Commit Graph
93 Commits
Author SHA1 Message Date
MichaelandClaude Opus 5 51e6d9d693 fix(epg): stop swallowing EPG failures, cap gateway concurrency
getShortEpg ended in `catch (e) { return []; }`, so a 401, a timeout, a
rate-limited panel and a genuinely empty guide all rendered the same
"No Info" label. That made the current problem undiagnosable from the
UI. Failures are now logged with the HTTP status, the Dio error type and
the response shape.

Two concrete causes are handled while we are here:

- Some Xtream panels answer player_api.php with a textual Content-Type.
  Dio then hands back a raw String, and `response.data['epg_listings']`
  threw, landing in the silent catch. The body is now parsed explicitly
  when it arrives as a String.
- The channel grid mounts one EPG provider per visible tile, firing
  ~32 concurrent requests at player_api.php. Many panels rate-limit well
  below that and fail the whole batch. A 3-slot semaphore serialises
  them in small groups.

This does not by itself prove why the guide is empty in production; it
makes the reason visible in the browser console.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 22:14:47 +02:00
MichaelandClaude Opus 5 ef744c215e fix(ui): make screen backgrounds full-bleed instead of content-sized
The gradient Container in the playlist selection and admin screens sized
itself to its content rather than the viewport: under the loose body
constraints, SingleChildScrollView and Wrap both shrink-wrap, so the
gradient was painted only across a 436 px band (48 padding + 340 card +
48 padding) with the rest of the screen falling through to bare black.
BoxConstraints.expand() forces full coverage.

Also:
- both screens now use AppColors.backgroundGradient. The previous ramp
  ran surfaceContainerLowest -> background -> baseLevel0, i.e. dark to
  lighter to dark, which put a pale band across the middle
- the playlist card was a 3% cream translucent plate, so it took on
  whatever sat behind it instead of resting on it; it is now an opaque
  surface (surfaceContainerLow, surfaceContainerHigh on hover) with the
  lift() shadow at rest and the ember focus halo on hover
- Scaffold backgroundColor pinned to baseLevel0 so route transitions
  never flash pure black

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 21:57:35 +02:00
MichaelandClaude Opus 5 ad3e970c8d fix(api): send session token on EPG, recordings and season-pass calls
The security hardening in 60d3f42 moved /api/epg, /api/recordings and
/api/season-passes behind authMiddleware, but the Flutter client still
called them through bare package:http. Those requests carry no
Authorization header, and on web BrowserClient sets withCredentials to
false so the session cookie is not sent either — every call came back
401. Symptoms: empty TV guide, empty recordings list, empty season
passes.

Adds AuthedHttp, a thin wrapper that injects the same token ApiClient
and XtreamService already use (localStorage['auth_token']), and routes
the 13 affected calls through it.

subtitle_service is left on plain http: it fetches third-party subtitle
URLs, not our API, and must not leak the session token.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 21:54:01 +02:00
MichaelandClaude Opus 5 1feeaae78a feat(design): Warm Cinema theme + event-driven adaptive players
Replaces the Projector Noir palette with "Warm Cinema" and rebuilds the
web players around a shared, event-driven engine.

Design
- app_colors: warm charcoal (#0B0908), cream (#F3E9DF), ember (#D9541F);
  adds posterScrim/heroScrim gradients, lift()/emberFocus() shadows,
  const cream-alpha tokens replacing Colors.whiteNN, and primaryFill,
  a deeper ember reserved for text-bearing fills so white labels clear
  the 4.5:1 AA threshold that #D9541F alone does not
- app_theme / mobile_theme: Fraunces (display serif) + Karla (body),
  tighter radii, 20+ component themes
- glass_container: opaque layered surfaces replace the blurred glass
- themed_loading_screen restyled; players and boot splash follow

Performance
- drop every BackdropFilter: backdrop blur forced a full framebuffer
  read per frame per card, the main source of scroll jank
- bundle Fraunces/Karla as assets so google_fonts stops fetching from
  fonts.gstatic.com at startup
- bound image decode size on 12 sites: a 40-poster grid drops from
  ~240 MB to a few tens of MB of GPU memory

Players (new shared engine: web/xf-player-core.js)
- start on media events instead of polling the buffer every 100-200 ms
- hls.js/mpegts.js loaded on demand, so ~213 KB of mpegts is never
  fetched for HLS streams
- liveSyncDurationCount 10 -> 2, startFragPrefetch on, testBandwidth
  off, MPEG-TS initial stash 512 KB -> 64 KB
- adaptive escalation fast -> balanced -> safe after repeated stalls in
  a 60 s window, applied live for HLS so there is no visible cut

Preserved from the recent streaming work on main: server-side quality
selection, stable player viewId, the turbo direct MPEG-TS path, vendored
library cache headers and the CI/Docker changes. Only the theme layer and
the player front-end were replaced; GlassCard stays in ui_components.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 21:42:56 +02:00
MichaelandClaude Opus 4.7 cb5eca7547 fix: add set_volume handler to player_lite.html for mute toggle
player_lite (Live TV desktop) ignored set_volume messages from Flutter,
so mute/unmute button had no effect. Added handler matching player.html.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-03 08:40:48 +02:00
Michael c61984d041 feat: implement RecordingScheduler to manage scheduled recordings and automated season passes 2026-04-02 19:12:21 +02:00
Michael 099d7da53f feat: implement streaming handler with FFmpeg-based HLS transcoding and GPU acceleration support 2026-04-02 07:43:23 +02:00
Michael 1b4321d84a feat: implement SimpleRecorder service for FFmpeg-based stream recording and scheduling 2026-04-02 07:22:24 +02:00
Michael ce695b7e43 feat: implement streaming handler with FFmpeg HLS transcoding and live TV proxying 2026-04-01 22:01:16 +02:00
Michael e641d04a3a feat: implement streaming handler with FFmpeg-based live and VOD HLS transcoding support 2026-04-01 21:35:25 +02:00
Michael f08fccc0d1 feat: implement HLS streaming handler with FFmpeg transcoding and add IPTV player screen UI 2026-04-01 21:28:47 +02:00
Michael d82f9f6846 feat: add RecordingsTab widget and EPG guide view for IPTV playback management 2026-04-01 21:21:26 +02:00
Michael e4301077b0 feat: implement HLS live streaming and VOD transcoding handler with FFmpeg and NVIDIA GPU support 2026-04-01 21:14:33 +02:00
Michael 5e7e86e4d8 feat: add RecordingsTab widget with EPG guide and channel navigation for IPTV playlists 2026-04-01 20:58:42 +02:00
MichaelandClaude Haiku 4.5 6efdadd6fd fix: simplify RecordingsTab to fix null check operator error
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-01 20:45:48 +02:00
MichaelandClaude Haiku 4.5 2d25cff43c fix: restore RecordingsTab to working version without tab complexity
- Removed TabBar/TabBarView complexity
- Keep only recordings list display
- Simplified to show only recordings without guide TV and season passes tabs

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-01 20:42:01 +02:00
Michael 0049a7c596 feat: add RecordingsTab widget and local settings configuration file 2026-04-01 20:41:27 +02:00
Michael 1e6d3741d1 feat: implement RecordingsTab and EPG guide view for IPTV feature 2026-04-01 20:37:02 +02:00
Michael 2a5eb08807 feat: add RecordingsTab widget and EPG guide view for IPTV playback 2026-04-01 20:31:52 +02:00
Michael cd859d643c feat: add RecordingsTab widget with integrated EPG guide functionality 2026-04-01 20:26:49 +02:00
Michael 6a4a642611 feat: implement IPTV player screen with iframe-based stream support and recordings tab widget 2026-04-01 20:19:40 +02:00
Michael 77dc9053bb feat: implement mobile dashboard screen with live TV tab and channel filtering functionality 2026-03-29 12:46:32 +02:00
Michael ddb8110c40 feat: add mobile scaffold layout and dedicated mobile video player implementation 2026-03-29 12:07:14 +02:00
Michael 36a7658cf9 feat: add mobile-optimized video player and streaming API handler 2026-03-29 11:47:09 +02:00
Michael db2eab0e66 feat: add mobile-optimized IPTV player with HLS and MpegTS support 2026-03-29 10:36:37 +02:00
Michael fa6ae90d8d feat: add mobile-optimized IPTV player with HLS and MpegTS support 2026-03-29 10:19:36 +02:00
Michael 3c9a9c7be7 feat: introduce playlist selection screen allowing users to choose from available IPTV playlists. 2026-03-26 21:11:14 +01:00
Michael 12e04c94ff feat: add playlist selection screen with interactive playlist cards and API fetching. 2026-03-26 20:52:27 +01:00
Michael d3f6d3a65e feat: Implement playlist selection screen with dynamic loading, error handling, and interactive playlist cards. 2026-03-26 20:39:36 +01:00
Michael 887b44b29d feat: introduce XtreamService for Xtream API communication, content retrieval, and stream URL generation with caching and proxy support. 2026-03-26 17:14:33 +01:00
Michael a9a1127d6b fix(server): add direct .ts proxy route for recordings and fix Cascade fall-through 2026-03-11 07:31:42 +01:00
Michael 2f7d709fe6 fix(player): finalize Buffer-First strategy in player_lite.html 2026-03-10 22:13:41 +01:00
Michael 893ae7b03a perf(player): switch to Buffer-First strategy to eliminate chaotic startup and micro-cuts 2026-03-10 22:08:20 +01:00
Michael 118887ab6f perf(player): add MpegTS auto-recovery and optimize initial buffer to prevent Stream Error 2026-03-10 22:02:44 +01:00
Michael b8922a2f08 perf(player): optimize desktop players for micro-cuts and stability 2026-03-10 22:02:13 +01:00
Michael 2ef1db8a68 perf(proxy): enable Keep-Alive and playlist caching to fix 5s zap delay; tuned mobile player for micro-cuts 2026-03-10 22:01:52 +01:00
Michael 79fae261aa perf(player): implement Turbo Start for faster zapping while maintaining stability 2026-03-10 21:55:11 +01:00
Michael 9e97f45046 feat(player): increase buffering and stability for HLS and MPEG-TS 2026-03-10 21:30:02 +01:00
Michael b8682eafe0 fix: resolve compilation error in XtreamService by restoring missing streams variable 2026-03-10 19:50:21 +01:00
Michael a8d2a5446d perf: implement robust playback stabilization to fix choppy video
- Increased MPEG-TS stashInitialSize to 1MB for better jitter resistance
- Enabled HLS.js discontinuity nudging to prevent freezing on corrupt segments
- Smoothed latency chasing with 1.1x playback rate
- Increased HLS sync distance to 6 segments for improved stability
2026-03-10 19:25:02 +01:00
Michael bb8978efaa perf: accelerate metadata loading with parallel fetching and local storage caching
- Implement parallel fetching for categories and streams in Live, VOD, and Series
- Add persistent local storage caching for instant UI population
- Optimize JSON parsing logic for large datasets
- Implement failover to local cache when network is unavailable
2026-03-10 18:59:39 +01:00
Michael df4bcfd07f fix: stabilize IPTV playback and implement request throttling
- Add playback lock to XtreamService to delay EPG during stream init
- Increase MPEG-TS stash buffer to 512KB for better stability
- Enable liveBufferLatencyChasing to prevent stream drift
- Tune HLS parameters for balanced speed and reliability
2026-03-10 18:54:44 +01:00
Michael 0ca6f96710 feat: implement Turbo-Start stream acceleration
- Add direct MPEG-TS support and optimized HLS tuning
- Implement low-latency sync and instant bitrate selection
- Achieve TiviMate-like zapping speed by reducing initial buffers
2026-03-10 18:41:46 +01:00
Michael 736ab0f51c chore: optimize IPTV performance and fix navigation Loop
- Revert aggressive caching in XtreamService (use forceCache + 1h stale)
- Adjust HLS.js buffers (60s-120s) for stream stability
- Fix desktop navigation loop in PlaylistSelectionScreen
- Fix receive timeouts (revert to 30s/60s)
2026-03-10 18:28:10 +01:00
Michael 1377b70aee fix: add missing xtream_provider import to resolve build error 2026-03-10 08:29:43 +01:00
Michael 69c23a9c35 fix(desktop): fix playlist selection not updating provider and navigation issue 2026-03-10 08:26:51 +01:00
Michael a256ca87b6 fix(player): resolve Safari infinite loading by refining play overlay and loading logic 2026-03-09 23:05:10 +01:00
Michael dbb6559640 fix(player): restore missing stream variables in player_mobile.html to fix infinite loading 2026-03-09 22:56:27 +01:00
Michael 3ef4884336 feat(player): remove non-functional fullscreen button as requested 2026-03-09 22:52:05 +01:00
Michael 0ae4946816 feat(player): standardize Safari compatibility fixes across all player versions 2026-03-09 22:43:51 +01:00
Michael 105496d243 feat(player): improve Safari/iOS compatibility with manual play overlay and robust loading 2026-03-09 22:40:58 +01:00
Michael 7a338db981 fix(player): remove duplicate declarations causing build failure 2026-03-09 22:34:26 +01:00
Michael 19a0755e01 feat(mobile): dedicated mobile player and responsive UI improvements 2026-03-09 22:14:33 +01:00
Michael 29a0d04b21 fix(mobile): apply responsive LayoutBuilder to player bottom bar 2026-03-09 22:01:57 +01:00
Michael b69e9d1812 fix(mobile): optimize player UI for mobile portrait and tune HLS buffering 2026-03-09 21:56:56 +01:00
Michael 441597354e fix(mobile): fix orientation reset with IndexedStack, support HLS in Lite player, and optimize fullscreen 2026-03-09 21:35:00 +01:00
Michael 39f4205d68 fix(mobile): fix XtreamService cache/URL logic and add tab error handling 2026-03-09 18:18:20 +01:00
Michael e4f8ebcf8f fix(mobile): stabilize router and add loading timeout/retry on playlists screen 2026-03-09 17:35:09 +01:00
Michael 180b57e1b7 fix(router): add missing import for MobileLoginScreen 2026-03-09 17:09:07 +01:00
Michael 13647a35da feat: Implement TV recording management with API endpoints, a data model, and a scheduling service that uses FFmpeg to record streams. 2026-03-09 16:46:45 +01:00
Michael 37945b513e fix(epg): use /api/epg/ backend for full guide (48h), fix _ProgrammeCard for Map format, remove stale EpgEntry code 2026-03-09 09:07:04 +01:00
Michael 1e1687e160 fix(epg): complete rewrite of recordings_tab (XtreamService direct), fix epg_api action (get_epg), add keepAlive 2026-03-09 08:54:45 +01:00
Michael 104159e8da fix(epg): pass playlist as parameter to RecordingsTab/_EpgGuideView — was null from selectedPlaylistProvider 2026-03-09 08:44:44 +01:00
Michael 1c38b62516 fix: remove literal newline in Dart string causing build_runner syntax error 2026-03-09 08:40:22 +01:00
Michael 3e0088ecf8 fix(epg): load filtered channels from playlist provider instead of manual channel ID input 2026-03-09 08:36:41 +01:00
Michael 47fff742e0 fix(epg): use playlist.dns directly (PlaylistConfig has no serverUrl field) 2026-03-09 08:26:16 +01:00
Michael 50a6998c09 feat: add EPG TV guide, season passes (auto-recording) and unified recordings/EPG tab with 3 sub-tabs 2026-03-09 08:21:48 +01:00
Michael 4762b4edf8 feat(recordings): switch output format from mp4 to mkv for better IPTV stream compatibility 2026-03-08 23:56:43 +01:00
Michael bbf462ae05 fix(recordings): DELETE now kills FFmpeg process before removing from DB to properly stop active recordings 2026-03-08 23:54:37 +01:00
Michael 4c2e3ce600 feat: add stop recording button and POST /api/recordings/stop/<id> endpoint to kill FFmpeg process 2026-03-08 23:53:32 +01:00
Michael 0d2ad322fe fix(entrypoint): add chmod 777 on /app/recordings for Unraid nobody:users shares + update default recordings path 2026-03-08 23:46:11 +01:00
Michael 424019d01a fix(scheduler): wrap _startRecording in single try/catch to prevent server crash, fix localhost port 8080→8089 2026-03-08 23:38:57 +01:00
Michael 93cecfc6d3 fix(docker): move CACHEBUST ARG before COPY to properly invalidate Flutter web build cache 2026-03-08 23:28:16 +01:00
Michael 9107eadc73 fix(recordings): send start_time and end_time in UTC to avoid +1h timezone offset with Docker server 2026-03-08 23:19:20 +01:00
Michael c04acc2fab debug(scheduler): add verbose logging every 10s and force UTC datetime comparisons 2026-03-08 23:11:22 +01:00
Michael 60bb10fe4d fix(recordings): correct stream_url to use real live stream, resolve to absolute URL for FFmpeg, use copy mode, speed up scheduler to 10s 2026-03-08 22:43:42 +01:00
Michael 7e0837374e refactor(recordings): eliminate Router/mount, expose direct handler methods to avoid shelf_router path collision 2026-03-08 22:10:59 +01:00
Michael d91be43f27 fix(backend): move GET /recordings/logs/<id> to main router to avoid shelf_router collision with DELETE /<id> 2026-03-08 21:42:53 +01:00
Michael 989303db77 fix(ui): gracefully handle json parse error when showLogs receives 404 text string 2026-03-08 21:36:21 +01:00
Michael 9d670c0625 fix(ui): handle 404 router errors gracefully instead of crashing on json parse 2026-03-08 21:30:55 +01:00
Michael 238cb8f407 feat(recording): add immediate record button to recording modal 2026-03-08 21:28:47 +01:00
Michael f217622e4a fix(recording): create log file before ffmpeg starts to capture boot exceptions and force absolute path 2026-03-08 20:50:38 +01:00
Michael 548e4cd664 fix(recording): rename log api route to avoid shelf_router Not Found param collisions 2026-03-08 20:43:50 +01:00
Michael 966311f560 feat(recording): add ffmpeg logs writing and viewing in UI 2026-03-08 19:26:54 +01:00
Michael abbac75926 feat(ui): add recordings tab to dashboard to list scheduled and active recordings 2026-03-08 19:24:03 +01:00
Michael 40e2f30ff1 fix(docker): ensure xtremuser has write access to /app/recordings volume 2026-03-08 17:46:26 +01:00
Michael 2cba30db4d feat(ui): add date picker and force 24h format in recording modal 2026-03-08 17:34:16 +01:00
Michael 344cf51ef9 fix(backend): make proxy handler robust to timeouts and add transparent pixel fallback for picons 2026-03-08 17:28:29 +01:00
Michael b3618805a6 fix(ui): use relative url for api recording requests in flutter web 2026-03-08 16:58:07 +01:00
Michael 219d6c816f fix(ui): remove invalid backgroundColor from showDialog 2026-03-08 16:52:59 +01:00
Michael 04b8b317c3 fix(ui): resolve bracket syntax error in live tv tab 2026-03-08 10:02:51 +01:00
Michael e46a1c15b3 fix: add missing recording model import in database 2026-03-08 09:05:18 +01:00
Michael 2180572b92 feat: implement live tv recording system 2026-03-08 08:40:55 +01:00