4gray
fd96b85c19
feat(playback): recommend recovery actions ( #1374 )
...
* docs(playback): design recovery recommendations
* docs(playback): plan recovery recommendations
* refactor(playback): extract diagnostic utilities
* feat(playback): define recovery recommendation contracts
* feat(playback): rank recovery recommendations
* feat(playback): track session recovery attempts
* feat(playback): identify content recovery sessions
* feat(ui): add ranked playback diagnostic panel
* feat(playback): switch temporarily to recommended players
* test(playback): cover temporary player recommendation
* test(playback): verify recommendation capability guards
* docs(playback): document recovery recommendations
* fix(playback): keep recovery keys credential-free
* fix(playback): remove derived tracking ownership
* fix(playback): preserve distinct recovery fallbacks
* fix(playback): reset resume for new sources
* fix(playback): preserve desktop recovery guidance
* docs(playback): clarify recovery policy exceptions
* fix(playback): reject stale progress updates
* fix(playback): keep protected recovery guidance neutral
* test(playback): cover stale progress output
* fix(playback): neutralize protected diagnostic copy
* fix(playback): harden runtime guidance ownership
* fix(playback): stabilize recovery application ownership
* fix(ci): classify playback util coverage
* fix(e2e): preserve playback fixture bytes
2026-08-08 01:04:39 +02:00
4gray
96facd6f49
feat(downloads): queue season episode downloads ( #1357 )
...
* docs(downloads): specify season queueing
* docs(downloads): plan season queue implementation
* feat(downloads): define episode queue identity
* fix(downloads): align episode identity contract
* feat(downloads): coordinate season queue submissions
* fix(downloads): keep queue coordination provider neutral
* fix(downloads): reconcile legacy episode identities
* fix(downloads): fail closed on invalid stored coordinates
* refactor(downloads): adapt Xtream episode requests
* fix(downloads): use canonical Stalker episode ids
* test(downloads): cover Stalker adapter reactivity
* feat(downloads): add selected season queue action
* refactor(downloads): extract season download presenter
* feat(downloads): localize season queue feedback
* test(downloads): cover series batch queue flow
* test(downloads): harden series queue fixtures
* docs(downloads): describe season queueing
* docs(downloads): clarify season queue IPC contract
* fix(downloads): isolate season header build warnings
* fix(downloads): label season view toggles
* fix(downloads): preserve Xtream episode headers
* fix(downloads): fail closed on stale episode state
* fix(downloads): align renderer queue safeguards
* fix(downloads): block ambiguous episode actions
* fix(downloads): accept nullable legacy coordinates
* fix(downloads): preserve scoped episode ownership
* fix(downloads): probe restored files asynchronously
* fix(downloads): bound restored file probes
* fix(downloads): release timed out file probes
* fix(downloads): bound file probe callers
* fix(downloads): refresh stable season skips
* fix(downloads): fail closed before provider prep
* fix(downloads): preserve retained partial ownership
* fix(downloads): reconcile partial cleanup completion
* fix(downloads): await authoritative list refresh
* fix(downloads): coalesce list refreshes
* fix(downloads): preserve specials season identity
* fix(stalker): preserve specials season mapping
* fix(downloads): distinguish missing Xtream seasons
2026-08-03 08:53:44 +02:00
4gray
dac0dfdb6c
docs(website): add unofficial sites post cover
2026-08-02 12:10:02 +02:00
4gray
347e3cd2f8
docs(website): define unofficial sites cover design
2026-08-02 12:10:02 +02:00
4gray
760099358b
feat(downloads): redesign download manager ( #1313 )
...
* docs(downloads): specify manager MVP redesign
* docs(downloads): plan manager MVP implementation
* docs(downloads): tighten manager validation plan
* fix(downloads): keep renderer download state global
* fix(downloads): make active count accessible
* feat(downloads): derive queue and library view model
* test(downloads): close view model coverage gaps
* fix(downloads): stabilize malformed view model data
* refactor(downloads): isolate library navigation
* fix(downloads): report library navigation failures
* feat(downloads): add ready-to-watch library
* feat(downloads): add active download queue
* feat(downloads): finish manager MVP
* docs(downloads): clarify detail-first offline behavior
* docs(downloads): plan detail navigation follow-up
* fix(downloads): open completed movies in details
* test(downloads): cover pending series navigation
* fix(downloads): honor the global cover size
* fix(downloads): prefer local playback in shared details
* fix(downloads): preserve external launch priority
* fix(downloads): prefer local playback in Xtream details
* test(downloads): cover offline detail journey
* docs(downloads): document offline detail behavior
* docs(downloads): format detail navigation plan
* fix(downloads): open Stalker items in provider details
* docs(downloads): clarify Stalker navigation fallback
* fix(xtream): isolate reused detail identities
* fix(xtream): ignore stale VOD positions
* fix(downloads): keep offline Xtream playback available
* docs(downloads): clarify provider playback availability
* docs(downloads): design missing-file recovery
* docs(downloads): plan missing-file recovery
* feat(downloads): derive completed file availability
* feat(downloads): recover missing completed files
* feat(downloads): refresh missing local files
* feat(downloads): separate missing files from ready media
* feat(downloads): surface missing files for recovery
* refactor(downloads): simplify ready cards
* test(downloads): cover missing-file and series journeys
* feat(downloads): finish missing-file recovery
* docs(downloads): design offline detail views
* docs(downloads): plan offline detail views
* feat(downloads): persist offline metadata snapshots
* fix(downloads): complete metadata snapshot bridge contract
* feat(downloads): manage offline metadata snapshots
* fix(downloads): harden metadata snapshot updates
* fix(downloads): restrict snapshot artwork
* fix(downloads): guard restart artwork URL
* fix(downloads): refine artwork URL checks
* feat(downloads): expose offline metadata updates
* fix(downloads): keep metadata service change focused
* fix(downloads): preserve metadata error conventions
* feat(downloads): derive offline detail content
* fix(downloads): preserve unknown episode coordinates
* feat(downloads): add focused offline detail routes
* fix(downloads): ignore fragments in shell route state
* fix(downloads): normalize fragments before queries
* feat(downloads): open ready cards in offline details
* fix(downloads): use native disabled card styles
* feat(downloads): enrich offline detail metadata
* fix(downloads): harden offline metadata resolution
* fix(downloads): preserve stalker provider titles
* fix(downloads): distinguish stalker metadata seeds
* fix(downloads): stabilize offline metadata refresh
* fix(downloads): throttle sparse metadata refreshes
* fix(downloads): type metadata language settings
* feat(downloads): render offline movie and series details
* fix(downloads): harden offline detail interactions
* fix(downloads): close offline detail edge cases
* feat(downloads): hand off to provider-only details
* fix(downloads): preserve stalker provider handoff
* feat(downloads): capture metadata at download time
* fix(downloads): preserve snapshot source semantics
* fix(downloads): preserve episode snapshot identity
* docs(downloads): document offline details flow
* docs(downloads): clarify stalker provider fallback
* test(downloads): cover offline detail journeys
* test(downloads): stabilize offline detail selectors
* style(downloads): format changed files
* docs(downloads): clean design spec formatting
* fix(downloads): preserve offline library ownership
* test(downloads): fix Windows workspace navigation
* test(database): preserve Electron tsconfig resolution
* perf(downloads): avoid blocking file availability probes
2026-08-01 18:09:31 +02:00
4gray
0c59aace71
fix(playback): structure MPEG-TS diagnostics ( #1327 )
...
* docs(playback): design structured mpegts diagnostics
* docs(playback): plan structured mpegts diagnostics
* fix(playback): structure mpegts error evidence
* fix(playback): structure HTML5 mpegts errors
* fix(playback): share mpegts evidence across players
* fix(playback): render structured mpegts evidence
* docs(playback): document structured mpegts diagnostics
* chore(playback): keep diagnostics lint clean
* docs(playback): complete mpegts diagnostics plan
2026-08-01 17:13:16 +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
a2fafcfc08
test(performance): add end-to-end Xtream benchmark harness ( #1300 )
...
* docs(performance): plan Xtream benchmark
* feat(xtream-mock-server): add deterministic 100k fixture
* style(xtream-mock-server): apply repository formatting
* fix(xtream-mock-server): harden performance fixture data
* feat(xtream-mock-server): add performance control plane
* docs(performance): correct Xtream capture plan
* fix(xtream-mock-server): harden performance controls
* fix(xtream-mock-server): harden control lifecycle
* feat(performance): add Xtream preload markers
* feat(performance): trace Xtream main phases
* feat(performance): mark Xtream store publications
* feat(performance): trace Xtream database phases
* feat(performance): trace Xtream delete cancellation
* feat(performance): capture Xtream phase attribution
* feat(performance): mark Sources Xtream refresh
* test(performance): define Xtream benchmark evidence contracts
* test(performance): add Xtream benchmark runner
* test(performance): surface failure evidence writes
* test(performance): align database read clock
* test(performance): preserve capture failure contracts
2026-07-28 08:08:07 +02:00
4gray
e55d55b47f
feat(mock-data): add shared screenshot-safe poster catalog ( #1271 )
...
Moves the fictional movie catalog into `libs/shared/marketing-fixtures` so the
Xtream and Stalker mocks describe the same titles, and adds 20 rendered posters
plus the shared fixture types behind them.
Supporting changes made while getting it green:
- `shared-marketing-fixtures` is classified Tier B in the coverage policy. Not
Tier A: it is fictional fixture data, so a statement percentage over it means
nothing, and a Tier A entry would pull it into the merged coverage map and the
ratchet. Tier B still runs its spec in CI. `stalker-mock-server` needs no entry
of its own — it is already Tier C and the Tier B/C runner falls back to
`pnpm nx test <project>`, so its new `marketing-poster-url.spec.ts` runs.
- Two release-capture defects the catalog reorder introduced, both fixed in
`tools/release/capture-app-driver.ts`:
- VOD stream ids are `MARKETING_VOD_STREAM_ID_BASE + index` and the generator
now lists the showcase movies first, so 62000-62002 became Black Harbor, The
Paper Astronaut and Summer Static while the dashboard seeding still mapped
those ids to the previous titles' backdrops.
- the raw `tsx` spawn of the Xtream mock lacked `--tsconfig
tsconfig.base.json`, so the mock could not resolve
`@iptvnator/shared/marketing-fixtures` and the capture never started. Both
mock projects' own serve targets already passed the flag.
2026-07-27 08:10:57 +02:00
4gray
08b868d6c1
test(electron): harden runtime boundary coverage ( #1267 )
...
Adds contract-focused regression coverage for the Electron HTTP server,
remote-control events, settings events, and managed download paths, and makes
Tier A coverage fail closed when instrumentation fails or a runtime-owning
production file disappears from a project or from the merged Istanbul report.
The old `coverage:ci` exited 0 despite a `Failed to collect coverage`
diagnostic: libs/m3u-state/src/lib/effects.ts was simply absent from the merged
map. All 30 Tier A reports are now required, the merged map covers 710 files,
and effects.ts is reported as 0/159 instead of silently disappearing.
Also fixes remote static-file path containment for encoded, malformed, NUL,
POSIX and Win32-style traversal inputs, with behavior-preserving testability
seams.
Statements 69.27% -> 69.54%; http-server.ts 0% -> 90.21%,
remote-control.events.ts 0% -> 96.55%, settings.events.ts 59.25% -> 96.29%.
2026-07-26 22:27:50 +02:00
4gray
d308749e2c
fix(stalker): preserve is_series episode metadata ( #1218 )
2026-07-21 07:51:37 +02:00
4gray
48ff4b9cc5
fix(portal): remove redundant catalog type badges ( #1217 )
...
Remove redundant LIVE, VOD, and SERIES badges from homogeneous Xtream and Stalker catalog grids while preserving mixed-content badges and type-driven grid behavior.
2026-07-20 21:52:00 +02:00
4gray
c266eaa680
fix(packaging): preserve Flatpak Electron ELF for Zypak ( #1205 )
...
Fixes the launcher/Zypak regression reported in #1203 . The additional GPU/video.js behavior remains tracked separately in that issue.
2026-07-18 22:42:45 +02:00
4gray
8fdac824fd
feat(packaging): ship Linux embedded MPV frame-copy runtime ( #1200 )
...
* docs: design Linux frame-copy packaging
* docs: plan Linux frame-copy packaging
* feat(packaging): define Linux frame-copy profiles
* fix(packaging): reject inherited profile names
* feat(embedded-mpv): validate staged Linux runtime
* fix(embedded-mpv): require Linux source packages
* fix(embedded-mpv): harden Linux runtime staging
* feat(embedded-mpv): build LGPL Linux runtime
* fix(embedded-mpv): pin Linux runtime inputs
* feat(embedded-mpv): build relocatable Linux helper
* fix(embedded-mpv): require bundled Linux runtime
* fix(embedded-mpv): make Linux runtime portable
* feat(packaging): ship Linux frame-copy artifacts
* fix(embedded-mpv): verify Linux helper linkage
* fix(packaging): enforce Linux frame-copy isolation
* fix(embedded-mpv): pin Linux display data
* docs(embedded-mpv): document Linux frame-copy packaging
* feat(embedded-mpv): probe Linux frame-copy runtime
* test(embedded-mpv): smoke packaged Linux frame-copy
* docs(embedded-mpv): clarify Linux system runtime baseline
* fix(embedded-mpv): harden Linux runtime capability gate
* ci: verify Linux frame-copy packages
* test(embedded-mpv): harden packaged Linux smoke
* test(embedded-mpv): preserve packaged GL mode
* test(packaging): harden Linux package probes
* fix(embedded-mpv): enable private Snap shared memory
* fix(embedded-mpv): sanitize Linux helper environment
* fix(packaging): enforce private Snap memory semantics
* fix(packaging): reject ambiguous Snap memory metadata
* fix(embedded-mpv): prioritize trusted Snap GL
* fix(packaging): reject advanced Snap YAML semantics
* fix(packaging): reject arbitrary Snap YAML aliases
* feat(packaging): ship Linux runtime license notices
* docs(embedded-mpv): document Linux runtime distribution
* fix(packaging): parse Snap trailing comments safely
* fix(release): gate Snap publish on public source release
* fix(packaging): strip VCS metadata from source bundle
* docs(packaging): clarify Linux source release gate
* test(embedded-mpv): smoke missing bundled libmpv
* style(embedded-mpv): format final validation inputs
* fix(e2e): satisfy fixture index signature typing
* fix(ci): declare fontconfig gperf generator
* fix(embedded-mpv): hash runtime cache identities
* fix(packaging): harden Linux frame-copy delivery
* fix(packaging): tighten runtime delivery gates
* fix(ci): decouple Linux runtime matrix
* fix(packaging): harden Linux frame-copy delivery
* fix(packaging): validate Linux frame-copy runtimes
* fix(packaging): scope Snap Electron library checks
* feat(packaging): ship Linux frame-copy runtimes
* fix(packaging): improve Linux runtime smoke diagnostics
* fix(packaging): expose bounded helper probe details
* test(packaging): trace Snap EGL probe failures
* fix(packaging): prefer core22 ABI in Snap helper
* fix(packaging): bound helper probe capture
* fix(packaging): harden Linux frame-copy releases
* fix(packaging): canonicalize libplacebo submodule identity
* fix(packaging): make source archive inspection portable
* fix(packaging): harden Snap release verification
2026-07-18 17:28:22 +02:00
4gray
c6ed504723
feat(playback): add shared picture-in-picture controls ( #1199 )
...
* docs(playback): design shared web picture-in-picture
* docs(playback): keep picture-in-picture exit available
* docs(playback): plan shared web picture-in-picture
* feat(playback): add picture-in-picture controls contract
* feat(playback): add shared web picture-in-picture
* feat(playback): expose shared picture-in-picture action
* docs(playback): document shared web picture-in-picture
* test(playback): cover shared picture-in-picture flow
* test(playback): wait for PiP video in Electron E2E
* refactor(playback): extract picture-in-picture controller
2026-07-17 22:11:29 +02:00
4gray
beb62db314
feat(settings): add shared web player controls toggle ( #1198 )
...
* docs(playback): design shared controls setting
* docs(playback): plan shared controls setting
* feat(settings): persist shared web controls preference
* test(settings): harden shared controls normalization coverage
* feat(settings): expose shared web controls toggle
* fix(settings): label shared controls toggle
* feat(playback): resolve shared controls from settings
* test(playback): cover shared controls setting
* docs(playback): document shared controls preference
* fix(playback): await settings before host creation
* fix(settings): normalize shared controls updates
2026-07-17 13:38:06 +02:00
4gray and Lars Emig
4e572c60ca
feat(videojs): add feature-flagged shared controls ( #1195 )
...
* feat(videojs): add feature-flagged shared controls
Rebuild the Video.js shared-controls integration on the current player lifecycle with Tech rebinds, source-scoped tracks, reset ordering, volume preservation, diagnostics gating, and default-off compatibility.
Credits and supersedes the stacked implementation proposed in #1153 .
Co-authored-by: Lars Emig <lars.emig@pickware.de >
* fix(videojs): harden MPEG-TS reset lifecycle
---------
Co-authored-by: Lars Emig <lars.emig@pickware.de >
2026-07-16 23:08:18 +02:00
4gray
c49ea2f6a8
feat(html-player): add feature-flagged shared controls ( #1194 )
...
* feat(html-player): bridge engine state to shared controls
* fix(html-player): avoid HLS subtitle event reentry
* fix(html-player): restore delayed HLS default subtitles
* refactor(html-player): split controls bridge collaborators
* feat(html-player): add feature-flagged shared controls
* test(html-player): cover shared-controls source ownership
* feat(html-player): pass shared-controls playback metadata
* docs(player-controls): describe HTML5 shared-controls bridge
* docs(player-controls): clarify HTML5 rollout effect
* fix(html-player): reveal diagnostics from fullscreen
* fix(html-player): defer HLS event resolution
* refactor(html-player): isolate video element session
2026-07-16 21:30:41 +02:00
4gray
f611ea3d7c
feat(embedded-mpv): use shared controls for frame-copy ( #1193 )
...
* docs(embedded-mpv): plan frame-copy shared controls
* feat(embedded-mpv): adapt frame-copy sessions to shared controls
* fix(embedded-mpv): correlate recording control updates
* fix(embedded-mpv): accept recording ack before command resolve
* fix(embedded-mpv): serialize delayed recording commands
* fix(embedded-mpv): latch buffered recording outcomes
* feat(embedded-mpv): use shared controls for frame-copy
* fix(embedded-mpv): isolate recording ticks by engine
* fix(embedded-mpv): reset controls on engine handoff
* docs(embedded-mpv): document frame-copy shared controls
* docs(embedded-mpv): normalize shared-controls plans
* fix(embedded-mpv): isolate legacy feedback on handoff
* fix(player-controls): block toggles while stalled
* refactor(embedded-mpv): isolate controls timing
* fix(player-controls): reset recording feedback on handoff
* fix(embedded-mpv): preserve newer session snapshots
2026-07-16 18:47:32 +02:00