4gray
bb4e386c6c
fix(pwa): avoid CSP-blocked stylesheet deferral
2026-05-24 14:59:08 +03:00
4gray
697eab6e73
refactor(epg): route renderer calls through runtime bridge
...
Add typed EPG runtime bridge, split EPG runtime capabilities, migrate renderer EPG callers away from direct window.electron access, and address Greptile review feedback.
2026-05-24 13:45:51 +03:00
4gray
003a8774a1
fix(electron): tighten navigation review feedback
...
Restrict packaged file navigation to the app renderer, guard redirects, and handle fire-and-forget header override IPC failures.
2026-05-23 19:05:38 +03:00
4gray
3c5f7ab92e
fix(electron): preserve playlist header defaults
...
Keep playlist-level request header overrides active when channel-scoped headers are cleared, and cover layered override behavior.
2026-05-23 15:57:29 +03:00
4gray
fc449ca73e
feat(electron): harden renderer security
...
Scope playback request header overrides to active stream origins and document the Electron runtime security contract.
2026-05-22 23:31:41 +03:00
4gray
582422c512
refactor(runtime): gate settings backup file save by capability
2026-05-22 13:41:24 +03:00
4gray
c9a0d5210e
refactor(runtime): gate settings sections by capability
2026-05-22 13:41:24 +03:00
4gray
09e2e08fc1
refactor(runtime): gate settings external players by capability
2026-05-22 13:40:14 +03:00
4gray
b4fd93354e
refactor(runtime): enable pwa xtream section navigation
2026-05-22 13:38:53 +03:00
4gray
f626e176d2
refactor(runtime): require playlist storage bridge
2026-05-22 13:37:36 +03:00
4gray
4603bd83d5
refactor(runtime): gate playlist refresh by capability
2026-05-22 13:36:39 +03:00
4gray
9a5620bf95
refactor(runtime): require downloads bridge surface
2026-05-22 13:35:03 +03:00
4gray
109aea0794
refactor(runtime): require external player bridge methods
2026-05-22 13:35:03 +03:00
4gray
3e398f1d1a
refactor(remote-control): gate live bridge by capability
2026-05-22 13:35:03 +03:00
4gray
8cfc40f59b
refactor(xtream): gate data source by sqlite capability
2026-05-22 13:35:03 +03:00
4gray
c571c57c5b
refactor(runtime): centralize platform capabilities
2026-05-22 11:00:34 +03:00
4gray
36bce47764
merge: resolve master conflicts for pwa hardening
...
- merge origin/master into PR #964 and keep embedded MPV test on the isolated playback sub-entrypoint
- centralize EPG capability through DataService.supportsEpg and update PWA web-e2e expectations
- split BrowserAccessError copy between Electron and PWA diagnostics
2026-05-22 10:20:03 +03:00
4gray
9d69443d01
Merge pull request #963 from 4gray/agent/embedded-mpv-ci-runtime-cache
...
ci: cache embedded mpv runtime
2026-05-22 09:38:26 +03:00
4gray
55efc24608
fix(pwa): harden self-hosted runtime boundaries
2026-05-22 02:09:57 +03:00
4gray
0b19155469
ci: cache embedded mpv runtime
2026-05-22 02:02:06 +03:00
4gray
2a769ad44e
Merge origin/master into PR 955
2026-05-22 01:34:56 +03:00
4gray
2ecb5c28f4
fix(dashboard): address PR review feedback
2026-05-22 00:59:17 +03:00
4gray
67d512d44c
Merge pull request #961 from 4gray/agent/pwa-provider-target-flow
...
fix(docker): exclude agent worktrees from build context
2026-05-22 00:47:22 +03:00
4gray
b2909a1186
feat(workspace): add keyboard shortcuts help ( #957 )
...
* feat(workspace): add keyboard shortcuts help
* style(workspace): polish keyboard shortcuts dialog
* fix(workspace): address shortcuts review feedback
* docs(workspace): clarify desktop shortcut availability
* refactor(workspace): split keyboard shortcut definitions
2026-05-21 19:15:46 +03:00
4gray
401d434bce
test(pwa): cover self-hosted provider target flow
2026-05-21 11:19:04 +03:00
4gray
fd59447064
docs(docker): restore self-hosted PWA compose flow
...
* docs(docker): restore self-hosted PWA compose flow
* fix(docker): supervise self-hosted runtime processes
* fix(docker): exit cleanly on container stop
2026-05-21 09:30:57 +02:00
4gray
5b091809ef
fix(xtream): ignore future recently added dates
...
## Summary
- Normalize Xtream recently-added timestamps across UI, import, and dashboard query paths.
- Filter future/invalid provider dates before ranking rails and migrate legacy millisecond cache rows.
- Add regression coverage for future timestamps, series date priority, and DB migration behavior.
## Validation
- GitHub checks passed, including Unit Tests and Typechecks, Web E2E, Electron E2E on macOS/Ubuntu/Windows, CodeQL, builds, and Greptile Review.
2026-05-19 14:39:38 +02:00
4gray
20e7322353
refactor(portal): split collection data access ( #953 )
2026-05-19 00:01:34 +02:00
4gray
118d4fce32
fix(playback): improve inline stream diagnostics ( #952 )
...
* fix(playback): improve inline stream diagnostics
* fix(playback): preserve headers in diagnostics wrapper
* fix(portal): align unified live player imports
2026-05-18 23:59:20 +02:00
4gray
5e5a89a300
refactor(ui): remove dead portal code and share detail styles ( #946 )
2026-05-16 00:09:29 +02:00
4gray
272e0e772e
fix(stalker): preserve explicit portal identity ( #941 )
2026-05-15 18:34:49 +02:00
4gray
2d5c4fa4f9
chore: tighten validation and runtime logging
...
* chore: tighten validation and runtime logging
* fix(i18n): localize new settings labels
2026-05-15 17:43:42 +02:00
4gray
d24c77a143
chore(nx): enforce scoped workspace boundaries ( #942 )
2026-05-15 09:59:06 +02:00
4gray
8f79b25f52
fix(playback): treat portal mpeg-ts vod as non-live
2026-05-15 01:07:23 +02:00
4gray
4a4334cb64
feat(playback): improve browser-player diagnostics ( #939 )
...
* feat(playback): diagnose browser stream access errors
Entire-Checkpoint: f957cd9849e0
* feat(playback): expose browser-player diagnostic details
Entire-Checkpoint: f957cd9849e0
* fix(playback): keep media path extensions authoritative
Entire-Checkpoint: f957cd9849e0
* fix(playback): tighten browser access diagnostics
Entire-Checkpoint: f957cd9849e0
* fix(playback): align diagnostic followups
Entire-Checkpoint: f957cd9849e0
* fix(playback): narrow declared stream metadata
Entire-Checkpoint: f957cd9849e0
* fix(playback): preserve explicit extension overrides
Entire-Checkpoint: f957cd9849e0
* fix(playback): keep mpeg-ts out of unsupported containers
Entire-Checkpoint: f957cd9849e0
* refactor(playback): split diagnostics utilities
Entire-Checkpoint: f957cd9849e0
* fix(playback): treat mpegts early eof as media fallback
Entire-Checkpoint: f957cd9849e0
2026-05-15 00:55:23 +02:00
4gray
8232a86a1e
feat(portal): add category sorting controls ( #940 )
...
* feat(portal): add category sort modes
* fix(portal): address category sort review feedback
2026-05-15 00:28:32 +02:00
4gray
a40d5447e7
feat(settings): add external player arguments ( #932 )
...
* feat(settings): add external player arguments
* fix(settings): address external player argument review
* fix(settings): require external player argument settings
* feat(settings): add external player argument placeholders
Closes https://github.com/4gray/iptvnator/issues/835
2026-05-14 11:04:01 +02:00
4gray
9ae984ad7f
feat(portal): add series quick start CTA ( #925 )
...
* feat(portal): add series quick start CTA
Entire-Checkpoint: f957cd9849e0
* fix(portal): address series quick start review
Entire-Checkpoint: f957cd9849e0
* docs: use repo-relative quick start path
Entire-Checkpoint: f957cd9849e0
2026-05-12 23:45:02 +02:00
4gray
e7db920543
fix(settings): clarify external player path hints ( #929 )
...
* fix(settings): clarify external player path hints
* fix(settings): gate external player hints to desktop
2026-05-12 19:49:14 +02:00
4gray
a33d506266
fix(stalker): play radio collections with audio layout ( #930 )
...
* fix(stalker): play radio collections with audio layout
* fix(stalker): address radio review feedback
2026-05-12 19:48:38 +02:00
4gray
6ae1251ad1
fix(playback): use inline player for collection VOD ( #928 )
...
* feat(portal): add series quick start CTA
Entire-Checkpoint: f957cd9849e0
* fix(playback): use inline player for collection vod
* fix(playback): address inline collection review feedback
* fix(playback): ignore stale vod position loads
2026-05-12 19:26:40 +02:00
4gray
6305dcf00e
Add browser playback diagnostics and MPV/VLC fallback ( #921 )
...
* feat(playback): add codec diagnostics fallback
Entire-Checkpoint: f957cd9849e0
* fix(playback): address diagnostics review feedback
Entire-Checkpoint: f957cd9849e0
* fix(playback): ignore recoverable hls diagnostics
Entire-Checkpoint: f957cd9849e0
* fix(playback): polish diagnostic fallback banner
Entire-Checkpoint: f957cd9849e0
* fix(xtream): preserve live category search scope
Entire-Checkpoint: f957cd9849e0
2026-05-10 17:27:54 +02:00
4gray
724e4b1ab3
feat(playback): add embedded mpv (macos) stream recording ( #916 )
...
* feat(playback): add embedded mpv stream recording
Entire-Checkpoint: f957cd9849e0
* fix(playback): address embedded mpv recording review
Entire-Checkpoint: f957cd9849e0
* fix(playback): track mpv recording auto-stop replies
Entire-Checkpoint: f957cd9849e0
2026-05-10 12:27:09 +02:00
4gray
aead89e3e6
fix(xtream): keep category management available
...
Fixes #913
2026-05-09 18:34:57 +02:00
4gray
ab905af285
feat(stalker): add radio support
...
Entire-Checkpoint: f957cd9849e0
2026-05-09 01:28:39 +02:00
4gray
e350a2ea96
fix double-click external playback handling
2026-05-08 10:59:52 +02:00
4gray
ed6302c059
feat(m3u): add channel list sorting controls
...
Entire-Checkpoint: f957cd9849e0
2026-05-06 00:14:52 +02:00
4gray and Claude Opus 4.7
7478ea8665
docs(embedded-mpv): document renderer architecture and reactivity rules
...
Capture the audit findings and refactor outcome in the canonical embedded-mpv
architecture doc so the next person to extend the player does not re-introduce
the same class of regression.
New "Renderer Architecture And Reactivity" section covers:
- The post-refactor file layout (format utils, shortcuts, overlay-visibility,
ui-state, session-controller, view component) and what each owns.
- The bounds compositing strategy: HIDDEN_BOUNDS for modal overlays,
partial bottom cutout for control popovers, full host rect otherwise —
plus why (NSView paints over WebContents, z-index is unwinnable).
- The reactivity rule learned from the audit: any signal read inside an
effect that feeds a one-shot side effect must be wrapped in untracked().
Only re-trigger sources stay tracked.
- A short ledger of the four bugs from the audit (support write loop,
volume-tracked session restart, scheduleControlsHide transitive deps,
stalled-tracker 2 Hz no-op) so they do not get reintroduced.
- IPC safety notes: gate on sessionId() not session()?.id; guardIpc
swallows addon-side throws.
- Pointer to the powerSaveBlocker integration.
Also documents the bundle 3 native surface additions (sid, speed,
video-aspect-override observers and exports, capability probe via
EmbeddedMpvSupport.capabilities) so renderers can feature-detect against
older addon binaries.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
Entire-Checkpoint: f957cd9849e0
2026-05-05 16:45:17 +02:00
4gray and Claude Opus 4.7
e192cba776
feat(player): add VLC reuse-instance setting ( #893 )
...
VLC was unconditionally spawned per click — VLC's own single-instance
preference fails because the per-launch RC args defeat its D-Bus
forwarder. Mirror the existing MPV reuse pattern so users can opt in to
driving one tracked VLC via its RC interface (clear + add) instead of
opening a new window every stream.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
Entire-Checkpoint: f957cd9849e0
2026-05-05 00:55:04 +02:00
4gray
6cbf2a1cfb
feat(m3u): add context menus to recent channels
...
Entire-Checkpoint: f957cd9849e0
2026-05-05 00:27:15 +02:00