Commit Graph
2692 Commits
Author SHA1 Message Date
4gray 5808511658 test(downloads): cover missing-file and series journeys 2026-08-01 16:29:50 +02:00
4gray 63b87da5f3 refactor(downloads): simplify ready cards 2026-08-01 16:29:50 +02:00
4gray 8a5b29ea4d feat(downloads): surface missing files for recovery 2026-08-01 16:29:50 +02:00
4gray 596f5a8d4d feat(downloads): separate missing files from ready media 2026-08-01 16:29:50 +02:00
4gray 2899091b74 feat(downloads): refresh missing local files 2026-08-01 16:29:50 +02:00
4gray 8a685ebf20 feat(downloads): recover missing completed files 2026-08-01 16:29:50 +02:00
4gray bd61426d8e feat(downloads): derive completed file availability 2026-08-01 16:29:50 +02:00
4gray 263f0f3d52 docs(downloads): plan missing-file recovery 2026-08-01 16:29:50 +02:00
4gray 830f50dfcd docs(downloads): design missing-file recovery 2026-08-01 16:29:50 +02:00
4gray 55a009c1fe docs(downloads): clarify provider playback availability 2026-08-01 16:29:50 +02:00
4gray 26b20658e3 fix(downloads): keep offline Xtream playback available 2026-08-01 16:29:50 +02:00
4gray 5511d66651 fix(xtream): ignore stale VOD positions 2026-08-01 16:29:50 +02:00
4gray 1d996b85f0 fix(xtream): isolate reused detail identities 2026-08-01 16:29:50 +02:00
4gray 6500807701 docs(downloads): clarify Stalker navigation fallback 2026-08-01 16:29:50 +02:00
4gray 3eda25ac3c fix(downloads): open Stalker items in provider details 2026-08-01 16:29:50 +02:00
4gray 4e7ed33d05 docs(downloads): format detail navigation plan 2026-08-01 16:29:49 +02:00
4gray 823d38bac0 docs(downloads): document offline detail behavior 2026-08-01 16:29:49 +02:00
4gray efbee7cc48 test(downloads): cover offline detail journey 2026-08-01 16:29:49 +02:00
4gray 89e708c591 fix(downloads): prefer local playback in Xtream details 2026-08-01 16:29:49 +02:00
4gray 0313dd7a9b fix(downloads): preserve external launch priority 2026-08-01 16:29:49 +02:00
4gray 95aa73058b fix(downloads): prefer local playback in shared details 2026-08-01 16:29:49 +02:00
4gray 34fa69e6f5 fix(downloads): honor the global cover size 2026-08-01 16:29:49 +02:00
4gray 727ea58bd7 test(downloads): cover pending series navigation 2026-08-01 16:29:49 +02:00
4gray 4f3567e1d0 fix(downloads): open completed movies in details 2026-08-01 16:29:49 +02:00
4gray 5ef5d6713f docs(downloads): plan detail navigation follow-up 2026-08-01 16:29:49 +02:00
4gray 211000a8e3 docs(downloads): clarify detail-first offline behavior 2026-08-01 16:29:49 +02:00
4gray bcc2e36a05 feat(downloads): finish manager MVP 2026-08-01 16:29:49 +02:00
4gray eb55c17a05 feat(downloads): add active download queue 2026-08-01 16:29:49 +02:00
4gray 8e1af010a9 feat(downloads): add ready-to-watch library 2026-08-01 16:29:49 +02:00
4gray 28770aad09 fix(downloads): report library navigation failures 2026-08-01 16:29:49 +02:00
4gray ce251e5f9b refactor(downloads): isolate library navigation 2026-08-01 16:29:49 +02:00
4gray bff9ca1491 fix(downloads): stabilize malformed view model data 2026-08-01 16:29:49 +02:00
4gray aae5450f4c test(downloads): close view model coverage gaps 2026-08-01 16:29:49 +02:00
4gray d6e1ee5d0c feat(downloads): derive queue and library view model 2026-08-01 16:29:49 +02:00
4gray bc29f24eb2 fix(downloads): make active count accessible 2026-08-01 16:29:49 +02:00
4gray 117bd75f01 fix(downloads): keep renderer download state global 2026-08-01 16:29:49 +02:00
4gray 505face7e4 docs(downloads): tighten manager validation plan 2026-08-01 16:29:49 +02:00
4gray 6995b5765a docs(downloads): plan manager MVP implementation 2026-08-01 16:29:49 +02:00
4gray b7f02c51b4 docs(downloads): specify manager MVP redesign 2026-08-01 16:29:49 +02:00
4grayandClaude Fable 5 9bb1811984 fix(playback): escape commas in mpv header fields on the TS paths (#1323)
* fix(playback): escape commas in mpv header fields on the TS paths

PR #1321 fixed the comma truncation of --http-header-fields inside the
native embedded-mpv addon, but the same OPT_STRINGLIST parsing bites
three TypeScript call sites that join header fields with ',':

- external MPV CLI launch (--http-header-fields=...)
- external MPV instance reuse (set_property http-header-fields)
- embedded MPV frame-copy loadfile options (opt.http-header-fields);
  the helper's %len% quoting protects only the option-list level, mpv
  still stringlist-parses the value afterwards

The Stalker MAG user agent contains "(KHTML, like Gecko)", so strict
portals received a truncated X-User-Agent and rejected live streams
with HTTP 400 (#910). Escape backslashes and commas per field with the
same scheme as the native fix, via a shared util.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(playback): cover the reused-instance IPC header escaping

Review follow-up (Greptile on #1323): the regression coverage only
exercised the CLI spawn path. Capture the JSON IPC traffic of a second,
reused mpv launch and assert the escaped MAG user agent survives the
set_property http-header-fields transport, so later serialization
changes cannot silently reintroduce truncated headers. net is mocked
with a passthrough default because the VLC specs bind a real ephemeral
port via createServer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-01 16:19:38 +02:00
wretchwatson 814161274b fix(playback): escape commas in mpv http header fields (#1321) 2026-08-01 15:17:48 +02:00
4gray b14ce2452b fix(packaging): add verified source mirror fallback (#1325) 2026-08-01 15:15:09 +02:00
4gray 9f4e11d6de fix(playback): structure Shaka diagnostics (#1318)
* docs(playback): design structured Shaka diagnostics

* fix(playback): structure Shaka diagnostics

* docs(playback): document Shaka evidence boundary

* docs(playback): fix Shaka validation commands

* fix(playback): preserve Shaka fallback evidence

* fix(playback): preserve Shaka text error evidence
2026-07-31 21:25:06 +02:00
4gray 9a50e7385b fix(playback): structure Video.js diagnostics (#1317) 2026-07-31 09:15:49 +02:00
4gray 46c7713841 fix(ui): preserve EPG in narrow channel rows (#1312)
Preserve current-program context and enabled actions in narrow channel rows while aligning loaded rows, skeletons, and virtual-scroll geometry across M3U, Xtream, Stalker, Favorites, and Recent views.
2026-07-31 08:27:36 +02:00
4gray 2ac0de752f fix(skills): align repository guidance with implementation (#1315)
* docs(skills): design implementation synchronization

* docs(skills): plan implementation synchronization

* fix(release): filter internal notes from public body

* docs(release): synchronize release workflow guidance

* fix(stalker): normalize catalog series flags

* fix(stalker): preserve progress with scoped episode IDs

* fix(playback): expose strict position persistence

* docs(stalker): record series position compatibility

* test(skills): validate repository skill contracts

* fix(database): keep SQL trace values private

* docs(skills): refresh Nx and SQLite ownership

* docs(skills): align provider and UI guidance

* docs(skills): tighten validated guidance

* docs(release): require exact release pushes

* style(electron): remove trailing blank line

* fix(ci): classify repository skills coverage
2026-07-31 08:00:59 +02:00
4gray 99d167993d fix(playback): structure HLS diagnostics (#1316)
* docs(playback): design structured HLS diagnostics

* docs(playback): plan structured HLS diagnostics

* fix(playback): structure HLS diagnostics

* docs(playback): document structured HLS evidence

* fix(playback): keep HLS startup logs private
2026-07-31 07:33:05 +02:00
4gray bf13849d69 fix(playback): avoid false codec diagnostics (#1314)
* docs(playback): design accurate native diagnostics

* docs(playback): plan accurate native diagnostics

* fix(playback): classify native source errors from evidence

* fix(playback): preserve Video.js HTTP error context

* fix(playback): show explicit HTTP playback errors

* docs(playback): document native error evidence
2026-07-30 19:55:35 +02:00
4gray 32ba209b63 fix(portals): restore fresh-import pins atomically (#1311)
* fix(portals): restore fresh-import pins atomically

* fix(portals): preserve Xtream restore retry state

* fix(portals): serialize Xtream restore revisions
2026-07-30 07:40:03 +02:00
4gray 78df3e7dbb fix(portals): match Greek titles whichever sigma the provider typed (#1310)
Greek Σ has two lowercase forms — medial σ and word-final ς — and neither the
candidate query nor the confirmation treated them as one letter.

The GLOB scan built each character's class from a one-way reach that only
arrived at ς when it started from ς, so a request for "ΑΣ" never admitted a
stored "Ας". Classes are now built from a fold group — every character sharing
an uppercase form — derived by scanning the cased ranges at module load the way
ACCENTED_BY_BASE already is. It generalises past sigma on its own: dotless ı
folds with i, long ſ with s, historic Cyrillic letterforms with В Д О С Т Ъ Ѣ.
Only the 24 groups of 767 that a per-character fold would miss are kept.

Admitting the row was only half of it. normalizeTitleKeys then compared "ασ"
against "ας" and discarded it, because toLowerCase picks the sigma form by
position. Both SQL tiers already folded them together — SQLite's trigram
tokenizer does full Unicode folding natively, unlike LOWER() — so the JS
confirmation was the only tier that did not, making this a pre-existing gap on
the FTS path as well. Normalization now rewrites ς to σ after lowercasing,
which is what Unicode case folding does.

Guards unchanged: a case mapping that changes length (ß → SS, İ) or a GLOB
metacharacter still returns null rather than a partial pattern.
2026-07-29 23:14:59 +02:00