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
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user