Files
SubMiner/src/core/services/mpv-render-metrics-service.ts

83 lines
3.3 KiB
TypeScript

import { MpvSubtitleRenderMetrics } from "../../types";
import { asBoolean, asFiniteNumber, asString } from "../utils/coerce";
export function updateMpvSubtitleRenderMetricsService(
current: MpvSubtitleRenderMetrics,
patch: Partial<MpvSubtitleRenderMetrics>,
): MpvSubtitleRenderMetrics {
const patchOsd = patch.osdDimensions;
const nextOsdDimensions =
patchOsd &&
typeof patchOsd.w === "number" &&
typeof patchOsd.h === "number" &&
typeof patchOsd.ml === "number" &&
typeof patchOsd.mr === "number" &&
typeof patchOsd.mt === "number" &&
typeof patchOsd.mb === "number"
? {
w: asFiniteNumber(patchOsd.w, 0, 1, 100000),
h: asFiniteNumber(patchOsd.h, 0, 1, 100000),
ml: asFiniteNumber(patchOsd.ml, 0, 0, 100000),
mr: asFiniteNumber(patchOsd.mr, 0, 0, 100000),
mt: asFiniteNumber(patchOsd.mt, 0, 0, 100000),
mb: asFiniteNumber(patchOsd.mb, 0, 0, 100000),
}
: patchOsd === null
? null
: current.osdDimensions;
return {
subPos: asFiniteNumber(patch.subPos, current.subPos, 0, 150),
subFontSize: asFiniteNumber(patch.subFontSize, current.subFontSize, 1, 200),
subScale: asFiniteNumber(patch.subScale, current.subScale, 0.1, 10),
subMarginY: asFiniteNumber(patch.subMarginY, current.subMarginY, 0, 200),
subMarginX: asFiniteNumber(patch.subMarginX, current.subMarginX, 0, 200),
subFont: asString(patch.subFont, current.subFont),
subSpacing: asFiniteNumber(patch.subSpacing, current.subSpacing, -100, 100),
subBold: asBoolean(patch.subBold, current.subBold),
subItalic: asBoolean(patch.subItalic, current.subItalic),
subBorderSize: asFiniteNumber(
patch.subBorderSize,
current.subBorderSize,
0,
100,
),
subShadowOffset: asFiniteNumber(
patch.subShadowOffset,
current.subShadowOffset,
0,
100,
),
subAssOverride: asString(patch.subAssOverride, current.subAssOverride),
subScaleByWindow: asBoolean(patch.subScaleByWindow, current.subScaleByWindow),
subUseMargins: asBoolean(patch.subUseMargins, current.subUseMargins),
osdHeight: asFiniteNumber(patch.osdHeight, current.osdHeight, 1, 10000),
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 };
}