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:
2026-08-15 23:35:37 -07:00
parent 7a1450ddb7
commit 877f350353
34 changed files with 612 additions and 43 deletions
+36
View File
@@ -0,0 +1,36 @@
export const ANIME_BROWSER_CLOSE_MESSAGE = 'subminer:anime-browser-close';
const ANIME_BROWSER_KEYDOWN_MESSAGE = 'subminer:anime-browser-keydown';
export interface AnimeBrowserKeydownMessage {
type: typeof ANIME_BROWSER_KEYDOWN_MESSAGE;
bindingKey: string;
repeat: boolean;
}
export function createAnimeBrowserKeydownMessage(
event: Pick<KeyboardEvent, 'altKey' | 'code' | 'ctrlKey' | 'metaKey' | 'repeat' | 'shiftKey'>,
): AnimeBrowserKeydownMessage {
const parts: string[] = [];
if (event.ctrlKey) parts.push('Ctrl');
if (event.altKey) parts.push('Alt');
if (event.shiftKey) parts.push('Shift');
if (event.metaKey) parts.push('Meta');
parts.push(event.code);
return {
type: ANIME_BROWSER_KEYDOWN_MESSAGE,
bindingKey: parts.join('+'),
repeat: event.repeat,
};
}
export function isAnimeBrowserKeydownMessage(value: unknown): value is AnimeBrowserKeydownMessage {
if (!value || typeof value !== 'object') return false;
const message = value as Partial<AnimeBrowserKeydownMessage>;
return (
message.type === ANIME_BROWSER_KEYDOWN_MESSAGE &&
typeof message.bindingKey === 'string' &&
message.bindingKey.length > 0 &&
typeof message.repeat === 'boolean'
);
}
+3
View File
@@ -140,6 +140,7 @@ export const IPC_CHANNELS = {
animeBrowserDequeueEpisode: 'anime-browser:dequeue-episode',
animeBrowserClearQueue: 'anime-browser:clear-queue',
animeBrowserGetQueue: 'anime-browser:get-queue',
animeBrowserGetPlaybackState: 'anime-browser:get-playback-state',
animeBrowserIsPlaying: 'anime-browser:is-playing',
animeBrowserGetPreferences: 'anime-browser:get-preferences',
animeBrowserSetPreference: 'anime-browser:set-preference',
@@ -174,6 +175,7 @@ export const IPC_CHANNELS = {
sessionHelpOpen: 'session-help:open',
changelogOpen: 'changelog:open',
animeBrowserOpen: 'anime-browser:open',
animeBrowserClose: 'anime-browser:close',
characterDictionaryManagerOpen: 'character-dictionary:manager-open',
controllerSelectOpen: 'controller-select:open',
controllerDebugOpen: 'controller-debug:open',
@@ -187,6 +189,7 @@ export const IPC_CHANNELS = {
animeBrowserBridgeState: 'anime-browser:bridge-state',
animeBrowserSearchUpdate: 'anime-browser:search-update',
animeBrowserQueueState: 'anime-browser:queue-state',
animeBrowserPlaybackState: 'anime-browser:playback-state',
},
} as const;