fix(anime): keep browser state in sync and alias HLS segments

- Toggle the player Anime Browser without losing its state
- Share active playback state and support rotating fake segment extensions
This commit is contained in:
sudacode committed 2026-08-15 23:35:37 -07:00
1 parent 7a1450ddb7
commit 877f350353
34 files changed
+612 -43

No files matched your search

+51
View File
@@ -0,0 +1,51 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import { nextPlaybackCue, playingEpisodeForAnime } from './episode-playback';
const selected = { sourceId: 'source.one', url: '/anime/one', title: 'One' };
test('playing episode sync applies only to the matching source and anime', () => {
assert.equal(
playingEpisodeForAnime(
{ sourceId: 'source.one', animeUrl: '/anime/one', episodeUrl: '/episode/3' },
selected,
),
'/episode/3',
);
assert.equal(
playingEpisodeForAnime(
{ sourceId: 'source.two', animeUrl: '/anime/one', episodeUrl: '/episode/3' },
selected,
),
null,
);
assert.equal(
playingEpisodeForAnime(
{ sourceId: 'source.one', animeUrl: '/anime/two', episodeUrl: '/episode/3' },
selected,
),
null,
);
assert.equal(playingEpisodeForAnime(null, selected), null);
});
test('live playback sync preserves a pending episode cue until resolution finishes', () => {
const loading = { url: '/episode/4', state: 'loading' as const };
assert.equal(
nextPlaybackCue(
{ sourceId: 'source.one', animeUrl: '/anime/one', episodeUrl: '/episode/3' },
selected,
loading,
),
loading,
);
assert.deepEqual(
nextPlaybackCue(
{ sourceId: 'source.one', animeUrl: '/anime/one', episodeUrl: '/episode/3' },
selected,
{ url: '/episode/2', state: 'playing' },
),
{ url: '/episode/3', state: 'playing' },
);
});