Put roots into GetUserRootFolder instead of RootFolder.VirtualChild so global search works (also thanks to interception in CinemaLibraryManager.GetItemsResult)
This commit is contained in:
@@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
namespace Jellyfin.Plugin.Cinema;
|
||||
|
||||
sealed class CinemaAnimeFolder : CinemaRootFolder
|
||||
public sealed class CinemaAnimeFolder : CinemaRootFolder
|
||||
{
|
||||
public CinemaAnimeFolder()
|
||||
{
|
||||
|
||||
@@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
namespace Jellyfin.Plugin.Cinema;
|
||||
|
||||
sealed class CinemaConcertFolder : CinemaRootFolder
|
||||
public sealed class CinemaConcertFolder : CinemaRootFolder
|
||||
{
|
||||
public CinemaConcertFolder()
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
namespace Jellyfin.Plugin.Cinema;
|
||||
|
||||
public class CinemaInnerMediaSourceManager
|
||||
class CinemaInnerMediaSourceManager
|
||||
{
|
||||
private readonly Type _innerType;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
namespace Jellyfin.Plugin.Cinema;
|
||||
|
||||
sealed class CinemaTvShowsFolder : CinemaRootFolder
|
||||
public sealed class CinemaTvShowsFolder : CinemaRootFolder
|
||||
{
|
||||
public CinemaTvShowsFolder()
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
namespace Jellyfin.Plugin.Cinema;
|
||||
|
||||
public interface ICinemaChildrenCount {
|
||||
interface ICinemaChildrenCount {
|
||||
int ChildrenCount { get; set; }
|
||||
int TotalChildrenCount { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user