From 1ec9fbcc023e71b459738bd09426decfed398ad9 Mon Sep 17 00:00:00 2001 From: Sam Matthews <75203773+TheLidlMan@users.noreply.github.com> Date: Tue, 4 Nov 2025 15:49:00 +0000 Subject: [PATCH] Hide music libraries from app (Issue #20) - Filter out artist-type libraries in libraries_screen.dart - Add safety check in media_card.dart to prevent music playback attempts - Filter music content from getOnDeck() and getRecentlyAdded() in plex_client.dart Music libraries are now hidden throughout the app since music playback is not yet supported. This focuses the app on video content (movies and TV shows). --- lib/client/plex_client.dart | 20 ++++++++++++++++---- lib/screens/libraries_screen.dart | 9 ++++++++- lib/widgets/media_card.dart | 13 +++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/lib/client/plex_client.dart b/lib/client/plex_client.dart index 95f1428d..d35f5f92 100644 --- a/lib/client/plex_client.dart +++ b/lib/client/plex_client.dart @@ -333,23 +333,35 @@ class PlexClient { return results; } - /// Get recently added media + /// Get recently added media (filtered to video content only) Future> getRecentlyAdded({int limit = 50}) async { final response = await _dio.get( '/library/recentlyAdded', queryParameters: {'X-Plex-Container-Size': limit, 'includeGuids': 1}, ); - return _extractMetadataList(response); + final allItems = _extractMetadataList(response); + + // Filter out music content (artists, albums, tracks) + return allItems.where((item) { + final type = item.type.toLowerCase(); + return type != 'artist' && type != 'album' && type != 'track'; + }).toList(); } - /// Get on deck items (continue watching) + /// Get on deck items (continue watching, filtered to video content only) Future> getOnDeck() async { final response = await _dio.get('/library/onDeck'); final container = _getMediaContainer(response); if (container != null && container['Metadata'] != null) { - return (container['Metadata'] as List) + final allItems = (container['Metadata'] as List) .map((json) => PlexMetadata.fromJsonWithImages(json)) .toList(); + + // Filter out music content (artists, albums, tracks) + return allItems.where((item) { + final type = item.type.toLowerCase(); + return type != 'artist' && type != 'album' && type != 'track'; + }).toList(); } return []; } diff --git a/lib/screens/libraries_screen.dart b/lib/screens/libraries_screen.dart index bd2b4cc6..1843d35c 100644 --- a/lib/screens/libraries_screen.dart +++ b/lib/screens/libraries_screen.dart @@ -58,7 +58,14 @@ class _LibrariesScreenState extends State throw Exception('No client available'); } - final libraries = await client.getLibraries(); + final allLibraries = await client.getLibraries(); + + // Filter out music libraries (type: 'artist') since music playback is not yet supported + // Only show movie and TV show libraries + final libraries = allLibraries + .where((lib) => lib.type.toLowerCase() != 'artist') + .toList(); + setState(() { _libraries = libraries; _isLoadingLibraries = false; diff --git a/lib/widgets/media_card.dart b/lib/widgets/media_card.dart index de5030e6..d8c45828 100644 --- a/lib/widgets/media_card.dart +++ b/lib/widgets/media_card.dart @@ -35,6 +35,19 @@ class _MediaCardState extends State { final itemType = widget.item.type.toLowerCase(); + // Music content is not yet supported + if (itemType == 'artist' || itemType == 'album' || itemType == 'track') { + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Music playback is not yet supported'), + duration: Duration(seconds: 2), + ), + ); + } + return; + } + // For episodes, start playback directly if (itemType == 'episode') { final result = await navigateToVideoPlayer(