From 996a85de767f41804230a88054092c3a31aa3c86 Mon Sep 17 00:00:00 2001 From: lashman Date: Tue, 24 Mar 2026 10:48:59 +0200 Subject: [PATCH] formatters, device profile, media matching, subtitle utils, syncplay, trakt --- src/lib/anime-filler.ts | 90 ++++++++ src/lib/audio-graph.ts | 120 +++++++++++ src/lib/bookmarks.ts | 79 +++++++ src/lib/canon-lists.ts | 96 +++++++++ src/lib/cast.ts | 60 ++++++ src/lib/density.ts | 26 +++ src/lib/device-profile.ts | 218 +++++++++++++++++++ src/lib/diary-export.ts | 143 ++++++++++++ src/lib/discover-icons.ts | 95 ++++++++ src/lib/discover-moods.ts | 202 +++++++++++++++++ src/lib/downloads.ts | 94 ++++++++ src/lib/episode-meta-context.tsx | 70 ++++++ src/lib/episode-meta.ts | 60 ++++++ src/lib/episode-order.ts | 63 ++++++ src/lib/format.test.ts | 30 +++ src/lib/format.ts | 203 ++++++++++++++++++ src/lib/genre-icons.ts | 69 ++++++ src/lib/icons.ts | 165 ++++++++++++++ src/lib/item-types.ts | 149 +++++++++++++ src/lib/jellyfin-meta.ts | 225 +++++++++++++++++++ src/lib/log.ts | 15 ++ src/lib/logo-tone.ts | 85 ++++++++ src/lib/player-shortcuts.ts | 358 +++++++++++++++++++++++++++++++ src/lib/query-client.ts | 16 ++ src/lib/recap-trigger.ts | 60 ++++++ src/lib/sensitive-storage.ts | 148 +++++++++++++ src/lib/share.ts | 46 ++++ src/lib/skip-tracker.ts | 34 +++ src/lib/stats.ts | 147 +++++++++++++ src/lib/studios-and-networks.ts | 40 ++++ src/lib/subtitle-match.ts | 123 +++++++++++ src/lib/subtitle-style.ts | 92 ++++++++ src/lib/syncplay-socket.ts | 141 ++++++++++++ src/lib/syncplay.ts | 87 ++++++++ src/lib/tauri.ts | 11 + src/lib/time-saved.ts | 61 ++++++ src/lib/tmdb-genres.ts | 61 ++++++ src/lib/tmdb-mapping.ts | 61 ++++++ src/lib/top-genre.ts | 27 +++ src/lib/trakt.ts | 283 ++++++++++++++++++++++++ src/lib/watch-stats.ts | 153 +++++++++++++ 41 files changed, 4306 insertions(+) create mode 100644 src/lib/anime-filler.ts create mode 100644 src/lib/audio-graph.ts create mode 100644 src/lib/bookmarks.ts create mode 100644 src/lib/canon-lists.ts create mode 100644 src/lib/cast.ts create mode 100644 src/lib/density.ts create mode 100644 src/lib/device-profile.ts create mode 100644 src/lib/diary-export.ts create mode 100644 src/lib/discover-icons.ts create mode 100644 src/lib/discover-moods.ts create mode 100644 src/lib/downloads.ts create mode 100644 src/lib/episode-meta-context.tsx create mode 100644 src/lib/episode-meta.ts create mode 100644 src/lib/episode-order.ts create mode 100644 src/lib/format.test.ts create mode 100644 src/lib/format.ts create mode 100644 src/lib/genre-icons.ts create mode 100644 src/lib/icons.ts create mode 100644 src/lib/item-types.ts create mode 100644 src/lib/jellyfin-meta.ts create mode 100644 src/lib/log.ts create mode 100644 src/lib/logo-tone.ts create mode 100644 src/lib/player-shortcuts.ts create mode 100644 src/lib/query-client.ts create mode 100644 src/lib/recap-trigger.ts create mode 100644 src/lib/sensitive-storage.ts create mode 100644 src/lib/share.ts create mode 100644 src/lib/skip-tracker.ts create mode 100644 src/lib/stats.ts create mode 100644 src/lib/studios-and-networks.ts create mode 100644 src/lib/subtitle-match.ts create mode 100644 src/lib/subtitle-style.ts create mode 100644 src/lib/syncplay-socket.ts create mode 100644 src/lib/syncplay.ts create mode 100644 src/lib/tauri.ts create mode 100644 src/lib/time-saved.ts create mode 100644 src/lib/tmdb-genres.ts create mode 100644 src/lib/tmdb-mapping.ts create mode 100644 src/lib/top-genre.ts create mode 100644 src/lib/trakt.ts create mode 100644 src/lib/watch-stats.ts diff --git a/src/lib/anime-filler.ts b/src/lib/anime-filler.ts new file mode 100644 index 0000000..a9f3c54 --- /dev/null +++ b/src/lib/anime-filler.ts @@ -0,0 +1,90 @@ +import { useEffect, useState } from 'react' + +/** + * Bundled per-show anime filler classification. Lives at + * `/data/anime-filler.json`, fetched on demand. Keyed by TMDB id (string). + * + * Shape: + * { + * "": { + * "filler": [12, 13, 28, 29, 30], + * "mostlyFiller": [60, 84] + * } + * } + * + * This is a v1 curated bundled list - covers Naruto, Bleach, One Piece, + * Dragon Ball Z, Hunter x Hunter (1999), etc. Easy to extend by editing + * the JSON. We deliberately don't go online for it because no public + * filler API has reliable CORS / uptime, and the underlying lists rarely + * change. + */ + +export type FillerFlag = 'filler' | 'mostly-filler' | 'canon' | null + +interface ShowFillerData { + filler?: number[] + mostlyFiller?: number[] +} + +type FillerDb = Record + +let cache: FillerDb | null = null +let cachePromise: Promise | null = null + +async function loadFillerDb(): Promise { + if (cache) return cache + if (cachePromise) return cachePromise + cachePromise = (async () => { + try { + const res = await fetch('/data/anime-filler.json') + if (!res.ok) return {} + cache = (await res.json()) as FillerDb + return cache + } catch { + cache = {} + return cache + } + })() + return cachePromise +} + +/** + * Hook: load the filler database once and look up the entry for a given + * TMDB id. Returns null until the data is loaded, or if the show isn't in + * the list (the common case for non-anime). + */ +export function useAnimeFiller(tmdbId?: string | number | null) { + const id = tmdbId != null ? String(tmdbId) : null + const [data, setData] = useState(null) + useEffect(() => { + if (!id) { + setData(null) + return + } + let cancelled = false + loadFillerDb().then(db => { + if (cancelled) return + setData(db[id] || null) + }) + return () => { + cancelled = true + } + }, [id]) + return data +} + +/** + * Classify an absolute episode number against the loaded filler data. + * Anime filler lists almost always count by absolute episode number, not + * by season + episode, so the caller should pass the running episode + * count rather than the per-season number. + */ +export function classifyEpisode( + absoluteEpisode: number, + data: ShowFillerData | null, +): FillerFlag { + if (!data) return null + if (data.filler?.includes(absoluteEpisode)) return 'filler' + if (data.mostlyFiller?.includes(absoluteEpisode)) return 'mostly-filler' + return 'canon' +} diff --git a/src/lib/audio-graph.ts b/src/lib/audio-graph.ts new file mode 100644 index 0000000..1e6671c --- /dev/null +++ b/src/lib/audio-graph.ts @@ -0,0 +1,120 @@ +/** + * Lazy Web Audio graph wrapped around the player's