mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-03-30 18:12:08 -07:00
feat: add app-owned YouTube subtitle flow with absPlayer-style parsing (#31)
* fix: harden preload argv parsing for popup windows * fix: align youtube playback with shared overlay startup * fix: unwrap mpv youtube streams for anki media mining * docs: update docs for youtube subtitle and mining flow * refactor: unify cli and runtime wiring for startup and youtube flow * feat: update subtitle sidebar overlay behavior * chore: add shared log-file source for diagnostics * fix(ci): add changelog fragment for immersion changes * fix: address CodeRabbit review feedback * fix: persist canonical title from youtube metadata * style: format stats library tab * fix: address latest review feedback * style: format stats library files * test: stub launcher youtube deps in CI * test: isolate launcher youtube flow deps * test: stub launcher youtube deps in failing case * test: force x11 backend in launcher ci harness * test: address latest review feedback * fix(launcher): preserve user YouTube ytdl raw options * docs(backlog): update task tracking notes * fix(immersion): special-case youtube media paths in runtime and tracking * feat(stats): improve YouTube media metadata and picker key handling * fix(ci): format stats media library hook * fix: address latest CodeRabbit review items * docs: update youtube release notes and docs * feat: auto-load youtube subtitles before manual picker * fix: restore app-owned youtube subtitle flow * docs: update youtube playback docs and config copy * refactor: remove legacy youtube launcher mode plumbing * fix: refine youtube subtitle startup binding * docs: clarify youtube subtitle startup behavior * fix: address PR #31 latest review follow-ups * fix: address PR #31 follow-up review comments * test: harden youtube picker test harness * udpate backlog * fix: add timeout to youtube metadata probe * docs: refresh youtube and stats docs * update backlog * update backlog * chore: release v0.9.0
This commit is contained in:
49
src/types.ts
49
src/types.ts
@@ -17,6 +17,7 @@
|
||||
*/
|
||||
|
||||
import type { SubtitleCue } from './core/services/subtitle-cue-parser';
|
||||
import type { YoutubeTrackKind } from './core/services/youtube/kinds';
|
||||
|
||||
export enum PartOfSpeech {
|
||||
noun = 'noun',
|
||||
@@ -139,6 +140,7 @@ export interface MpvClient {
|
||||
currentSubStart: number;
|
||||
currentSubEnd: number;
|
||||
currentAudioStreamIndex: number | null;
|
||||
requestProperty?: (name: string) => Promise<unknown>;
|
||||
send(command: { command: unknown[]; request_id?: number }): boolean;
|
||||
}
|
||||
|
||||
@@ -559,6 +561,46 @@ export interface ControllerRuntimeSnapshot {
|
||||
}
|
||||
|
||||
export type JimakuLanguagePreference = 'ja' | 'en' | 'none';
|
||||
export type { YoutubeTrackKind };
|
||||
|
||||
export interface YoutubeTrackOption {
|
||||
id: string;
|
||||
language: string;
|
||||
sourceLanguage: string;
|
||||
kind: YoutubeTrackKind;
|
||||
label: string;
|
||||
title?: string;
|
||||
downloadUrl?: string;
|
||||
fileExtension?: string;
|
||||
}
|
||||
|
||||
export interface YoutubePickerOpenPayload {
|
||||
sessionId: string;
|
||||
url: string;
|
||||
tracks: YoutubeTrackOption[];
|
||||
defaultPrimaryTrackId: string | null;
|
||||
defaultSecondaryTrackId: string | null;
|
||||
hasTracks: boolean;
|
||||
}
|
||||
|
||||
export type YoutubePickerResolveRequest =
|
||||
| {
|
||||
sessionId: string;
|
||||
action: 'continue-without-subtitles';
|
||||
primaryTrackId: null;
|
||||
secondaryTrackId: null;
|
||||
}
|
||||
| {
|
||||
sessionId: string;
|
||||
action: 'use-selected';
|
||||
primaryTrackId: string | null;
|
||||
secondaryTrackId: string | null;
|
||||
};
|
||||
|
||||
export interface YoutubePickerResolveResult {
|
||||
ok: boolean;
|
||||
message: string;
|
||||
}
|
||||
|
||||
export interface JimakuConfig {
|
||||
apiKey?: string;
|
||||
@@ -1166,14 +1208,20 @@ export interface ElectronAPI {
|
||||
onRuntimeOptionsChanged: (callback: (options: RuntimeOptionState[]) => void) => void;
|
||||
onOpenRuntimeOptions: (callback: () => void) => void;
|
||||
onOpenJimaku: (callback: () => void) => void;
|
||||
onOpenYoutubeTrackPicker: (callback: (payload: YoutubePickerOpenPayload) => void) => void;
|
||||
onCancelYoutubeTrackPicker: (callback: () => void) => void;
|
||||
onKeyboardModeToggleRequested: (callback: () => void) => void;
|
||||
onLookupWindowToggleRequested: (callback: () => void) => void;
|
||||
appendClipboardVideoToQueue: () => Promise<ClipboardAppendResult>;
|
||||
youtubePickerResolve: (
|
||||
request: YoutubePickerResolveRequest,
|
||||
) => Promise<YoutubePickerResolveResult>;
|
||||
notifyOverlayModalClosed: (
|
||||
modal:
|
||||
| 'runtime-options'
|
||||
| 'subsync'
|
||||
| 'jimaku'
|
||||
| 'youtube-track-picker'
|
||||
| 'kiku'
|
||||
| 'controller-select'
|
||||
| 'controller-debug'
|
||||
@@ -1184,6 +1232,7 @@ export interface ElectronAPI {
|
||||
| 'runtime-options'
|
||||
| 'subsync'
|
||||
| 'jimaku'
|
||||
| 'youtube-track-picker'
|
||||
| 'kiku'
|
||||
| 'controller-select'
|
||||
| 'controller-debug'
|
||||
|
||||
Reference in New Issue
Block a user