feat: add watch together playback rejoin flow

close #639
This commit is contained in:
edde746
2026-03-06 20:42:18 +01:00
parent 1318c54c0c
commit beff4f9ca0
23 changed files with 377 additions and 72 deletions
+37
View File
@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@@ -6,6 +8,7 @@ import '../mpv/mpv.dart';
import '../models/plex_metadata.dart';
import '../models/plex_video_playback_data.dart';
import '../providers/download_provider.dart';
import '../providers/multi_server_provider.dart';
import '../screens/video_player_screen.dart';
import '../services/external_player_service.dart';
import '../services/settings_service.dart';
@@ -14,6 +17,15 @@ import 'app_logger.dart';
const String kVideoPlayerRouteName = '/video_player';
class WatchTogetherPlaybackNavigationException implements Exception {
final String message;
const WatchTogetherPlaybackNavigationException(this.message);
@override
String toString() => message;
}
/// Navigates to the VideoPlayerScreen with instant transitions to prevent white flash.
///
/// This utility function provides a consistent way to navigate to the video player
@@ -175,3 +187,28 @@ Future<bool?> navigateToVideoPlayerWithRefresh(
return result;
}
/// Resolves the current Watch Together media and opens the video player.
Future<void> navigateToWatchTogetherPlayback(
BuildContext context, {
required String ratingKey,
required String serverId,
VoidCallback? onBeforeNavigate,
}) async {
final multiServer = context.read<MultiServerProvider>();
final client = multiServer.getClientForServer(serverId);
if (client == null) {
throw const WatchTogetherPlaybackNavigationException('Watch Together server is unavailable');
}
final metadata = await client.getMetadataWithImages(ratingKey);
if (metadata == null) {
throw const WatchTogetherPlaybackNavigationException('Current Watch Together media is unavailable');
}
if (!context.mounted) return;
onBeforeNavigate?.call();
unawaited(navigateToVideoPlayer(context, metadata: metadata));
}