feat: Introduce IPTV player screen with web iframe for live, VOD, and series playback, including controls and state management.

This commit is contained in:
Michael committed 2025-12-08 19:48:35 +01:00
1 parent 7d5c72f7f7
commit e6c9dbf050
2 files changed
+32 -22

No files matched your search

-1
View File
@@ -31,7 +31,6 @@ migrate_working_dir/
/build/ /build/
# Web related # Web related
lib/generated_plugin_registrant.dart
# Symbolication related # Symbolication related
app.*.symbols app.*.symbols
+32 -21
View File
@@ -320,22 +320,27 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
final iptvUrl = '${widget.playlist.dns}/live/${widget.playlist.username}/${widget.playlist.password}/$currentStreamId.ts'; final iptvUrl = '${widget.playlist.dns}/live/${widget.playlist.username}/${widget.playlist.password}/$currentStreamId.ts';
final encodedUrl = Uri.encodeComponent(iptvUrl); final encodedUrl = Uri.encodeComponent(iptvUrl);
// Map enum values to string params // Map enum values to string params using if-else (avoids switch exhaustivity issues)
final qualityParam = switch (settings.streamQuality) { String qualityParam = 'medium';
StreamQuality.low => 'low', if (settings.streamQuality == StreamQuality.low) {
StreamQuality.medium => 'medium', qualityParam = 'low';
StreamQuality.high => 'high', } else if (settings.streamQuality == StreamQuality.high) {
}; qualityParam = 'high';
final bufferParam = switch (settings.bufferSize) { }
BufferSize.low => 'low',
BufferSize.medium => 'medium', String bufferParam = 'medium';
BufferSize.high => 'high', if (settings.bufferSize == BufferSize.low) {
}; bufferParam = 'low';
final timeoutParam = switch (settings.connectionTimeout) { } else if (settings.bufferSize == BufferSize.high) {
ConnectionTimeout.short => 'short', bufferParam = 'high';
ConnectionTimeout.medium => 'medium', }
ConnectionTimeout.long => 'long',
}; String timeoutParam = 'medium';
if (settings.connectionTimeout == ConnectionTimeout.short) {
timeoutParam = 'short';
} else if (settings.connectionTimeout == ConnectionTimeout.long) {
timeoutParam = 'long';
}
final modeParam = settings.modeString; // direct, transcode, or auto final modeParam = settings.modeString; // direct, transcode, or auto
// Construct the stream URL directly using MPEG-TS format // Construct the stream URL directly using MPEG-TS format
@@ -361,11 +366,17 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
: xtreamService.getSeriesStreamUrl(currentStreamId, widget.containerExtension); : xtreamService.getSeriesStreamUrl(currentStreamId, widget.containerExtension);
final encodedUrl = Uri.encodeComponent(vodStreamUrl); final encodedUrl = Uri.encodeComponent(vodStreamUrl);
final qualityParam = switch (settings.streamQuality) {
StreamQuality.low => 'low', // Read settings for VOD quality
StreamQuality.medium => 'medium', final settings = ref.read(iptvSettingsProvider);
StreamQuality.high => 'high',
}; // Map quality enum to string (using if-else to avoid switch exhaustivity issues)
String qualityParam = 'medium';
if (settings.streamQuality == StreamQuality.low) {
qualityParam = 'low';
} else if (settings.streamQuality == StreamQuality.high) {
qualityParam = 'high';
}
// Calculate start time for seeking support // Calculate start time for seeking support
// If override provided (seeking), use it. Else check provider resume. // If override provided (seeking), use it. Else check provider resume.