Rename from TutorialDock to TutorialVault. Remove legacy Python app and scripts. Fix video playback, subtitles, metadata display, window state persistence, and auto-download of ffmpeg/ffprobe on first run. Bundle fonts via npm instead of runtime download.
189 lines
3.4 KiB
TypeScript
189 lines
3.4 KiB
TypeScript
// ===== Video Item (from get_library_info items array) =====
|
|
|
|
export interface VideoItem {
|
|
index: number;
|
|
fid: string;
|
|
name: string;
|
|
title: string;
|
|
relpath: string;
|
|
depth: number;
|
|
pipes: boolean[];
|
|
is_last: boolean;
|
|
has_prev_in_parent: boolean;
|
|
pos: number;
|
|
watched: number;
|
|
duration: number | null;
|
|
finished: boolean;
|
|
note_len: number;
|
|
last_open: number;
|
|
has_sub: boolean;
|
|
}
|
|
|
|
// ===== Library Info (from get_library / open_folder_path / select_folder) =====
|
|
|
|
export interface NextUp {
|
|
index: number;
|
|
title: string;
|
|
}
|
|
|
|
export interface LibraryInfo {
|
|
ok: boolean;
|
|
error?: string;
|
|
cancelled?: boolean;
|
|
folder?: string;
|
|
library_id?: string;
|
|
count?: number;
|
|
current_index?: number;
|
|
current_fid?: string | null;
|
|
current_time?: number;
|
|
folder_volume?: number;
|
|
folder_autoplay?: boolean;
|
|
folder_rate?: number;
|
|
items?: VideoItem[];
|
|
has_subdirs?: boolean;
|
|
overall_progress?: number | null;
|
|
durations_known?: number;
|
|
finished_count?: number;
|
|
remaining_count?: number;
|
|
remaining_seconds_known?: number | null;
|
|
top_folders?: { name: string; total: number; finished: number }[];
|
|
next_up?: NextUp | null;
|
|
}
|
|
|
|
// ===== Preferences =====
|
|
|
|
export interface WindowState {
|
|
width: number;
|
|
height: number;
|
|
x: number | null;
|
|
y: number | null;
|
|
}
|
|
|
|
export interface Prefs {
|
|
version: number;
|
|
ui_zoom: number;
|
|
split_ratio: number;
|
|
dock_ratio: number;
|
|
always_on_top: boolean;
|
|
window: WindowState;
|
|
last_folder_path: string | null;
|
|
last_library_id: string | null;
|
|
updated_at: number;
|
|
}
|
|
|
|
// ===== API Responses =====
|
|
|
|
export interface OkResponse {
|
|
ok: boolean;
|
|
error?: string;
|
|
}
|
|
|
|
export interface PrefsResponse {
|
|
ok: boolean;
|
|
prefs: Prefs;
|
|
}
|
|
|
|
export interface RecentItem {
|
|
name: string;
|
|
path: string;
|
|
}
|
|
|
|
export interface RecentsResponse {
|
|
ok: boolean;
|
|
items: RecentItem[];
|
|
}
|
|
|
|
export interface NoteResponse {
|
|
ok: boolean;
|
|
note: string;
|
|
len?: number;
|
|
}
|
|
|
|
// ===== Video Metadata =====
|
|
|
|
export interface BasicFileMeta {
|
|
ext: string;
|
|
size: number;
|
|
mtime: number;
|
|
folder: string;
|
|
}
|
|
|
|
export interface SubtitleTrack {
|
|
index: number;
|
|
codec: string;
|
|
language: string;
|
|
title: string;
|
|
}
|
|
|
|
export interface ProbeMeta {
|
|
v_codec?: string;
|
|
width?: number;
|
|
height?: number;
|
|
fps?: number;
|
|
v_bitrate?: number;
|
|
pix_fmt?: string;
|
|
color_space?: string;
|
|
a_codec?: string;
|
|
channels?: number;
|
|
sample_rate?: string;
|
|
a_bitrate?: number;
|
|
subtitle_tracks?: SubtitleTrack[];
|
|
container_bitrate?: number;
|
|
duration?: number;
|
|
format_name?: string;
|
|
container_title?: string;
|
|
encoder?: string;
|
|
}
|
|
|
|
export interface VideoMetaResponse {
|
|
ok: boolean;
|
|
error?: string;
|
|
fid?: string;
|
|
basic?: BasicFileMeta;
|
|
probe?: ProbeMeta | null;
|
|
ffprobe_found?: boolean;
|
|
}
|
|
|
|
// ===== Subtitles =====
|
|
|
|
export interface SubtitleResponse {
|
|
ok: boolean;
|
|
has?: boolean;
|
|
url?: string;
|
|
label?: string;
|
|
cancelled?: boolean;
|
|
error?: string;
|
|
}
|
|
|
|
export interface SidecarSub {
|
|
path: string;
|
|
label: string;
|
|
format: string;
|
|
}
|
|
|
|
export interface EmbeddedSub {
|
|
index: number;
|
|
label: string;
|
|
codec: string;
|
|
language: string;
|
|
}
|
|
|
|
export interface AvailableSubsResponse {
|
|
ok: boolean;
|
|
sidecar: SidecarSub[];
|
|
embedded: EmbeddedSub[];
|
|
}
|
|
|
|
export interface EmbeddedSubsResponse {
|
|
ok: boolean;
|
|
tracks: SubtitleTrack[];
|
|
}
|
|
|
|
// ===== FFmpeg Download Progress =====
|
|
|
|
export interface FfmpegProgress {
|
|
percent: number;
|
|
downloaded_bytes: number;
|
|
total_bytes: number;
|
|
}
|