feat: Apple glass gray theme, lower live latency, audio fix, remote focus memory

Theme — replace the near-black "Warm Cinema" palette with a neutral
"Apple Glass Gray" system: graphite surfaces (#26262C base, lighter
containers), Apple-white text, Apple system blue accent, white glass
borders/highlights. Noticeably less dark overall; light theme moves
from kraft paper to iOS light gray. All AppColors names kept so no
call site changes.

Player latency — live buffering drops from 8s cache / 10s readahead /
150MB to 3s / 5s / 60MB, keeping enough headroom for network jitter
while staying much closer to the live edge.

Audio — the forced audio filter chain
(af=lavrresample,format=channels=stereo:sample_fmts=s16) mixed FFmpeg
and mpv syntax; when it failed to init for a channel's codec, mpv
muted the stream entirely. Replaced by mpv's native
audio-channels=stereo downmix and AO-negotiated output format. Probe
caps raised (2MB/3s) so late-declared audio tracks (AAC-LATM) are
detected without slowing healthy streams.

Remote control — the player OSD now remembers the last focused button
and restores focus to it whenever the OSD reopens (arrows, OK) and
across channel switches, so one press re-zaps instead of five. On
live TV, OK with hidden controls only reopens the OSD instead of
pausing the stream.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0156exq7fejVrD3HKU3MmS8X
This commit is contained in:
Claude committed 2026-08-28 07:41:18 +00:00
1 parent 694b1257b9
commit 9b6b7faf4a
4 files changed
+218 -165

No files matched your search

+11 -12
View File
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'app_colors.dart';
/// XtremFlow — "Warm Cinema" theme (ported from the web app).
/// XtremFlow — "Apple Glass Gray" theme.
///
/// Typography: **Fraunces** (serif éditorial) for display/headline, **Karla**
/// (humaniste chaud) for UI and body — very legible at TV distance and on a
@@ -217,10 +217,9 @@ class AppTheme {
secondary: AppColors.textSecondary,
),
// Curseur crème — un curseur blanc pur jure sur fond chaud.
textSelectionTheme: const TextSelectionThemeData(
cursorColor: AppColors.primary,
selectionColor: Color(0x59D9541F),
selectionColor: Color(0x590A84FF),
selectionHandleColor: AppColors.primaryContainer,
),
@@ -334,7 +333,7 @@ class AppTheme {
activeTrackColor: AppColors.primaryContainer,
inactiveTrackColor: AppColors.onSurface24,
thumbColor: AppColors.primary,
overlayColor: Color(0x29D9541F),
overlayColor: Color(0x290A84FF),
),
progressIndicatorTheme: const ProgressIndicatorThemeData(
@@ -362,17 +361,17 @@ class AppTheme {
);
}
// ============ LIGHT THEME (« papier kraft ») ============
// ============ LIGHT THEME (gris système clair) ============
static ThemeData get lightTheme {
final baseTheme = ThemeData.light(useMaterial3: true);
const bgColor = Color(0xFFFBF3EC);
const bgColor = Color(0xFFF2F2F7);
const surfaceColor = Color(0xFFFFFFFF);
const primaryColor = Color(0xFFA63B10);
const textPrimaryColor = Color(0xFF201A16);
const textSecondaryColor = Color(0xFF52443B);
const textTertiaryColor = Color(0xFF847369);
const borderColor = Color(0xFFD6C3B7);
const primaryColor = Color(0xFF0066CC);
const textPrimaryColor = Color(0xFF1C1C1E);
const textSecondaryColor = Color(0xFF48484E);
const textTertiaryColor = Color(0xFF8E8E93);
const borderColor = Color(0xFFD8D8DE);
return baseTheme.copyWith(
colorScheme: AppColors.lightColorScheme,
@@ -386,7 +385,7 @@ class AppTheme {
textSelectionTheme: const TextSelectionThemeData(
cursorColor: primaryColor,
selectionColor: Color(0x4DA63B10),
selectionColor: Color(0x4D0066CC),
selectionHandleColor: primaryColor,
),