From 83d1a15cc9d0ee91be73bd91c4672cf1bcf2728a Mon Sep 17 00:00:00 2001 From: tidusjar Date: Wed, 23 Mar 2022 11:01:48 +0000 Subject: [PATCH] fix(metadata): improved the metadata job to also lookup the media in Plex to see if it has any more uptodate metadata --- src/Ombi.Helpers/PlexHelper.cs | 2 + .../Jobs/Ombi/RefreshMetadata.cs | 68 ++++++++++++++++--- .../Jobs/Plex/PlexContentSync.cs | 6 ++ 3 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/Ombi.Helpers/PlexHelper.cs b/src/Ombi.Helpers/PlexHelper.cs index 6827d0f74..7951a7edf 100644 --- a/src/Ombi.Helpers/PlexHelper.cs +++ b/src/Ombi.Helpers/PlexHelper.cs @@ -180,6 +180,8 @@ namespace Ombi.Helpers public string ImdbId { get; set; } public bool Plex { get; set; } + public bool Any() => TheTvDb.HasValue() || TheMovieDb.HasValue() || ImdbId.HasValue(); + public ProviderType Type { get diff --git a/src/Ombi.Schedule/Jobs/Ombi/RefreshMetadata.cs b/src/Ombi.Schedule/Jobs/Ombi/RefreshMetadata.cs index 1f5abb5e4..64abb2aac 100644 --- a/src/Ombi.Schedule/Jobs/Ombi/RefreshMetadata.cs +++ b/src/Ombi.Schedule/Jobs/Ombi/RefreshMetadata.cs @@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Ombi.Api.Emby; using Ombi.Api.Jellyfin; +using Ombi.Api.Plex; using Ombi.Api.TheMovieDb; using Ombi.Api.TheMovieDb.Models; using Ombi.Api.TvMaze; @@ -30,7 +31,8 @@ namespace Ombi.Schedule.Jobs.Ombi IMovieDbApi movieApi, ISettingsService embySettings, IEmbyApiFactory embyApi, ISettingsService jellyfinSettings, IJellyfinApiFactory jellyfinApi, - IHubContext notification, IMediaCacheService mediaCacheService) + IHubContext notification, IMediaCacheService mediaCacheService, + IPlexApi plexApi) { _plexRepo = plexRepo; _embyRepo = embyRepo; @@ -45,6 +47,7 @@ namespace Ombi.Schedule.Jobs.Ombi _jellyfinApiFactory = jellyfinApi; _notification = notification; _mediaCacheService = mediaCacheService; + _plexApi = plexApi; } private readonly IPlexContentRepository _plexRepo; @@ -60,6 +63,7 @@ namespace Ombi.Schedule.Jobs.Ombi private readonly IJellyfinApiFactory _jellyfinApiFactory; private readonly IHubContext _notification; private readonly IMediaCacheService _mediaCacheService; + private readonly IPlexApi _plexApi; private IEmbyApi EmbyApi { get; set; } private IJellyfinApi JellyfinApi { get; set; } @@ -75,7 +79,7 @@ namespace Ombi.Schedule.Jobs.Ombi var settings = await _plexSettings.GetSettingsAsync(); if (settings.Enable) { - await StartPlex(); + await StartPlex(settings); await OmbiQuartz.TriggerJob(nameof(IPlexAvailabilityChecker), "Plex"); } @@ -112,12 +116,12 @@ namespace Ombi.Schedule.Jobs.Ombi .SendAsync(NotificationHub.NotificationEvent, "Metadata Refresh Finished"); } - private async Task StartPlex() + private async Task StartPlex(PlexSettings settings) { // Ensure we check that we have not linked this item to a request var allMovies = await _plexRepo.GetAll().Where(x => - x.Type == MediaType.Movie && x.RequestId == null && (x.TheMovieDbId == null || x.ImdbId == null)).ToListAsync(); - await StartPlexMovies(allMovies); + x.Type == MediaType.Movie && x.RequestId == null && ((x.TheMovieDbId == null || x.TheMovieDbId == string.Empty ) || (x.ImdbId == null || x.ImdbId == string.Empty))).ToListAsync(); + await StartPlexMovies(allMovies, settings); // Now Tv var allTv = await _plexRepo.GetAll().Where(x => @@ -245,7 +249,7 @@ namespace Ombi.Schedule.Jobs.Ombi } } - private async Task StartPlexMovies(List allMovies) + private async Task StartPlexMovies(List allMovies, PlexSettings settings) { foreach (var movie in allMovies) { @@ -261,14 +265,58 @@ namespace Ombi.Schedule.Jobs.Ombi if (!hasImdb) { var imdbId = await GetImdbId(hasTheMovieDb, false, movie.Title, movie.TheMovieDbId, string.Empty, RequestType.Movie); - movie.ImdbId = imdbId; - _plexRepo.UpdateWithoutSave(movie); + if (imdbId.HasValue()) + { + movie.ImdbId = imdbId; + hasImdb = true; + _plexRepo.UpdateWithoutSave(movie); + } } if (!hasTheMovieDb) { var id = await GetTheMovieDbId(false, hasImdb, string.Empty, movie.ImdbId, movie.Title, true); - movie.TheMovieDbId = id; - _plexRepo.UpdateWithoutSave(movie); + if (id.HasValue()) + { + movie.TheMovieDbId = id; + hasTheMovieDb = true; + _plexRepo.UpdateWithoutSave(movie); + } + } + if (!hasTheMovieDb || !hasImdb) + { + // Check to see if the Plex item has anything + if (!settings.Servers.Any()) + { + continue; + } + var servers = settings.Servers[0]; + var metaData = await _plexApi.GetMetadata(servers.PlexAuthToken, settings.Servers[0].FullUri, movie.Key); + var guids = new List(); + + var meta = metaData.MediaContainer.Metadata.FirstOrDefault(); + guids.Add(meta.guid); + if (meta.Guid != null) + { + foreach (var g in meta.Guid) + { + guids.Add(g.Id); + } + } + + var providerIds = PlexHelper.GetProviderIdsFromMetadata(guids.ToArray()); + if (providerIds.Any()) + { + if (providerIds.TheMovieDb.HasValue() && !hasTheMovieDb) + { + movie.TheMovieDbId = providerIds.TheMovieDb; + _plexRepo.UpdateWithoutSave(movie); + } + if (providerIds.ImdbId.HasValue() && !hasImdb) + { + movie.ImdbId = providerIds.ImdbId; + _plexRepo.UpdateWithoutSave(movie); + } + } } await _plexRepo.SaveChangesAsync(); diff --git a/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs b/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs index 823766bd2..62d0fb1b9 100644 --- a/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs +++ b/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs @@ -379,6 +379,12 @@ namespace Ombi.Schedule.Jobs.Plex } var providerIds = PlexHelper.GetProviderIdsFromMetadata(guids.ToArray()); + if (!providerIds.Any()) + { + Logger.LogWarning($"Movie {movie.title} has no External Ids in Plex (ImdbId, TheMovieDbId). Skipping."); + continue; + } + var qualities = movie.Media?.Select(x => x.videoResolution); var is4k = qualities != null && qualities.Any(x => x.Equals("4k", StringComparison.InvariantCultureIgnoreCase)); var selectedQuality = is4k ? null : qualities?.OrderBy(x => x)?.FirstOrDefault() ?? string.Empty;