Files
xtremobile/pubspec.yaml
T
MichaelandClaude Opus 5 8d74bbb320 feat: XMLTV EPG fallback, Warm Cinema theme, background release
Align the Android app with xtremflow on three fronts.

EPG: add XmltvService, a streaming XMLTV parser (gunzip-aware, indexed to a
-3h/+18h window, JSON disk cache with a 6h TTL). XtreamServiceMobile now falls
back through the provider's xmltv.php, a user-supplied URL, then a community
guide whenever get_short_epg returns nothing. Channels are matched on
epg_channel_id first, then on a normalized name (accents, HD/FHD/4K suffixes,
"FR:" and "|FR|" prefixes). A streamId -> Channel index populated by
getLiveChannels supplies those keys, so no getShortEPG call site changed.
EPG requests are also funnelled through a 3-slot semaphore, as in xtremflow:
a 30-tile grid used to fire 30 parallel player_api.php calls, which rate-limited
panels answered with errors, emptying the guide for the whole screen.

Theme: port the Warm Cinema charter (ember/charcoal/cream, Fraunces + Karla)
into app_colors, app_theme and app_decorations. The 21 Apple TV colour names
already in use are kept as compatibility aliases. mobile_theme now derives from
AppTheme instead of duplicating its 390 lines.

Playback lifecycle: stop reacting to AppLifecycleState.inactive, which fires on
transient Android interruptions such as pulling down the notification shade and
was killing playback. Both engines now release on paused/hidden/detached via
_releasePlayback(): stream stopped, decoder released, timers cancelled, wakelock
dropped. An _isReleased latch keeps the watchdog and reconnect paths from
restarting a stream from the background.

Long-run stability: cancel the six player stream subscriptions on dispose, cap
demuxer-max-back-bytes at 8MB (mpv defaults to 50MiB, which combined with the
150MB readahead pushed the native heap toward an Android memory kill after a few
hours), rebuild on position only while the controls are visible, and dispose the
Lite player's focus nodes.

Startup: prewarmHost() pre-resolves DNS and opens then closes a bare TCP/TLS
socket before playback. No HTTP request is issued, so no provider connection
slot is consumed. Capped at 1.5s.

Verified: flutter analyze clean on all touched files; 19/19 tests, including a
run over a real 46MB/69802-programme dump (517 channels indexed in 1.1s, 5/5
name probes matched); flutter build apk --release succeeds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 19:25:33 +02:00

81 lines
1.5 KiB
YAML

name: xtremobile
description: High-performance IPTV Android Application with Xtream Codes API
publish_to: 'none'
version: 1.6.0+12
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
# State Management
flutter_riverpod: ^2.6.1
riverpod_annotation: ^2.6.1
# Local Database (Web IndexedDB)
hive: ^2.2.3
hive_flutter: ^1.1.0
# Networking
dio: ^5.7.0
dio_cache_interceptor: ^3.5.1
dio_cache_interceptor_hive_store: ^3.2.2
http: ^1.2.2
# EPG (XMLTV fallback parsing)
xml: ^6.5.0
# Routing
go_router: ^13.2.5
# Video Player (FFmpeg-based for full codec support)
media_kit: ^1.1.11
media_kit_video: ^1.2.5
media_kit_libs_video: ^1.0.5
# UI Components
google_fonts: ^6.2.1
cached_network_image: ^3.3.1
# Security
crypto: ^3.0.3
uuid: ^4.4.0
# Utilities
intl: ^0.19.0
equatable: ^2.0.5
shared_preferences: ^2.3.2
path_provider: ^2.1.5
video_player: ^2.10.1
wakelock_plus: ^1.2.8
device_info_plus: ^12.3.0
shelf_router: ^1.1.4
shelf_static: ^1.1.3
flutter_cache_manager: ^3.4.1
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^3.0.2
flutter_launcher_icons: ^0.14.3
# Code Generation
build_runner: ^2.4.13
riverpod_generator: ^2.4.0
hive_generator: ^2.0.1
flutter_launcher_icons:
android: true
image_path: "assets/images/app-icon.png"
adaptive_icon_background: "#1a1a2e"
adaptive_icon_foreground: "assets/images/app-icon.png"
flutter:
uses-material-design: true
assets:
- assets/images/