feat(youtube): add YouTube browser window and Whisper subtitle source

- Add `subminer youtube`/`yt` and tray "Browse YouTube" window that plays or queues picked videos in mpv
- Add `youtube.subtitleSource` (`youtube` | `whisper`) to transcribe YouTube audio via subtitle generation
- Allow the subtitle generation modal on YouTube videos
- Pick the real Japanese track over machine-translated ones and fall back to yt-dlp on HTTP 429
- Remove legacy launcher youtubeSubgen/whisper/AI args and `--youtube-mode`
- Fix EPIPE crash when the launching terminal is closed with Ctrl+C
- Thin media timing review handles with orange original-boundary bars
- Update docs and change fragments
This commit is contained in:
sudacode committed 2026-09-28 20:46:11 -07:00
commit b347fdf21a
105 files changed
+2297 -623

No files matched your search

+2 -10
View File
@@ -20,7 +20,7 @@ import type {
YomitanConfig,
YoutubeConfig,
YoutubeMediaCacheMode,
YoutubeSubgenConfig,
YoutubeSubtitleSource,
} from './integrations';
import type {
ControllerButtonIndicesConfig,
@@ -174,7 +174,6 @@ export interface Config {
discordPresence?: DiscordPresenceConfig;
ai?: AiConfig;
youtube?: YoutubeConfig;
youtubeSubgen?: YoutubeSubgenConfig;
immersionTracking?: ImmersionTrackingConfig;
stats?: StatsConfig;
updates?: UpdatesConfig;
@@ -394,19 +393,12 @@ export interface ResolvedConfig {
};
youtube: YoutubeConfig & {
primarySubLanguages: string[];
subtitleSource: YoutubeSubtitleSource;
mediaCache: {
mode: YoutubeMediaCacheMode;
maxHeight: number;
};
};
youtubeSubgen: YoutubeSubgenConfig & {
whisperBin: string;
whisperModel: string;
whisperVadModel: string;
whisperThreads: number;
fixWithAi: boolean;
ai: AiFeatureConfig;
};
immersionTracking: {
enabled: boolean;
dbPath?: string;
+4 -9
View File
@@ -124,6 +124,9 @@ export interface AiConfig {
export type YoutubeMediaCacheMode = 'direct' | 'background';
/** Where primary YouTube subtitles come from: YouTube's captions, or Whisper on the audio. */
export type YoutubeSubtitleSource = 'youtube' | 'whisper';
export interface YoutubeMediaCacheConfig {
mode?: YoutubeMediaCacheMode;
maxHeight?: number;
@@ -131,18 +134,10 @@ export interface YoutubeMediaCacheConfig {
export interface YoutubeConfig {
primarySubLanguages?: string[];
subtitleSource?: YoutubeSubtitleSource;
mediaCache?: YoutubeMediaCacheConfig;
}
export interface YoutubeSubgenConfig {
whisperBin?: string;
whisperModel?: string;
whisperVadModel?: string;
whisperThreads?: number;
fixWithAi?: boolean;
ai?: AiFeatureConfig;
}
export interface StatsConfig {
toggleKey?: string;
markWatchedKey?: string;