Optimize the live channel page path so unfiltered catalog pages are counted and paged in SQLite before serialization and enrichment.
Add the T42 CPU regression test covering a 50000-channel projected catalog.
Refs #42
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ensure full refresh marks the live projection as building before source refresh awaits, and expose phase-specific counters so language detection progress is determinate.
Covers #40 and #41.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Run Local AI language detection during full rebuilds after identity classification and restore variant expansion with a visible playing stream indicator.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Run full live catalog refreshes through live source sync, complete channel analysis, EPG source refresh, and persisted EPG rematching while keeping check-new incremental.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Separate incremental live checks from full catalog rebuilds and page projected channel/variant loading so first live-list display stays bounded.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Persist live channel language metadata across background projection rebuilds and target Local AI identity analysis to newly detected streams unless a manual full analysis is requested.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ensure automatic live projection rebuilds use the algorithmic path so Laya identity batches are not launched during live list playback or background sync.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add server-side Google Cast discovery and sessions, signed cast media URLs, browser device picker integration, and deployment documentation.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a browser-native casting service with Live and Watch player controls for Remote Playback and AirPlay-compatible devices.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Update the Docker build/push helper to build and push both application and Laya images, and document the configurable image targets.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Use configurable published images in docker-compose and update deployment docs so Compose works without a full checkout or local Dockerfiles.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Update deployment guidance for standard and Laya-profile Compose flows, and mark the Laya service as profile-gated.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Explain how to start the optional Laya runtime when model download fails because the service is unavailable, while keeping generic failures concise.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Require numeric query tokens to match numeric channel tokens exactly while preserving singular/plural and compact-name tolerance.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bound synchronous live channel enrichment and tolerate minimal projection payloads so analysis and listings do not blank the UI.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Filter projected live channels locally in the browser and apply server-side search and language filters before costly enrichment work.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Render active and inactive EPG priority lists, support move controls, and persist complete EPG source ordering from the settings UI.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add persistent EPG priority ordering, source reorder validation, and priority-aware EPG matching for live channels.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add language filter controls for projected live channels, preserve backend language views in the browser, and separate built-in EPG sources from custom sources.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add backend language detection, flexible live channel search, iptv-org catalog caching, and protected built-in EPG source registration.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Report post-projection Laya language detection as a busy analysis phase and normalize Laya language labels before caching and display.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Track the Laya identity phase separately from catalog projection progress and expose phase-specific counters through the live status API and Settings presentation.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ensure Docker images keep their container-built native dependencies, wait for the Laya sidecar healthcheck, expose accurate Laya readiness, and treat empty AI language batches as fallback failures.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Treat successful but empty live projections with existing live input as stale, reject them on the frontend, and keep the previous visible channel state during rebuild failures.
Add DOM coverage for the Settings analysis flow and backend serialization coverage for empty projection state.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fix the regression introduced by the weighted Laya signal (#16):
rebuild now merges exact fingerprints in every engine mode after
evaluating hard blockers, compares candidates against all variants
of a group, falls back to deterministic scoring when Laya is
unavailable, and reports transaction errors safely. Non-regression
tests cover the Laya-mode rebuild path; verified against a real
catalog copy (39,341 streams rebuilt successfully).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Introduce a liveGroupingScoring engine that combines existing
membership signals (normalized name, brand, number, metadata tokens,
language, category/source when relevant) with a bounded Laya
contribution: Laya raises or lowers confidence instead of acting as
a final judge, with guard-rails against obvious contradictions.
Sanitize Laya batch identity inputs in layaService and wire the
weighted scoring into the live projection service. Weights are not
exposed in the Nodecast UI. Cover signal combination, bounds and
contradiction guard-rails with tests.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
beIN Sports 1 variants stayed separated after projection because
names with region prefixes (C Car, C Reu, Thai), time-shift suffixes
(2h/4h/8h/12h) and language markers (En, Fr, Thai) produced distinct
fingerprints. Extend normalization in the server projection service
and the frontend grouping fallback to fold these into one logical
channel, with tests on the exact reported names. Clarify the Laya
language detection warning so a language-matching failure is not
mistaken for a grouping failure, and bump script versions for cache
refresh.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>