diff --git a/src/Ombi.Api.Plex/Models/Metadata.cs b/src/Ombi.Api.Plex/Models/Metadata.cs index cda6ce68b..92e66b35c 100644 --- a/src/Ombi.Api.Plex/Models/Metadata.cs +++ b/src/Ombi.Api.Plex/Models/Metadata.cs @@ -44,7 +44,13 @@ namespace Ombi.Api.Plex.Models public string grandparentTheme { get; set; } public string chapterSource { get; set; } public Medium[] Media { get; set; } + public PlexGuids[] Guid { get; set; } // public Director[] Director { get; set; } // public Writer[] Writer { get; set; } } + + public class PlexGuids + { + public string Id { get; set; } + } } \ No newline at end of file diff --git a/src/Ombi.Helpers.Tests/PlexHelperTests.cs b/src/Ombi.Helpers.Tests/PlexHelperTests.cs index ef1119f9f..82b59fdf7 100644 --- a/src/Ombi.Helpers.Tests/PlexHelperTests.cs +++ b/src/Ombi.Helpers.Tests/PlexHelperTests.cs @@ -41,6 +41,37 @@ namespace Ombi.Helpers.Tests yield return new TestCaseData("com.plexapp.agents.agent47://456822/999/999?lang=en", ProviderIdType.TvDb).Returns("456822").SetName("Unknown TvDb agent, large episode and season"); yield return new TestCaseData("com.plexapp.agents.xbmcnfotv://153021/2/1?lang=xn", ProviderIdType.TvDb).Returns("153021").SetName("xmbc agent, tv episode"); yield return new TestCaseData("com.plexapp.agents.xbmcnfotv://153021?lang=xn", ProviderIdType.TvDb).Returns("153021").SetName("xmbc agent, tv show"); + yield return new TestCaseData("tmdb://610201", ProviderIdType.MovieDb).Returns("610201").SetName("Themoviedb new plex format"); + } + } + + [TestCaseSource(nameof(ProviderIdGuidDataV2))] + public void GetProviderIdsFromMetadataTests(string guidInput, ProviderId expected) + { + var param = guidInput.Split('|', StringSplitOptions.RemoveEmptyEntries); + var result = PlexHelper.GetProviderIdsFromMetadata(param); + + Assert.AreEqual(expected.ImdbId, result.ImdbId); + Assert.AreEqual(expected.TheMovieDb, result.TheMovieDb); + Assert.AreEqual(expected.TheTvDb, result.TheTvDb); + } + + public static IEnumerable ProviderIdGuidDataV2 + { + get + { + yield return new TestCaseData("plex://movie/5e1632df2d4d84003e48e54e|imdb://tt9178402|tmdb://610201", new ProviderId { ImdbId = "tt9178402", TheMovieDb = "610201" }).SetName("V2 Regular Plex Id"); + yield return new TestCaseData("plex://movie/5d7768253c3c2a001fbcab72|imdb://tt0119567|tmdb://330", new ProviderId { ImdbId = "tt0119567", TheMovieDb = "330" }).SetName("V2 Regular Plex Id Another"); + yield return new TestCaseData("plex://movie/5d7768253c3c2a001fbcab72|imdb://tt0119567", new ProviderId { ImdbId = "tt0119567" }).SetName("V2 Regular Plex Id Single Imdb"); + yield return new TestCaseData("plex://movie/5d7768253c3c2a001fbcab72|tmdb://330", new ProviderId { TheMovieDb = "330" }).SetName("V2 Regular Plex Id Single Tmdb"); + yield return new TestCaseData("com.plexapp.agents.thetvdb://269586/2/8?lang=en", new ProviderId { TheTvDb = "269586" }).SetName("V2 Regular TvDb Id"); + yield return new TestCaseData("com.plexapp.agents.themoviedb://390043?lang=en", new ProviderId { TheMovieDb = "390043" }).SetName("V2 Regular MovieDb Id"); + yield return new TestCaseData("com.plexapp.agents.imdb://tt2543164?lang=en", new ProviderId { ImdbId = "tt2543164" }).SetName("V2 Regular Imdb Id"); + yield return new TestCaseData("com.plexapp.agents.agent47://tt2543456?lang=en", new ProviderId { ImdbId = "tt2543456" }).SetName("V2 Unknown IMDB agent"); + yield return new TestCaseData("com.plexapp.agents.agent47://456822/1/1?lang=en", new ProviderId { TheTvDb = "456822" }).SetName("V2 Unknown TvDb agent"); + yield return new TestCaseData("com.plexapp.agents.agent47://456822/999/999?lang=en", new ProviderId { TheTvDb = "456822" }).SetName("V2 Unknown TvDb agent, large episode and season"); + yield return new TestCaseData("com.plexapp.agents.xbmcnfotv://153021/2/1?lang=xn", new ProviderId { TheTvDb = "153021" }).SetName("V2 xmbc agent, tv episode"); + yield return new TestCaseData("com.plexapp.agents.xbmcnfotv://153021?lang=xn", new ProviderId { TheTvDb = "153021" }).SetName("V2 xmbc agent, tv show"); } } diff --git a/src/Ombi.Helpers/PlexHelper.cs b/src/Ombi.Helpers/PlexHelper.cs index a25c3b14a..4dbde0c92 100644 --- a/src/Ombi.Helpers/PlexHelper.cs +++ b/src/Ombi.Helpers/PlexHelper.cs @@ -41,6 +41,7 @@ namespace Ombi.Helpers //com.plexapp.agents.thetvdb://269586/2/8?lang=en //com.plexapp.agents.themoviedb://390043?lang=en //com.plexapp.agents.imdb://tt2543164?lang=en + //plex://movie/5e1632df2d4d84003e48e54e // https://github.com/tidusjar/Ombi/issues/3277 if (string.IsNullOrEmpty(guid)) { @@ -57,7 +58,7 @@ namespace Ombi.Helpers TheTvDb = guidSplit[1] }; } - if (guid.Contains("themoviedb", CompareOptions.IgnoreCase)) + if (guid.Contains("themoviedb", CompareOptions.IgnoreCase) || guid.Contains("tmdb", CompareOptions.IgnoreCase)) { return new ProviderId { @@ -71,6 +72,13 @@ namespace Ombi.Helpers ImdbId = guidSplit[1] }; } + if (guid.Contains("plex://", CompareOptions.IgnoreCase)) + { + return new ProviderId + { + Plex = true + }; + } var imdbRegex = new Regex(ImdbMatchExpression, RegexOptions.Compiled); var tvdbRegex = new Regex(TvDbIdMatchExpression, RegexOptions.Compiled); @@ -102,6 +110,37 @@ namespace Ombi.Helpers $"https://app.plex.tv/web/app#!/server/{machineId}/details?key=library%2Fmetadata%2F{mediaId}"; return url; } + + public static ProviderId GetProviderIdsFromMetadata(params string[] guids) + { + var providerIds = new ProviderId(); + foreach (var guid in guids) + { + var provider = GetProviderIdFromPlexGuid(guid); + if (provider.Type == ProviderType.Plex) + { + // There are more guids! + continue; + } + + switch (provider.Type) + { + case ProviderType.ImdbId: + providerIds.ImdbId = provider.ImdbId; + break; + case ProviderType.TheMovieDbId: + providerIds.TheMovieDb = provider.TheMovieDb; + break; + case ProviderType.TvDbId: + providerIds.TheTvDb = provider.TheTvDb; + break; + default: + throw new ArgumentOutOfRangeException(nameof(provider.Type)); + } + } + + return providerIds; + } } public class ProviderId @@ -109,6 +148,7 @@ namespace Ombi.Helpers public string TheTvDb { get; set; } public string TheMovieDb { get; set; } public string ImdbId { get; set; } + public bool Plex { get; set; } public ProviderType Type { @@ -126,6 +166,10 @@ namespace Ombi.Helpers { return ProviderType.TvDbId; } + if (Plex) + { + return ProviderType.Plex; + } return ProviderType.ImdbId; } } @@ -135,6 +179,7 @@ namespace Ombi.Helpers { ImdbId, TheMovieDbId, - TvDbId + TvDbId, + Plex } } \ No newline at end of file diff --git a/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs b/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs index 6dd01a298..f554e428d 100644 --- a/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs +++ b/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs @@ -281,9 +281,21 @@ namespace Ombi.Schedule.Jobs.Plex Logger.LogDebug("Adding movie {0}", movie.title); var metaData = await PlexApi.GetMetadata(servers.PlexAuthToken, servers.FullUri, movie.ratingKey); - var providerIds = PlexHelper.GetProviderIdFromPlexGuid(metaData.MediaContainer.Metadata - .FirstOrDefault() - .guid); + + var meta = metaData.MediaContainer.Metadata.FirstOrDefault(); + var guids = new List + { + meta.guid + }; + if (meta.Guid != null) + { + foreach (var g in meta.Guid) + { + guids.Add(g.Id); + } + } + + var providerIds = PlexHelper.GetProviderIdsFromMetadata(guids.ToArray()); var item = new PlexServerContent { @@ -296,15 +308,15 @@ namespace Ombi.Schedule.Jobs.Plex Seasons = new List(), Quality = movie.Media?.FirstOrDefault()?.videoResolution ?? string.Empty }; - if (providerIds.Type == ProviderType.ImdbId) + if (providerIds.ImdbId.HasValue()) { item.ImdbId = providerIds.ImdbId; } - if (providerIds.Type == ProviderType.TheMovieDbId) + if (providerIds.TheMovieDb.HasValue()) { item.TheMovieDbId = providerIds.TheMovieDb; } - if (providerIds.Type == ProviderType.TvDbId) + if (providerIds.TheTvDb.HasValue()) { item.TvDbId = providerIds.TheTvDb; } @@ -563,20 +575,31 @@ namespace Ombi.Schedule.Jobs.Plex private static void GetProviderIds(PlexMetadata showMetadata, PlexServerContent existingContent) { + var metadata = showMetadata.MediaContainer.Metadata.FirstOrDefault(); + var guids = new List + { + metadata.guid + }; + if (metadata.Guid != null) + { + foreach (var g in metadata.Guid) + { + guids.Add(g.Id); + } + } var providerIds = - PlexHelper.GetProviderIdFromPlexGuid(showMetadata.MediaContainer.Metadata.FirstOrDefault() - .guid); - if (providerIds.Type == ProviderType.ImdbId) + PlexHelper.GetProviderIdsFromMetadata(guids.ToArray()); + if (providerIds.ImdbId.HasValue()) { existingContent.ImdbId = providerIds.ImdbId; } - if (providerIds.Type == ProviderType.TheMovieDbId) + if (providerIds.TheMovieDb.HasValue()) { existingContent.TheMovieDbId = providerIds.TheMovieDb; } - if (providerIds.Type == ProviderType.TvDbId) + if (providerIds.TheTvDb.HasValue()) { existingContent.TvDbId = providerIds.TheTvDb; }