9.3 KiB
YouTube Integration
SubMiner auto-loads Japanese subtitles when you play a YouTube URL, giving you the same sentence-mining overlay experience as local video files. It probes available subtitle tracks via yt-dlp, selects the best primary and secondary tracks, downloads them, and loads them into mpv before playback resumes.
Requirements
- yt-dlp must be installed and on your
PATH. yt-dlp is a free command-line tool that reads YouTube video and subtitle info; SubMiner calls it behind the scenes. (PATHis the list of folders your system searches for programs - most installers add yt-dlp to it automatically. If yours did not, setSUBMINER_YTDLP_BINto the full path of the yt-dlp binary.) - mpv with
--input-ipc-serverconfigured (handled automatically when you launch playback through thesubminerlauncher - no manual setup needed).
How It Works
When SubMiner detects a YouTube URL (or ytsearch: target), it pauses mpv at startup and runs a subtitle pipeline before resuming playback:
- Probe ---
yt-dlp --dump-single-jsonextracts all available subtitle tracks (manual uploads and auto-generated captions) along with video metadata. - Discover --- Each track is normalized into a
YoutubeTrackOptionwith language code, kind (manualorauto), display label, and direct download URL. - Select --- SubMiner picks the best primary track (Japanese, preferring manual over auto) and secondary track (English, preferring manual over auto).
- Download --- Selected tracks are fetched via direct URL when available, falling back to
yt-dlp --write-subs/--write-auto-subs. YouTube TimedText XML formats (srv1/srv2/srv3) are converted to VTT on the fly. Auto-generated VTT captions are normalized to remove rolling-caption duplication. - Load --- Subtitle files are injected into mpv via
sub-add. Playback resumes once the primary track is ready; secondary failures do not block.
Pipeline Diagram
flowchart TD
classDef step fill:#c6a0f6,stroke:#494d64,color:#24273a
classDef action fill:#8aadf4,stroke:#494d64,color:#24273a
classDef result fill:#a6da95,stroke:#494d64,color:#24273a
classDef enrich fill:#8bd5ca,stroke:#494d64,color:#24273a
classDef ext fill:#eed49f,stroke:#494d64,color:#24273a
A[YouTube URL detected]:::step
B[yt-dlp probe]:::ext
C[Track discovery]:::action
D{Auto or manual selection?}:::step
E[Auto-select best tracks]:::action
F[Manual picker - Ctrl+Alt+C]:::action
G[Download subtitle files]:::action
H[Convert TimedText to VTT]:::enrich
I[Normalize auto-caption duplicates]:::enrich
K[sub-add into mpv]:::action
L[Overlay renders subtitles]:::result
A --> B
B --> C
C --> D
D -- startup --> E
D -- user request --> F
E --> G
F --> G
G --> H
H --> I
I --> K
K --> L
Auto-Load Flow
On startup with a YouTube URL:
- mpv launches paused.
- SubMiner calls
yt-dlp --dump-single-jsonto probe all subtitle tracks. - Tracks are split into manual (human-uploaded) and auto (machine-generated) categories.
- The selection algorithm picks:
- Primary: first Japanese manual track, then Japanese auto track, then any manual track, then first available track.
- Secondary: first English manual track, then English auto track (excluding the primary).
- If mpv already exposes an authoritative matching track, SubMiner reuses it instead of downloading again.
- Missing tracks are downloaded to a temp directory and loaded via
sub-add. - Playback unpauses once the primary subtitle is ready.
Manual Subtitle Picker
Press Ctrl+Alt+C during YouTube playback to open the subtitle picker overlay. This lets you:
- Browse all discovered tracks (manual and auto-generated)
- Select different primary and secondary tracks
- Retry track loading if the auto-load failed or picked the wrong track
SubMiner shows an "Opening YouTube subtitle picker..." status through your configured notification surface while it probes tracks and prepares the modal, then updates the subtitle download progress card to a success notification after the selected tracks load.
The picker displays each track with its language, kind (manual/auto), and title when available.
Subtitle Format Handling
SubMiner handles several YouTube subtitle formats transparently:
| Format | Handling |
|---|---|
srt, vtt |
Used directly (preferred for manual tracks) |
srv1, srv2, srv3 |
YouTube TimedText XML --- converted to VTT automatically |
| Auto-generated VTT | Normalized to remove rolling-caption text duplication |
For auto-generated tracks, SubMiner prefers srv3 > srv2 > srv1 > vtt (TimedText XML produces cleaner output). For manual tracks, srt > vtt is preferred.
Card Media Cache
By default, YouTube card audio and screenshots are extracted directly from mpv's active stream URLs. If generated card media fails with YouTube 403 errors, set youtube.mediaCache.mode to "background". Background mode starts a separate yt-dlp media download after playback loads, including YouTube URLs opened directly in mpv and resolved stream URLs when mpv still exposes the original YouTube playlist entry. It creates text fields immediately, queues audio/image work for mined notes, and fills those fields once the local cache file is ready.
Background cache downloads use IPv4 and retry flags to reduce YouTube throttling failures. If the background download still fails, SubMiner shows a cache failure notification, shows queued-card failure notifications, and clears those pending updates so cards are not left waiting silently.
Configuration Reference
Primary Subtitle Languages
{
"youtube": {
"primarySubLanguages": ["ja", "jpn"],
},
}
| Option | Type | Description |
|---|---|---|
primarySubLanguages |
string[] |
Language priority for YouTube primary subtitle auto-loading (default ["ja", "jpn"]) |
Secondary Subtitle Languages
Secondary track selection uses the shared secondarySub config:
{
"secondarySub": {
"secondarySubLanguages": [],
"autoLoadSecondarySub": false,
"defaultMode": "hover",
},
}
| Option | Type | Description |
|---|---|---|
secondarySubLanguages |
string[] |
Extra language codes (e.g. ["eng", "en"]) used when auto-selecting a secondary track. Default is empty ([]). For YouTube, SubMiner always tries an English track first regardless of this list. |
autoLoadSecondarySub |
boolean |
Auto-detect and load a matching secondary track (default: false) |
defaultMode |
"hidden" / "visible" / "hover" |
Initial display mode for secondary subtitles (default: "hover") |
Precedence: CLI flag > environment variable > config.jsonc > built-in default.
Limitations and Troubleshooting
- No subtitles found: The video may not have Japanese subtitles. Open the picker with
Ctrl+Alt+Cto see all available tracks. - yt-dlp not found: Install
yt-dlpand ensure it is onPATH, or setSUBMINER_YTDLP_BINto the binary path. - Probe timeout:
yt-dlphas a 15-second timeout per operation. Slow connections or rate-limited IPs may hit this. Retry or updateyt-dlp. - Card media
403errors: Switchyoutube.mediaCache.modefrom"direct"to"background"so card media is generated from a localyt-dlpcache instead of ffmpeg reading an expiring YouTube stream URL. - Auto-caption quality: YouTube auto-generated captions vary in quality. Manual subtitles (when available) are always preferred.
ytsearch:targets:subminer ytsearch:"keyword"plays the first search result. Subtitle availability depends on the matched video.- Secondary subtitle fails: Secondary track failures never block playback. The primary subtitle loads independently.
- Native mpv secondary rendering: Stays hidden during YouTube flows so the SubMiner overlay remains the visible secondary subtitle surface.