From dbfd9105dea8117aad762defe9897ad11fde0de9 Mon Sep 17 00:00:00 2001 From: sudacode Date: Mon, 9 Feb 2026 23:03:40 -0800 Subject: [PATCH] refactor: extract mpv render metrics runtime apply helper --- package.json | 2 +- .../mpv-render-metrics-service.test.ts | 37 +++++++++++++++++++ .../services/mpv-render-metrics-service.ts | 25 +++++++++++++ src/main.ts | 24 +----------- 4 files changed, 65 insertions(+), 23 deletions(-) create mode 100644 src/core/services/mpv-render-metrics-service.test.ts diff --git a/package.json b/package.json index 2f7de9c..2e67017 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "docs:build": "vitepress build docs", "docs:preview": "vitepress preview docs --host 0.0.0.0 --port 4173 --strictPort", "test:config": "pnpm run build && node --test dist/config/config.test.js", - "test:core": "pnpm run build && node --test dist/cli/args.test.js dist/cli/help.test.js dist/core/services/cli-command-service.test.js dist/core/services/numeric-shortcut-session-service.test.js dist/core/services/secondary-subtitle-service.test.js", + "test:core": "pnpm run build && node --test dist/cli/args.test.js dist/cli/help.test.js dist/core/services/cli-command-service.test.js dist/core/services/numeric-shortcut-session-service.test.js dist/core/services/secondary-subtitle-service.test.js dist/core/services/mpv-render-metrics-service.test.js", "test:subtitle": "pnpm run build && node --test dist/subtitle/stages.test.js dist/subtitle/pipeline.test.js", "generate:config-example": "pnpm run build && node dist/generate-config-example.js", "start": "pnpm run build && electron . --start", diff --git a/src/core/services/mpv-render-metrics-service.test.ts b/src/core/services/mpv-render-metrics-service.test.ts new file mode 100644 index 0000000..43c9e7e --- /dev/null +++ b/src/core/services/mpv-render-metrics-service.test.ts @@ -0,0 +1,37 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { MpvSubtitleRenderMetrics } from "../../types"; +import { applyMpvSubtitleRenderMetricsPatchService } from "./mpv-render-metrics-service"; + +const BASE: MpvSubtitleRenderMetrics = { + subPos: 100, + subFontSize: 38, + subScale: 1, + subMarginY: 34, + subMarginX: 19, + subFont: "sans-serif", + subSpacing: 0, + subBold: false, + subItalic: false, + subBorderSize: 2.5, + subShadowOffset: 0, + subAssOverride: "yes", + subScaleByWindow: true, + subUseMargins: true, + osdHeight: 720, + osdDimensions: null, +}; + +test("applyMpvSubtitleRenderMetricsPatchService returns unchanged on empty patch", () => { + const { next, changed } = applyMpvSubtitleRenderMetricsPatchService(BASE, {}); + assert.equal(changed, false); + assert.deepEqual(next, BASE); +}); + +test("applyMpvSubtitleRenderMetricsPatchService reports changed when patch modifies value", () => { + const { next, changed } = applyMpvSubtitleRenderMetricsPatchService(BASE, { + subPos: 95, + }); + assert.equal(changed, true); + assert.equal(next.subPos, 95); +}); diff --git a/src/core/services/mpv-render-metrics-service.ts b/src/core/services/mpv-render-metrics-service.ts index 271d388..82efd27 100644 --- a/src/core/services/mpv-render-metrics-service.ts +++ b/src/core/services/mpv-render-metrics-service.ts @@ -55,3 +55,28 @@ export function updateMpvSubtitleRenderMetricsService( osdDimensions: nextOsdDimensions, }; } + +export function applyMpvSubtitleRenderMetricsPatchService( + current: MpvSubtitleRenderMetrics, + patch: Partial, +): { next: MpvSubtitleRenderMetrics; changed: boolean } { + const next = updateMpvSubtitleRenderMetricsService(current, patch); + const changed = + next.subPos !== current.subPos || + next.subFontSize !== current.subFontSize || + next.subScale !== current.subScale || + next.subMarginY !== current.subMarginY || + next.subMarginX !== current.subMarginX || + next.subFont !== current.subFont || + next.subSpacing !== current.subSpacing || + next.subBold !== current.subBold || + next.subItalic !== current.subItalic || + next.subBorderSize !== current.subBorderSize || + next.subShadowOffset !== current.subShadowOffset || + next.subAssOverride !== current.subAssOverride || + next.subScaleByWindow !== current.subScaleByWindow || + next.subUseMargins !== current.subUseMargins || + next.osdHeight !== current.osdHeight || + JSON.stringify(next.osdDimensions) !== JSON.stringify(current.osdDimensions); + return { next, changed }; +} diff --git a/src/main.ts b/src/main.ts index 59725ad..3413084 100644 --- a/src/main.ts +++ b/src/main.ts @@ -160,7 +160,7 @@ import { MpvIpcClient, MPV_REQUEST_ID_SECONDARY_SUB_VISIBILITY, } from "./core/services/mpv-service"; -import { updateMpvSubtitleRenderMetricsService } from "./core/services/mpv-render-metrics-service"; +import { applyMpvSubtitleRenderMetricsPatchService } from "./core/services/mpv-render-metrics-service"; import { handleMpvCommandFromIpcService, } from "./core/services/ipc-command-service"; @@ -636,30 +636,10 @@ function handleInitialArgs(): void { function updateMpvSubtitleRenderMetrics( patch: Partial, ): void { - const next = updateMpvSubtitleRenderMetricsService( + const { next, changed } = applyMpvSubtitleRenderMetricsPatchService( mpvSubtitleRenderMetrics, patch, ); - - const changed = - next.subPos !== mpvSubtitleRenderMetrics.subPos || - next.subFontSize !== mpvSubtitleRenderMetrics.subFontSize || - next.subScale !== mpvSubtitleRenderMetrics.subScale || - next.subMarginY !== mpvSubtitleRenderMetrics.subMarginY || - next.subMarginX !== mpvSubtitleRenderMetrics.subMarginX || - next.subFont !== mpvSubtitleRenderMetrics.subFont || - next.subSpacing !== mpvSubtitleRenderMetrics.subSpacing || - next.subBold !== mpvSubtitleRenderMetrics.subBold || - next.subItalic !== mpvSubtitleRenderMetrics.subItalic || - next.subBorderSize !== mpvSubtitleRenderMetrics.subBorderSize || - next.subShadowOffset !== mpvSubtitleRenderMetrics.subShadowOffset || - next.subAssOverride !== mpvSubtitleRenderMetrics.subAssOverride || - next.subScaleByWindow !== mpvSubtitleRenderMetrics.subScaleByWindow || - next.subUseMargins !== mpvSubtitleRenderMetrics.subUseMargins || - next.osdHeight !== mpvSubtitleRenderMetrics.osdHeight || - JSON.stringify(next.osdDimensions) !== - JSON.stringify(mpvSubtitleRenderMetrics.osdDimensions); - if (!changed) return; mpvSubtitleRenderMetrics = next; broadcastToOverlayWindows(