Rename to Cinema
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2024-11-30 00:50:10 +01:00
parent 5523399969
commit 0bcb6d571f
71 changed files with 210 additions and 211 deletions

View File

@@ -3,11 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.002.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StreamCinemaLib", "StreamCinemaLib\StreamCinemaLib.csproj", "{7DE997A9-52B8-41E4-9958-1115BA3E481D}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CinemaLib", "CinemaLib\CinemaLib.csproj", "{7DE997A9-52B8-41E4-9958-1115BA3E481D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StreamCinemaWeb", "StreamCinemaWeb\StreamCinemaWeb.csproj", "{6B2550AF-200C-40B3-95AE-892A604B9A76}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CinemaWeb", "CinemaWeb\CinemaWeb.csproj", "{6B2550AF-200C-40B3-95AE-892A604B9A76}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StreamCinemaJellyfin", "StreamCinemaJellyfin\StreamCinemaJellyfin.csproj", "{E106C0D2-788D-4401-A9F0-9D0A35E8BB63}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CinemaJellyfin", "CinemaJellyfin\CinemaJellyfin.csproj", "{E106C0D2-788D-4401-A9F0-9D0A35E8BB63}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@@ -6,14 +6,14 @@ using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
using StreamCinemaLib.API;
using CinemaLib.API;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
/// <summary>
/// Stream Cinema folder that also implicitly represents a filter (minimally filter by <see cref="ItemType"/>).
/// </summary>
public abstract class StreamCinemaFilterFolder : Folder
public abstract class CinemaFilterFolder : Folder
{
private const string PreferredCulture = "cs";
private const string FallbackCulture = "en";
@@ -45,7 +45,7 @@ public abstract class StreamCinemaFilterFolder : Folder
public abstract ItemType ItemType { get; }
/// <summary>
/// Information for <see cref="StreamCinemaImageProvider"/> to render icon for us.
/// Information for <see cref="CinemaImageProvider"/> to render icon for us.
/// </summary>
internal abstract string ImageName { get; }
@@ -159,7 +159,7 @@ public abstract class StreamCinemaFilterFolder : Folder
/// </summary>
/// <typeparam name="T">Type of the folder.</typeparam>
/// <param name="localizedName">Culture localized name of the folder.</param>
protected T CreateChildFolder<T>(string localizedName) where T : StreamCinemaFilterFolder, new()
protected T CreateChildFolder<T>(string localizedName) where T : CinemaFilterFolder, new()
{
return CreateFilterFolderInternal<T>(this, localizedName);
}
@@ -169,18 +169,18 @@ public abstract class StreamCinemaFilterFolder : Folder
/// <typeparam name="T">Type of the folder.</typeparam>
/// <param name="parent">Parent folder.</param>
/// <param name="localizedName">Culture localized name of the folder.</param>
internal static T CreateRootFilterFolder<T>(string localizedName) where T : StreamCinemaRootFolder, new()
internal static T CreateRootFilterFolder<T>(string localizedName) where T : CinemaRootFolder, new()
{
return CreateFilterFolderInternal<T>(null, localizedName);
}
private static T CreateFilterFolderInternal<T>(StreamCinemaFilterFolder? parent, string localizedName) where T : StreamCinemaFilterFolder, new()
private static T CreateFilterFolderInternal<T>(CinemaFilterFolder? parent, string localizedName) where T : CinemaFilterFolder, new()
{
Guid folderId = StreamCinemaHost.LibraryManager.GetNewItemId("folder", typeof(T));
string folderPath = GetInternalMetadataPath(StreamCinemaHost.InternalMetadataPath!, folderId);
Guid folderId = CinemaHost.LibraryManager.GetNewItemId("folder", typeof(T));
string folderPath = GetInternalMetadataPath(CinemaHost.InternalMetadataPath!, folderId);
Directory.CreateDirectory(folderPath);
T? folder = StreamCinemaHost.LibraryManager.GetItemById(folderId) as T;
T? folder = CinemaHost.LibraryManager.GetItemById(folderId) as T;
bool isNew;
bool forceUpdate = false;
if (isNew = folder == null)
@@ -189,8 +189,8 @@ public abstract class StreamCinemaFilterFolder : Folder
{
Id = folderId,
Name = localizedName,
DateCreated = StreamCinemaHost.FileSystem.GetCreationTimeUtc(folderPath),
DateModified = StreamCinemaHost.FileSystem.GetLastWriteTimeUtc(folderPath)
DateCreated = CinemaHost.FileSystem.GetCreationTimeUtc(folderPath),
DateModified = CinemaHost.FileSystem.GetLastWriteTimeUtc(folderPath)
};
}
@@ -200,7 +200,7 @@ public abstract class StreamCinemaFilterFolder : Folder
{
folder.ParentId = Guid.Empty;
folder.IsRoot = true;
StreamCinemaHost.LibraryManager.RootFolder.AddVirtualChild(folder);
CinemaHost.LibraryManager.RootFolder.AddVirtualChild(folder);
}
else
{
@@ -210,11 +210,11 @@ public abstract class StreamCinemaFilterFolder : Folder
if (isNew)
{
folder.OnMetadataChanged();
StreamCinemaHost.LibraryManager.CreateItem(folder, parent);
CinemaHost.LibraryManager.CreateItem(folder, parent);
}
folder.RefreshMetadata(
new MetadataRefreshOptions(new DirectoryService(StreamCinemaHost.FileSystem)) { ForceSave = !isNew && forceUpdate },
new MetadataRefreshOptions(new DirectoryService(CinemaHost.FileSystem)) { ForceSave = !isNew && forceUpdate },
default
).GetAwaiter().GetResult();
@@ -275,7 +275,7 @@ public abstract class StreamCinemaFilterFolder : Folder
}
else
{
item = GetMediaItemById<StreamCinemaMovie>(csId, null, out isNew);
item = GetMediaItemById<CinemaMovie>(csId, null, out isNew);
}
if (isNew && media.info_labels != null)
@@ -324,11 +324,11 @@ public abstract class StreamCinemaFilterFolder : Folder
}
}
// Identify the item as it originates from StreamCinema
// Identify the item as it originates from Cinema
// Note: This is getting lost in persisted items
if (item.ProviderIds == null)
item.ProviderIds = new Dictionary<string, string>();
item.ProviderIds[StreamCinemaPlugin.StreamCinemaProviderName] = "";
item.ProviderIds[CinemaPlugin.CinemaProviderName] = "";
item.Path = "https://a/b";
@@ -381,7 +381,7 @@ public abstract class StreamCinemaFilterFolder : Folder
{
// HACK: We use RegisterItem that is volatile intead of CreateItem
//_libraryManager.CreateItem(item, parentFolder);
StreamCinemaHost.LibraryManager.RegisterItem(item);
CinemaHost.LibraryManager.RegisterItem(item);
if (media.cast != null && media.cast.Count > 0)
{
@@ -451,7 +451,7 @@ public abstract class StreamCinemaFilterFolder : Folder
internal static string GetInternalMetadataPath(string basePath, Guid id)
{
return System.IO.Path.Combine(basePath, "streamcinema", id.ToString("N", CultureInfo.InvariantCulture), "metadata");
return System.IO.Path.Combine(basePath, "cinema", id.ToString("N", CultureInfo.InvariantCulture), "metadata");
}
/// <summary>
@@ -459,7 +459,7 @@ public abstract class StreamCinemaFilterFolder : Folder
/// </summary>
internal static Guid GetMediaItemId(string csPrimaryId, string? csVersionId) {
string idS = csVersionId == null ? csPrimaryId : (csPrimaryId + VersionSeparator + csVersionId);
return StreamCinemaHost.LibraryManager.GetNewItemId(idS, typeof(StreamCinemaPlugin));
return CinemaHost.LibraryManager.GetNewItemId(idS, typeof(CinemaPlugin));
}
/// <summary>
@@ -469,7 +469,7 @@ public abstract class StreamCinemaFilterFolder : Folder
where T : BaseItem, new()
{
Guid id = GetMediaItemId(csPrimaryId, csVersionId);
T? item = StreamCinemaHost.LibraryManager.GetItemById(id) as T;
T? item = CinemaHost.LibraryManager.GetItemById(id) as T;
if (item == null)
{

View File

@@ -5,26 +5,26 @@ using MediaBrowser.Model.IO;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
/// <summary>
/// <see cref="IHostedService"/> responsible for Live TV recordings.
/// </summary>
public sealed class StreamCinemaHost : IHostedService
public sealed class CinemaHost : IHostedService
{
#pragma warning disable CS8618
// This instance is specially registered and gets created before all classes
// except StreamCinemaSeccviceRegistrator and StreamCinemaPlugin.
// except CinemaServiceRegistrator and CinemaPlugin.
private static ILibraryManager _libraryManager;
private static IServerConfigurationManager _config;
private static IFileSystem _fileSystem;
#pragma warning restore CS8618
private readonly ILogger<StreamCinemaHost> _logger;
private readonly ILogger<CinemaHost> _logger;
/// <summary>
/// Initializes a the Stream Cinema plugin.
/// </summary>
public StreamCinemaHost(ILibraryManager libraryManager, IServerConfigurationManager config, IFileSystem fileSystem, ILogger<StreamCinemaHost> logger)
public CinemaHost(ILibraryManager libraryManager, IServerConfigurationManager config, IFileSystem fileSystem, ILogger<CinemaHost> logger)
{
_libraryManager = libraryManager;
_config = config;
@@ -42,7 +42,7 @@ public sealed class StreamCinemaHost : IHostedService
public Task StartAsync(CancellationToken cancellationToken)
{
// Make sure the Stream Cinema root folders are created
StreamCinemaFilterFolder.CreateRootFilterFolder<StreamCinemaMoviesFolder>("Movies");
CinemaFilterFolder.CreateRootFilterFolder<CinemaMoviesFolder>("Movies");
/*
pluginItems.Add(CreateMenuItem("movies", Resources.Movies, GetResourceUrl("movies.png")));

View File

@@ -2,16 +2,16 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
/// <summary>
/// An image provider for Stream Cinema icons.
/// An image provider for Cinema icons.
/// </summary>
public class StreamCinemaImageProvider : IDynamicImageProvider
public class CinemaImageProvider : IDynamicImageProvider
{
/// <inheritdoc />
public string Name => "Stream Cinema Image Provider";
public string Name => "Cinema Image Provider";
/// <inheritdoc />
public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
@@ -22,8 +22,8 @@ public class StreamCinemaImageProvider : IDynamicImageProvider
/// <inheritdoc />
public Task<DynamicImageResponse> GetImage(BaseItem item, ImageType type, CancellationToken cancellationToken)
{
if (item is StreamCinemaFilterFolder filter)
return Task.FromResult(new DynamicImageResponse() { HasImage = true, Stream = typeof(StreamCinemaImageProvider).Assembly.GetManifestResourceStream(typeof(StreamCinemaImageProvider), filter.ImageName) });
if (item is CinemaFilterFolder filter)
return Task.FromResult(new DynamicImageResponse() { HasImage = true, Stream = typeof(CinemaImageProvider).Assembly.GetManifestResourceStream(typeof(CinemaImageProvider), filter.ImageName) });
else
return Task.FromResult(new DynamicImageResponse() { HasImage = false });
}
@@ -31,6 +31,6 @@ public class StreamCinemaImageProvider : IDynamicImageProvider
/// <inheritdoc />
public bool Supports(BaseItem item)
{
return item is StreamCinemaFilterFolder;
return item is CinemaFilterFolder;
}
}

View File

@@ -0,0 +1,12 @@
namespace Jellyfin.Plugin.Cinema;
class CinemaInnerMediaSourceManager : ICinemaInnerMediaSourceManager
{
private readonly Type _innerType;
public CinemaInnerMediaSourceManager(Type innerType) {
this._innerType = innerType;
}
public Type InnerType => _innerType;
}

View File

@@ -7,7 +7,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\StreamCinemaLib/StreamCinemaLib.csproj" />
<ProjectReference Include="..\CinemaLib\CinemaLib.csproj" />
<PackageReference Include="Jellyfin.Controller" Version="10.10.3" />
<!--ProjectReference Include="..\..\..\jellyfin/MediaBrowser.Controller\MediaBrowser.Controller.csproj" /-->
<PackageReference Include="Jellyfin.Model" Version="10.10.3" />
@@ -16,9 +16,9 @@
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Debug'">
<ItemGroup>
<DebugCopyFiles Include="$(TargetDir)\StreamCinema*.dll" />
<DebugCopyFiles Include="$(TargetDir)\Cinema*.dll" />
</ItemGroup>
<MakeDir Directories="\home\code\.local\share\jellyfin\plugins\StreamCinema" />
<Copy SourceFiles="@(DebugCopyFiles)" DestinationFolder="\home\code\.local\share\jellyfin\plugins\StreamCinema" />
<MakeDir Directories="\home\code\.local\share\jellyfin\plugins\Cinema" />
<Copy SourceFiles="@(DebugCopyFiles)" DestinationFolder="\home\code\.local\share\jellyfin\plugins\Cinema" />
</Target>
</Project>

View File

@@ -16,12 +16,12 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.MediaInfo;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Primitives;
using StreamCinema.Webshare;
using StreamCinemaLib.API;
using Cinema.Webshare;
using CinemaLib.API;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
public class StreamCinemaMediaSourceManager : IMediaSourceManager
public class CinemaMediaSourceManager : IMediaSourceManager
{
private const bool IsWebshareFreeAccount = true;
private const double BitrateMargin = 0.1; // 10 %
@@ -29,14 +29,14 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
private static readonly TimeSpan VersionValidityTimeout = TimeSpan.FromMinutes(180);
private static StreamCinemaMediaSourceManager? _instance;
private static CinemaMediaSourceManager? _instance;
private readonly IMediaSourceManager _inner;
private readonly ILibraryManager _libraryManager;
private readonly IHttpContextAccessor _http;
private readonly ConcurrentDictionary<Guid, VersionSetEntry> _videoVersions;
public StreamCinemaMediaSourceManager(IStreamCinemaInnerMediaSourceManager innerMediaSourceManager, ILibraryManager libraryManager, IServiceProvider svc, IHttpContextAccessor http)
public CinemaMediaSourceManager(ICinemaInnerMediaSourceManager innerMediaSourceManager, ILibraryManager libraryManager, IServiceProvider svc, IHttpContextAccessor http)
{
if (innerMediaSourceManager == null || svc == null)
throw new ArgumentNullException();
@@ -53,7 +53,7 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
_instance = this;
}
internal static bool TryGetInstance([NotNullWhen(true)] out StreamCinemaMediaSourceManager? instance)
internal static bool TryGetInstance([NotNullWhen(true)] out CinemaMediaSourceManager? instance)
{
instance = _instance;
return instance != null;
@@ -120,15 +120,15 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
{
return _inner.GetMediaStreams(itemId);
/*
// Intercept for StreamCinemaItems
// Intercept for CinemaItems
Video? item = _libraryManager.GetItemById<Video>(itemId);
if (item == null
|| item.ProviderIds == null
|| !item.ProviderIds.ContainsKey(StreamCinemaPlugin.StreamCinemaProviderName)
|| !item.ProviderIds.ContainsKey(CinemaPlugin.CinemaProviderName)
|| string.IsNullOrEmpty(item.ExternalId))
return _inner.GetMediaStreams(itemId);
StreamCinemaLib.API.Stream? ver = GetVersion(item, default).GetAwaiter().GetResult();
CinemaLib.API.Stream? ver = GetVersion(item, default).GetAwaiter().GetResult();
return ver != null ? VersionToMediaStreams(item, ver) : new List<MediaStream>();
*/
@@ -151,10 +151,10 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
public List<MediaSourceInfo> GetStaticMediaSources(BaseItem item, bool enablePathSubstitution, User? user = null)
{
// Intercept for StreamCinemaItems
// Intercept for CinemaItems
if (item == null
|| item.ProviderIds == null
|| !item.ProviderIds.ContainsKey(StreamCinemaPlugin.StreamCinemaProviderName)
|| !item.ProviderIds.ContainsKey(CinemaPlugin.CinemaProviderName)
|| string.IsNullOrEmpty(item.ExternalId))
return _inner.GetStaticMediaSources(item, enablePathSubstitution, user);
@@ -168,7 +168,7 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
IEnumerable<Video> items;
switch (video)
{
case StreamCinemaMovie movie: items = GetVideoVersionsEnumerate<StreamCinemaMovie>(movie, videoPrimary!, ver.Versions); break;
case CinemaMovie movie: items = GetVideoVersionsEnumerate<CinemaMovie>(movie, videoPrimary!, ver.Versions); break;
default: throw new NotSupportedException(string.Format("BaseItem type '{0}' not supported in CinemaMediaSources.", video.GetType().Name));
}
@@ -190,10 +190,10 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
public async Task<List<MediaSourceInfo>> GetPlaybackMediaSources(BaseItem item, User user, bool allowMediaProbe, bool enablePathSubstitution, CancellationToken cancellationToken)
{
// Intercept for StreamCinemaItems
// Intercept for CinemaItems
if (item == null
|| item.ProviderIds == null
|| !item.ProviderIds.ContainsKey(StreamCinemaPlugin.StreamCinemaProviderName)
|| !item.ProviderIds.ContainsKey(CinemaPlugin.CinemaProviderName)
|| string.IsNullOrEmpty(item.ExternalId))
return await _inner.GetPlaybackMediaSources(item, user, allowMediaProbe, enablePathSubstitution, cancellationToken);
@@ -301,7 +301,7 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
}
else
{
a = StreamCinemaFilterFolder.GetMediaItemById<T>(item.ExternalId, i.Meta._id, out bool isNew);
a = CinemaFilterFolder.GetMediaItemById<T>(item.ExternalId, i.Meta._id, out bool isNew);
if (isNew)
{
// Copy properties from the parent version
@@ -328,7 +328,7 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
throw new ArgumentNullException();
if (item.ProviderIds == null
|| !item.ProviderIds.ContainsKey(StreamCinemaPlugin.StreamCinemaProviderName)
|| !item.ProviderIds.ContainsKey(CinemaPlugin.CinemaProviderName)
|| string.IsNullOrEmpty(item.ExternalId))
{
// Not a Stream Cinema video
@@ -345,7 +345,7 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
primary = _libraryManager.GetItemById(primaryId);
if (primary == null
|| primary.ProviderIds == null
|| !primary.ProviderIds.ContainsKey(StreamCinemaPlugin.StreamCinemaProviderName)
|| !primary.ProviderIds.ContainsKey(CinemaPlugin.CinemaProviderName)
|| string.IsNullOrEmpty(primary.ExternalId))
// Not a Stream Cinema video
return Task.FromResult<VersionSetEntry>(default);
@@ -399,7 +399,7 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
id = primary!.Id;
}
else
id = StreamCinemaFilterFolder.GetMediaItemId(primary!.ExternalId, i.Meta._id);
id = CinemaFilterFolder.GetMediaItemId(primary!.ExternalId, i.Meta._id);
if (id == item.Id)
return i;
@@ -419,7 +419,7 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
return GetVersionInfo(item, ver.Meta);
}
private MediaSourceInfo GetVersionInfo(Video item, StreamCinemaLib.API.Stream ver)
private MediaSourceInfo GetVersionInfo(Video item, CinemaLib.API.Stream ver)
{
MediaSourceInfo result = new MediaSourceInfo();
result.VideoType = VideoType.VideoFile;
@@ -478,7 +478,7 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
return result;
}
private static List<MediaStream> VersionToMediaStreams(Video item, StreamCinemaLib.API.Stream ver)
private static List<MediaStream> VersionToMediaStreams(Video item, CinemaLib.API.Stream ver)
{
List<MediaStream> result = new List<MediaStream>();
// HACK: Propagate some values to the item also
@@ -601,14 +601,14 @@ public class StreamCinemaMediaSourceManager : IMediaSourceManager
class VersionEntry
{
private readonly StreamCinemaLib.API.Stream _meta;
private readonly CinemaLib.API.Stream _meta;
internal VersionEntry(StreamCinemaLib.API.Stream meta)
internal VersionEntry(CinemaLib.API.Stream meta)
{
this._meta = meta;
}
internal StreamCinemaLib.API.Stream Meta => _meta;
internal CinemaLib.API.Stream Meta => _meta;
internal Uri? DownloadLink { get; set; }
}

View File

@@ -4,14 +4,14 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using StreamCinemaLib.API;
using CinemaLib.API;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
/// <summary>
/// Media source provider for for Stream Cinema media items.
/// Media source provider for for Cinema media items.
/// </summary>
public class StreamCinemaMediaSourceProvider : IMediaSourceProvider
public class CinemaMediaSourceProvider : IMediaSourceProvider
{
/// <inheritdoc />
public Task<IEnumerable<MediaSourceInfo>> GetMediaSources(BaseItem item, CancellationToken cancellationToken)

View File

@@ -7,16 +7,16 @@ using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.IO;
using Microsoft.Extensions.Logging;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
/// <summary>
/// Metadata service that recognizes the StreamCinemaFilterFolder folders.
/// Metadata service that recognizes the CinemaFilterFolder folders.
/// </summary>
public class StreamCinemaMetadataService : IMetadataService
public class CinemaMetadataService : IMetadataService
{
public StreamCinemaMetadataService(
public CinemaMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger<StreamCinemaMetadataService> logger,
ILogger<CinemaMetadataService> logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
@@ -27,17 +27,17 @@ public class StreamCinemaMetadataService : IMetadataService
public bool CanRefresh(BaseItem item)
{
return item is StreamCinemaFilterFolder;
return item is CinemaFilterFolder;
}
public bool CanRefreshPrimary(Type type)
{
return typeof(StreamCinemaFilterFolder).IsAssignableFrom(type);
return typeof(CinemaFilterFolder).IsAssignableFrom(type);
}
public Task<ItemUpdateType> RefreshMetadata(BaseItem item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken)
{
var itemOfType = (StreamCinemaFilterFolder)item;
var itemOfType = (CinemaFilterFolder)item;
var updateType = ItemUpdateType.None;
@@ -90,7 +90,7 @@ public class StreamCinemaMetadataService : IMetadataService
}
}
var metadataResult = new MetadataResult<StreamCinemaFilterFolder>
var metadataResult = new MetadataResult<CinemaFilterFolder>
{
Item = itemOfType,
//People = LibraryManager.GetPeople(item)

View File

@@ -3,12 +3,12 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Model.Dto;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
/// <summary>
/// Movie media item from Stream Cinema.
/// Movie media item from Cinema.
/// </summary>
public class StreamCinemaMovie : Movie
public class CinemaMovie : Movie
{
public sealed override string GetClientTypeName() => BaseItemKind.Movie.ToString();

View File

@@ -1,21 +1,21 @@
using Jellyfin.Data.Enums;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using StreamCinemaLib.API;
using CinemaLib.API;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
sealed class StreamCinemaMoviesFolder : StreamCinemaRootFolder
sealed class CinemaMoviesFolder : CinemaRootFolder
{
private readonly BaseItem _trending;
private readonly BaseItem _popular;
private readonly BaseItem _mostWatched;
private readonly BaseItem _newReleases;
public StreamCinemaMoviesFolder()
public CinemaMoviesFolder()
{
this._trending = CreateChildFolder<StreamCinemaTrendingFolder>("Trending");
this._popular = CreateChildFolder<StreamCinemaPopularFolder>("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");
}

View File

@@ -6,18 +6,18 @@ using MediaBrowser.Common.Plugins;
using MediaBrowser.Model.Plugins;
using MediaBrowser.Model.Serialization;
using Jellyfin.Plugin.StreamCinema.Configuration;
using Jellyfin.Plugin.Cinema.Configuration;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
/// <summary>
/// Class Plugin.
/// </summary>
public class StreamCinemaPlugin : BasePlugin<StreamCinemaPluginConfiguration>, IHasWebPages
public class CinemaPlugin : BasePlugin<CinemaPluginConfiguration>, IHasWebPages
{
internal const string StreamCinemaProviderName = "StreamCinema";
internal const string CinemaProviderName = "Cinema";
public StreamCinemaPlugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer)
public CinemaPlugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer)
: base(applicationPaths, xmlSerializer)
{
}
@@ -26,7 +26,7 @@ public class StreamCinemaPlugin : BasePlugin<StreamCinemaPluginConfiguration>, I
public override Guid Id => new Guid("253cce3e-aa5f-11ef-bb75-8f5ab4b2eee3");
/// <inheritdoc />
public override string Name => "StreamCinema";
public override string Name => "Cinema";
/// <inheritdoc />
public override string Description => "Videodoplněk obsahující rozsáhlou databázi filmů a seriálů.";
@@ -38,13 +38,13 @@ public class StreamCinemaPlugin : BasePlugin<StreamCinemaPluginConfiguration>, I
{
new PluginPageInfo
{
Name = "streamcinema",
EmbeddedResourcePath = GetType().Namespace + ".Web.streamcinema.html",
Name = "cinema",
EmbeddedResourcePath = GetType().Namespace + ".Web.cinema.html",
},
new PluginPageInfo
{
Name = "streamcinemajs",
EmbeddedResourcePath = GetType().Namespace + ".Web.streamcinema.js"
Name = "cinemajs",
EmbeddedResourcePath = GetType().Namespace + ".Web.cinema.js"
}
};
}

View File

@@ -1,10 +1,10 @@
using Jellyfin.Data.Enums;
using MediaBrowser.Controller.Entities;
using StreamCinemaLib.API;
using CinemaLib.API;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
public sealed class StreamCinemaPopularFolder : StreamCinemaSortFolder
public sealed class CinemaPopularFolder : CinemaSortFolder
{
internal override string ImageName => "popular.png";

View File

@@ -9,19 +9,19 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
using Microsoft.Extensions.Logging;
using StreamCinemaLib.API;
using CinemaLib.API;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
/// <summary>
/// Stream Cinema root folder that is displayed identically to user-defined libraries.
/// Cinema root folder that is displayed identically to user-defined libraries.
/// </summary>
public abstract class StreamCinemaRootFolder : StreamCinemaFilterFolder, ICollectionFolder
public abstract class CinemaRootFolder : CinemaFilterFolder, ICollectionFolder
{
/// <summary>
/// Gets the item type for <see cref="ICollectionFolder"/>. Shall be kept in
/// sync with value for <see cref="StreamCinemaFilterFolder.ClientType"/>
/// sync with value for <see cref="CinemaFilterFolder.ClientType"/>
/// </summary>
public abstract CollectionType? CollectionType { get; }

View File

@@ -5,21 +5,21 @@ using MediaBrowser.Controller.Plugins;
using MediaBrowser.Controller.Providers;
using Microsoft.Extensions.DependencyInjection;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
/// <summary>
/// Register StreamCinema services.
/// Register Cinema services.
/// </summary>
///
public class StreamCinemaServiceRegistrator : IPluginServiceRegistrator
public class CinemaServiceRegistrator : IPluginServiceRegistrator
{
/// <inheritdoc />
public void RegisterServices(IServiceCollection serviceCollection, IServerApplicationHost applicationHost)
{
serviceCollection.AddSingleton<IImageProvider, StreamCinemaImageProvider>();
serviceCollection.AddHostedService<StreamCinemaHost>();
serviceCollection.AddSingleton<IImageProvider, CinemaImageProvider>();
serviceCollection.AddHostedService<CinemaHost>();
// HACK: Replace IMediaSourceManager as StreamCinemaMediaSourceProvider is not called soon enough while
// HACK: Replace IMediaSourceManager as CinemaMediaSourceProvider is not called soon enough while
// entering a media item page.
Type tIf = typeof(IMediaSourceManager);
int count = serviceCollection.Count;
@@ -30,12 +30,12 @@ public class StreamCinemaServiceRegistrator : IPluginServiceRegistrator
{
Type oldImplType = a.ImplementationType!;
serviceCollection.RemoveAt(i);
serviceCollection.AddSingleton<IStreamCinemaInnerMediaSourceManager>(new StreamCinemaInnerMediaSourceManager(oldImplType));
serviceCollection.AddSingleton<ICinemaInnerMediaSourceManager>(new CinemaInnerMediaSourceManager(oldImplType));
serviceCollection.AddSingleton(oldImplType, oldImplType);
// Replace IMediaSourceManager but also need direct access to the StreamCinemaMediaSourceManager if it itself
// Replace IMediaSourceManager but also need direct access to the CinemaMediaSourceManager if it itself
// also gets replaced in a longer chain
serviceCollection.AddSingleton<StreamCinemaMediaSourceManager>();
serviceCollection.AddSingleton<IMediaSourceManager>(x => x.GetRequiredService<StreamCinemaMediaSourceManager>());
serviceCollection.AddSingleton<CinemaMediaSourceManager>();
serviceCollection.AddSingleton<IMediaSourceManager>(x => x.GetRequiredService<CinemaMediaSourceManager>());
break;
}
}

View File

@@ -0,0 +1,8 @@
using CinemaLib.API;
namespace Jellyfin.Plugin.Cinema;
public abstract class CinemaSortFolder : CinemaFilterFolder
{
internal abstract FilterSortBy SortBy { get; }
}

View File

@@ -1,10 +1,10 @@
using Jellyfin.Data.Enums;
using MediaBrowser.Controller.Entities;
using StreamCinemaLib.API;
using CinemaLib.API;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
public sealed class StreamCinemaTrendingFolder : StreamCinemaSortFolder
public sealed class CinemaTrendingFolder : CinemaSortFolder
{
internal override string ImageName => "trending.png";

View File

@@ -2,9 +2,9 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Dto;
namespace Jellyfin.Plugin.StreamCinema;
namespace Jellyfin.Plugin.Cinema;
static class StreamCinemaVideoExtensions
static class CinemaVideoExtensions
{
public static IEnumerable<(BaseItem Item, MediaSourceType MediaSourceType)>? VideoGetAllItemsForMediaSources<T>(this T @this)
where T : Video, new()
@@ -16,16 +16,16 @@ static class StreamCinemaVideoExtensions
}
// Our media source manager must be present
StreamCinemaMediaSourceManager? msm;
if (!StreamCinemaMediaSourceManager.TryGetInstance(out msm))
CinemaMediaSourceManager? msm;
if (!CinemaMediaSourceManager.TryGetInstance(out msm))
return Enumerable.Empty<(BaseItem Item, MediaSourceType MediaSourceType)>();
// Generate item for each StreamCinemaLib.API.Stream. Obtaining the file sub-streams themselves
// is intercepted in StreamCinemaMediaSourceManager.GetMediaStreams
// Generate item for each CinemaLib.API.Stream. Obtaining the file sub-streams themselves
// is intercepted in CinemaMediaSourceManager.GetMediaStreams
return GetAllItemsForMediaSourcesEnumerate(@this, msm);
}
private static IEnumerable<(BaseItem Item, MediaSourceType MediaSourceType)> GetAllItemsForMediaSourcesEnumerate<T>(T @this, StreamCinemaMediaSourceManager msm)
private static IEnumerable<(BaseItem Item, MediaSourceType MediaSourceType)> GetAllItemsForMediaSourcesEnumerate<T>(T @this, CinemaMediaSourceManager msm)
where T : Video, new()
{
IEnumerable<T>? versions = msm.GetVideoVersions(@this, default).GetAwaiter().GetResult();
@@ -40,8 +40,8 @@ static class StreamCinemaVideoExtensions
List<MediaSourceInfo> result = new List<MediaSourceInfo>();
// Our media source manager must be present
StreamCinemaMediaSourceManager? msm;
if (!StreamCinemaMediaSourceManager.TryGetInstance(out msm))
CinemaMediaSourceManager? msm;
if (!CinemaMediaSourceManager.TryGetInstance(out msm))
return result;
var a = msm.GetVersionInfo(@this, default).GetAwaiter().GetResult();

View File

@@ -3,11 +3,11 @@ using System.Collections.Generic;
using MediaBrowser.Model.Plugins;
namespace Jellyfin.Plugin.StreamCinema.Configuration;
namespace Jellyfin.Plugin.Cinema.Configuration;
public class StreamCinemaPluginConfiguration : BasePluginConfiguration
public class CinemaPluginConfiguration : BasePluginConfiguration
{
public StreamCinemaPluginConfiguration()
public CinemaPluginConfiguration()
{
Pin = "0000";
WebServiceUrl = "http://localhost:8866";

View File

@@ -0,0 +1,5 @@
namespace Jellyfin.Plugin.Cinema;
public interface ICinemaInnerMediaSourceManager {
Type InnerType { get; }
}

View File

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class Art
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class Cast
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class FilterHits
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class FilterResponse
{

View File

@@ -1,4 +1,4 @@
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public enum FilterSortBy
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class FilterTotalHits
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class InfoLabelI18n
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class InfoLabels
{

View File

@@ -1,4 +1,4 @@
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public enum ItemOrder
{

View File

@@ -1,4 +1,4 @@
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public enum ItemType
{

View File

@@ -1,7 +1,7 @@
using System;
using System.Text.Json.Serialization;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class MediaFormatInfo
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class MediaInfo
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class MediaLanguageInfo
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class MediaLanguageInfos
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class MediaLanguageItem
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class MediaRating
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class MediaRatings
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class MediaSource
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class MediaStreamInfo
{

View File

@@ -6,7 +6,7 @@ using System.Net.Http.Json;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class Metadata
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class ServicesIds
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class ShardsInfo
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class Stream
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class StreamAudio
{

View File

@@ -1,6 +1,6 @@
using System;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class StreamSubtitle
{

View File

@@ -2,7 +2,7 @@ using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace StreamCinemaLib.API;
namespace CinemaLib.API;
public class StreamVideo
{

View File

@@ -1,5 +1,5 @@
using System;
using StreamCinema.Webshare;
using Cinema.Webshare;
class Program
{

View File

@@ -1,7 +1,7 @@
using System;
using System.Text;
namespace StreamCinema.Webshare;
namespace Cinema.Webshare;
/// <summary>
/// Performs generic binary-to-text encoding.

View File

@@ -4,7 +4,7 @@ using System.Security.Cryptography;
using System.Text;
using System.Xml;
namespace StreamCinema.Webshare;
namespace Cinema.Webshare;
public class LinkGenerator
{

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<ItemGroup>
<ProjectReference Include="..\StreamCinemaLib\StreamCinemaLib.csproj" />
<ProjectReference Include="..\CinemaLib\CinemaLib.csproj" />
</ItemGroup>
<PropertyGroup>

View File

@@ -3,7 +3,7 @@ using System.Buffers;
using System.Text;
using System.Web;
namespace StreamCinemaWeb.Layouts;
namespace CinemaWeb.Layouts;
public abstract class BasicLayout
{

View File

@@ -1,9 +1,9 @@
using System;
using System.Web;
using StreamCinemaLib.API;
using StreamCinemaWeb.Layouts;
using CinemaLib.API;
using CinemaWeb.Layouts;
namespace StreamCinemaWeb.Pages;
namespace CinemaWeb.Pages;
public class EpisodesPage : BasicLayout
{

View File

@@ -1,12 +1,12 @@
using System;
using System.Web;
using Microsoft.Extensions.Primitives;
using StreamCinema.Webshare;
using StreamCinemaLib.API;
using StreamCinemaWeb.Layouts;
using LinkGenerator = StreamCinema.Webshare.LinkGenerator;
using Cinema.Webshare;
using CinemaLib.API;
using CinemaWeb.Layouts;
using LinkGenerator = Cinema.Webshare.LinkGenerator;
namespace StreamCinemaWeb.Pages;
namespace CinemaWeb.Pages;
public class LinkPage : BasicLayout
{

View File

@@ -1,9 +1,9 @@
using System;
using System.Web;
using StreamCinemaLib.API;
using StreamCinemaWeb.Layouts;
using CinemaLib.API;
using CinemaWeb.Layouts;
namespace StreamCinemaWeb.Pages;
namespace CinemaWeb.Pages;
public class MediaPage : BasicLayout
{
@@ -24,7 +24,7 @@ public class MediaPage : BasicLayout
w.WriteLine("<div>TODO</div>");
w.WriteLine("<h2>Zvolte kvalitu</h2>");
StreamCinemaLib.API.Stream[]? res = await Metadata.StreamsAsync(_id, cancel: req.HttpContext.RequestAborted);
CinemaLib.API.Stream[]? res = await Metadata.StreamsAsync(_id, cancel: req.HttpContext.RequestAborted);
if (res == null || res.Length == 0)
{

View File

@@ -2,11 +2,11 @@ using System;
using System.Globalization;
using System.Web;
using StreamCinemaWeb.Layouts;
using StreamCinemaLib.API;
using CinemaWeb.Layouts;
using CinemaLib.API;
using System.Runtime.InteropServices;
namespace StreamCinemaWeb.Pages;
namespace CinemaWeb.Pages;
public class SearchPage : BasicLayout
{

View File

@@ -1,10 +1,10 @@
using System;
using System.Text;
using System.Web;
using StreamCinemaLib.API;
using StreamCinemaWeb.Layouts;
using CinemaLib.API;
using CinemaWeb.Layouts;
namespace StreamCinemaWeb.Pages;
namespace CinemaWeb.Pages;
public class StreamsPage : BasicLayout
{
@@ -24,7 +24,7 @@ public class StreamsPage : BasicLayout
w.WriteLine("<h1>" + HttpUtility.HtmlEncode(_title) + "</h1>");
w.WriteLine("<div><b>Zvolte kvalitu</b></div>");
StreamCinemaLib.API.Stream[]? res = await Metadata.StreamsAsync(_id, cancel: req.HttpContext.RequestAborted);
CinemaLib.API.Stream[]? res = await Metadata.StreamsAsync(_id, cancel: req.HttpContext.RequestAborted);
if (res == null || res.Length == 0)
{
@@ -36,10 +36,10 @@ public class StreamsPage : BasicLayout
}
}
internal static void RenderStreams(TextWriter w, IEnumerable<StreamCinemaLib.API.Stream> streams, string title)
internal static void RenderStreams(TextWriter w, IEnumerable<CinemaLib.API.Stream> streams, string title)
{
w.WriteLine("<div class=\"media-streams\">");
foreach (StreamCinemaLib.API.Stream i in streams)
foreach (CinemaLib.API.Stream i in streams)
{
// Gather external subtitles
StringBuilder extSubtitles = new StringBuilder();

View File

@@ -1,5 +1,5 @@
using System.Web;
using StreamCinemaWeb.Pages;
using CinemaWeb.Pages;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

View File

@@ -2,4 +2,4 @@ FROM mcr.microsoft.com/dotnet/aspnet:9.0
COPY ./out/ /App/
WORKDIR /App
EXPOSE 8080
ENTRYPOINT ["dotnet", "StreamCinemaWeb.dll"]
ENTRYPOINT ["dotnet", "CinemaWeb.dll"]

View File

@@ -1,5 +0,0 @@
namespace Jellyfin.Plugin.StreamCinema;
public interface IStreamCinemaInnerMediaSourceManager {
Type InnerType { get; }
}

View File

@@ -1,12 +0,0 @@
namespace Jellyfin.Plugin.StreamCinema;
class StreamCinemaInnerMediaSourceManager : IStreamCinemaInnerMediaSourceManager
{
private readonly Type _innerType;
public StreamCinemaInnerMediaSourceManager(Type innerType) {
this._innerType = innerType;
}
public Type InnerType => _innerType;
}

View File

@@ -1,9 +0,0 @@
using MediaBrowser.Controller.Entities;
using StreamCinemaLib.API;
namespace Jellyfin.Plugin.StreamCinema;
public abstract class StreamCinemaSortFolder : StreamCinemaFilterFolder
{
internal abstract FilterSortBy SortBy { get; }
}