Files
SubMiner/src/main/media-runtime.ts
2026-02-17 22:54:09 -08:00

69 lines
2.5 KiB
TypeScript

import { updateCurrentMediaPath } from '../core/services';
import type { SubtitlePosition } from '../types';
export interface MediaRuntimeDeps {
isRemoteMediaPath: (mediaPath: string) => boolean;
loadSubtitlePosition: () => SubtitlePosition | null;
getCurrentMediaPath: () => string | null;
getPendingSubtitlePosition: () => SubtitlePosition | null;
getSubtitlePositionsDir: () => string;
setCurrentMediaPath: (mediaPath: string | null) => void;
clearPendingSubtitlePosition: () => void;
setSubtitlePosition: (position: SubtitlePosition | null) => void;
broadcastSubtitlePosition: (position: SubtitlePosition | null) => void;
getCurrentMediaTitle: () => string | null;
setCurrentMediaTitle: (title: string | null) => void;
}
export interface MediaRuntimeService {
updateCurrentMediaPath: (mediaPath: unknown) => void;
updateCurrentMediaTitle: (mediaTitle: unknown) => void;
resolveMediaPathForJimaku: (mediaPath: string | null) => string | null;
}
export function createMediaRuntimeService(deps: MediaRuntimeDeps): MediaRuntimeService {
return {
updateCurrentMediaPath(mediaPath: unknown): void {
if (typeof mediaPath !== 'string' || !deps.isRemoteMediaPath(mediaPath)) {
deps.setCurrentMediaTitle(null);
}
updateCurrentMediaPath({
mediaPath,
currentMediaPath: deps.getCurrentMediaPath(),
pendingSubtitlePosition: deps.getPendingSubtitlePosition(),
subtitlePositionsDir: deps.getSubtitlePositionsDir(),
loadSubtitlePosition: () => deps.loadSubtitlePosition(),
setCurrentMediaPath: (nextPath: string | null) => {
deps.setCurrentMediaPath(nextPath);
},
clearPendingSubtitlePosition: () => {
deps.clearPendingSubtitlePosition();
},
setSubtitlePosition: (position: SubtitlePosition | null) => {
deps.setSubtitlePosition(position);
},
broadcastSubtitlePosition: (position: SubtitlePosition | null) => {
deps.broadcastSubtitlePosition(position);
},
});
},
updateCurrentMediaTitle(mediaTitle: unknown): void {
if (typeof mediaTitle === 'string') {
const sanitized = mediaTitle.trim();
deps.setCurrentMediaTitle(sanitized.length > 0 ? sanitized : null);
return;
}
deps.setCurrentMediaTitle(null);
},
resolveMediaPathForJimaku(mediaPath: string | null): string | null {
return mediaPath && deps.isRemoteMediaPath(mediaPath) && deps.getCurrentMediaTitle()
? deps.getCurrentMediaTitle()
: mediaPath;
},
};
}