Path.read_text()/write_text() default to the platform encoding (cp1252
on Windows), which mangles or crashes on UTF-8 files. yt-dlp's
video.info.json is UTF-8 and routinely contains non-ASCII bytes, so on
Windows the parse raised UnicodeDecodeError, was swallowed by a bare
except, and the /watch report came back missing Title/Uploader.
- download.py: read video.info.json as UTF-8; log parse failures to
stderr instead of swallowing them silently.
- whisper.py, setup.py: same UTF-8 fix on .env reads and writes for
symmetry across platforms.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- download.py: insert `--` before URL in yt-dlp argv so a `-`-prefixed
string can never be parsed as a flag (e.g. --exec, --config-location).
Tighten is_url to reject `-`-prefixed sources and require non-empty
netloc.
- frames.py, whisper.py: resolve video/audio paths to absolute via
Path.resolve() before passing to ffmpeg/ffprobe (which don't honor
`--` as end-of-options), so a relative path starting with `-` can
never be misinterpreted as a flag.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Give Claude the ability to watch any video — yt-dlp download, ffmpeg
frame extraction with auto-scaled fps, native-caption transcript with
Whisper (Groq/OpenAI) fallback.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>