From 0049a7c596a13dca23e4636e789a677c2a5fdfe5 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 1 Apr 2026 20:41:27 +0200 Subject: [PATCH] feat: add RecordingsTab widget and local settings configuration file --- lib/features/iptv/widgets/recordings_tab.dart | 41 ++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/lib/features/iptv/widgets/recordings_tab.dart b/lib/features/iptv/widgets/recordings_tab.dart index 8984ad3..10ba24c 100644 --- a/lib/features/iptv/widgets/recordings_tab.dart +++ b/lib/features/iptv/widgets/recordings_tab.dart @@ -7,6 +7,7 @@ import '../../../core/models/iptv_models.dart'; import '../../../core/models/playlist_config.dart'; import '../providers/xtream_provider.dart'; import '../providers/settings_provider.dart'; +import '../screens/player_screen.dart'; // ═══════════════════════════════════════════════════════════════════════════ // ENTRÉE — Onglet "Enregistrements" @@ -49,7 +50,7 @@ class _RecordingsTabState extends State { ), ), Expanded( - child: const _RecordingsListView(), + child: _RecordingsListView(playlist: widget.playlist), ), ], ); @@ -721,7 +722,8 @@ class _ProgrammeCard extends StatelessWidget { // ═══════════════════════════════════════════════════════════════════════════ class _RecordingsListView extends StatefulWidget { - const _RecordingsListView(); + final PlaylistConfig playlist; + const _RecordingsListView({required this.playlist}); @override State<_RecordingsListView> createState() => _RecordingsListViewState(); } @@ -777,6 +779,31 @@ class _RecordingsListViewState extends State<_RecordingsListView> { _fetchRecordings(); } + Future _playRecording(BuildContext context, Map rec) async { + final streamUrl = rec['stream_url'] as String? ?? ''; + final title = rec['title'] as String? ?? 'Enregistrement'; + + if (streamUrl.isEmpty) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('URL du flux indisponible')), + ); + return; + } + + if (!mounted) return; + Navigator.of(context).push( + MaterialPageRoute( + builder: (ctx) => PlayerScreen( + streamId: streamUrl, + title: title, + playlist: widget.playlist, + streamType: StreamType.vod, + containerExtension: 'ts', + ), + ), + ); + } + Future _showLogs(String id, String title) async { try { final response = await http.get(Uri.parse('/api/recordings/logs/$id')); @@ -989,6 +1016,16 @@ class _RecordingsListViewState extends State<_RecordingsListView> { rec['title'] ?? '', ), ), + if (status == 'completed') + IconButton( + icon: const Icon( + Icons.play_circle_outline, + color: Colors.greenAccent, + size: 20, + ), + tooltip: 'Lecture', + onPressed: () => _playRecording(context, rec), + ), IconButton( icon: const Icon( Icons.description_outlined,