mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-07-15 21:37:59 +03:00
Fix Book collections scanning all items
Added static method GetBaseItemKindsForCollectionType in ItemsController (moved from ContentFolderImageProvider to be shared) Added AudioBook to GetRepresentativeItemTypes for CollectionType.books for consistency Added GetBooks to GetUserItems for CollectionType.books which gets BaseItemKind.Book and BaseItemKind.AudioBook Move GetBaseItemKindsForCollectionType to DtoExtensions Cleaned up the missing null checks and used new collection expressions. Associate Person to Book and AudioBook for related items.
This commit is contained in:
@@ -71,6 +71,8 @@ namespace Emby.Server.Implementations.Dto
|
|||||||
{
|
{
|
||||||
BaseItemKind.Person, [
|
BaseItemKind.Person, [
|
||||||
BaseItemKind.Audio,
|
BaseItemKind.Audio,
|
||||||
|
BaseItemKind.AudioBook,
|
||||||
|
BaseItemKind.Book,
|
||||||
BaseItemKind.Episode,
|
BaseItemKind.Episode,
|
||||||
BaseItemKind.Movie,
|
BaseItemKind.Movie,
|
||||||
BaseItemKind.LiveTvProgram,
|
BaseItemKind.LiveTvProgram,
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using Jellyfin.Api.Extensions;
|
||||||
using Jellyfin.Data.Enums;
|
using Jellyfin.Data.Enums;
|
||||||
using Jellyfin.Database.Implementations.Enums;
|
using Jellyfin.Database.Implementations.Enums;
|
||||||
using MediaBrowser.Common.Configuration;
|
using MediaBrowser.Common.Configuration;
|
||||||
@@ -14,7 +15,6 @@ using MediaBrowser.Controller.Entities;
|
|||||||
using MediaBrowser.Controller.Providers;
|
using MediaBrowser.Controller.Providers;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
using MediaBrowser.Model.IO;
|
using MediaBrowser.Model.IO;
|
||||||
using MediaBrowser.Model.Querying;
|
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.Images
|
namespace Emby.Server.Implementations.Images
|
||||||
{
|
{
|
||||||
@@ -28,38 +28,7 @@ namespace Emby.Server.Implementations.Images
|
|||||||
{
|
{
|
||||||
var view = (CollectionFolder)item;
|
var view = (CollectionFolder)item;
|
||||||
var viewType = view.CollectionType;
|
var viewType = view.CollectionType;
|
||||||
|
var includeItemTypes = DtoExtensions.GetBaseItemKindsForCollectionType(viewType);
|
||||||
BaseItemKind[] includeItemTypes;
|
|
||||||
|
|
||||||
switch (viewType)
|
|
||||||
{
|
|
||||||
case CollectionType.movies:
|
|
||||||
includeItemTypes = new[] { BaseItemKind.Movie };
|
|
||||||
break;
|
|
||||||
case CollectionType.tvshows:
|
|
||||||
includeItemTypes = new[] { BaseItemKind.Series };
|
|
||||||
break;
|
|
||||||
case CollectionType.music:
|
|
||||||
includeItemTypes = new[] { BaseItemKind.MusicArtist }; // Music albums usually don't have dedicated backdrops, so use artist instead
|
|
||||||
break;
|
|
||||||
case CollectionType.musicvideos:
|
|
||||||
includeItemTypes = new[] { BaseItemKind.MusicVideo };
|
|
||||||
break;
|
|
||||||
case CollectionType.books:
|
|
||||||
includeItemTypes = new[] { BaseItemKind.Book, BaseItemKind.AudioBook };
|
|
||||||
break;
|
|
||||||
case CollectionType.boxsets:
|
|
||||||
includeItemTypes = new[] { BaseItemKind.BoxSet };
|
|
||||||
break;
|
|
||||||
case CollectionType.homevideos:
|
|
||||||
case CollectionType.photos:
|
|
||||||
includeItemTypes = new[] { BaseItemKind.Video, BaseItemKind.Photo };
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
includeItemTypes = new[] { BaseItemKind.Video, BaseItemKind.Audio, BaseItemKind.Photo, BaseItemKind.Movie, BaseItemKind.Series };
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
var recursive = viewType != CollectionType.playlists;
|
var recursive = viewType != CollectionType.playlists;
|
||||||
|
|
||||||
return view.GetItemList(new InternalItemsQuery
|
return view.GetItemList(new InternalItemsQuery
|
||||||
@@ -67,12 +36,9 @@ namespace Emby.Server.Implementations.Images
|
|||||||
CollapseBoxSetItems = false,
|
CollapseBoxSetItems = false,
|
||||||
Recursive = recursive,
|
Recursive = recursive,
|
||||||
DtoOptions = new DtoOptions(false),
|
DtoOptions = new DtoOptions(false),
|
||||||
ImageTypes = new[] { ImageType.Primary },
|
ImageTypes = [ImageType.Primary],
|
||||||
Limit = 8,
|
Limit = 8,
|
||||||
OrderBy = new[]
|
OrderBy = [(ItemSortBy.Random, SortOrder.Ascending)],
|
||||||
{
|
|
||||||
(ItemSortBy.Random, SortOrder.Ascending)
|
|
||||||
},
|
|
||||||
IncludeItemTypes = includeItemTypes
|
IncludeItemTypes = includeItemTypes
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -287,6 +287,8 @@ public class ItemsController : BaseJellyfinApiController
|
|||||||
QueryResult<BaseItem> result;
|
QueryResult<BaseItem> result;
|
||||||
|
|
||||||
Guid[] linkedChildAncestorIds = [];
|
Guid[] linkedChildAncestorIds = [];
|
||||||
|
|
||||||
|
includeItemTypes ??= [];
|
||||||
if (includeItemTypes.Length == 1
|
if (includeItemTypes.Length == 1
|
||||||
&& (includeItemTypes[0] == BaseItemKind.BoxSet || includeItemTypes[0] == BaseItemKind.Playlist)
|
&& (includeItemTypes[0] == BaseItemKind.BoxSet || includeItemTypes[0] == BaseItemKind.Playlist)
|
||||||
&& item is not BoxSet
|
&& item is not BoxSet
|
||||||
@@ -314,6 +316,7 @@ public class ItemsController : BaseJellyfinApiController
|
|||||||
if (folder is IHasCollectionType hasCollectionType)
|
if (folder is IHasCollectionType hasCollectionType)
|
||||||
{
|
{
|
||||||
collectionType = hasCollectionType.CollectionType;
|
collectionType = hasCollectionType.CollectionType;
|
||||||
|
includeItemTypes = [.. includeItemTypes.Union(DtoExtensions.GetBaseItemKindsForCollectionType(collectionType))];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (collectionType == CollectionType.playlists)
|
if (collectionType == CollectionType.playlists)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using Jellyfin.Data.Enums;
|
||||||
using MediaBrowser.Controller.Dto;
|
using MediaBrowser.Controller.Dto;
|
||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
|
|
||||||
@@ -9,6 +10,35 @@ namespace Jellyfin.Api.Extensions;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class DtoExtensions
|
public static class DtoExtensions
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the BaseItemKind values associated with the specified CollectionType.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="collectionType">The collection type to map to BaseItemKind values.</param>
|
||||||
|
/// <returns>An array of BaseItemKind values that correspond to the collection type.</returns>
|
||||||
|
public static BaseItemKind[] GetBaseItemKindsForCollectionType(CollectionType? collectionType)
|
||||||
|
{
|
||||||
|
switch (collectionType)
|
||||||
|
{
|
||||||
|
case CollectionType.movies:
|
||||||
|
return [BaseItemKind.Movie];
|
||||||
|
case CollectionType.tvshows:
|
||||||
|
return [BaseItemKind.Series];
|
||||||
|
case CollectionType.music:
|
||||||
|
return [BaseItemKind.MusicAlbum, BaseItemKind.MusicArtist];
|
||||||
|
case CollectionType.musicvideos:
|
||||||
|
return [BaseItemKind.MusicVideo];
|
||||||
|
case CollectionType.books:
|
||||||
|
return [BaseItemKind.Book, BaseItemKind.AudioBook];
|
||||||
|
case CollectionType.boxsets:
|
||||||
|
return [BaseItemKind.BoxSet];
|
||||||
|
case CollectionType.homevideos:
|
||||||
|
case CollectionType.photos:
|
||||||
|
return [BaseItemKind.Video, BaseItemKind.Photo];
|
||||||
|
default:
|
||||||
|
return [BaseItemKind.Video, BaseItemKind.Audio, BaseItemKind.Photo, BaseItemKind.Movie, BaseItemKind.Series];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add additional DtoOptions.
|
/// Add additional DtoOptions.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -61,6 +61,9 @@ namespace MediaBrowser.Controller.Entities
|
|||||||
case CollectionType.folders:
|
case CollectionType.folders:
|
||||||
return GetResult(_libraryManager.GetUserRootFolder().GetChildren(user, true), query);
|
return GetResult(_libraryManager.GetUserRootFolder().GetChildren(user, true), query);
|
||||||
|
|
||||||
|
case CollectionType.books:
|
||||||
|
return GetBooks(queryParent, user, query);
|
||||||
|
|
||||||
case CollectionType.tvshows:
|
case CollectionType.tvshows:
|
||||||
return GetTvView(queryParent, user, query);
|
return GetTvView(queryParent, user, query);
|
||||||
|
|
||||||
@@ -190,6 +193,17 @@ namespace MediaBrowser.Controller.Entities
|
|||||||
return _libraryManager.GetItemsResult(query);
|
return _libraryManager.GetItemsResult(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private QueryResult<BaseItem> GetBooks(Folder parent, User user, InternalItemsQuery query)
|
||||||
|
{
|
||||||
|
query.Recursive = true;
|
||||||
|
query.Parent = parent;
|
||||||
|
query.SetUser(user);
|
||||||
|
|
||||||
|
query.IncludeItemTypes = new[] { BaseItemKind.Book, BaseItemKind.AudioBook };
|
||||||
|
|
||||||
|
return _libraryManager.GetItemsResult(query);
|
||||||
|
}
|
||||||
|
|
||||||
private QueryResult<BaseItem> GetMovieMovies(Folder parent, User user, InternalItemsQuery query)
|
private QueryResult<BaseItem> GetMovieMovies(Folder parent, User user, InternalItemsQuery query)
|
||||||
{
|
{
|
||||||
query.Recursive = true;
|
query.Recursive = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user