feat(anime): append queued episodes to mpv playlist

- Resolve queued streams immediately and cache subtitles in the background
- Attach prepared tracks as mpv advances through the playlist
This commit is contained in:
2026-08-15 21:44:51 -07:00
parent 183560d2c3
commit 935e4c145f
21 changed files with 660 additions and 289 deletions
+21
View File
@@ -3330,6 +3330,13 @@ const animeBrowserRuntime = createAnimeBrowserRuntime({
client.on('end-file', listener);
return () => client.off('end-file', listener);
},
onPlaybackPathChange: (listener) => {
const client = appState.mpvClient;
if (!client) return () => {};
const handler = ({ path: mediaPath }: { path: string }) => listener(mediaPath);
client.on('media-path-change', handler);
return () => client.off('media-path-change', handler);
},
readMpvProperty: (name) => {
const client = appState.mpvClient;
if (!client) return Promise.reject(new Error('mpv is not connected.'));
@@ -3370,6 +3377,20 @@ const animeBrowserRuntime = createAnimeBrowserRuntime({
episodeNumber: metadata.episodeNumber,
});
},
onPreparedPlaybackMetadata: (metadata) => {
streamPlaybackMetadata.set(metadata);
// Register the URL alias before mpv can advance to it, but do not replace
// the title of the file that is still playing now.
ensureImmersionTrackerStarted();
appState.immersionTracker?.recordStreamPlaybackMetadata({
mediaPath: metadata.mediaPath,
statsPath: metadata.statsPath,
displayTitle: metadata.displayTitle,
seriesTitle: metadata.seriesTitle,
seasonNumber: metadata.seasonNumber,
episodeNumber: metadata.episodeNumber,
});
},
onBridgeState: (state) => {
const window = appState.animeBrowserWindow;
if (window && !window.isDestroyed()) {