feat(subtitle-sidebar): add sidebar config surface (#28)

This commit is contained in:
2026-03-21 23:37:42 -07:00
committed by GitHub
parent eddf6f0456
commit 3a01cffc6b
66 changed files with 5241 additions and 426 deletions

View File

@@ -1,5 +1,16 @@
import { fileURLToPath } from 'node:url';
function parseTrackId(value: unknown): number | null {
if (typeof value === 'number' && Number.isInteger(value)) {
return value;
}
if (typeof value === 'string') {
const parsed = Number(value.trim());
return Number.isInteger(parsed) ? parsed : null;
}
return null;
}
export function getActiveExternalSubtitleSource(
trackListRaw: unknown,
sidRaw: unknown,
@@ -8,9 +19,8 @@ export function getActiveExternalSubtitleSource(
return null;
}
const sid =
typeof sidRaw === 'number' ? sidRaw : typeof sidRaw === 'string' ? Number(sidRaw) : null;
if (sid == null || !Number.isFinite(sid)) {
const sid = parseTrackId(sidRaw);
if (sid === null) {
return null;
}
@@ -19,7 +29,7 @@ export function getActiveExternalSubtitleSource(
return false;
}
const track = entry as Record<string, unknown>;
return track.type === 'sub' && track.id === sid && track.external === true;
return track.type === 'sub' && parseTrackId(track.id) === sid && track.external === true;
}) as Record<string, unknown> | undefined;
const externalFilename =
@@ -40,3 +50,21 @@ export function resolveSubtitleSourcePath(source: string): string {
return source;
}
}
export function buildSubtitleSidebarSourceKey(
videoPath: string,
track: unknown,
fallbackSourcePath?: string,
): string {
const normalizedVideoPath = videoPath.trim();
if (track && typeof track === 'object' && normalizedVideoPath) {
const subtitleTrack = track as Record<string, unknown>;
const trackId = parseTrackId(subtitleTrack.id);
const ffIndex = parseTrackId(subtitleTrack['ff-index']);
if (trackId !== null || ffIndex !== null) {
return `internal:${normalizedVideoPath}:track:${trackId ?? 'unknown'}:ff:${ffIndex ?? 'unknown'}`;
}
}
return fallbackSourcePath ?? normalizedVideoPath;
}