From 333ee5eea446678da70ecaa5ff638494735ba677 Mon Sep 17 00:00:00 2001 From: sudacode Date: Sat, 15 Aug 2026 00:16:00 -0700 Subject: [PATCH] fix(anime): clean up discarded queued subtitles in background - Let queued episode discard return before subtitle preparation finishes - Remove the redundant queued subtitle loading command --- src/anime-bridge/mpv-playback.test.ts | 1 - src/anime-bridge/mpv-playback.ts | 5 +---- src/main/runtime/anime-browser-playback.test.ts | 15 +++++++++++++-- src/main/runtime/anime-browser-playback.ts | 9 +++++++-- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/anime-bridge/mpv-playback.test.ts b/src/anime-bridge/mpv-playback.test.ts index 478ccbf3..a17d57b4 100644 --- a/src/anime-bridge/mpv-playback.test.ts +++ b/src/anime-bridge/mpv-playback.test.ts @@ -65,7 +65,6 @@ test('queued playback carries file-local title and language preferences into mpv ), ); assert.deepEqual(buildQueuedPlaybackCommands(options), [ - ['script-message', 'subminer-managed-subtitles-loading'], [ 'loadfile', 'https://video.example/episode.m3u8', diff --git a/src/anime-bridge/mpv-playback.ts b/src/anime-bridge/mpv-playback.ts index 8431a055..dcb82152 100644 --- a/src/anime-bridge/mpv-playback.ts +++ b/src/anime-bridge/mpv-playback.ts @@ -126,10 +126,7 @@ export function buildPlaybackCommands(options: BuildPlaybackOptions): MpvCommand /** Append a fully resolved stream without replacing the file playing now. */ export function buildQueuedPlaybackCommands(options: BuildPlaybackOptions): MpvCommand[] { - return [ - ['script-message', 'subminer-managed-subtitles-loading'], - ['loadfile', options.stream.url, 'append-play', -1, buildQueuedLoadfileOptions(options)], - ]; + return [['loadfile', options.stream.url, 'append-play', -1, buildQueuedLoadfileOptions(options)]]; } /** diff --git a/src/main/runtime/anime-browser-playback.test.ts b/src/main/runtime/anime-browser-playback.test.ts index 8a3b7a6c..eebb1fc2 100644 --- a/src/main/runtime/anime-browser-playback.test.ts +++ b/src/main/runtime/anime-browser-playback.test.ts @@ -141,6 +141,7 @@ test('queued video can append while subtitle caching continues in the background ], } as unknown as AnimeBridgeClient; const commands: Array> = []; + let removedDirs = 0; const playback = createAnimeBrowserPlayback({ deps: { sendMpvCommand: (command) => void commands.push(command), @@ -149,7 +150,9 @@ test('queued video can append while subtitle caching continues in the background fetch: async () => await fetchPending, makeTempDir: async () => '/tmp/subminer-queued-test', writeFile: async () => undefined, - removeDir: async () => undefined, + removeDir: async () => { + removedDirs += 1; + }, }, log: () => undefined, }, @@ -164,12 +167,20 @@ test('queued video can append while subtitle caching continues in the background playback.appendEpisode(result.playback); assert.equal(commands.at(-1)?.[2], 'append-play'); + const discardResult = await Promise.race([ + playback.discardEpisode(result.playback).then(() => 'discarded'), + new Promise<'pending'>((resolve) => setImmediate(() => resolve('pending'))), + ]); + assert.equal(discardResult, 'discarded'); + finishFetch({ ok: true, status: 200, arrayBuffer: async () => new TextEncoder().encode('1\n00:00:00,000 --> 00:00:01,000\n字幕').buffer, }); - await playback.discardEpisode(result.playback); + await result.playback.trackPreparation; + await new Promise(setImmediate); + assert.equal(removedDirs, 1); await playback.dispose(); }); diff --git a/src/main/runtime/anime-browser-playback.ts b/src/main/runtime/anime-browser-playback.ts index 783b9c7d..89ce7c7b 100644 --- a/src/main/runtime/anime-browser-playback.ts +++ b/src/main/runtime/anime-browser-playback.ts @@ -239,8 +239,13 @@ export function createAnimeBrowserPlayback(options: AnimeBrowserPlaybackOptions) deps.showMpvOsd?.(playback.metadata.displayTitle); } - async function discardEpisode(playback: PreparedAnimeBrowserPlayback): Promise { - await releasePreparedTracks(await playback.trackPreparation); + function discardEpisode(playback: PreparedAnimeBrowserPlayback): Promise { + void playback.trackPreparation + .then((preparedTracks) => releasePreparedTracks(preparedTracks)) + .catch((error) => { + deps.log(`[anime-browser] queued track cleanup failed: ${String(error)}`); + }); + return Promise.resolve(); } async function releasePreparedTracks(preparedTracks: PreparedTrackSetup): Promise {