#!/bin/bash # worker.sh — 处理单个视频:下载 → 抽音频 → 转写(由 fetch_course.sh 调用) set -uo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" line="$1" NN=$(echo "$line"|cut -d'|' -f1); ID=$(echo "$line"|cut -d'|' -f2); SLUG=$(echo "$line"|cut -d'|' -f3) VID="$OUT/videos/${NN}-${SLUG}.mp4"; TXT="$OUT/transcripts/${NN}-${SLUG}.${LANG}.txt" LOG="$OUT/build.log" log(){ echo "[$(date '+%F %T')] [$NN] $*" >> "$LOG"; } [ -f "$TXT" ] && { log "skip(done)"; exit 0; } if [ ! -f "$VID" ]; then for a in 1 2 3; do yt-dlp --proxy "$PROXY" --no-warnings --no-part \ --extractor-args "youtube:player_client=android" -f "$FMT" \ -o "$VID" "https://www.youtube.com/watch?v=$ID" >>"$LOG" 2>&1 && break log "retry-dl $a"; sleep 8 done fi [ -f "$VID" ] || { log "FAIL download"; exit 1; } ffmpeg -y -hide_banner -loglevel error -i "$VID" -ar 16000 -ac 1 -c:a pcm_s16le "$OUT/_${NN}.wav" 2>>"$LOG" || { log "FAIL audio"; exit 1; } MODEL="$MODEL" LANG="$LANG" THREADS=1 python3 "$HERE/course_util.py" transcribe "$OUT/_${NN}.wav" "$TXT" >>"$LOG" 2>&1 || { log "FAIL transcribe"; exit 1; } rm -f "$OUT/_${NN}.wav" log "ok $(du -h "$VID"|cut -f1)"