Fix Windows mpv logging and add log export (#88)

This commit is contained in:
2026-05-26 00:31:38 -07:00
committed by GitHub
parent 43ebc7d371
commit 11c196821d
150 changed files with 2748 additions and 582 deletions
+15
View File
@@ -51,6 +51,13 @@ test('createDefaultArgs seeds mpv profile from launcher config', () => {
assert.equal(parsed.profile, 'anime');
});
test('createDefaultArgs seeds log level from launcher logging config', () => {
const parsed = createDefaultArgs({}, {}, { level: 'debug', rotation: 14 });
assert.equal(parsed.logLevel, 'debug');
assert.equal(parsed.logRotation, 14);
});
test('applyRootOptionsToArgs appends CLI mpv profile to configured profile', () => {
const parsed = createDefaultArgs({}, { profile: 'anime' });
@@ -131,6 +138,8 @@ test('applyInvocationsToArgs maps config and jellyfin invocation state', () => {
doctorTriggered: false,
doctorLogLevel: null,
doctorRefreshKnownWords: false,
logsTriggered: false,
logsExport: false,
texthookerTriggered: false,
texthookerLogLevel: null,
texthookerOpenBrowser: false,
@@ -175,6 +184,8 @@ test('applyInvocationsToArgs maps settings invocation to settings window', () =>
doctorTriggered: false,
doctorLogLevel: null,
doctorRefreshKnownWords: false,
logsTriggered: false,
logsExport: false,
texthookerTriggered: false,
texthookerLogLevel: null,
texthookerOpenBrowser: false,
@@ -212,6 +223,8 @@ test('applyInvocationsToArgs fails when config invocation has no action', () =>
doctorTriggered: false,
doctorLogLevel: null,
doctorRefreshKnownWords: false,
logsTriggered: false,
logsExport: false,
texthookerTriggered: false,
texthookerLogLevel: null,
texthookerOpenBrowser: false,
@@ -247,6 +260,8 @@ test('applyInvocationsToArgs maps texthooker browser-open request', () => {
doctorTriggered: false,
doctorLogLevel: null,
doctorRefreshKnownWords: false,
logsTriggered: false,
logsExport: false,
texthookerTriggered: true,
texthookerLogLevel: null,
texthookerOpenBrowser: true,
+9 -1
View File
@@ -4,6 +4,7 @@ import { fail } from '../log.js';
import type {
Args,
Backend,
LauncherLoggingConfig,
LauncherMpvConfig,
LauncherYoutubeSubgenConfig,
LogLevel,
@@ -106,6 +107,7 @@ function parseDictionaryAnilistId(value: string): number {
export function createDefaultArgs(
launcherConfig: LauncherYoutubeSubgenConfig,
mpvConfig: LauncherMpvConfig = {},
loggingConfig: LauncherLoggingConfig = {},
): Args {
const configuredSecondaryLangs = uniqueNormalizedLangCodes(
launcherConfig.secondarySubLanguages ?? [],
@@ -162,6 +164,7 @@ export function createDefaultArgs(
statsCleanupLifetime: false,
doctor: false,
doctorRefreshKnownWords: false,
logsExport: false,
version: false,
update: false,
settings: false,
@@ -195,7 +198,8 @@ export function createDefaultArgs(
texthookerOnly: false,
texthookerOpenBrowser: false,
useRofi: false,
logLevel: 'info',
logLevel: loggingConfig.level ?? 'warn',
logRotation: loggingConfig.rotation ?? 7,
passwordStore: '',
target: '',
targetKind: '',
@@ -260,6 +264,10 @@ export function applyInvocationsToArgs(parsed: Args, invocations: CliInvocations
}
if (invocations.doctorTriggered) parsed.doctor = true;
if (invocations.doctorRefreshKnownWords) parsed.doctorRefreshKnownWords = true;
if (invocations.logsTriggered && !invocations.logsExport) {
fail('Logs command requires -e or --export.');
}
if (invocations.logsExport) parsed.logsExport = true;
if (invocations.texthookerTriggered) parsed.texthookerOnly = true;
if (invocations.texthookerOpenBrowser) parsed.texthookerOpenBrowser = true;
+16
View File
@@ -41,6 +41,8 @@ export interface CliInvocations {
doctorTriggered: boolean;
doctorLogLevel: string | null;
doctorRefreshKnownWords: boolean;
logsTriggered: boolean;
logsExport: boolean;
texthookerTriggered: boolean;
texthookerLogLevel: string | null;
texthookerOpenBrowser: boolean;
@@ -91,6 +93,7 @@ function getTopLevelCommand(argv: string[]): { name: string; index: number } | n
'config',
'settings',
'mpv',
'logs',
'dictionary',
'dict',
'stats',
@@ -158,6 +161,8 @@ export function parseCliPrograms(
let statsLogLevel: string | null = null;
let doctorLogLevel: string | null = null;
let doctorRefreshKnownWords = false;
let logsTriggered = false;
let logsExport = false;
let texthookerLogLevel: string | null = null;
let texthookerOpenBrowser = false;
let doctorTriggered = false;
@@ -294,6 +299,15 @@ export function parseCliPrograms(
doctorRefreshKnownWords = options.refreshKnownWords === true;
});
commandProgram
.command('logs')
.description('Log file helpers')
.option('-e, --export', 'Export sanitized log archive')
.action((options: Record<string, unknown>) => {
logsTriggered = true;
logsExport = options.export === true;
});
commandProgram
.command('config')
.description('Config file helpers (path|show)')
@@ -388,6 +402,8 @@ export function parseCliPrograms(
doctorTriggered,
doctorLogLevel,
doctorRefreshKnownWords,
logsTriggered,
logsExport,
texthookerTriggered,
texthookerLogLevel,
texthookerOpenBrowser,
+3 -1
View File
@@ -40,6 +40,7 @@ function validBackendOrDefault(value: unknown, fallback: Backend): Backend {
export function parsePluginRuntimeConfigFromMainConfig(
root: Record<string, unknown> | null,
logLevel: LogLevel = 'info',
): PluginRuntimeConfig {
const mpvConfig = root ? parseLauncherMpvConfig(root) : {};
const texthooker = rootObject(root, 'texthooker');
@@ -48,6 +49,7 @@ export function parsePluginRuntimeConfigFromMainConfig(
socketPath: mpvConfig.socketPath ?? DEFAULT_SOCKET_PATH,
binaryPath: mpvConfig.subminerBinaryPath ?? '',
backend: validBackendOrDefault(mpvConfig.backend, 'auto'),
logLevel,
autoStart: booleanOrDefault(mpvConfig.autoStartSubMiner, true),
autoStartVisibleOverlay: booleanOrDefault(root?.auto_start_overlay, false),
autoStartPauseUntilReady: booleanOrDefault(mpvConfig.pauseUntilOverlayReady, true),
@@ -65,7 +67,7 @@ export function buildPluginRuntimeScriptOptParts(
}
export function readPluginRuntimeConfig(logLevel: LogLevel): PluginRuntimeConfig {
const parsed = parsePluginRuntimeConfigFromMainConfig(readLauncherMainConfigObject());
const parsed = parsePluginRuntimeConfigFromMainConfig(readLauncherMainConfigObject(), logLevel);
log(
'debug',