mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-08 17:06:15 -08:00
Two compounding wins for the dashboard's M3U favorites path. #3 — Memoize loadM3uPlaylistFavorites The function calls getPlaylistById() which deserializes the entire M3U playlist payload (potentially 90K channels) just to read the favorites field and the matching items. On every dashboard mount, it re-paid that cost for every M3U playlist with favorites — even though nothing relevant had changed. Add a per-playlist cache keyed by playlist ID with a fingerprint of {updateDate, favorites JSON}. A cache hit skips the heavyweight playlist read entirely; a refresh (updateDate change) or favorites add/remove naturally invalidates without explicit busting. First mount still pays the parse; subsequent dashboard visits and re-renders are effectively free. #4 — Stream per-playlist favorites into the rail reloadM3uGlobalFavorites used Promise.all over loadM3uPlaylistFavorites and wrote one flat array at the end, so a single slow M3U playlist pinned the entire M3U favorites contribution behind it. Replace the writable m3uGlobalFavorites signal-of-array with a WritableSignal<Map<playlistId, items[]>> + computed flatten. Each playlist's contribution lands in the map as soon as ITS load resolves (usually instant via the new cache), so the favorites rail re-renders incrementally — Xtream favorites first, then each M3U playlist's favorites appear as it streams in. Cache + map entries for playlists that no longer have favorites are pruned at the start of each reload, so removed playlists don't leave stale state. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Entire-Checkpoint: fb28be89e785