4gray
e7467788ed
feat(downloads): enrich offline detail metadata
2026-08-01 16:29:50 +02:00
4gray
eff978d626
fix(downloads): use native disabled card styles
2026-08-01 16:29:50 +02:00
4gray
1ec0f444e4
feat(downloads): open ready cards in offline details
2026-08-01 16:29:50 +02:00
4gray
e8e2a31312
fix(downloads): normalize fragments before queries
2026-08-01 16:29:50 +02:00
4gray
5fd9b2eb35
fix(downloads): ignore fragments in shell route state
2026-08-01 16:29:50 +02:00
4gray
05ea3ad636
feat(downloads): add focused offline detail routes
2026-08-01 16:29:50 +02:00
4gray
95cdf83aa2
fix(downloads): preserve unknown episode coordinates
2026-08-01 16:29:50 +02:00
4gray
b2efcedda1
feat(downloads): derive offline detail content
2026-08-01 16:29:50 +02:00
4gray
103354df71
fix(downloads): preserve metadata error conventions
2026-08-01 16:29:50 +02:00
4gray
9d0b324805
fix(downloads): keep metadata service change focused
2026-08-01 16:29:50 +02:00
4gray
15a364ed51
feat(downloads): expose offline metadata updates
2026-08-01 16:29:50 +02:00
4gray
a3d774f05a
fix(downloads): complete metadata snapshot bridge contract
2026-08-01 16:29:50 +02:00
4gray
664d333f0f
feat(downloads): persist offline metadata snapshots
2026-08-01 16:29:50 +02:00
4gray
51d80c5c0c
feat(downloads): finish missing-file recovery
2026-08-01 16:29:50 +02:00
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
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
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
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
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