Do not use ProviderIds for Cinema items detection as peristence does not work for it. Use ExternalId for it.
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2024-12-01 14:27:33 +01:00
parent 02e33d046d
commit 6dcd488919
4 changed files with 47 additions and 46 deletions

View File

@@ -296,9 +296,10 @@ public abstract class CinemaFilterFolder : Folder
//item.ParentIndexNumber = info.ParentIndexNumber;
item.PremiereDate = media.info_labels?.premiered;
item.ProductionYear = media.info_labels?.year;
item.ProviderIds = new Dictionary<string, string>();
if (media.services != null)
if (media.services != null) {
item.ProviderIds = new Dictionary<string, string>();
ConvertProviderIds(media.services, item.ProviderIds);
}
//item.OfficialRating = info.OfficialRating;
item.DateCreated = media.info_labels?.dateadded ?? DateTime.UtcNow;
//item.Tags = info.Tags.ToArray();
@@ -324,12 +325,6 @@ public abstract class CinemaFilterFolder : Folder
}
}
// 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[CinemaPlugin.CinemaProviderName] = "";
// Indicate just HTTP CinemaMediaSourceManager and CinemaMediaSourceController will handle the rest
item.Path = "https://a/b";
@@ -357,7 +352,7 @@ public abstract class CinemaFilterFolder : Folder
hasSeries.SeriesName = info.SeriesName;
}*/
item.ExternalId = csId;
item.ExternalId = CinemaIdToExternalId(csId);
/*
if (item is Audio channelAudioItem)
@@ -485,4 +480,22 @@ public abstract class CinemaFilterFolder : Folder
item.Id = id;
return item;
}
internal static string CinemaIdToExternalId(string csId) {
return CinemaPlugin.CinemaExtIdPrefix + csId;
}
internal static bool IsCinemaExternalId(string? externalId) {
return externalId != null && externalId.StartsWith(CinemaPlugin.CinemaExtIdPrefix);
}
internal static bool TryGetCinemaIdFromExternalId(string? externalId, [NotNullWhen(true)] out string? csId) {
if (IsCinemaExternalId(externalId)) {
csId = externalId!.Substring(CinemaPlugin.CinemaExtIdPrefix.Length);
return true;
} else {
csId = null;
return false;
}
}
}

View File

@@ -28,7 +28,7 @@ public class CinemaMediaSourceController : ControllerBase
[HttpGet("{provider}/{ident}/link/{name?}")]
[ProducesResponseType(StatusCodes.Status302Found)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult> GetExternalIdInfos(
public async Task<ActionResult> GenerateCinemaLink(
[FromRoute, Required] string provider,
[FromRoute, Required] string ident,
[FromRoute, Optional] string? name,

View File

@@ -125,19 +125,6 @@ public class CinemaMediaSourceManager : IMediaSourceManager
public List<MediaStream> GetMediaStreams(Guid itemId)
{
return _inner.GetMediaStreams(itemId);
/*
// Intercept for CinemaItems
Video? item = _libraryManager.GetItemById<Video>(itemId);
if (item == null
|| item.ProviderIds == null
|| !item.ProviderIds.ContainsKey(CinemaPlugin.CinemaProviderName)
|| string.IsNullOrEmpty(item.ExternalId))
return _inner.GetMediaStreams(itemId);
CinemaLib.API.Stream? ver = GetVersion(item, default).GetAwaiter().GetResult();
return ver != null ? VersionToMediaStreams(item, ver) : new List<MediaStream>();
*/
}
public List<MediaStream> GetMediaStreams(MediaStreamQuery query)
@@ -161,8 +148,7 @@ public class CinemaMediaSourceManager : IMediaSourceManager
HttpContext? ctx = _http.HttpContext;
if (ctx == null
|| item == null
|| item.ProviderIds == null
|| !item.ProviderIds.ContainsKey(CinemaPlugin.CinemaProviderName)
|| !CinemaFilterFolder.IsCinemaExternalId(item.ExternalId)
|| string.IsNullOrEmpty(item.ExternalId))
return _inner.GetStaticMediaSources(item, enablePathSubstitution, user);
@@ -181,8 +167,7 @@ public class CinemaMediaSourceManager : IMediaSourceManager
HttpContext? ctx = _http.HttpContext;
if (ctx == null
|| item == null
|| item.ProviderIds == null
|| !item.ProviderIds.ContainsKey(CinemaPlugin.CinemaProviderName)
|| !CinemaFilterFolder.IsCinemaExternalId(item.ExternalId)
|| string.IsNullOrEmpty(item.ExternalId))
return await _inner.GetPlaybackMediaSources(item, user, allowMediaProbe, enablePathSubstitution, cancellationToken);
@@ -191,13 +176,13 @@ public class CinemaMediaSourceManager : IMediaSourceManager
switch (item)
{
case Video video:
VersionSetEntry ver = await GetVersionSet(video, out BaseItem? videoPrimary, default);
VersionSetEntry ver = await GetVersionSet(video, out BaseItem? videoPrimary, out string? csId, default);
if (ver.Versions != null)
{
IEnumerable<Video> items;
switch (video)
{
case CinemaMovie movie: items = GetVideoVersionsEnumerate<CinemaMovie>(movie, videoPrimary!, ver.Versions); break;
case CinemaMovie movie: items = GetVideoVersionsEnumerate<CinemaMovie>(csId!, movie, videoPrimary!, ver.Versions); break;
default: throw new NotSupportedException(string.Format("BaseItem type '{0}' not supported in CinemaMediaSources.", video.GetType().Name));
}
@@ -244,12 +229,12 @@ public class CinemaMediaSourceManager : IMediaSourceManager
if (item == null)
throw new ArgumentNullException();
VersionSetEntry ver = await GetVersionSet(item, out BaseItem? primary, cancel);
VersionSetEntry ver = await GetVersionSet(item, out BaseItem? primary, out string? csId, cancel);
return ver.Versions == null ? null : GetVideoVersionsEnumerate(item, primary!, ver.Versions);
return ver.Versions == null ? null : GetVideoVersionsEnumerate(csId!, item, primary!, ver.Versions);
}
private IEnumerable<T> GetVideoVersionsEnumerate<T>(T item, BaseItem primary, VersionEntry[] versions)
private IEnumerable<T> GetVideoVersionsEnumerate<T>(string csId, T item, BaseItem primary, VersionEntry[] versions)
where T : Video, new()
{
bool isFirst = true;
@@ -264,7 +249,7 @@ public class CinemaMediaSourceManager : IMediaSourceManager
}
else
{
a = CinemaFilterFolder.GetMediaItemById<T>(item.ExternalId, i.Meta._id, out bool isNew);
a = CinemaFilterFolder.GetMediaItemById<T>(csId, i.Meta._id, out bool isNew);
if (isNew)
{
// Copy properties from the parent version
@@ -285,44 +270,47 @@ public class CinemaMediaSourceManager : IMediaSourceManager
/// <summary>
/// Gets a version set for a video.
/// </summary>
private Task<VersionSetEntry> GetVersionSet(Video item, out BaseItem? primary, CancellationToken cancel)
private Task<VersionSetEntry> GetVersionSet(Video item, out BaseItem? primary, out string? csId, CancellationToken cancel)
{
if (item == null)
throw new ArgumentNullException();
if (item.ProviderIds == null
|| !item.ProviderIds.ContainsKey(CinemaPlugin.CinemaProviderName)
if (!CinemaFilterFolder.IsCinemaExternalId(item.ExternalId)
|| string.IsNullOrEmpty(item.ExternalId))
{
// Not a Stream Cinema video
primary = null;
csId = null;
return Task.FromResult<VersionSetEntry>(default);
}
Guid primaryId;
string csId;
string externalId;
if (!string.IsNullOrEmpty(item.PrimaryVersionId))
{
// Move to the primary item
primaryId = Guid.Parse(item.PrimaryVersionId, CultureInfo.InvariantCulture);
primary = _libraryManager.GetItemById(primaryId);
if (primary == null
|| primary.ProviderIds == null
|| !primary.ProviderIds.ContainsKey(CinemaPlugin.CinemaProviderName)
|| string.IsNullOrEmpty(primary.ExternalId))
|| !CinemaFilterFolder.IsCinemaExternalId(primary.ExternalId)
|| string.IsNullOrEmpty(primary.ExternalId)) {
// Not a Stream Cinema video
csId = null;
return Task.FromResult<VersionSetEntry>(default);
}
csId = primary.ExternalId;
externalId = primary.ExternalId;
}
else
{
primary = item;
primaryId = item.Id;
csId = item.ExternalId;
externalId = item.ExternalId;
}
if (!CinemaFilterFolder.TryGetCinemaIdFromExternalId(externalId, out csId))
throw new InvalidOperationException("Cannot parse Cinema identifier.");
return GetVersionSet(primaryId, csId, cancel);
}
@@ -349,7 +337,7 @@ public class CinemaMediaSourceManager : IMediaSourceManager
private async Task<VersionEntry?> GetVersion(Video item, CancellationToken cancel)
{
VersionSetEntry vers = await GetVersionSet(item, out BaseItem? primary, cancel);
VersionSetEntry vers = await GetVersionSet(item, out BaseItem? primary, out string? csId, cancel);
if (vers.Versions == null)
return null;
@@ -364,7 +352,7 @@ public class CinemaMediaSourceManager : IMediaSourceManager
id = primary!.Id;
}
else
id = CinemaFilterFolder.GetMediaItemId(primary!.ExternalId, i.Meta._id);
id = CinemaFilterFolder.GetMediaItemId(csId!, i.Meta._id);
if (id == item.Id)
return i;

View File

@@ -15,7 +15,7 @@ namespace Jellyfin.Plugin.Cinema;
/// </summary>
public class CinemaPlugin : BasePlugin<CinemaPluginConfiguration>, IHasWebPages
{
internal const string CinemaProviderName = "Cinema";
internal const string CinemaExtIdPrefix = "cinema:";
public CinemaPlugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer)
: base(applicationPaths, xmlSerializer)