mirror of
https://github.com/R0m1k3/xtremobile.git
synced 2026-10-11 17:29:26 +02:00
8d74bbb320d471cd8eab4e31ea159ee37f714f0a
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>
XtremFlow - IPTV Web Application
High-performance, containerized IPTV Web Application using Flutter Web and Xtream Codes API.
Features
✅ Local Authentication System
- Default admin user (
admin/admin) - Secure salt-based password hashing (SHA-256)
- No public signup - private app only
✅ Multi-Playlist Management
- Centralized Xtream credentials management
- Playlist assignment to users
- Easy switching between playlists
✅ High-Performance Dashboard (60fps)
- Category-based pagination (100 items/page for Live TV, 50 for Movies)
- Lazy loading with
ListView.builder/GridView.builder - Image caching with
cached_network_image
✅ Live TV with EPG
- Electronic Program Guide (EPG) overlay
- "Now & Next" program display
- Real-time progress bar
✅ VOD & Series
- Movies and Series organized by categories
- Grid layout with posters
- Optimized ratings display (1 decimal place)
✅ Docker Deployment
- Multi-stage build with Flutter and Dart
- Custom Dart Server (
bin/server.dart) - FFmpeg Transcoding for mobile compatibility
- Cache Management system for temporary files
- External network support (
nginx_default)
Tech Stack
- Framework: Flutter Web
- State Management: Riverpod
- Local Database: Hive (Web IndexedDB) with AES encryption
- Networking: Dio with cache interceptors
- Routing: GoRouter with auth guards
- Video Player:
video_player+chewie - UI: Google Fonts, Material Design 3
Prerequisites
- Docker & Docker Compose
- Existing
nginx_defaultnetwork (for reverse proxy routing) - Flutter SDK (for local development only)
Quick Start (Docker)
1. Build the Docker image
docker-compose build
2. Start the container
docker-compose up -d
3. Access via reverse proxy
Configure your reverse proxy (Nginx/Traefik) to route traffic to:
- Container:
xtremflow - Internal Port:
8080 - Network:
nginx_default
Example Nginx configuration:
location /iptv {
proxy_pass http://xtremflow:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
4. Login
- URL:
http://your-domain/iptv - Default Credentials:
- Username:
admin - Password:
admin
- Username:
⚠️ Change the admin password immediately after first login!
Local Development
Install dependencies
flutter pub get
Generate Hive adapters (if modified)
flutter pub run build_runner build --delete-conflicting-outputs
Run web app
flutter run -d chrome
Project Structure
lib/
├── core/
│ ├── database/
│ │ └── hive_service.dart # Hive initialization & encryption
│ ├── models/
│ │ ├── app_user.dart # User model (Hive)
│ │ ├── playlist_config.dart # Playlist credentials (Hive)
│ │ └── iptv_models.dart # Channel, VOD, Series, EPG models
│ ├── router/
│ │ └── app_router.dart # GoRouter configuration
│ └── utils/
│ └── crypto_utils.dart # Password hashing utilities
├── features/
│ ├── auth/
│ │ ├── providers/
│ │ │ └── auth_provider.dart # Authentication state
│ │ └── screens/
│ │ └── login_screen.dart
│ ├── admin/
│ │ └── screens/
│ │ └── admin_panel.dart # User & Playlist CRUD
│ └── iptv/
│ ├── services/
│ │ └── xtream_service.dart # Xtream API client
│ ├── providers/
│ │ └── xtream_provider.dart # Riverpod providers
│ ├── screens/
│ │ └── player_screen.dart # Video player
│ └── widgets/
│ ├── live_tv_tab.dart # Live TV with pagination
│ ├── movies_tab.dart # Movies grid
│ ├── series_tab.dart # Series grid
│ └── epg_overlay.dart # EPG display
└── main.dart
Security Features
Password Storage
- Algorithm: SHA-256 with random UUID-based salt
- Format:
salt:hash(stored in Hive) - Legacy Support: Fallback to unsalted comparison for migration
Database Encryption
- Hive AES Cipher (256-bit key)
- Key stored in
FlutterSecureStorage - Automatic key generation on first run
Authentication Flow
- User enters credentials
- System retrieves stored hash
- Input password is hashed with same salt
- Constant-time comparison prevents timing attacks
Performance Optimizations
Memory Management (20k+ channels)
- Grouping: Channels organized by category
- Pagination: 100 items per page (Live TV), 50 per page (Movies)
- Lazy Loading: Only render visible items
- Image Caching: Disk/memory cache with
cached_network_image
Network Optimization
- Dio Cache Interceptor: 1-hour cache for API responses
- EPG Cache: 5-minute refresh for program data
- Hive Disk Store: Persistent cache across sessions
Rendering (60fps Target)
ListView.builderwith fixeditemExtentAutomaticKeepAliveClientMixinfor tab state- Expansion panels for category navigation
- Grid with fixed
crossAxisCountandchildAspectRatio
Xtream API Integration
Supported Endpoints
| Endpoint | Purpose | Caching |
|---|---|---|
player_api.php |
Authentication | 1 hour |
get_live_streams |
Live TV channels | 1 hour |
get_vod_streams |
Movies | 1 hour |
get_series |
Series | 1 hour |
get_short_epg |
EPG data | 5 minutes |
Stream URL Formats
// Live TV
http://[dns]/live/[username]/[password]/[stream_id].m3u8
// Movies
http://[dns]/movie/[username]/[password]/[stream_id].[container_extension]
// Series
http://[dns]/series/[username]/[password]/[stream_id].[container_extension]
Docker Configuration
Dockerfile (Multi-Stage)
Stage 1: Builder
- Base:
cirrusci/flutter:stable - Build:
flutter build web --release --web-renderer html
Stage 2: Runtime
- Base:
dart:stable - Server:
dhttpd --host 0.0.0.0 --port 8080 - Size: ~150MB (compressed)
docker-compose.yml
services:
iptv-web:
build: .
container_name: xtremflow
restart: unless-stopped
networks:
- nginx_default
networks:
nginx_default:
external: true
No port mapping - Access via reverse proxy only.
Troubleshooting
Container won't start
# Check logs
docker logs xtremflow
# Verify network exists
docker network ls | grep nginx_default
# Create network if missing
docker network create nginx_default
Login fails with admin/admin
- Check Hive database initialization in logs
- Verify
HiveService.init()completed successfully - Default admin is seeded only if
usersbox is empty
EPG not displaying
- EPG is optional and gracefully degrades
- Check if Xtream server supports
get_short_epg - Verify stream has
epg_channel_id
Performance issues (FPS drops)
- Reduce
_itemsPerPageconstant (currently 100 for Live TV) - Disable image caching temporarily
- Check browser DevTools Performance tab
License
Proprietary - Private Use Only
Support
For Xtream API documentation, consult your IPTV provider.
Languages
Dart
82.4%
Python
16.3%
Shell
1%
Dockerfile
0.3%