#!/bin/bash CHANNEL_DIR="$(dirname "$0")" STATE_FILE="$CHANNEL_DIR/state.txt" LOGO_ASS="$CHANNEL_DIR/logo.ass" ADS_DIR="$CHANNEL_DIR/ads" SCHEDULE_FILE="$CHANNEL_DIR/schedule.txt" # Format: 10:00 PM-11:00 PM:'Attack On Titan' # --- Create text-based logo ASS if not exists --- if [ ! -f "$LOGO_ASS" ]; then cat > "$LOGO_ASS" <= TEMP_START || CURRENT_MIN < TEMP_END )) && IN_SCHEDULE=1 else (( CURRENT_MIN >= TEMP_START && CURRENT_MIN < TEMP_END )) && IN_SCHEDULE=1 fi if (( IN_SCHEDULE )); then ACTIVE_FOLDER="$CHANNEL_DIR/$FOLDER_NAME" TODAY=$(date +%Y-%m-%d) SCHEDULE_START_TS=$(date -d "$TODAY $SH24:$SM" +%s) if (( TEMP_END <= TEMP_START && CURRENT_MIN < TEMP_END )); then SCHEDULE_START_TS=$(( SCHEDULE_START_TS - 24*3600 )) fi break fi fi done < "$SCHEDULE_FILE" fi if [ -z "$ACTIVE_FOLDER" ]; then echo "No anime scheduled at this time." exit 0 fi echo "Now playing: $ACTIVE_FOLDER" # --- Find all videos in order --- VIDEOS=() while IFS= read -r -d $'\0' file; do VIDEOS+=("$file") done < <(find "$ACTIVE_FOLDER" -maxdepth 1 -type f \( -iname "*.mp4" -o -iname "*.mkv" -o -iname "*.avi" \) -print0 | sort -z -V) # --- Pick a random ad --- AD_PATH="" if [ -d "$ADS_DIR" ] && [ $(ls -1 "$ADS_DIR" | wc -l) -gt 0 ]; then AD_FILE=$(ls "$ADS_DIR" | shuf -n1) AD_PATH="$ADS_DIR/$AD_FILE" fi # --- Determine elapsed time --- SCHEDULE_ELAPSED=$(( CURRENT_TS - SCHEDULE_START_TS )) if [ -f "$STATE_FILE" ] && [ -s "$STATE_FILE" ]; then STATE_ELAPSED=$(cat "$STATE_FILE") else STATE_ELAPSED=0 fi # Use the larger of schedule elapsed or saved state ELAPSED=$(( SCHEDULE_ELAPSED > STATE_ELAPSED ? SCHEDULE_ELAPSED : STATE_ELAPSED )) # --- Determine which video and seek position --- CURRENT_FILE="" SEEK=0 for VIDEO in "${VIDEOS[@]}"; do DURATION=$(ffprobe -v error -show_entries format=duration \ -of default=noprint_wrappers=1:nokey=1 "$VIDEO") DURATION=${DURATION%.*} if (( ELAPSED >= DURATION )); then ELAPSED=$(( ELAPSED - DURATION )) else CURRENT_FILE="$VIDEO" SEEK=$ELAPSED break fi done [ -z "$CURRENT_FILE" ] && { CURRENT_FILE="${VIDEOS[0]}"; SEEK=0; } # --- Build playlist --- PLAYLIST=("$CURRENT_FILE") FOUND=0 for VIDEO in "${VIDEOS[@]}"; do if [ "$VIDEO" == "$CURRENT_FILE" ]; then FOUND=1 continue fi [ "$FOUND" -eq 1 ] && PLAYLIST+=("$VIDEO") done [ -n "$AD_PATH" ] && PLAYLIST+=("$AD_PATH") # --- MPV options --- WATCH_DIR="$CHANNEL_DIR/watch_later" mkdir -p "$WATCH_DIR" MPV_COMMON="--fullscreen --loop-playlist=inf \ --no-input-default-bindings --no-osd-bar --osd-level=0 \ --force-window=no --sub-files=$LOGO_ASS \ --no-resume-playback --watch-later-directory=$WATCH_DIR" # --- Start MPV --- if (( SEEK > 0 )); then mpv $MPV_COMMON --start="$SEEK" "${PLAYLIST[@]}" else mpv $MPV_COMMON "${PLAYLIST[@]}" fi # --- Update state.txt --- ELAPSED=$(( SEEK + $(date +%s) - CURRENT_TS )) echo $ELAPSED > "$STATE_FILE" echo "Channel position updated. Next run will resume correctly."