Commit Graph
100 Commits
Author SHA1 Message Date
MichaelandClaude Opus 5 d6c7184475 Lecture : un échec de chargement de mpegts.js n'est plus fatal
L'écran « Échec du chargement : vendor/mpegts.min.js » était un cul-de-sac :
la moindre requête ratée sur la lib condamnait la chaîne, alors que le flux
restait parfaitement lisible autrement.

- xf-player-core : le chargement des libs est retenté une fois en
  contournant le cache HTTP (les libs sont servies en max-age=86400, une
  entrée tronquée bloquait le lecteur jusqu'au vidage manuel du cache), et
  seul un succès est mémorisé — la promesse rejetée restait en cache et
  rendait tout réessai impossible pour le reste de la session.
- Repli automatique : si mpegts.js reste introuvable, le live bascule sur la
  route HLS équivalente (où FFmpeg réencode déjà l'audio en AAC) ; si hls.js
  reste introuvable, on tente le HLS natif. Plus d'écran d'erreur quand un
  chemin de lecture est encore disponible.
- Message d'erreur exploitable : la cause réelle est affichée (HTTP 404,
  429, réseau injoignable) au lieu d'un échec indifférencié.
- Préchargement corrigé : les trois players préchargeaient hls.js en dur,
  soit 618 Ko téléchargés pour rien à chaque zap TV — c'est mpegts.js qui
  sert au direct — au détriment du flux et du chargement de mpegts.js
  lui-même. Le préchargement suit désormais le flux demandé, avec la même
  décision que XFPlayer.start() (et ne charge rien sur Safari/iOS).
- Serveur : avertissement explicite au démarrage si web/vendor/*.min.js
  manque, au lieu de laisser le navigateur échouer sans explication.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FSovdudi3KBwZK3aC42fw
2026-09-09 16:40:31 +00:00
MichaelandClaude Opus 5 5ab7203c8d fix(epg): cache client du guide et plafond de débit relevé
Les journaux du serveur montrent la grille Live TV se faire couper en 429 :
"Rate limit exceeded", une trentaine de requêtes refusées d'affilée après
quelques écrans de défilement.

Deux causes cumulées. D'une part le passage du guide de Dio vers AuthedHttp a
fait perdre le cache de réponses qui existait auparavant : chaque
reconstruction de tuile repartait en requête. Un cache mémoire de dix minutes
le rétablit — le backend garde déjà ces réponses trente minutes, il n'y a
aucune raison d'aller les rechercher.

D'autre part le plafond de deux cents requêtes par minute et par adresse était
trop bas pour l'usage réel : une grille demande un logo et un guide par tuile,
et tous les clients partagent l'adresse du reverse proxy. Il passe à six
cents.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 11:17:55 +02:00
MichaelandClaude Opus 5 de49e8b34d fix(player): rebasculer sur HLS quand la piste audio n'est pas démuxable
mpegts.js ne démuxe que l'AAC et le MP3. Une chaîne diffusée en E-AC3
(stream_type 0x87) ou en AC-3 (0x81) était donc lue sans aucune piste audio,
sans erreur ni avertissement : l'image passait, le son était simplement absent.
Les journaux le montrent au PMT — "pid_stream_type":{"256":27,"257":135} avec
un "common_pids" réduit au seul h264, là où les flux audibles annoncent
"257":15 pour l'AAC.

L'évènement MEDIA_INFO porte l'information : quand il arrive sans piste audio,
le lecteur détruit la session MPEG-TS et rejoue la même chaîne par
/api/live/<id>/source/playlist.m3u8. Le préréglage source garde la vidéo en
copie de flux et ne réencode que l'audio, en AAC — le coût processeur reste
négligeable. La bascule n'est tentée qu'une fois par lecture, et seulement sur
une URL live directe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 11:15:17 +02:00
MichaelandClaude Opus 5 5b9eb74a84 feat(epg): source XMLTV de repli quand le panneau ne rend rien d'actuel
Le guide du fournisseur est figé sur beaucoup de revendeurs : sur le compte de
test, get_simple_data_table répond correctement mais le dernier programme
français date de deux jours, et le xmltv.php du panneau ne couvre aucune chaîne
française. Aucun correctif côté appel Xtream ne pouvait donc remplir la grille.

Nouveau service XmltvEpgService : téléchargement de dumps XMLTV publics,
décompression gzip détectée sur le nombre magique, parsing en flux via
XmlEventReader — un dump national fait 46 Mo décompressés, en charger l'arbre
DOM coûterait plusieurs centaines de mégaoctets dans le conteneur. Mesuré à
environ 1 s pour 973 chaînes. Index rafraîchi toutes les 6 h, programmes
terminés depuis plus de 6 h écartés à l'indexation.

L'appel sortant reste un dernier recours. L'ordre est inchangé —
get_simple_data_table, puis get_short_epg — et le dump n'est consulté que si
le panneau ne rend aucun programme couvrant l'instant présent : compter les
entrées ne suffisait pas, un guide périmé en renvoie des centaines. La source
se configure par EPG_XMLTV_URLS ; vider la variable supprime tout appel
sortant. La réponse porte un en-tête X-Epg-Source pour savoir qui a répondu.

Les identifiants sont rapprochés après normalisation : le dump écrit
France.2.fr là où le panneau annonce France2.fr. Repli sur le nom affiché de
la chaîne, et table stream_id vers identifiant EPG mise en cache 6 h.

Le client passe désormais par /api/epg au lieu d'appeler player_api.php en
direct. Il dupliquait le choix de l'action, la conversion des fuseaux et le
décodage base64 ; le backend le fait une fois, met en cache pour tous les
utilisateurs, et sait basculer sur le repli — bascule impossible depuis le
navigateur.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:48:10 +02:00
MichaelandClaude Opus 5 c3b28b8278 fix(player): le bouton plein écran ne faisait rien sous Chrome
La détection lisait `webkitFullscreenElement` et `mozFullScreenElement` via un
cast `dynamic`. dart2js ne retombe pas sur la propriété JavaScript quand le
membre n'est pas déclaré sur la classe `Document` : il lève un
`NoSuchMethodError`, visible en console sous la forme
`method not found: 'gaR5'`. Le test d'état échouait donc à chaque appel, avant
même de pouvoir demander le plein écran.

Seule l'API non préfixée est désormais utilisée ; elle est supportée par tous
les navigateurs visés.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:39:38 +02:00
MichaelandClaude Opus 5 f490e96448 feat(player): bouton plein écran et reconnexion du proxy live
Plein écran — le bouton n'existait que dans les contrôles VOD, sous une icône
aspect_ratio peu parlante, et les contrôles Live TV n'en avaient aucun. Ajout
du bouton côté Live TV et passage aux icônes fullscreen / fullscreen_exit.
L'état suit désormais l'évènement fullscreenchange du document : sortir par la
touche Échap laissait l'icône désynchronisée.

Proxy live — la route /api/live/<id>.ts relayait la source sans aucune reprise.
Les panneaux Xtream ferment régulièrement la connexion en cours de route, et le
MediaSource du navigateur recevait alors un sourceEnded : la lecture s'arrêtait
net au bout de quelques dizaines de secondes. Le proxy rouvre maintenant la
source tant que le client écoute, avec quatre tentatives et une seconde
d'attente entre chaque, le temps que le panneau libère le slot de connexion.
Le compteur repart de zéro dès qu'une connexion a tenu plus d'une minute.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:31:13 +02:00
MichaelandClaude Opus 5 8b82b101aa fix(ui): remplacer les couleurs Material codées en dur par les jetons Warm Cinema
41 couleurs Material brutes traînaient encore dans l'interface, hors palette :
rouge, vert, orange et surtout un violet omniprésent sur les Season Pass, qui
n'appartient à aucune famille du thème.

Correspondances retenues :
- Colors.red / redAccent -> AppColors.live (#E5484D) pour les badges LIVE et
  les indicateurs d'enregistrement, AppColors.error pour les messages d'erreur
- Colors.green / greenAccent -> AppColors.success
- Colors.orangeAccent -> AppColors.warning
- Colors.amber -> AppColors.ratingGold, pour aligner les étoiles de notation
  du mobile sur celles du bureau
- Colors.purpleAccent -> famille secondary (terre cuite)
- fonds de boutons passés sur les variantes *Container avec leur couleur de
  premier plan, le remplissage clair ne portant pas de texte lisible

Le titre du programme EPG dans la grille Live TV utilisait ratingGold, un jeton
réservé aux notes : il passe sur primary, l'accent ember du thème.

Les fonds de SnackBar vert/rouge deviennent surfaceContainerHigh, le succès et
l'échec restant portés par le pictogramme du message.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:16:38 +02:00
MichaelandClaude Opus 5 537312908a fix(epg,ui): utiliser get_simple_data_table pour l'EPG et recaler la sidebar sur le thème
EPG — les trois chemins (backend /api/epg, XtreamService.getShortEpg et
getShortEPG) n'utilisaient que get_epg et get_short_epg. Beaucoup de
panneaux Xtream ne connaissent pas get_epg : ils répondent 200 avec le
bloc d'authentification, sans epg_listings, ce qui produisait un guide
vide indiscernable d'une chaîne sans programme. get_short_epg y renvoie
epg_listings vide en permanence.

- backend : get_simple_data_table en premier, get_short_epg en repli
- client : bascule automatique et mémorisée vers le tableau complet dès
  qu'un panneau est muet sur l'action légère, pour ne pas doubler les
  requêtes sur chaque tuile de grille
- dates dérivées des *_timestamp epoch et émises en ISO-8601 UTC : les
  champs texte sont dans le fuseau du panneau, sans indicateur de zone,
  et étaient relus comme de l'heure locale — le guide était décalé et
  les enregistrements planifiés depuis le guide l'étaient aussi
- cache backend : la clé incluait seulement le channelId, deux playlists
  partageant un stream_id se servaient mutuellement leur guide

UI — les deux halos d'ambiance du dashboard étaient restés de l'ancien
thème : primary (#FFB68C) à 40 % posé sur le coin haut-gauche, donc pile
derrière la sidebar, et info (#A3B8C4, bleu-gris) à 35 % dans une palette
entièrement chaude. Ramenés à des braises ember à 8 % / 6 %.

- fond via AppColors.backgroundGradient
- onglet actif rempli en primaryContainer (surface) et non primary
  (teinte claire réservée au texte/icônes)
- sidebar en niveau flottant : en niveau 1 son fond #181310 se confondait
  avec le haut du dégradé #1A1310

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 09:53:17 +02:00
MichaelandClaude Fable 5 e332895d7d feat(design): Projector Noir theme - tungsten amber on film-black
Full visual refonte replacing the generic neon-blue glass look:

- palette: warm film-black surface ladder, tungsten amber primary,
  warm taupe secondary, verdigris teal tertiary; semantic and
  category colors retuned to match (coral live, gold movies)
- typography: Syne (display/headlines) + Instrument Sans (body/UI)
  replace Space Grotesk/Inter/Outfit across all screens
- glassmorphism tokens warmed (amber inner glow, warm-white borders)
- web player theme.css + index.html loader mirror the new tokens
- hardcoded Colors.blue* in streaming settings and recordings tabs
  now use AppColors tokens
- DESIGN_SYSTEM.md updated to v3.0 Projector Noir

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 14:52:45 +02:00
MichaelandClaude Fable 5 9595afcc99 fix(streaming): stop streams dying mid-playback
- reaper no longer kills exited sessions immediately: a finished VOD
  transcode was reaped (segments deleted) while still being watched
- reuse completed VOD/recording sessions instead of re-transcoding
- live input: add -rw_timeout 30s and -reconnect_at_eof so a stalled
  upstream triggers reconnect instead of wedging ffmpeg forever
- reaper watchdog restarts live sessions whose playlist stopped updating
- waitForPlaylist fails fast on clean ffmpeg exit without output
- direct .ts proxy: close http.Client on stream end/error (socket leak)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 14:34:31 +02:00
MichaelandClaude Fable 5 92634dba13 perf: faster stream startup
- Stop sending no-store on vendored player libraries: hls.min.js and
  mpegts.min.js (~750 KB) were re-downloaded on every player open
- hls.js: start with 1 live segment instead of 3, lower buffer-first
  threshold 1.5s -> 0.8s, poll buffer every 100ms
- mpegts.js: initial stash 512KB -> 128KB, start at 0.5s buffered
- Live FFmpeg: -hls_init_time 1 closes the first segment after ~1s

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 11:23:32 +02:00
MichaelandClaude Fable 5 dcf1c00cca chore: prod compose back to GHCR image (publish workflow fixed)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 11:05:34 +02:00
MichaelandClaude Fable 5 a49b0d94c8 fix(docker): stop ignoring entrypoint.sh
.dockerignore excluded entrypoint.sh while the Dockerfile COPYs it into
the runtime stage; buildx (docker-container driver) fails hard on this
where the legacy builder only warned.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 10:59:24 +02:00
MichaelandClaude Fable 5 b749960d26 fix: stream auth middleware blocked non-streaming requests
streamAuthMiddleware wrapped the whole streaming router inside the
Cascade, so any unmatched path without a session (e.g. GET / through the
reverse proxy) returned 401 before reaching the static file handler.
Now only /api/live, /api/vod and /api/recordings/stream are guarded;
other paths fall through to the router's 404 and the Cascade continues.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 10:58:11 +02:00
MichaelandClaude Fable 5 29c40239db chore: prod compose builds from GitHub until GHCR publish is fixed
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 10:51:56 +02:00
MichaelandClaude Fable 5 3904a1b9c8 chore: add production compose using GHCR image
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 10:46:20 +02:00
MichaelandClaude Fable 5 066de08cf7 ci: publish Docker image to GHCR on push to main
Builds and pushes ghcr.io/r0m1k3/xtremflow:latest (+ sha tag) so update
managers (Unraid/Watchtower/Portainer) can detect new images instead of
relying on a local build context.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 10:35:07 +02:00
MichaelandClaude Fable 5 2e6bc7c7d6 chore: untrack local Claude settings
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 10:17:54 +02:00
MichaelandClaude Fable 5 969d40dec5 fix(ci): exclude bin/ from root analyzer and clean remaining warnings
The frontend CI job ran `flutter analyze` from the repo root, which also
analyzed the bin/ server package without its dependencies resolved
(shelf_router, sqlite3, bcrypt, test), producing hundreds of
uri_does_not_exist errors. bin/ is a standalone package covered by the
backend job, so it is now excluded from root analysis.

Also:
- Remove all unused fields/variables flagged as analyzer warnings
  (api_client, cache_service, player_screen, subtitle_service,
  live_tv_tab, mobile screens)
- Run `flutter analyze --no-fatal-infos` in CI: pre-existing deprecation
  infos (withOpacity, dart:html) stay non-fatal while errors and warnings
  still fail the build

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 10:17:40 +02:00
MichaelandClaude Fable 5 60d3f42901 feat: security hardening, streaming overhaul, design polish, tests
Security:
- Replace unsalted SHA-256 password hashing with bcrypt (lazy rehash on login)
- Add authenticated /api/xtream-api gateway: Xtream credentials are injected
  server-side and never sent to the frontend; /api/playlists no longer
  returns passwords
- Redact credentials from all logs (login body, proxy/FFmpeg/scheduler URLs)
- Add auth to recordings, EPG, season-passes and streaming routes
  (HttpOnly session cookie for hls.js; loopback bypass for local FFmpeg)
- Lock player postMessage to same-origin in both directions
- Vendor and pin hls.js 1.6.7 / mpegts.js 1.7.3 (drop CDN @latest)
- Fix rate limiter (client IP was never resolved), add login rate limit,
  restrict CORS, add CSP Report-Only, block private-IP SSRF targets,
  fix path traversal in recording log retrieval, chmod 777 -> 770
- Remove dead HiveService (seeded admin/admin into IndexedDB with SHA-256)
- Fix authMiddleware not populating 'user' context (getPlaylist ignored the
  logged-in user; admin purge always returned 403)

Streaming:
- New FfmpegSessionManager: process registry, idle reaper (4 min live /
  15 min VOD), orphan cleanup at startup, clean SIGTERM shutdown,
  fast-fail with stderr instead of 30 s timeout
- Quality selection (source/high/medium/low) for live and VOD; source mode
  streams with -c:v copy (zero transcoding); selector wired into the player
- Concurrent recordings (MAX_CONCURRENT_RECORDINGS, default 2); conflicts
  retry on the next tick instead of silently failing
- Lower live latency (HLS window 20 -> 10 segments, liveSync 10 -> 3)
- Fix recording log lookup (.mp4 vs .mkv mismatch)

Design:
- Replace hardcoded colors with AppColors tokens (12 files)
- web/theme.css syncs HTML players with the Flutter palette
- DPAD/keyboard navigation (arrow-key focus, player shortcuts)
- Tooltips on player icon buttons, Semantics on content cards
- Remove 7 dead widgets broken since the Stitch merge

Quality:
- bin/test/: 21 unit tests (bcrypt, redaction, traversal, SSRF, recording
  conflicts) plus a quality-selector widget test
- GitHub Actions CI (analyze + test + build web)
- Archive stale status docs into docs/archive/

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 10:07:18 +02:00
MichaelandClaude Opus 4.7 b985f11704 fix: resolve all compile errors from Stitch theme merge
- Add missing AppTheme animation constants (durationSm/Md/Lg/Xl, curveSmooth)
  to satisfy remote widget references.
- Replace deprecated GlassContainer(opacity:) with .glass()/.floating()/.base()
  in login_screen, live_tv_tab, mobile_live_tv_tab, player_screen,
  dashboard_screen.
- Fix const-eval errors by removing const from BorderSide/Text/BoxDecoration
  using AppColors.focusColor and AppColors.border (runtime getters).
- Fix subtitle_service.dart: padEnd → padRight (Dart String API).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-28 07:37:37 +02:00
MichaelandClaude Opus 4.7 60228f5576 fix: resolve GlassContainer API mismatch and broken remote files
- Replace deprecated GlassContainer(opacity:/hasBorder:) calls in
  dashboard_screen.dart and player_screen.dart with .glass() constructor.
- Fix epg_grid_screen.dart missing provider import and Playlist type mismatch.
- Delete broken/unreferenced files: network_service.dart, epg_grid_screen.dart.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-28 07:24:41 +02:00
MichaelandClaude Opus 4.7 2ba16caf55 Merge remote-tracking branch 'origin/main' into main
Resolved conflicts by keeping remote functional features (RecordingScheduler,
FFmpeg HLS transcoding, mobile player, channel cards) and restoring local
Stitch theme foundation (app_colors, app_theme, glass_container, mobile_theme).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-27 22:17:52 +02:00
MichaelandClaude Opus 4.7 f7eaa724e2 feat(theme): complete redesign to Cyber-Cinematic Glass (Stitch)
Replace the legacy Apple TV-style purple/cyan theme with the full
Google Stitch Cyber-Cinematic Glass design system across the
entire app (desktop + mobile).

- New Material 3 dark ColorScheme: background #121317, primary
  #adc6ff, primaryContainer #4b8eff, surface containers, etc.
- Typography: Space Grotesk (headlines) + Inter (body/labels)
- 3-level glassmorphism via GlassContainer: base, glass, floating
- Primary gradient: #007AFF → #00C6FF with blue glow effects
- Removed old compatibility aliases (focusColor, border, textPrimary,
  textSecondary); all code now uses semantic Stitch tokens
- Systematically replaced all Colors.white/black/red/grey and
  GoogleFonts.roboto/outfit with Stitch equivalents
- All 36 lib/ files updated, zero compilation errors

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-27 22:06:29 +02:00
Michael 9755f51af5 fix(ui): prevent NaN division crash in TvChannelGrid and fix playlist silent failure
- tv_channel_grid.dart: guard screenWidth <= 0 / NaN / Infinite on first
  Flutter Web layout pass (previously caused NaN ~/ 225.03 crash cascade).
  Also use .clamp(1.0, infinity) on item width for belt-and-suspenders safety.
  Fix invalid 'padding.vertical as double?' cast in TvHorizontalList by using
  padding.resolve(TextDirection.ltr).top instead.

- playlist_api_service.dart: remove silent catch-and-return-empty in
  getPlaylists(). Exceptions now propagate to the Riverpod FutureProvider
  so the UI shows the real error state (with Retry button) instead of
  a misleading 'No playlists available' when the API call actually failed
  (e.g., 401 Unauthorized or network error).
2026-03-26 16:24:18 +01:00
Michael 8c65e48bbe feat: Implement Xtream IPTV API service, including data fetching, caching, and proxy integration. 2026-03-10 16:48:28 +01:00
Michael f5b3457390 refactor: Consolidate Flutter web and Dart server compilation into a single Docker build stage for streamlined dependency management. 2026-03-10 16:25:46 +01:00
Michael 8098e024a9 build: optimize docker caching strategy to avoid redundant installs 2026-03-10 16:05:47 +01:00
Michael 36a74d9e97 fix: increase default timeouts and ensure they are applied to XtreamService 2026-03-10 15:44:04 +01:00
Michael 16b4bfc17a build: change compose context to local for reliable builds 2026-03-10 15:42:25 +01:00
Michael 1b022ba1d5 build: add verbosity and version tag to diagnose hang 2026-03-10 15:41:37 +01:00
Michael 3499d6ec8c build: merge stages for stability 2026-03-10 15:07:34 +01:00
Michael 9f3c29f6dd feat: implement Xtream API service for managing live channels, VOD, and series with caching and dynamic backend URL handling. 2026-03-10 14:57:44 +01:00
Michael 36a4de2140 fix(compilation): resolved undefined 'options' variable and optimized Docker build 2026-03-10 13:06:40 +01:00
Michael e707bda597 feat: implement Xtream Codes API service for authentication, live channels, VOD, and series, including caching and URL proxying. 2026-03-10 12:14:47 +01:00
Michael 129bcadd37 feat: Add Xtream API service for IPTV features and precache web artifacts in Dockerfile. 2026-03-10 12:00:43 +01:00
Michael e4922d7fce Remove --no-pub, --no-wasm-dry-run, and --verbose flags from the flutter build web command in the Dockerfile. 2026-03-10 11:23:06 +01:00
Michael 4f6b5fe14e feat: Implement Xtream Codes API service for IPTV content and streamline the Dockerfile web build process. 2026-03-10 11:19:15 +01:00
Michael df33c02d1d chore: Optimize Docker build by expanding ignored files and improving Flutter web build caching. 2026-03-10 11:14:08 +01:00
Michael f9098e02ed feat: Increase DART VM heap size to 16GB and precache web artifacts for build optimization. 2026-03-10 10:55:51 +01:00
Michael 1432ca12bc feat: Introduce HLS streaming API with FFmpeg-based live and VOD transcoding, including GPU acceleration, and add web player files and an Xtream service. 2026-03-10 10:44:27 +01:00
Michael 33d0e0a80d fix(streaming): optimize quality, audio sync, and content update refresh
- Increased FFmpeg video quality to 8Mbps and audio to 192kbps.
- Added audio resync filters and better presets.
- Optimized HLS buffer settings for mobile players to reduce interruptions.
- Reduced API cache duration to 15m and added refresh support for faster content updates.
2026-03-10 10:26:24 +01:00
Michael 33c6385d7e feat: introduce mobile player screen and lite player view with channel zapping functionality 2026-03-09 14:52:41 +01:00
Michael 4d1e08148b feat: implement mobile live TV tab with channel browsing, search, and a dedicated player screen supporting channel zapping. 2026-03-09 14:32:41 +01:00
Michael 12b799a7fd feat: introduce LitePlayerView for video playback with custom zapping controls and mobile fullscreen support. 2026-03-09 14:18:51 +01:00
Michael c57273be2c feat: Implement GPU-accelerated live HLS streaming with FFmpeg, including iOS optimizations and IPTV redirect resolution. 2026-03-09 14:10:13 +01:00
Michael d0a2a1ee6a feat: Implement Xtream proxy handler with SSRF protection and M3U8 URL rewriting, resolving 502 proxy errors. 2026-03-09 14:00:28 +01:00
Michael c9a212ec4f feat: implement live HLS streaming with FFmpeg transcoding, GPU acceleration, and HLS segment serving. 2026-03-09 13:52:46 +01:00
Michael 0b5aa3f9e4 feat: Implement initial streaming handler for live and VOD content using FFmpeg HLS transcoding with GPU acceleration support. 2026-03-09 13:46:56 +01:00
Michael bd7645922d feat: add Xtream API proxy with SSRF protection and streaming handler with FFmpeg integration. 2026-03-09 13:41:56 +01:00
Michael 7eb483fc07 feat: introduce IPTV settings management with a dedicated mobile tab, providers, and service. 2026-03-09 13:31:01 +01:00
Michael 7ea12511a0 feat: implement mobile series tab with pagination, search, and filtering for IPTV series. 2026-03-09 13:20:00 +01:00
Michael 829c5751ca feat: implement initial mobile IPTV feature with player screen, live TV, movies, and series tabs, along with the Xtream API service. 2026-03-09 13:16:29 +01:00
Michael b1f887af69 feat: Implement EPG API with caching and Xtream get_epg to get_short_epg fallback for program data. 2026-03-09 11:36:40 +01:00
Michael 3232a3a226 feat: introduce EPG API with caching and TV & Recordings UI with EPG Guide, Recordings, and Season Passes tabs. 2026-03-09 10:47:30 +01:00
Michael fa88746db6 feat: introduce IPTV data models and initial Live TV UI, including EPG overlay. 2026-03-09 10:12:55 +01:00
Michael 758cbe4c43 feat: implement Xtream proxy handler with M3U8 URL rewriting, SSRF protection, and content type handling. 2026-01-07 11:31:40 +01:00
Michael 755367018a feat: Implement core server application with API routing, streaming, and static content serving. 2026-01-07 11:29:00 +01:00
Michael 1dd77bd87a feat: implement core server with API routing, middleware, and static file serving 2026-01-07 11:24:26 +01:00
Michael 5d4dfa5e05 fix: Add Docker entrypoint script with gosu to manage volume permissions and drop user privileges. 2026-01-07 11:09:42 +01:00
Michael a149bf266c chore: add detailed login logging and update startup message 2026-01-07 10:39:06 +01:00
Michael 948e405307 chore: bump cachebust to force docker rebuild 2026-01-07 10:31:59 +01:00
Michael 842862006a fix(proxy): remove auth requirement to allow browser image requests, keep ssrf protection 2026-01-07 10:16:52 +01:00
Michael 38572fa747 fix(auth): move auth check inside proxy handler after path filtering 2026-01-07 09:32:51 +01:00
Michael 37c23d575b fix(docker): use libsqlite3-dev to provide libsqlite3.so symlink for Dart FFI 2026-01-07 09:26:53 +01:00
Michael 5ad3ad9f9e fix(stream): validate streamId AFTER stripping extension 2026-01-07 09:23:37 +01:00
Michael e0612ba67f fix(docker): resolve server deps from bin/pubspec.yaml 2026-01-07 09:19:32 +01:00
Michael 3a633cd74d chore: update task.md to reflect current local Docker environment maintenance tasks. 2026-01-07 09:13:05 +01:00
Michael d1933f7500 merge: resolve Dockerfile conflict (kept optimization + nvenc support) 2026-01-07 08:44:50 +01:00
Michael 8df9a37baa feat: security overhaul (proxy ssrf fix, streaming sanitization, docker optimization) 2026-01-07 08:43:33 +01:00
Michael 7e5d50f258 feat: Add IPTV player screen for live, VOD, and series streams with comprehensive playback controls. 2026-01-03 10:57:22 +01:00
Michael 71630d75e8 feat: Install FFmpeg with NVIDIA NVENC/NVDEC support via apt-get instead of a static build. 2026-01-03 10:26:17 +01:00
Michael 33a331dce9 Fix GPU rollbacks v2 - aresample filter, copyts, larger buffers 2026-01-02 09:21:51 +01:00
Michael d93d638b1b Unified Live TV control bar - EPG + buttons in single bar 2026-01-02 09:14:57 +01:00
Michael 8670e42cf8 Fix GPU Live TV rollbacks - add vsync cfr, async, smaller buffer, faster keyframes 2026-01-02 09:01:14 +01:00
Michael f6d5ae7764 UI fixes: remove center play button from Native player, align EPG/controls in Live TV, match background colors 2026-01-02 08:59:52 +01:00
Michael 409878e173 Fix VOD GPU transcoding - remove hwaccel_output_format, use CBR mode for HLS 2026-01-01 23:33:02 +01:00
Michael cd3a49ce63 Fix GPU transcoding timeout - use CBR mode, increase timeouts, add keyframe interval 2026-01-01 23:27:04 +01:00
Michael a00d5ae4da Force GPU transcoding (h264_nvenc) for Live TV when GPU toggle is enabled 2026-01-01 23:19:48 +01:00
Michael 363fa14453 Add debug logging for GPU setting detection 2026-01-01 23:18:08 +01:00
Michael 2d4f687b4b Use BtbN FFmpeg build with NVENC/NVDEC hardware acceleration support 2026-01-01 20:30:20 +01:00
Michael b4c1cd919f Revert Dockerfile to stable dart:stable base, add GPU toggle in settings UI 2026-01-01 20:26:34 +01:00
Michael c77b100a4e feat: Switch Dockerfile base image to NVIDIA CUDA, install Dart SDK, and add NVENC-enabled FFmpeg. 2026-01-01 20:17:52 +01:00
Michael ce82b9e824 feat: Implement API handlers for live and VOD streaming and create database module. 2026-01-01 20:13:56 +01:00
Michael 72e28a398a feat: add IPTV player screen with HTML iframe integration for live, VOD, and series streams 2026-01-01 20:10:14 +01:00
Michael 478107f0a4 feat: Add streaming handlers for live and VOD content using FFmpeg. 2026-01-01 20:05:40 +01:00
Michael e27fa6fec3 feat: Add IPTV player screen supporting live, VOD, and series playback with interactive controls. 2026-01-01 19:56:31 +01:00
Michael aa75347d0a feat: implement IPTV player screen with web-based video playback, controls, and EPG overlay. 2026-01-01 19:43:14 +01:00
Michael 440f15faa6 feat: add IPTV player screen with support for live, VOD, and series streams using iframe-based playback. 2026-01-01 19:27:32 +01:00
Michael b6a0016c00 feat: implement IPTV PlayerScreen with embedded web player for live, VOD, and series streams. 2026-01-01 19:19:52 +01:00
Michael e74aa822ad feat: add IPTV player screen supporting live, VOD, and series stream playback via embedded web players. 2026-01-01 19:16:51 +01:00
Michael 1547b376e0 feat: Implement web-based video player screen with playback controls and stream type handling. 2026-01-01 19:04:11 +01:00
Michael 4ecfd4f48c feat: Implement IPTV player screen supporting live and VOD streams via iframe. 2026-01-01 18:48:26 +01:00
Michael e19f0638f7 feat: add PlayerScreen for IPTV playback with web player integration and controls. 2026-01-01 18:44:29 +01:00
Michael 83e43b9da8 feat: Implement IPTV player screen with playback controls and stream type handling. 2026-01-01 18:41:02 +01:00
Michael 30218cb1d0 feat: add TvFocusableCard widget for interactive focus and hover effects. 2026-01-01 18:37:42 +01:00
Michael 2d418e4e0c feat: Add playlist selection screen and basic web IPTV player. 2026-01-01 18:32:39 +01:00
Michael c165ff5d40 feat: Implement IPTV player screen with web iframe integration for live and VOD streams, utilizing player_lite.html for live TV. 2026-01-01 18:26:05 +01:00
Michael 79ad1243fa feat: Add a themed loading screen widget and a web-based HLS/MPEG-TS video player. 2026-01-01 18:21:54 +01:00
Michael be51118dc2 feat: add LiveTVTab for browsing live channels with search and favorites, and PlayerScreen for channel playback. 2026-01-01 18:17:35 +01:00