feat: introduce streaming handlers for live TV proxy and VOD HLS transcoding using FFmpeg.

This commit is contained in:
Michael committed 2026-01-01 18:12:45 +01:00
1 parent d22350fb89
commit a1a8810ddc
10 files changed
+968 -612

No files matched your search

+4 -8
View File
@@ -5,7 +5,7 @@ import 'package:google_fonts/google_fonts.dart';
import '../../../core/models/playlist_config.dart';
import '../../../core/theme/app_colors.dart';
import '../../../core/utils/responsive_layout.dart';
import '../../../core/widgets/components/hero_carousel.dart';
import '../../../core/widgets/hero_carousel.dart';
import '../../../core/widgets/glass_container.dart';
import '../../../core/widgets/tv_focusable_card.dart';
import '../providers/watch_history_provider.dart';
@@ -305,22 +305,18 @@ class _MoviesTabState extends ConsumerState<MoviesTab> {
items: displayMovies
.take(5)
.map(
(m) => HeroItem(
(m) => HeroCarouselItem(
id: m.streamId,
title: m.name,
imageUrl: _getProxiedImageUrl(m.streamIcon),
subtitle: m.rating != null
? '${_formatRating(m.rating)} ★'
: null,
onMoreInfo: () => _playMovie(m),
onPlay: () => _playMovie(m),
onTap: () => _playMovie(m),
),
)
.toList(),
onTap: (item) {
final movie = _movies
.firstWhere((element) => element.streamId == item.id);
_playMovie(movie);
},
),
),
),
+12 -10
View File
@@ -6,7 +6,7 @@ import '../../../core/models/playlist_config.dart';
import '../../../core/theme/app_colors.dart';
import '../../../core/theme/app_theme.dart';
import '../../../core/utils/responsive_layout.dart';
import '../../../core/widgets/components/hero_carousel.dart';
import '../../../core/widgets/hero_carousel.dart';
import '../../../core/widgets/themed_loading_screen.dart';
import '../../../core/widgets/glass_container.dart';
import '../../../core/widgets/tv_focusable_card.dart';
@@ -283,14 +283,23 @@ class _SeriesTabState extends ConsumerState<SeriesTab> {
items: displaySeries
.take(5)
.map(
(s) => HeroItem(
(s) => HeroCarouselItem(
id: s.seriesId.toString(),
title: s.name,
imageUrl: _getProxiedImageUrl(s.cover),
subtitle: s.rating != null
? '${_formatRating(s.rating)} ★'
: null,
onMoreInfo: () {
onPlay: () {
final series = _series.firstWhere(
(element) =>
element.seriesId.toString() ==
s.seriesId.toString(),
orElse: () => s,
);
_openSeries(series);
},
onTap: () {
final series = _series.firstWhere(
(element) =>
element.seriesId.toString() ==
@@ -302,13 +311,6 @@ class _SeriesTabState extends ConsumerState<SeriesTab> {
),
)
.toList(),
onTap: (item) {
final series = _series.firstWhere(
(element) => element.seriesId.toString() == item.id,
orElse: () => _series[0],
);
_openSeries(series);
},
),
),
),