refactor: extract mpv render metrics runtime apply helper

This commit is contained in:
2026-02-09 23:03:40 -08:00
parent 10d9cc2db4
commit dbfd9105de
4 changed files with 65 additions and 23 deletions

View File

@@ -16,7 +16,7 @@
"docs:build": "vitepress build docs", "docs:build": "vitepress build docs",
"docs:preview": "vitepress preview docs --host 0.0.0.0 --port 4173 --strictPort", "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: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", "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", "generate:config-example": "pnpm run build && node dist/generate-config-example.js",
"start": "pnpm run build && electron . --start", "start": "pnpm run build && electron . --start",

View File

@@ -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);
});

View File

@@ -55,3 +55,28 @@ export function updateMpvSubtitleRenderMetricsService(
osdDimensions: nextOsdDimensions, osdDimensions: nextOsdDimensions,
}; };
} }
export function applyMpvSubtitleRenderMetricsPatchService(
current: MpvSubtitleRenderMetrics,
patch: Partial<MpvSubtitleRenderMetrics>,
): { 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 };
}

View File

@@ -160,7 +160,7 @@ import {
MpvIpcClient, MpvIpcClient,
MPV_REQUEST_ID_SECONDARY_SUB_VISIBILITY, MPV_REQUEST_ID_SECONDARY_SUB_VISIBILITY,
} from "./core/services/mpv-service"; } from "./core/services/mpv-service";
import { updateMpvSubtitleRenderMetricsService } from "./core/services/mpv-render-metrics-service"; import { applyMpvSubtitleRenderMetricsPatchService } from "./core/services/mpv-render-metrics-service";
import { import {
handleMpvCommandFromIpcService, handleMpvCommandFromIpcService,
} from "./core/services/ipc-command-service"; } from "./core/services/ipc-command-service";
@@ -636,30 +636,10 @@ function handleInitialArgs(): void {
function updateMpvSubtitleRenderMetrics( function updateMpvSubtitleRenderMetrics(
patch: Partial<MpvSubtitleRenderMetrics>, patch: Partial<MpvSubtitleRenderMetrics>,
): void { ): void {
const next = updateMpvSubtitleRenderMetricsService( const { next, changed } = applyMpvSubtitleRenderMetricsPatchService(
mpvSubtitleRenderMetrics, mpvSubtitleRenderMetrics,
patch, 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; if (!changed) return;
mpvSubtitleRenderMetrics = next; mpvSubtitleRenderMetrics = next;
broadcastToOverlayWindows( broadcastToOverlayWindows(