diff --git a/launcher/commands/playback-command.ts b/launcher/commands/playback-command.ts index dbe5e0b..83a33d4 100644 --- a/launcher/commands/playback-command.ts +++ b/launcher/commands/playback-command.ts @@ -1,5 +1,4 @@ import fs from 'node:fs'; -import path from 'node:path'; import { fail, log } from '../log.js'; import { commandExists, isYoutubeTarget, realpathMaybe, resolvePathMaybe } from '../util.js'; import { collectVideos, showFzfMenu, showRofiMenu } from '../picker.js'; diff --git a/src/anki-integration.ts b/src/anki-integration.ts index 8943da8..0e3ea27 100644 --- a/src/anki-integration.ts +++ b/src/anki-integration.ts @@ -458,14 +458,6 @@ export class AnkiIntegration { return this.config.nPlusOne?.highlightEnabled === true; } - private startKnownWordCacheLifecycle(): void { - this.knownWordCache.startLifecycle(); - } - - private stopKnownWordCacheLifecycle(): void { - this.knownWordCache.stopLifecycle(); - } - private getConfiguredAnkiTags(): string[] { if (!Array.isArray(this.config.tags)) { return []; diff --git a/src/anki-integration/field-grouping-workflow.ts b/src/anki-integration/field-grouping-workflow.ts index 3990af9..6b030fd 100644 --- a/src/anki-integration/field-grouping-workflow.ts +++ b/src/anki-integration/field-grouping-workflow.ts @@ -80,7 +80,7 @@ export class FieldGroupingWorkflow { async handleManual( originalNoteId: number, - newNoteId: number, + _newNoteId: number, newNoteInfo: FieldGroupingWorkflowNoteInfo, ): Promise { const callback = await this.resolveFieldGroupingCallback(); diff --git a/src/core/services/tokenizer/yomitan-parser-runtime.test.ts b/src/core/services/tokenizer/yomitan-parser-runtime.test.ts index f2be7b5..0318372 100644 --- a/src/core/services/tokenizer/yomitan-parser-runtime.test.ts +++ b/src/core/services/tokenizer/yomitan-parser-runtime.test.ts @@ -8,7 +8,6 @@ import { importYomitanDictionaryFromZip, deleteYomitanDictionaryByTitle, removeYomitanDictionarySettings, - requestYomitanParseResults, requestYomitanScanTokens, requestYomitanTermFrequencies, syncYomitanDefaultAnkiServer, diff --git a/src/main.ts b/src/main.ts index 425755e..b72a259 100644 --- a/src/main.ts +++ b/src/main.ts @@ -92,8 +92,6 @@ import type { SecondarySubMode, SubtitleData, SubtitlePosition, - SubsyncManualRunRequest, - SubsyncResult, WindowGeometry, } from './types'; import { AnkiIntegration } from './anki-integration'; @@ -116,36 +114,15 @@ import { failStartupFromConfig, } from './main/config-validation'; import { - buildAnilistAttemptKey, buildAnilistSetupUrl, consumeAnilistSetupCallbackUrl, createAnilistStateRuntime, - createBuildGetAnilistMediaGuessRuntimeStateMainDepsHandler, - createBuildGetCurrentAnilistMediaKeyMainDepsHandler, - createBuildMaybeProbeAnilistDurationMainDepsHandler, - createBuildMaybeRunAnilistPostWatchUpdateMainDepsHandler, createBuildOpenAnilistSetupWindowMainDepsHandler, - createBuildProcessNextAnilistRetryUpdateMainDepsHandler, - createBuildRefreshAnilistClientSecretStateMainDepsHandler, - createBuildResetAnilistMediaGuessStateMainDepsHandler, - createBuildResetAnilistMediaTrackingMainDepsHandler, - createBuildSetAnilistMediaGuessRuntimeStateMainDepsHandler, - createEnsureAnilistMediaGuessHandler, - createGetAnilistMediaGuessRuntimeStateHandler, - createGetCurrentAnilistMediaKeyHandler, createMaybeFocusExistingAnilistSetupWindowHandler, - createMaybeProbeAnilistDurationHandler, - createMaybeRunAnilistPostWatchUpdateHandler, createOpenAnilistSetupWindowHandler, - createProcessNextAnilistRetryUpdateHandler, - createRefreshAnilistClientSecretStateHandler, - createResetAnilistMediaGuessStateHandler, - createResetAnilistMediaTrackingHandler, - createSetAnilistMediaGuessRuntimeStateHandler, findAnilistSetupDeepLinkArgvUrl, isAnilistTrackingEnabled, loadAnilistManualTokenEntry, - loadAnilistSetupFallback, openAnilistSetupInBrowser, rememberAnilistAttemptedUpdateKey, } from './main/runtime/domains/anilist'; @@ -153,50 +130,9 @@ import { createApplyJellyfinMpvDefaultsHandler, createBuildApplyJellyfinMpvDefaultsMainDepsHandler, createBuildGetDefaultSocketPathMainDepsHandler, - createEnsureMpvConnectedForJellyfinPlaybackHandler, - createBuildEnsureMpvConnectedForJellyfinPlaybackMainDepsHandler, createGetDefaultSocketPathHandler, - createGetJellyfinClientInfoHandler, - createBuildGetJellyfinClientInfoMainDepsHandler, - createHandleJellyfinAuthCommands, - createBuildHandleJellyfinAuthCommandsMainDepsHandler, - createHandleJellyfinListCommands, - createBuildHandleJellyfinListCommandsMainDepsHandler, - createHandleJellyfinPlayCommand, - createBuildHandleJellyfinPlayCommandMainDepsHandler, - createHandleJellyfinRemoteAnnounceCommand, - createBuildHandleJellyfinRemoteAnnounceCommandMainDepsHandler, - createHandleJellyfinRemotePlay, - createBuildHandleJellyfinRemotePlayMainDepsHandler, - createHandleJellyfinRemotePlaystate, - createBuildHandleJellyfinRemotePlaystateMainDepsHandler, - createHandleJellyfinRemoteGeneralCommand, - createBuildHandleJellyfinRemoteGeneralCommandMainDepsHandler, - createLaunchMpvIdleForJellyfinPlaybackHandler, - createBuildLaunchMpvIdleForJellyfinPlaybackMainDepsHandler, - createPlayJellyfinItemInMpvHandler, - createBuildPlayJellyfinItemInMpvMainDepsHandler, - createPreloadJellyfinExternalSubtitlesHandler, - createBuildPreloadJellyfinExternalSubtitlesMainDepsHandler, - createReportJellyfinRemoteProgressHandler, - createBuildReportJellyfinRemoteProgressMainDepsHandler, - createReportJellyfinRemoteStoppedHandler, - createBuildReportJellyfinRemoteStoppedMainDepsHandler, - createStartJellyfinRemoteSessionHandler, - createBuildStartJellyfinRemoteSessionMainDepsHandler, - createStopJellyfinRemoteSessionHandler, - createBuildStopJellyfinRemoteSessionMainDepsHandler, - createRunJellyfinCommandHandler, - createBuildRunJellyfinCommandMainDepsHandler, - createWaitForMpvConnectedHandler, - createBuildWaitForMpvConnectedMainDepsHandler, - createOpenJellyfinSetupWindowHandler, - createBuildOpenJellyfinSetupWindowMainDepsHandler, - createGetResolvedJellyfinConfigHandler, - createBuildGetResolvedJellyfinConfigMainDepsHandler, - parseJellyfinSetupSubmissionUrl, buildJellyfinSetupFormHtml, - createMaybeFocusExistingJellyfinSetupWindowHandler, + parseJellyfinSetupSubmissionUrl, } from './main/runtime/domains/jellyfin'; import type { ActiveJellyfinRemotePlaybackState } from './main/runtime/domains/jellyfin'; import { getConfiguredJellyfinSession } from './main/runtime/domains/jellyfin'; @@ -226,7 +162,6 @@ import { createBuildEnsureOverlayWindowLevelMainDepsHandler, createBuildUpdateVisibleOverlayBoundsMainDepsHandler, createOverlayWindowRuntimeHandlers, - createOverlayRuntimeBootstrapHandlers, createTrayRuntimeHandlers, createOverlayVisibilityRuntime, createBroadcastRuntimeOptionsChangedHandler, @@ -268,25 +203,11 @@ import { createConfigDerivedRuntime, appendClipboardVideoToQueueRuntime, createMainSubsyncRuntime, - createLaunchBackgroundWarmupTaskHandler, - createStartBackgroundWarmupsHandler, - createBuildLaunchBackgroundWarmupTaskMainDepsHandler, - createBuildStartBackgroundWarmupsMainDepsHandler, } from './main/runtime/domains/startup'; import { - createBuildBindMpvMainEventHandlersMainDepsHandler, - createBuildMpvClientRuntimeServiceFactoryDepsHandler, - createMpvClientRuntimeServiceFactory, - createBindMpvMainEventHandlersHandler, - createBuildTokenizerDepsMainHandler, - createCreateMecabTokenizerAndCheckMainHandler, - createPrewarmSubtitleDictionariesMainHandler, - createUpdateMpvSubtitleRenderMetricsHandler, - createBuildUpdateMpvSubtitleRenderMetricsMainDepsHandler, createMpvOsdRuntimeHandlers, createCycleSecondarySubModeRuntimeHandler, } from './main/runtime/domains/mpv'; -import type { MpvClientRuntimeServiceOptions } from './main/runtime/domains/mpv'; import { createBuildCopyCurrentSubtitleMainDepsHandler, createBuildHandleMineSentenceDigitMainDepsHandler, @@ -324,7 +245,6 @@ import { MpvIpcClient, SubtitleWebSocket, Texthooker, - DEFAULT_MPV_SUBTITLE_RENDER_METRICS, applyMpvSubtitleRenderMetricsPatch, authenticateWithPasswordRuntime, broadcastRuntimeOptionsChangedRuntime, @@ -424,7 +344,6 @@ import { createCharacterDictionaryRuntimeService } from './main/character-dictio import { createCharacterDictionaryAutoSyncRuntimeService } from './main/runtime/character-dictionary-auto-sync'; import { type AnilistMediaGuessRuntimeState, - type AppState, type StartupState, applyStartupState, createAppState, @@ -1455,13 +1374,8 @@ function shouldInitializeMecabForAnnotations(): boolean { const { getResolvedJellyfinConfig, - getJellyfinClientInfo, reportJellyfinRemoteProgress, reportJellyfinRemoteStopped, - handleJellyfinRemotePlay, - handleJellyfinRemotePlaystate, - handleJellyfinRemoteGeneralCommand, - playJellyfinItemInMpv, startJellyfinRemoteSession, stopJellyfinRemoteSession, runJellyfinCommand, @@ -2184,7 +2098,7 @@ const ensureImmersionTrackerStarted = (): void => { createImmersionTrackerStartup(); }; -const { reloadConfig: reloadConfigHandler, appReadyRuntimeRunner } = composeAppReadyRuntime({ +const { appReadyRuntimeRunner } = composeAppReadyRuntime({ reloadConfigMainDeps: { reloadConfigStrict: () => configService.reloadConfigStrict(), logInfo: (message) => appLogger.logInfo(message), @@ -2288,7 +2202,7 @@ const { reloadConfig: reloadConfigHandler, appReadyRuntimeRunner } = composeAppR immersionTrackerStartupMainDeps, }); -const { appLifecycleRuntimeRunner, runAndApplyStartupState } = +const { runAndApplyStartupState } = runtimeRegistry.startup.createStartupRuntimeHandlers< CliArgs, StartupState, @@ -2386,7 +2300,6 @@ function handleInitialArgs(): void { } const { - bindMpvClientEventHandlers, createMpvClientRuntimeService: createMpvClientRuntimeServiceHandler, updateMpvSubtitleRenderMetrics: updateMpvSubtitleRenderMetricsHandler, tokenizeSubtitle, @@ -2758,10 +2671,6 @@ async function syncYomitanDefaultProfileAnkiServer(): Promise { } } -function createOverlayWindow(kind: 'visible' | 'modal'): BrowserWindow { - return createOverlayWindowHandler(kind); -} - function createModalWindow(): BrowserWindow { const existingWindow = overlayManager.getModalWindow(); if (existingWindow && !existingWindow.isDestroyed()) { @@ -2775,13 +2684,6 @@ function createModalWindow(): BrowserWindow { function createMainWindow(): BrowserWindow { return createMainWindowHandler(); } -function resolveTrayIconPath(): string | null { - return resolveTrayIconPathHandler(); -} - -function buildTrayMenu(): Menu { - return buildTrayMenuHandler(); -} function ensureTray(): void { ensureTrayHandler(); @@ -2808,8 +2710,6 @@ const { startPendingMultiCopy, cancelPendingMineSentenceMultiple, startPendingMineSentenceMultiple, - registerOverlayShortcuts, - unregisterOverlayShortcuts, syncOverlayShortcuts, refreshOverlayShortcuts, } = composeShortcutRuntimes({ @@ -2848,7 +2748,7 @@ const { }, }); -const { appendToMpvLog, flushMpvLog, showMpvOsd } = createMpvOsdRuntimeHandlers({ +const { flushMpvLog, showMpvOsd } = createMpvOsdRuntimeHandlers({ appendToMpvLogMainDeps: { logPath: DEFAULT_MPV_LOG_PATH, dirname: (targetPath) => path.dirname(targetPath), @@ -3005,7 +2905,6 @@ const { setVisibleOverlayVisible: setVisibleOverlayVisibleHandler, toggleVisibleOverlay: toggleVisibleOverlayHandler, setOverlayVisible: setOverlayVisibleHandler, - toggleOverlay: toggleOverlayHandler, } = createOverlayVisibilityRuntime({ setVisibleOverlayVisibleDeps: { setVisibleOverlayVisibleCore, @@ -3065,11 +2964,7 @@ const shiftSubtitleDelayToAdjacentCueHandler = createShiftSubtitleDelayToAdjacen showMpvOsd: (text) => showMpvOsd(text), }); -const { - handleMpvCommandFromIpc: handleMpvCommandFromIpcHandler, - runSubsyncManualFromIpc: runSubsyncManualFromIpcHandler, - registerIpcRuntimeHandlers, -} = composeIpcRuntimeHandlers({ +const { registerIpcRuntimeHandlers } = composeIpcRuntimeHandlers({ mpvCommandMainDeps: { triggerSubsyncFromConfig: () => triggerSubsyncFromConfig(), openRuntimeOptionsPalette: () => openRuntimeOptionsPalette(), @@ -3224,11 +3119,8 @@ const createCliCommandContextHandler = createCliCommandContextFactory({ logWarn: (message: string) => logger.warn(message), logError: (message: string, err: unknown) => logger.error(message, err), }); -const { - createOverlayWindow: createOverlayWindowHandler, - createMainWindow: createMainWindowHandler, - createModalWindow: createModalWindowHandler, -} = createOverlayWindowRuntimeHandlers({ +const { createMainWindow: createMainWindowHandler, createModalWindow: createModalWindowHandler } = + createOverlayWindowRuntimeHandlers({ createOverlayWindowDeps: { createOverlayWindowCore: (kind, options) => createOverlayWindowCore(kind, options), isDev, @@ -3250,12 +3142,8 @@ const { setMainWindow: (window) => overlayManager.setMainWindow(window), setModalWindow: (window) => overlayManager.setModalWindow(window), }); -const { - resolveTrayIconPath: resolveTrayIconPathHandler, - buildTrayMenu: buildTrayMenuHandler, - ensureTray: ensureTrayHandler, - destroyTray: destroyTrayHandler, -} = createTrayRuntimeHandlers({ +const { ensureTray: ensureTrayHandler, destroyTray: destroyTrayHandler } = + createTrayRuntimeHandlers({ resolveTrayIconPathDeps: { resolveTrayIconPathRuntime, platform: process.platform, @@ -3436,25 +3324,10 @@ function setOverlayVisible(visible: boolean): void { setOverlayVisibleHandler(visible); syncOverlayMpvSubtitleSuppression(); } -function toggleOverlay(): void { - if (!overlayManager.getVisibleOverlayVisible()) { - void ensureOverlayMpvSubtitlesHidden(); - } - toggleOverlayHandler(); - syncOverlayMpvSubtitleSuppression(); -} function handleOverlayModalClosed(modal: OverlayHostedModal): void { handleOverlayModalClosedHandler(modal); } -function handleMpvCommandFromIpc(command: (string | number)[]): void { - handleMpvCommandFromIpcHandler(command); -} - -async function runSubsyncManualFromIpc(request: SubsyncManualRunRequest): Promise { - return runSubsyncManualFromIpcHandler(request) as Promise; -} - function appendClipboardVideoToQueue(): { ok: boolean; message: string } { return appendClipboardVideoToQueueHandler(); } diff --git a/src/main/runtime/composers/composer-contracts.type-test.ts b/src/main/runtime/composers/composer-contracts.type-test.ts index 2eee69d..feb2980 100644 --- a/src/main/runtime/composers/composer-contracts.type-test.ts +++ b/src/main/runtime/composers/composer-contracts.type-test.ts @@ -22,10 +22,13 @@ type RequiredMpvInputKeys = keyof ComposerInputs< MpvRuntimeComposerOptions >; -type _anilistHasNotifyDeps = Assert>; -type _jellyfinHasGetMpvClient = Assert>; -type _ipcHasRegistration = Assert>; -type _mpvHasTokenizer = Assert>; +const contractAssertions = [ + true as Assert>, + true as Assert>, + true as Assert>, + true as Assert>, +]; +void contractAssertions; // @ts-expect-error missing required notifyDeps should fail compile-time contract const anilistMissingRequired: AnilistSetupComposerOptions = {