feat(anime): filter episodes and mark them watched by hand

- Add a filter box above the episode list for a number, range, or name substring, with a "N of M" counter
- Read watch marks from the immersion tracker stats and show them per episode, with a watched count in the header, refreshed on window focus
- Add a right-click menu to mark one episode or a whole catch-up span (this and everything below) watched/unwatched
- Add setWatched/getWatchState IPC plumbing so a manual mark creates the stats row for an episode that was never played
This commit is contained in:
2026-08-03 01:00:54 -07:00
parent c510cd8d90
commit 0889910687
23 changed files with 1601 additions and 111 deletions
+21
View File
@@ -0,0 +1,21 @@
/**
* Which episodes a manual watch mark applies to.
*
* Sources list newest first, so "everything below" the row you right-clicked is
* the back catalogue: the natural shape of "I have watched up to here". The
* span is taken from the full list rather than from what the filter leaves,
* because a filter narrows what you are looking at, not what you have watched.
*/
export type MarkScope = 'one' | 'below';
export function episodesInScope<T>(episodes: T[], index: number, scope: MarkScope): T[] {
if (index < 0 || index >= episodes.length) return [];
return scope === 'one' ? [episodes[index]!] : episodes.slice(index);
}
/** "3 episodes" / "1 episode", for the status line after a bulk mark. */
export function describeMarkCount(count: number, watched: boolean): string {
const noun = count === 1 ? 'episode' : 'episodes';
return watched ? `Marked ${count} ${noun} watched` : `Cleared the watch mark on ${count} ${noun}`;
}