Subtitles become a feature, not an afterthought: the player can now find tracks on OpenSubtitles and translate any track into your language with AI — both opt-in, both off until you bring a key. Under the hood, a week of seek-accuracy work in the transcoder and the player ships with it.
New
- AI subtitles (
subtitle-translate, new service): a "Translate to " track in the subtitle picker, translating embedded tracks, uploaded files and OpenSubtitles finds progressively while you watch. Finished translations persist in the embedded S3, so a film is translated once. NeedsSUBTITLE_TRANSLATE_ENABLED=trueandANTHROPIC_API_KEY— calls are billed to the key, so both halves are deliberate, anddocker logsnames whichever half is missing. - OpenSubtitles tracks (
video-info, new service): subtitles found for the exact file by hash, offered in every language OpenSubtitles has. Enabled byOSDB_API_KEYalone (a free consumer key is enough); search answers and fetched files are cached in Redis and the embedded S3, so a key's quota is spent once per film. Without the key, exports simply carry no subtitles leg. - content-transcoder: seeking got honest — the playlist reports where the run actually starts (keyframe, not the 30-second grid), and the player uses it to keep subtitles in sync after a seek.
- web-ui: the player waits for subtitles to catch up after a seek instead of playing over their silence — with a visible banner and a working "keep waiting" choice; AI translation polls survive throttling; restored subtitle selections survive track wipes on seek.
Fixes
- video-info: died at startup when probes are off (
USE_PROBE=false) — a typed-nil probe hidden inside an interface; production never saw it, this image would have. - content-transcoder: the legacy
/index.m3u8route answers again, serving the master playlist inline without spawning FFmpeg.
Upgrade
No schema migrations. All new variables are optional and off by default: SUBTITLE_TRANSLATE_ENABLED + ANTHROPIC_API_KEY (+ SUBTITLE_TRANSLATE_MODEL) for AI subtitles, OSDB_API_KEY (+ OSDB_USER/OSDB_PASS/OSDB_RATE) for OpenSubtitles — see the README's "Configuring OpenSubtitles" and "Configuring AI features". Existing .env files keep working. docker pull ghcr.io/webtor-io/self-hosted:2.1.0.