mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-28 06:22:45 -08:00
Standardize core service module and export names to reduce naming ambiguity and make imports predictable across runtime, tests, scripts, and docs.
99 lines
3.0 KiB
TypeScript
99 lines
3.0 KiB
TypeScript
import {
|
|
RuntimeOptionApplyResult,
|
|
RuntimeOptionId,
|
|
RuntimeOptionValue,
|
|
SubsyncManualRunRequest,
|
|
SubsyncResult,
|
|
} from "../../types";
|
|
|
|
export interface HandleMpvCommandFromIpcOptions {
|
|
specialCommands: {
|
|
SUBSYNC_TRIGGER: string;
|
|
RUNTIME_OPTIONS_OPEN: string;
|
|
RUNTIME_OPTION_CYCLE_PREFIX: string;
|
|
REPLAY_SUBTITLE: string;
|
|
PLAY_NEXT_SUBTITLE: string;
|
|
};
|
|
triggerSubsyncFromConfig: () => void;
|
|
openRuntimeOptionsPalette: () => void;
|
|
runtimeOptionsCycle: (
|
|
id: RuntimeOptionId,
|
|
direction: 1 | -1,
|
|
) => RuntimeOptionApplyResult;
|
|
showMpvOsd: (text: string) => void;
|
|
mpvReplaySubtitle: () => void;
|
|
mpvPlayNextSubtitle: () => void;
|
|
mpvSendCommand: (command: (string | number)[]) => void;
|
|
isMpvConnected: () => boolean;
|
|
hasRuntimeOptionsManager: () => boolean;
|
|
}
|
|
|
|
export function handleMpvCommandFromIpc(
|
|
command: (string | number)[],
|
|
options: HandleMpvCommandFromIpcOptions,
|
|
): void {
|
|
const first = typeof command[0] === "string" ? command[0] : "";
|
|
if (first === options.specialCommands.SUBSYNC_TRIGGER) {
|
|
options.triggerSubsyncFromConfig();
|
|
return;
|
|
}
|
|
|
|
if (first === options.specialCommands.RUNTIME_OPTIONS_OPEN) {
|
|
options.openRuntimeOptionsPalette();
|
|
return;
|
|
}
|
|
|
|
if (first.startsWith(options.specialCommands.RUNTIME_OPTION_CYCLE_PREFIX)) {
|
|
if (!options.hasRuntimeOptionsManager()) return;
|
|
const [, idToken, directionToken] = first.split(":");
|
|
const id = idToken as RuntimeOptionId;
|
|
const direction: 1 | -1 = directionToken === "prev" ? -1 : 1;
|
|
const result = options.runtimeOptionsCycle(id, direction);
|
|
if (!result.ok && result.error) {
|
|
options.showMpvOsd(result.error);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (options.isMpvConnected()) {
|
|
if (first === options.specialCommands.REPLAY_SUBTITLE) {
|
|
options.mpvReplaySubtitle();
|
|
} else if (first === options.specialCommands.PLAY_NEXT_SUBTITLE) {
|
|
options.mpvPlayNextSubtitle();
|
|
} else {
|
|
options.mpvSendCommand(command);
|
|
}
|
|
}
|
|
}
|
|
|
|
export async function runSubsyncManualFromIpc(
|
|
request: SubsyncManualRunRequest,
|
|
options: {
|
|
isSubsyncInProgress: () => boolean;
|
|
setSubsyncInProgress: (inProgress: boolean) => void;
|
|
showMpvOsd: (text: string) => void;
|
|
runWithSpinner: (task: () => Promise<SubsyncResult>) => Promise<SubsyncResult>;
|
|
runSubsyncManual: (request: SubsyncManualRunRequest) => Promise<SubsyncResult>;
|
|
},
|
|
): Promise<SubsyncResult> {
|
|
if (options.isSubsyncInProgress()) {
|
|
const busy = "Subsync already running";
|
|
options.showMpvOsd(busy);
|
|
return { ok: false, message: busy };
|
|
}
|
|
try {
|
|
options.setSubsyncInProgress(true);
|
|
const result = await options.runWithSpinner(() =>
|
|
options.runSubsyncManual(request),
|
|
);
|
|
options.showMpvOsd(result.message);
|
|
return result;
|
|
} catch (error) {
|
|
const message = `Subsync failed: ${(error as Error).message}`;
|
|
options.showMpvOsd(message);
|
|
return { ok: false, message };
|
|
} finally {
|
|
options.setSubsyncInProgress(false);
|
|
}
|
|
}
|