diff --git a/lib/providers/companion_remote_provider.dart b/lib/providers/companion_remote_provider.dart index 08906475..efad669c 100644 --- a/lib/providers/companion_remote_provider.dart +++ b/lib/providers/companion_remote_provider.dart @@ -226,6 +226,10 @@ class CompanionRemoteProvider with ChangeNotifier { } Future joinSessionMulti(String sessionId, String pin, List hostAddresses) async { + if (hostAddresses.isEmpty) { + throw ArgumentError('hostAddresses must not be empty'); + } + await leaveSession(); _lastSessionId = sessionId; diff --git a/lib/providers/offline_watch_provider.dart b/lib/providers/offline_watch_provider.dart index b139b9a5..c212871e 100644 --- a/lib/providers/offline_watch_provider.dart +++ b/lib/providers/offline_watch_provider.dart @@ -145,7 +145,7 @@ class OfflineWatchProvider extends ChangeNotifier { } // All episodes watched - return first episode for replay - return episodes.first; + return episodes.firstOrNull; } /// Find the next unwatched downloaded episode synchronously. @@ -164,7 +164,7 @@ class OfflineWatchProvider extends ChangeNotifier { } // All episodes watched - return first episode for replay - return episodes.first; + return episodes.firstOrNull; } /// Emit a watch state change event for immediate UI update. diff --git a/lib/providers/playback_state_provider.dart b/lib/providers/playback_state_provider.dart index de4ccf35..809d3fc5 100644 --- a/lib/providers/playback_state_provider.dart +++ b/lib/providers/playback_state_provider.dart @@ -210,7 +210,7 @@ class PlaybackStateProvider with ChangeNotifier { } // Need to load next window - if (_client != null && _playQueueId != null) { + if (_client != null && _playQueueId != null && _loadedItems.isNotEmpty) { // Load next window centered on the item after current final nextItemID = _loadedItems.last.playQueueItemID; if (nextItemID != null) { @@ -248,7 +248,7 @@ class PlaybackStateProvider with ChangeNotifier { } // Need to load previous window - if (_client != null && _playQueueId != null) { + if (_client != null && _playQueueId != null && _loadedItems.isNotEmpty) { final prevItemID = _loadedItems.first.playQueueItemID; if (prevItemID != null && prevItemID > 0) { final loaded = await _ensureItemsLoaded(prevItemID - 1); diff --git a/lib/screens/base_media_list_detail_screen.dart b/lib/screens/base_media_list_detail_screen.dart index 9eda93e7..f584cbc0 100644 --- a/lib/screens/base_media_list_detail_screen.dart +++ b/lib/screens/base_media_list_detail_screen.dart @@ -59,10 +59,10 @@ abstract class BaseMediaListDetailScreen extends State // If serverId is null, fall back to first available server if (serverId == null) { final multiServerProvider = Provider.of(context, listen: false); - if (!multiServerProvider.hasConnectedServers) { + serverId = multiServerProvider.onlineServerIds.firstOrNull; + if (serverId == null) { throw Exception(t.errors.noClientAvailable); } - serverId = multiServerProvider.onlineServerIds.first; } return context.getClientForServer(serverId); diff --git a/lib/screens/discover_screen.dart b/lib/screens/discover_screen.dart index 1d1f4dfd..8388bdf8 100644 --- a/lib/screens/discover_screen.dart +++ b/lib/screens/discover_screen.dart @@ -63,10 +63,11 @@ class _DiscoverScreenState extends State @override PlexClient get client { final multiServerProvider = Provider.of(context, listen: false); - if (!multiServerProvider.hasConnectedServers) { + final serverId = multiServerProvider.onlineServerIds.firstOrNull; + if (serverId == null) { throw Exception('No servers available'); } - return context.getClientForServer(multiServerProvider.onlineServerIds.first); + return context.getClientForServer(serverId); } List _onDeck = []; @@ -140,10 +141,11 @@ class _DiscoverScreenState extends State final serverId = item?.serverId; if (serverId == null) { final multiServerProvider = Provider.of(context, listen: false); - if (!multiServerProvider.hasConnectedServers) { + final fallbackId = multiServerProvider.onlineServerIds.firstOrNull; + if (fallbackId == null) { throw Exception('No servers available'); } - return context.getClientForServer(multiServerProvider.onlineServerIds.first); + return context.getClientForServer(fallbackId); } return context.getClientForServer(serverId); } diff --git a/lib/screens/libraries/libraries_screen.dart b/lib/screens/libraries/libraries_screen.dart index f6515573..d370670f 100644 --- a/lib/screens/libraries/libraries_screen.dart +++ b/lib/screens/libraries/libraries_screen.dart @@ -79,10 +79,11 @@ class _LibrariesScreenState extends State @override PlexClient get client { final multiServerProvider = Provider.of(context, listen: false); - if (!multiServerProvider.hasConnectedServers) { + final serverId = multiServerProvider.onlineServerIds.firstOrNull; + if (serverId == null) { throw Exception(t.errors.noClientAvailable); } - return context.getClientForServer(multiServerProvider.onlineServerIds.first); + return context.getClientForServer(serverId); } // GlobalKeys for tabs to enable refresh diff --git a/lib/utils/provider_extensions.dart b/lib/utils/provider_extensions.dart index 6b42143d..3f459b07 100644 --- a/lib/utils/provider_extensions.dart +++ b/lib/utils/provider_extensions.dart @@ -50,10 +50,11 @@ extension ProviderExtensions on BuildContext { // If library doesn't have a serverId, fall back to first available server if (library.serverId == null) { final multiServerProvider = Provider.of(this, listen: false); - if (!multiServerProvider.hasConnectedServers) { + final serverId = multiServerProvider.onlineServerIds.firstOrNull; + if (serverId == null) { throw Exception(t.errors.noClientAvailable); } - return getClientForServer(multiServerProvider.onlineServerIds.first); + return getClientForServer(serverId); } return getClientForServer(library.serverId!); } @@ -80,10 +81,11 @@ extension ProviderExtensions on BuildContext { /// Throws an exception if no servers are available PlexClient getFirstAvailableClient() { final multiServerProvider = Provider.of(this, listen: false); - if (!multiServerProvider.hasConnectedServers) { + final serverId = multiServerProvider.onlineServerIds.firstOrNull; + if (serverId == null) { throw Exception(t.errors.noClientAvailable); } - return getClientForServer(multiServerProvider.onlineServerIds.first); + return getClientForServer(serverId); } /// Get client for a serverId with fallback to first available server