From 96fd47a1600dfd87e33e044074fc67f588bdb0ee Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Sat, 25 Jul 2026 17:37:25 +0200 Subject: [PATCH] fix(libraries): filter content-type-less Jellyfin roots --- .../libraries/tabs/library_browse_tab.dart | 2 +- lib/services/jellyfin_mappers.dart | 17 ++++++++++------- .../libraries/library_browse_tab_test.dart | 18 +++++++++--------- test/services/jellyfin_mappers_test.dart | 18 ++++++++++-------- 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/lib/screens/libraries/tabs/library_browse_tab.dart b/lib/screens/libraries/tabs/library_browse_tab.dart index 4a906239..41508945 100644 --- a/lib/screens/libraries/tabs/library_browse_tab.dart +++ b/lib/screens/libraries/tabs/library_browse_tab.dart @@ -767,7 +767,7 @@ class _LibraryBrowseTabState extends BaseLibraryTabState MediaKind.movie, 'tvshows' => MediaKind.show, @@ -328,15 +329,17 @@ class JellyfinMappers { 'photos' => MediaKind.photo, 'boxsets' => MediaKind.collection, 'playlists' => MediaKind.playlist, - 'mixed' => MediaKind.unknown, _ => MediaKind.unknown, }; } return MediaKind.fromString(type); } - static List _defaultBrowseKindsFromCollectionType(String? collectionType) { - return collectionType?.toLowerCase() == 'mixed' ? const [MediaKind.movie, MediaKind.show] : const []; + static List _defaultBrowseKindsFromCollectionType(String? collectionType, String? type) { + final ct = collectionType?.trim(); + return (ct == null || ct.isEmpty) && type?.toLowerCase() == 'collectionfolder' + ? const [MediaKind.movie, MediaKind.show] + : const []; } static Map? _userData(Map item) { diff --git a/test/screens/libraries/library_browse_tab_test.dart b/test/screens/libraries/library_browse_tab_test.dart index 617b6b54..47afdcc0 100644 --- a/test/screens/libraries/library_browse_tab_test.dart +++ b/test/screens/libraries/library_browse_tab_test.dart @@ -20,6 +20,7 @@ import 'package:plezy/providers/multi_server_provider.dart'; import 'package:plezy/screens/libraries/state_messages.dart'; import 'package:plezy/screens/libraries/tabs/library_browse_tab.dart'; import 'package:plezy/services/data_aggregation_service.dart'; +import 'package:plezy/services/jellyfin_mappers.dart'; import 'package:plezy/services/multi_server_manager.dart'; import 'package:plezy/services/settings_service.dart'; import 'package:plezy/services/storage_service.dart'; @@ -137,20 +138,19 @@ void main() { final client = _BrowseClient('server-a', 'Mixed'); final harness = _BrowseHarness(clientA: client); addTearDown(harness.dispose); - harness.selectedLibrary.value = MediaLibrary( - id: 'mixed-library', - backend: MediaBackend.jellyfin, - title: 'Mixed', - defaultBrowseKinds: const [MediaKind.movie, MediaKind.show], - serverId: client.serverId, - ); + harness.selectedLibrary.value = JellyfinMappers.library({ + 'Id': 'mixed-library', + 'Name': 'Mixed', + 'Type': 'CollectionFolder', + 'IsFolder': true, + }, serverId: client.serverId)!; await _pumpHarness(tester, harness); expect(client.pageQueries, hasLength(1)); - expect(client.pageQueries.single.kind, isNull); + expect(client.pageQueries.single.kind, MediaKind.folder); expect(client.pageQueries.single.includeKinds, const [MediaKind.movie, MediaKind.show]); - expect(client.pageLibraryKinds.single, MediaKind.unknown); + expect(client.pageLibraryKinds.single, MediaKind.folder); }); } diff --git a/test/services/jellyfin_mappers_test.dart b/test/services/jellyfin_mappers_test.dart index e32ef550..baa70dba 100644 --- a/test/services/jellyfin_mappers_test.dart +++ b/test/services/jellyfin_mappers_test.dart @@ -474,18 +474,20 @@ void main() { } }); - test('maps mixed collections to a movie and show root browse', () { - final mixed = JellyfinMappers.library({ - 'Id': 'view-mixed', - 'Name': 'Mixed', - 'CollectionType': 'mixed', - }, serverId: ServerId(_serverId))!; - expect(mixed.kind, MediaKind.unknown); - expect(mixed.defaultBrowseKinds, const [MediaKind.movie, MediaKind.show]); + test('maps content-type-less collection folders to a movie and show root browse', () { + for (final view in [ + {'Id': 'view-missing-type', 'Name': 'Mixed', 'Type': 'CollectionFolder', 'IsFolder': true}, + {'Id': 'view-empty-type', 'Name': 'Mixed', 'Type': 'CollectionFolder', 'CollectionType': '', 'IsFolder': true}, + ]) { + final mixed = JellyfinMappers.library(view, serverId: ServerId(_serverId))!; + expect(mixed.kind, MediaKind.folder); + expect(mixed.defaultBrowseKinds, const [MediaKind.movie, MediaKind.show]); + } final unrecognised = JellyfinMappers.library({ 'Id': 'view-books', 'Name': 'Books', + 'Type': 'CollectionFolder', 'CollectionType': 'books', }, serverId: ServerId(_serverId))!; expect(unrecognised.kind, MediaKind.unknown);