mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-28 06:22:45 -08:00
refactor: extract anki jimaku ipc deps runtime service
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
import test from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
import {
|
||||
AnkiJimakuIpcDepsRuntimeOptions,
|
||||
createAnkiJimakuIpcDepsRuntimeService,
|
||||
} from "./anki-jimaku-ipc-deps-runtime-service";
|
||||
|
||||
test("createAnkiJimakuIpcDepsRuntimeService returns passthrough runtime options", async () => {
|
||||
const calls: string[] = [];
|
||||
const options = {
|
||||
patchAnkiConnectEnabled: () => calls.push("patch"),
|
||||
getResolvedConfig: () => ({ ankiConnect: undefined }),
|
||||
getRuntimeOptionsManager: () => null,
|
||||
getSubtitleTimingTracker: () => null,
|
||||
getMpvClient: () => null,
|
||||
getAnkiIntegration: () => null,
|
||||
setAnkiIntegration: () => calls.push("set-integration"),
|
||||
showDesktopNotification: () => calls.push("notify"),
|
||||
createFieldGroupingCallback: () => async () => ({
|
||||
keepNoteId: 0,
|
||||
deleteNoteId: 0,
|
||||
deleteDuplicate: false,
|
||||
cancelled: true,
|
||||
}),
|
||||
broadcastRuntimeOptionsChanged: () => calls.push("broadcast"),
|
||||
getFieldGroupingResolver: () => null,
|
||||
setFieldGroupingResolver: () => calls.push("set-resolver"),
|
||||
parseMediaInfo: () => ({ mediaPath: null, baseName: null, episode: null }),
|
||||
getCurrentMediaPath: () => "/tmp/a.mp4",
|
||||
jimakuFetchJson: async () => ({ ok: true, data: [] }),
|
||||
getJimakuMaxEntryResults: () => 100,
|
||||
getJimakuLanguagePreference: () => "prefer-japanese",
|
||||
resolveJimakuApiKey: async () => "abc",
|
||||
isRemoteMediaPath: () => false,
|
||||
downloadToFile: async () => ({ ok: true, path: "/tmp/a.srt" }),
|
||||
} as unknown as AnkiJimakuIpcDepsRuntimeOptions;
|
||||
|
||||
const runtime = createAnkiJimakuIpcDepsRuntimeService(options);
|
||||
|
||||
runtime.patchAnkiConnectEnabled(true);
|
||||
runtime.broadcastRuntimeOptionsChanged();
|
||||
runtime.setFieldGroupingResolver(null);
|
||||
|
||||
assert.deepEqual(calls, ["patch", "broadcast", "set-resolver"]);
|
||||
assert.equal(runtime.getCurrentMediaPath(), "/tmp/a.mp4");
|
||||
assert.equal(runtime.getJimakuMaxEntryResults(), 100);
|
||||
assert.equal(await runtime.resolveJimakuApiKey(), "abc");
|
||||
});
|
||||
32
src/core/services/anki-jimaku-ipc-deps-runtime-service.ts
Normal file
32
src/core/services/anki-jimaku-ipc-deps-runtime-service.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import {
|
||||
AnkiJimakuIpcRuntimeOptions,
|
||||
} from "./anki-jimaku-runtime-service";
|
||||
|
||||
export type AnkiJimakuIpcDepsRuntimeOptions = AnkiJimakuIpcRuntimeOptions;
|
||||
|
||||
export function createAnkiJimakuIpcDepsRuntimeService(
|
||||
options: AnkiJimakuIpcDepsRuntimeOptions,
|
||||
): AnkiJimakuIpcRuntimeOptions {
|
||||
return {
|
||||
patchAnkiConnectEnabled: options.patchAnkiConnectEnabled,
|
||||
getResolvedConfig: options.getResolvedConfig,
|
||||
getRuntimeOptionsManager: options.getRuntimeOptionsManager,
|
||||
getSubtitleTimingTracker: options.getSubtitleTimingTracker,
|
||||
getMpvClient: options.getMpvClient,
|
||||
getAnkiIntegration: options.getAnkiIntegration,
|
||||
setAnkiIntegration: options.setAnkiIntegration,
|
||||
showDesktopNotification: options.showDesktopNotification,
|
||||
createFieldGroupingCallback: options.createFieldGroupingCallback,
|
||||
broadcastRuntimeOptionsChanged: options.broadcastRuntimeOptionsChanged,
|
||||
getFieldGroupingResolver: options.getFieldGroupingResolver,
|
||||
setFieldGroupingResolver: options.setFieldGroupingResolver,
|
||||
parseMediaInfo: options.parseMediaInfo,
|
||||
getCurrentMediaPath: options.getCurrentMediaPath,
|
||||
jimakuFetchJson: options.jimakuFetchJson,
|
||||
getJimakuMaxEntryResults: options.getJimakuMaxEntryResults,
|
||||
getJimakuLanguagePreference: options.getJimakuLanguagePreference,
|
||||
resolveJimakuApiKey: options.resolveJimakuApiKey,
|
||||
isRemoteMediaPath: options.isRemoteMediaPath,
|
||||
downloadToFile: options.downloadToFile,
|
||||
};
|
||||
}
|
||||
@@ -25,7 +25,7 @@ interface SubtitleTimingTrackerLike {
|
||||
cleanup: () => void;
|
||||
}
|
||||
|
||||
export function registerAnkiJimakuIpcRuntimeService(options: {
|
||||
export interface AnkiJimakuIpcRuntimeOptions {
|
||||
patchAnkiConnectEnabled: (enabled: boolean) => void;
|
||||
getResolvedConfig: () => { ankiConnect?: AnkiConnectConfig };
|
||||
getRuntimeOptionsManager: () => RuntimeOptionsManagerLike | null;
|
||||
@@ -55,7 +55,11 @@ export function registerAnkiJimakuIpcRuntimeService(options: {
|
||||
destPath: string,
|
||||
headers: Record<string, string>,
|
||||
) => Promise<{ ok: true; path: string } | { ok: false; error: { error: string; code?: number; retryAfter?: number } }>;
|
||||
}): void {
|
||||
}
|
||||
|
||||
export function registerAnkiJimakuIpcRuntimeService(
|
||||
options: AnkiJimakuIpcRuntimeOptions,
|
||||
): void {
|
||||
registerAnkiJimakuIpcHandlers({
|
||||
setAnkiConnectEnabled: (enabled) => {
|
||||
options.patchAnkiConnectEnabled(enabled);
|
||||
|
||||
Reference in New Issue
Block a user