From 049fdf2ade2087f0a43e9b5c6471e84b7f182cf1 Mon Sep 17 00:00:00 2001 From: 4gray Date: Sat, 5 Sep 2026 09:34:10 +0200 Subject: [PATCH] fix(playback): preserve VLC retry arguments containing quiet flag --- .../app/events/vlc-session.service.spec.ts | 39 +++++++++++++++++++ .../src/app/events/vlc-session.service.ts | 4 +- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/apps/electron-backend/src/app/events/vlc-session.service.spec.ts b/apps/electron-backend/src/app/events/vlc-session.service.spec.ts index 9f1176657..e7043479c 100644 --- a/apps/electron-backend/src/app/events/vlc-session.service.spec.ts +++ b/apps/electron-backend/src/app/events/vlc-session.service.spec.ts @@ -184,6 +184,45 @@ describe('vlc-session.service helpers and launch args', () => { }); describe('openVlcPlayer launch args', () => { + it.each(['error', 'exit'])( + 'preserves data containing --rc-quiet during an RC retry (%s)', + async (event) => { + Object.defineProperty(process, 'platform', { value: 'win32' }); + mockStoreValues({ + [VLC_PLAYER_PATH]: '/usr/bin/vlc', + [VLC_REUSE_INSTANCE]: true, + [VLC_PLAYER_ARGUMENTS]: '--fullscreen\n--rc-quiet', + }); + const proc = createMockChildProcess(); + const retryProc = createMockChildProcess(); + spawnMock + .mockReturnValueOnce(proc) + .mockReturnValueOnce(retryProc); + const url = `${streamUrl}?option=--rc-quiet`; + const openPromise = openVlcPlayer({ + title: 'Movie --rc-quiet', + url, + userAgent: 'Agent --rc-quiet', + }); + await waitForSpawnCallCount(1); + proc.emit('spawn'); + await openPromise; + proc.emit(event, event === 'exit' ? 1 : new Error('RC failed')); + await waitForSpawnCallCount(2); + + expect(spawnMock.mock.lastCall[1]).toEqual([ + '--fullscreen', + // Custom arguments are preserved; only the managed flag goes. + '--rc-quiet', + ':http-user-agent=Agent --rc-quiet', + url, + ':meta-title=Movie --rc-quiet', + ]); + retryProc.emit('spawn'); + retryProc.emit('exit', 0); + } + ); + it.each(['win32', 'darwin', 'linux'] as const)( 'adds quiet mode only for managed Windows RC launches (%s)', async (platform) => { diff --git a/apps/electron-backend/src/app/events/vlc-session.service.ts b/apps/electron-backend/src/app/events/vlc-session.service.ts index afe91f5c0..7ca52da0f 100644 --- a/apps/electron-backend/src/app/events/vlc-session.service.ts +++ b/apps/electron-backend/src/app/events/vlc-session.service.ts @@ -525,7 +525,7 @@ export async function openVlcPlayer({ (arg) => !arg.includes('--extraintf') && !arg.includes('--rc-host') && - !arg.includes('--rc-quiet') + arg !== '--rc-quiet' ); spawnVlc(retryArgs, true); } else { @@ -576,7 +576,7 @@ export async function openVlcPlayer({ (arg) => !arg.includes('--extraintf') && !arg.includes('--rc-host') && - !arg.includes('--rc-quiet') + arg !== '--rc-quiet' ); spawnVlc(retryArgs, true); return;