Skip to content
🚧 These docs are a work in progress and may contain inaccuracies. Content is being actively reviewed and validated.

Subtitles

Dubby supports external subtitle files, embedded subtitle tracks, and automatic downloads from OpenSubtitles.

Place subtitle files next to your video files with a language code suffix:

Movie Name (2024).mkv
Movie Name (2024).en.srt # English subtitles
Movie Name (2024).en.forced.srt # Forced subtitles (foreign dialog only)
Movie Name (2024).es.srt # Spanish subtitles

External subtitles are auto-detected during library scans. Supported formats: .srt, .ass, .ssa, .vtt

Subtitles embedded inside the video container (MKV, MP4) are automatically extracted during the probe step. The server extracts each track as WebVTT for client-side rendering.

When configured, Dubby searches OpenSubtitles for missing subtitle tracks during the ingest pipeline’s enhance stage. Downloaded subtitles are saved alongside your media files.

OpenSubtitles supports two types of API keys:

  • Consumer API keys (free) — Short alphanumeric strings. Allow 5 subtitle downloads per IP per 24 hours without an account. To increase limits, add your OpenSubtitles username and password during setup — Dubby will authenticate on your behalf.
  • VIP/Paid API keys — JWT tokens (start with eyJ...). Include higher download limits and use the dedicated VIP server (vip-api.opensubtitles.com). No username/password needed.

Dubby automatically detects which type of key you’ve entered and configures the appropriate server URL and authentication method.

FormatTypeHow it’s rendered
SRTTextConverted to WebVTT, rendered client-side
WebVTTTextRendered client-side natively
ASS / SSA (simple)TextConverted to WebVTT (styling simplified)
ASS / SSA (complex)TextBurned into video stream
PGS / SUP (Blu-ray)Image-basedBurned into video stream
VOBSUB (DVD)Image-basedBurned into video stream

Text-based subtitles (SRT, WebVTT, simple ASS) are extracted and delivered as a separate WebVTT file. The client renders them as an overlay — no transcoding required.

Image-based subtitles (PGS, VOBSUB) and complex ASS/SSA must be “burned” into the video frame by the server. This triggers a full video transcode, which significantly increases server CPU/GPU usage.

When starting playback, subtitle track selection follows this priority:

  1. Explicit selection — Track chosen by the user in the player UI
  2. Session memory — Last-used track within the current show (persists across episodes)
  3. User preference — Global subtitle language preference set in profile settings
  4. None — Subtitles are off by default

Forced subtitles contain only foreign-language dialog (e.g., alien speech in a primarily English film). They’re identified by:

  • Filename suffix: .forced.srt
  • Container flag: the “forced” flag on an embedded track

Forced subtitle tracks are treated separately from regular subtitle tracks in the player UI.

On web clients, subtitles are rendered using a custom overlay positioned on top of the video. This ensures consistent appearance across browsers and avoids CSS conflicts with the player UI.

On TV clients (Apple TV, Android TV), subtitles are rendered by the native video player (AVPlayer or ExoPlayer).