Commit Graph
224 Commits
Author SHA1 Message Date
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 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 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 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
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 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
GitHub CopilotandClaude Haiku 4.5 c4a3aaa066 refactor(ui): apply premium Apple TV glows to all screens
Consistent Apple TV-style premium background across:
- Dashboard: dual glows (teal 40%, blue 35%)
- Login: dual glows with larger coverage (0.4, 0.3 opacity)
- Playlist Selection: dual glows (teal 30%, blue 25%)

All backgrounds now feature:
- Deep gradient (050505 → 000000 → 0A0A0A)
- Visible ambient glows instead of flat black
- Premium cinematic feel with accent lighting
- Larger glow sizes for better visual impact

Result: Cohesive Apple TV premium aesthetic across entire app

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-26 12:09:17 +01:00
GitHub CopilotandClaude Haiku 4.5 8c8a7ad5c5 fix(ui): make ambient glows visible with increased opacity
Dashboard now has visible Apple TV-style glows:
- Teal glow (top-left): 40% opacity (was 25%)
- Blue glow (bottom-right): 35% opacity (was 15%)
- Larger glow sizes (800x800, 700x700) for better coverage
- Improved gradient background for depth

Changes:
- dashboard_screen.dart: increase glow opacity and size
- Add multi-stop gradients for smooth falloff

Result: Premium Apple TV background with visible glows instead of pure black

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-26 12:08:24 +01:00
GitHub CopilotandClaude Haiku 4.5 96ea8e2ad2 refactor(ui): improve Apple TV aesthetics with premium gradients and glows
- Enhance category card gradient with teal accent (AppColors.primary)
- Add premium ambient glows to dashboard (teal + blue)
- Replace flat black background with subtle gradient for depth
- Increase glow intensity and size for better visual impact
- Apple TV inspired premium dark theme with accent lighting

Changes:
- live_tv_tab.dart: category gradient now uses AppColors.primary
- dashboard_screen.dart: add dual-glow background with premium styling

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-26 12:00:49 +01:00
GitHub CopilotandClaude Haiku 4.5 a3a4b6f0f2 refactor(theme): replace hardcoded colors with AppColors system
- Unify color palette across login, dashboard, admin, and player screens
- Replace Colors.white/black with AppColors semantic colors
- Use AppColors.backgroundGradient instead of hardcoded gradients
- Apply primary teal accent (#00A0D2) consistently
- Fix text hierarchy with textPrimary/Secondary/Tertiary
- Improve visual consistency with Apple TV theme

Changes:
- login_screen.dart: gradient, icon, text colors
- dashboard_screen.dart: border, text, background colors
- admin_panel.dart: all Colors.white/white70 → AppColors
- player_screen.dart: background, overlay, text colors

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-26 11:49:46 +01:00
GitHub Copilot 0c9d0e50ec refactor(theme): update color references to use AppColors for consistency across components 2026-03-26 11:46:41 +01:00
GitHub Copilot 863e5ddad4 refactor(theme): update card and dialog themes to use CardThemeData and DialogThemeData
refactor(ui_components): adjust animation durations for smoother transitions
fix(dashboard): rename border property to hasBorder for clarity
fix(player): rename border property to hasBorder for consistency
2026-03-26 11:20:31 +01:00
GitHub Copilot 5b16029038 refactor(channel_card): simplify ChannelCard structure and enhance hover effects 2026-03-26 11:15:30 +01:00
GitHub Copilot 2ca0c8bf1a feat: Enhance Apple TV UI components with modern design elements
- Updated ChannelCard widget to include live indicator, favorite button, and EPG information with smooth animations and skeleton loading for images.
- Introduced MobileTheme for touch-optimized layouts, adapting Apple TV design principles for mobile screens.
- Added TvChannelGrid for responsive channel layouts with flexible column counts and smooth animations.
- Created TvModernCard for displaying content with interactive hover states, progress indicators, and context menu support.
- Implemented TvTopNavBar and TvSideNav for improved navigation with glassmorphism effects and user-friendly interactions.
- Developed TvFloatingMenu for context-aware actions with smooth reveal animations.
2026-03-26 11:09:40 +01:00
GitHub Copilot 2c4572191d feat(recording): implement simplified recording system with API endpoints and UI integration 2026-03-26 11:00:40 +01:00
GitHub Copilot ee97e29f72 fix(cache): remove unused dio_cache_interceptor_hive_store import and simplify caching setup 2026-03-26 10:48:56 +01:00
GitHub Copilot 91eb1ce5a0 Add download and subtitle services, enhance UI with continue watching and quality selector widgets
- Implemented DownloadService for managing download tasks, including start, pause, resume, and cancel functionalities.
- Created SubtitleService for handling subtitle tracks, parsing SRT and WebVTT formats, and downloading subtitles.
- Added ContinueWatchingWidget to display user's watch history with progress indicators.
- Developed QualitySelectorWidget for selecting video quality during playback, including auto quality adjustment.
- Introduced TrendingWidget and RecentlyAddedWidget to showcase trending and recently added content.
2026-03-26 10:34:18 +01:00
Michael b8682eafe0 fix: resolve compilation error in XtreamService by restoring missing streams variable 2026-03-10 19:50:21 +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 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 36a74d9e97 fix: increase default timeouts and ensure they are applied to XtreamService 2026-03-10 15:44:04 +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 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 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