Put roots into GetUserRootFolder instead of RootFolder.VirtualChild so global search works (also thanks to interception in CinemaLibraryManager.GetItemsResult)

This commit is contained in:
2024-12-07 02:28:07 +01:00
parent 9b6a93cda3
commit 882cf0f604
14 changed files with 93 additions and 60 deletions

View File

@@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis;
namespace Jellyfin.Plugin.Cinema;
sealed class CinemaAnimeFolder : CinemaRootFolder
public sealed class CinemaAnimeFolder : CinemaRootFolder
{
public CinemaAnimeFolder()
{

View File

@@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis;
namespace Jellyfin.Plugin.Cinema;
sealed class CinemaConcertFolder : CinemaRootFolder
public sealed class CinemaConcertFolder : CinemaRootFolder
{
public CinemaConcertFolder()
{

View File

@@ -66,6 +66,11 @@ public abstract class CinemaFilterFolder : Folder
/// </summary>
protected sealed override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)
{
if ((query.IncludeItemTypes != null && !query.IncludeItemTypes.Contains(ClientType))
|| (query.ExcludeItemTypes != null && query.ExcludeItemTypes.Contains(ClientType)))
// None of our items can match
return new QueryResult<BaseItem>() { Items = new List<BaseItem>() };
int offset = query.StartIndex ?? 0;
int limit = query.Limit ?? 0;
@@ -165,10 +170,13 @@ public abstract class CinemaFilterFolder : Folder
folder.Path = folderPath;
if (parent == null)
{
folder.ParentId = Guid.Empty;
folder.IsRoot = true;
if (!CinemaHost.LibraryManager.RootFolder.VirtualChildren.Contains(folder))
CinemaHost.LibraryManager.RootFolder.AddVirtualChild(folder);
Folder parentItem = LibraryManager.GetUserRootFolder();
folder.ParentId = parentItem.Id;
//folder.IsRoot = true;
//if (!CinemaHost.LibraryManager.RootFolder.VirtualChildren.Contains(folder))
// CinemaHost.LibraryManager.RootFolder.AddVirtualChild(folder);
if (!parentItem.Children.Contains(folder))
parentItem.AddChild(folder);
}
else
{

View File

@@ -14,7 +14,7 @@ namespace Jellyfin.Plugin.Cinema;
/// <summary>
/// <see cref="IHostedService"/> responsible for Live TV recordings.
/// </summary>
public sealed class CinemaHost : IHostedService
sealed class CinemaHost : IHostedService
{
#pragma warning disable CS8618
// This instance is specially registered and gets created before all classes

View File

@@ -4,11 +4,11 @@ using MediaBrowser.Model.Entities;
namespace Jellyfin.Plugin.Cinema;
/*
/// <summary>
/// An image provider for Cinema icons.
/// </summary>
public class CinemaImageProvider : IDynamicImageProvider
class CinemaImageProvider : IDynamicImageProvider
{
/// <inheritdoc />
public string Name => "Cinema Image Provider";
@@ -33,4 +33,4 @@ public class CinemaImageProvider : IDynamicImageProvider
{
return item is CinemaFilterFolder;
}
}
}*/

View File

@@ -1,6 +1,6 @@
namespace Jellyfin.Plugin.Cinema;
public class CinemaInnerMediaSourceManager
class CinemaInnerMediaSourceManager
{
private readonly Type _innerType;

View File

@@ -38,17 +38,20 @@ sealed class CinemaLibraryManager : ILibraryManager
public bool IsScanRunning => _inner.IsScanRunning;
public event EventHandler<ItemChangeEventArgs>? ItemAdded {
add => _inner.ItemAdded += value;
remove => _inner.ItemAdded -= value;
public event EventHandler<ItemChangeEventArgs>? ItemAdded
{
add => _inner.ItemAdded += value;
remove => _inner.ItemAdded -= value;
}
public event EventHandler<ItemChangeEventArgs>? ItemUpdated {
add => _inner.ItemUpdated += value;
remove => _inner.ItemUpdated -= value;
public event EventHandler<ItemChangeEventArgs>? ItemUpdated
{
add => _inner.ItemUpdated += value;
remove => _inner.ItemUpdated -= value;
}
public event EventHandler<ItemChangeEventArgs>? ItemRemoved {
add => _inner.ItemRemoved += value;
remove => _inner.ItemRemoved -= value;
public event EventHandler<ItemChangeEventArgs>? ItemRemoved
{
add => _inner.ItemRemoved += value;
remove => _inner.ItemRemoved -= value;
}
public void AddMediaPath(string virtualFolderName, MediaPathInfo mediaPath)
@@ -213,37 +216,40 @@ sealed class CinemaLibraryManager : ILibraryManager
public List<Guid> GetItemIds(InternalItemsQuery query)
{
return _inner.GetItemIds(query);
return _inner.GetItemIds(query);
}
public List<BaseItem> GetItemList(InternalItemsQuery query)
{
string? serieOrSeasonIdS;
Guid serieOrSeasonId;
BaseItem? serieOrSeason;
if (query.IncludeItemTypes == null
|| query.IncludeItemTypes.Length != 1
|| query.IncludeItemTypes[0] != BaseItemKind.Episode
|| (serieOrSeasonIdS = query.AncestorWithPresentationUniqueKey ?? query.SeriesPresentationUniqueKey) == null
|| !Guid.TryParse(serieOrSeasonIdS, out serieOrSeasonId)
|| (serieOrSeason = _inner.GetItemById(serieOrSeasonId)) == null
|| !CinemaQueryExtensions.IsCinemaExternalId(serieOrSeason.ExternalId))
return _inner.GetItemList(query);
string? serieOrSeasonIdS;
Guid serieOrSeasonId;
BaseItem? serieOrSeason;
if (query.IncludeItemTypes == null
|| query.IncludeItemTypes.Length != 1
|| query.IncludeItemTypes[0] != BaseItemKind.Episode
|| (serieOrSeasonIdS = query.AncestorWithPresentationUniqueKey ?? query.SeriesPresentationUniqueKey) == null
|| !Guid.TryParse(serieOrSeasonIdS, out serieOrSeasonId)
|| (serieOrSeason = _inner.GetItemById(serieOrSeasonId)) == null
|| !CinemaQueryExtensions.IsCinemaExternalId(serieOrSeason.ExternalId))
return _inner.GetItemList(query);
// HACK: Necessary until GetEpisodes is virtual
switch (serieOrSeason) {
case CinemaSeason season: return new List<BaseItem>(season.GetItemList(query));
case CinemaTvSeries series:
List<BaseItem> result = new List<BaseItem>();
foreach (BaseItem i in series.GetItemList(new InternalItemsQuery())) {
switch (i) {
case CinemaEpisode episode: result.Add(episode); break;
case CinemaSeason season: result.AddRange(season.GetItemList(query)); break;
}
}
return result;
default: return _inner.GetItemList(query);
}
// HACK: Necessary until GetEpisodes is virtual
switch (serieOrSeason)
{
case CinemaSeason season: return new List<BaseItem>(season.GetItemList(query));
case CinemaTvSeries series:
List<BaseItem> result = new List<BaseItem>();
foreach (BaseItem i in series.GetItemList(new InternalItemsQuery()))
{
switch (i)
{
case CinemaEpisode episode: result.Add(episode); break;
case CinemaSeason season: result.AddRange(season.GetItemList(query)); break;
}
}
return result;
default: return _inner.GetItemList(query);
}
}
public List<BaseItem> GetItemList(InternalItemsQuery query, bool allowExternalContent)
@@ -258,7 +264,21 @@ sealed class CinemaLibraryManager : ILibraryManager
public QueryResult<BaseItem> GetItemsResult(InternalItemsQuery query)
{
return _inner.GetItemsResult(query);
QueryResult<BaseItem> result = _inner.GetItemsResult(query);
if (query.ParentId != Guid.Empty || query.OrderBy.FirstOrDefault().OrderBy == ItemSortBy.DatePlayed)
return result;
List<BaseItem> a = new List<BaseItem>(result.Items);
foreach (BaseItem i in GetUserRootFolder().Children)
if (i is CinemaRootFolder root)
{
var b = root.GetItemList(query);
if (b != null)
a.AddRange(b);
}
return new QueryResult<BaseItem>() { Items = a };
}
public LibraryOptions GetLibraryOptions(BaseItem item)

View File

@@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations;
using System.Runtime.InteropServices;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
namespace Jellyfin.Plugin.Cinema;
@@ -14,9 +15,9 @@ public class CinemaMediaSourceController : ControllerBase
{
private readonly CinemaMediaSourceManager _mediaManager;
public CinemaMediaSourceController(CinemaMediaSourceManager mediaManager)
public CinemaMediaSourceController(IServiceProvider svc)
{
_mediaManager = mediaManager;
_mediaManager = svc.GetRequiredService<CinemaMediaSourceManager>();
}
/// <summary>

View File

@@ -23,7 +23,7 @@ using MediaBrowser.Model.Dlna;
namespace Jellyfin.Plugin.Cinema;
public sealed class CinemaMediaSourceManager : IMediaSourceManager
sealed class CinemaMediaSourceManager : IMediaSourceManager
{
private const double BitrateMargin = 0.1; // 10 %
private const double WebshareFreeBitrate = 300000 * 8;

View File

@@ -5,17 +5,17 @@ using System.Diagnostics.CodeAnalysis;
namespace Jellyfin.Plugin.Cinema;
sealed class CinemaMoviesFolder : CinemaRootFolder
public sealed class CinemaMoviesFolder : CinemaRootFolder
{
private readonly BaseItem _trending;
private readonly BaseItem _popular;
//private readonly BaseItem _trending;
//private readonly BaseItem _popular;
//private readonly BaseItem _mostWatched;
//private readonly BaseItem _newReleases;
public CinemaMoviesFolder()
{
this._trending = CreateChildFolder<CinemaTrendingFolder>("Trending");
this._popular = CreateChildFolder<CinemaPopularFolder>("Popular");
//this._trending = CreateChildFolder<CinemaTrendingFolder>("Trending");
//this._popular = CreateChildFolder<CinemaPopularFolder>("Popular");
//this._mostWatched = CreateFilterFolder("mostWatched", this, "Most Watched", "watched.png");
//this._newReleases = CreateFilterFolder("newReleases", this, "New Releases", "new.png");
}
@@ -31,10 +31,11 @@ sealed class CinemaMoviesFolder : CinemaRootFolder
protected override IEnumerable<BaseItem> GetFilterItems()
{
// Root items
yield return _trending;
yield return _popular!;
//yield return _trending;
//yield return _popular!;
//yield return _mostWatched!;
//yield return _newReleases!;
yield break;
}
public override bool TryCreateMediaItem(MediaSource? media, string csId, BaseItem parentFolder, [NotNullWhen(true)] out BaseItem? item)

View File

@@ -27,6 +27,7 @@ public abstract class CinemaRootFolder : CinemaFilterFolder, ICollectionFolder
public abstract CollectionType? CollectionType { get; }
public override bool IsHidden => _hidden;
internal bool Hide
{
get => _hidden;
@@ -36,6 +37,8 @@ public abstract class CinemaRootFolder : CinemaFilterFolder, ICollectionFolder
if (a.Contains(this) == (!value))
return;
this._hidden = value;
if (value)
{
// Remove ourselves

View File

@@ -16,7 +16,7 @@ public class CinemaServiceRegistrator : IPluginServiceRegistrator
/// <inheritdoc />
public void RegisterServices(IServiceCollection serviceCollection, IServerApplicationHost applicationHost)
{
serviceCollection.AddSingleton<IImageProvider, CinemaImageProvider>();
//serviceCollection.AddSingleton<IImageProvider, CinemaImageProvider>();
serviceCollection.AddHostedService<CinemaHost>();
// HACK: Replace IMediaSourceManager as CinemaMediaSourceProvider is not called soon enough while

View File

@@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis;
namespace Jellyfin.Plugin.Cinema;
sealed class CinemaTvShowsFolder : CinemaRootFolder
public sealed class CinemaTvShowsFolder : CinemaRootFolder
{
public CinemaTvShowsFolder()
{

View File

@@ -1,6 +1,6 @@
namespace Jellyfin.Plugin.Cinema;
public interface ICinemaChildrenCount {
interface ICinemaChildrenCount {
int ChildrenCount { get; set; }
int TotalChildrenCount { get; set; }
}