From 248ac9619c9565a156336362a41587d5a6955e6e Mon Sep 17 00:00:00 2001 From: Qstick Date: Mon, 17 Jul 2023 19:34:39 -0500 Subject: [PATCH] Fixed: Images for some movies not downloading Closes #8006 Co-Authored-By: Mark McDowall --- frontend/src/Movie/MovieImage.js | 6 ++++-- .../Migration/231_update_images_remote_url.cs | 16 ++++++++++++++++ .../Consumers/Roksbox/RoksboxMetadata.cs | 4 ---- .../Metadata/Consumers/Wdtv/WdtvMetadata.cs | 4 ---- .../Metadata/Consumers/Xbmc/XbmcMetadata.cs | 14 +++++++------- .../ImportLists/Radarr/RadarrImport.cs | 11 ----------- src/NzbDrone.Core/MediaCover/MediaCover.cs | 4 ++-- .../MediaCover/MediaCoverService.cs | 8 +++----- .../MetadataSource/SkyHook/SkyHookProxy.cs | 2 +- .../Notifications/Discord/Discord.cs | 12 ++++++------ src/NzbDrone.Core/Notifications/Gotify/Gotify.cs | 2 +- .../ImportLists/ImportListMoviesController.cs | 4 ++-- src/Radarr.Api.V3/Movies/MovieResource.cs | 3 ++- 13 files changed, 44 insertions(+), 46 deletions(-) create mode 100644 src/NzbDrone.Core/Datastore/Migration/231_update_images_remote_url.cs diff --git a/frontend/src/Movie/MovieImage.js b/frontend/src/Movie/MovieImage.js index f6a6da714..6bb71755a 100644 --- a/frontend/src/Movie/MovieImage.js +++ b/frontend/src/Movie/MovieImage.js @@ -7,9 +7,11 @@ function findImage(images, coverType) { } function getUrl(image, coverType, size) { - if (image) { + const imageUrl = image?.url ?? image?.remoteUrl; + + if (imageUrl) { // Remove protocol - let url = image.url.replace(/^https?:/, ''); + let url = imageUrl.replace(/^https?:/, ''); url = url.replace(`${coverType}.jpg`, `${coverType}-${size}.jpg`); return url; diff --git a/src/NzbDrone.Core/Datastore/Migration/231_update_images_remote_url.cs b/src/NzbDrone.Core/Datastore/Migration/231_update_images_remote_url.cs new file mode 100644 index 000000000..c7a682c44 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/231_update_images_remote_url.cs @@ -0,0 +1,16 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(231)] + public class update_images_remote_url : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Execute.Sql("UPDATE \"MovieMetadata\" SET \"Images\" = REPLACE(\"Images\", '\"url\"', '\"remoteUrl\"')"); + Execute.Sql("UPDATE \"Credits\" SET \"Images\" = REPLACE(\"Images\", '\"url\"', '\"remoteUrl\"')"); + Execute.Sql("UPDATE \"Collections\" SET \"Images\" = REPLACE(\"Images\", '\"url\"', '\"remoteUrl\"')"); + } + } +} diff --git a/src/NzbDrone.Core/Extras/Metadata/Consumers/Roksbox/RoksboxMetadata.cs b/src/NzbDrone.Core/Extras/Metadata/Consumers/Roksbox/RoksboxMetadata.cs index 7bf94bb28..9526da43f 100644 --- a/src/NzbDrone.Core/Extras/Metadata/Consumers/Roksbox/RoksboxMetadata.cs +++ b/src/NzbDrone.Core/Extras/Metadata/Consumers/Roksbox/RoksboxMetadata.cs @@ -6,7 +6,6 @@ using System.Text; using System.Xml; using System.Xml.Linq; using NLog; -using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Extras.Metadata.Files; using NzbDrone.Core.MediaCover; @@ -18,15 +17,12 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Roksbox public class RoksboxMetadata : MetadataBase { private readonly IMapCoversToLocal _mediaCoverService; - private readonly IDiskProvider _diskProvider; private readonly Logger _logger; public RoksboxMetadata(IMapCoversToLocal mediaCoverService, - IDiskProvider diskProvider, Logger logger) { _mediaCoverService = mediaCoverService; - _diskProvider = diskProvider; _logger = logger; } diff --git a/src/NzbDrone.Core/Extras/Metadata/Consumers/Wdtv/WdtvMetadata.cs b/src/NzbDrone.Core/Extras/Metadata/Consumers/Wdtv/WdtvMetadata.cs index 142ee45c7..ed5686b0b 100644 --- a/src/NzbDrone.Core/Extras/Metadata/Consumers/Wdtv/WdtvMetadata.cs +++ b/src/NzbDrone.Core/Extras/Metadata/Consumers/Wdtv/WdtvMetadata.cs @@ -6,7 +6,6 @@ using System.Text; using System.Xml; using System.Xml.Linq; using NLog; -using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Extras.Metadata.Files; using NzbDrone.Core.MediaCover; @@ -18,15 +17,12 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Wdtv public class WdtvMetadata : MetadataBase { private readonly IMapCoversToLocal _mediaCoverService; - private readonly IDiskProvider _diskProvider; private readonly Logger _logger; public WdtvMetadata(IMapCoversToLocal mediaCoverService, - IDiskProvider diskProvider, Logger logger) { _mediaCoverService = mediaCoverService; - _diskProvider = diskProvider; _logger = logger; } diff --git a/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/XbmcMetadata.cs b/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/XbmcMetadata.cs index 5d4aa1211..93e848563 100644 --- a/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/XbmcMetadata.cs +++ b/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/XbmcMetadata.cs @@ -208,14 +208,14 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc if (thumbnail != null) { - details.Add(new XElement("thumb", thumbnail.Url)); + details.Add(new XElement("thumb", thumbnail.RemoteUrl)); } foreach (var poster in posters) { - if (poster != null && poster.Url != null) + if (poster != null && poster.RemoteUrl != null) { - details.Add(new XElement("thumb", new XAttribute("aspect", "poster"), new XAttribute("preview", poster.Url), poster.Url)); + details.Add(new XElement("thumb", new XAttribute("aspect", "poster"), new XAttribute("preview", poster.RemoteUrl), poster.RemoteUrl)); } } @@ -224,9 +224,9 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc var fanartElement = new XElement("fanart"); foreach (var fanart in fanarts) { - if (fanart != null && fanart.Url != null) + if (fanart != null && fanart.RemoteUrl != null) { - fanartElement.Add(new XElement("thumb", new XAttribute("preview", fanart.Url), fanart.Url)); + fanartElement.Add(new XElement("thumb", new XAttribute("preview", fanart.RemoteUrl), fanart.RemoteUrl)); } } @@ -366,9 +366,9 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc var headshot = credit.Images.FirstOrDefault(m => m.CoverType == MediaCoverTypes.Headshot); - if (headshot != null && headshot.Url != null) + if (headshot != null && headshot.RemoteUrl != null) { - actorElement.Add(new XElement("thumb", headshot.Url)); + actorElement.Add(new XElement("thumb", headshot.RemoteUrl)); } details.Add(actorElement); diff --git a/src/NzbDrone.Core/ImportLists/Radarr/RadarrImport.cs b/src/NzbDrone.Core/ImportLists/Radarr/RadarrImport.cs index 8c8689226..0b6e58e48 100644 --- a/src/NzbDrone.Core/ImportLists/Radarr/RadarrImport.cs +++ b/src/NzbDrone.Core/ImportLists/Radarr/RadarrImport.cs @@ -141,16 +141,5 @@ namespace NzbDrone.Core.ImportLists.Radarr { failures.AddIfNotNull(_radarrV3Proxy.Test(Settings)); } - - private static MediaCover.MediaCover MapImage(MediaCover.MediaCover arg, string baseUrl) - { - var newImage = new MediaCover.MediaCover - { - Url = string.Format("{0}{1}", baseUrl, arg.Url), - CoverType = arg.CoverType - }; - - return newImage; - } } } diff --git a/src/NzbDrone.Core/MediaCover/MediaCover.cs b/src/NzbDrone.Core/MediaCover/MediaCover.cs index 0e9025428..d75439858 100644 --- a/src/NzbDrone.Core/MediaCover/MediaCover.cs +++ b/src/NzbDrone.Core/MediaCover/MediaCover.cs @@ -24,10 +24,10 @@ namespace NzbDrone.Core.MediaCover { } - public MediaCover(MediaCoverTypes coverType, string url) + public MediaCover(MediaCoverTypes coverType, string remoteUrl) { CoverType = coverType; - Url = url; + RemoteUrl = remoteUrl; } } } diff --git a/src/NzbDrone.Core/MediaCover/MediaCoverService.cs b/src/NzbDrone.Core/MediaCover/MediaCoverService.cs index fa5be545f..c0b692ce3 100644 --- a/src/NzbDrone.Core/MediaCover/MediaCoverService.cs +++ b/src/NzbDrone.Core/MediaCover/MediaCoverService.cs @@ -93,7 +93,6 @@ namespace NzbDrone.Core.MediaCover // Movie isn't in Radarr yet, map via a proxy to circument referrer issues foreach (var mediaCover in covers) { - mediaCover.RemoteUrl = mediaCover.Url; mediaCover.Url = _mediaCoverProxy.RegisterUrl(mediaCover.RemoteUrl); } } @@ -108,7 +107,6 @@ namespace NzbDrone.Core.MediaCover var filePath = GetCoverPath(movieId, mediaCover.CoverType); - mediaCover.RemoteUrl = mediaCover.Url; mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/" + movieId + "/" + mediaCover.CoverType.ToString().ToLower() + GetExtension(mediaCover.CoverType); FileInfo file; @@ -162,7 +160,7 @@ namespace NzbDrone.Core.MediaCover try { - alreadyExists = _coverExistsSpecification.AlreadyExists(cover.Url, fileName); + alreadyExists = _coverExistsSpecification.AlreadyExists(cover.RemoteUrl, fileName); if (!alreadyExists) { @@ -207,8 +205,8 @@ namespace NzbDrone.Core.MediaCover { var fileName = GetCoverPath(movie.Id, cover.CoverType); - _logger.Info("Downloading {0} for {1} {2}", cover.CoverType, movie, cover.Url); - _httpClient.DownloadFile(cover.Url, fileName); + _logger.Info("Downloading {0} for {1} {2}", cover.CoverType, movie, cover.RemoteUrl); + _httpClient.DownloadFile(cover.RemoteUrl, fileName); } private void EnsureResizedCovers(Movie movie, MediaCover cover, bool forceResize) diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index a70827879..a736aa164 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -646,7 +646,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook { return new MediaCover.MediaCover { - Url = arg.Url, + RemoteUrl = arg.Url, CoverType = MapCoverType(arg.CoverType) }; } diff --git a/src/NzbDrone.Core/Notifications/Discord/Discord.cs b/src/NzbDrone.Core/Notifications/Discord/Discord.cs index 951a61f69..c35c769b9 100644 --- a/src/NzbDrone.Core/Notifications/Discord/Discord.cs +++ b/src/NzbDrone.Core/Notifications/Discord/Discord.cs @@ -45,7 +45,7 @@ namespace NzbDrone.Core.Notifications.Discord { embed.Thumbnail = new DiscordImage { - Url = message.Movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Poster)?.Url + Url = message.Movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Poster)?.RemoteUrl }; } @@ -53,7 +53,7 @@ namespace NzbDrone.Core.Notifications.Discord { embed.Image = new DiscordImage { - Url = message.Movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Fanart)?.Url + Url = message.Movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Fanart)?.RemoteUrl }; } @@ -145,7 +145,7 @@ namespace NzbDrone.Core.Notifications.Discord { embed.Thumbnail = new DiscordImage { - Url = message.Movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Poster)?.Url + Url = message.Movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Poster)?.RemoteUrl }; } @@ -153,7 +153,7 @@ namespace NzbDrone.Core.Notifications.Discord { embed.Image = new DiscordImage { - Url = message.Movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Fanart)?.Url + Url = message.Movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Fanart)?.RemoteUrl }; } @@ -446,7 +446,7 @@ namespace NzbDrone.Core.Notifications.Discord { embed.Thumbnail = new DiscordImage { - Url = movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Poster)?.Url + Url = movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Poster)?.RemoteUrl }; } @@ -454,7 +454,7 @@ namespace NzbDrone.Core.Notifications.Discord { embed.Image = new DiscordImage { - Url = movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Fanart)?.Url + Url = movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Fanart)?.RemoteUrl }; } diff --git a/src/NzbDrone.Core/Notifications/Gotify/Gotify.cs b/src/NzbDrone.Core/Notifications/Gotify/Gotify.cs index 6a102aa8a..b981e2817 100644 --- a/src/NzbDrone.Core/Notifications/Gotify/Gotify.cs +++ b/src/NzbDrone.Core/Notifications/Gotify/Gotify.cs @@ -116,7 +116,7 @@ namespace NzbDrone.Core.Notifications.Gotify if (Settings.IncludeMoviePoster && movie != null) { - var poster = movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Poster)?.Url; + var poster = movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Poster)?.RemoteUrl; if (poster != null) { diff --git a/src/Radarr.Api.V3/ImportLists/ImportListMoviesController.cs b/src/Radarr.Api.V3/ImportLists/ImportListMoviesController.cs index 07bff3335..42fef65ad 100644 --- a/src/Radarr.Api.V3/ImportLists/ImportListMoviesController.cs +++ b/src/Radarr.Api.V3/ImportLists/ImportListMoviesController.cs @@ -123,7 +123,7 @@ namespace Radarr.Api.V3.ImportLists var poster = currentMovie.MovieMetadata.Value.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster); if (poster != null) { - resource.RemotePoster = poster.Url; + resource.RemotePoster = poster.RemoteUrl; } var translation = currentMovie.MovieMetadata.Value.Translations.FirstOrDefault(t => t.Language == language); @@ -153,7 +153,7 @@ namespace Radarr.Api.V3.ImportLists var poster = currentMovie.MovieMetadata.Value.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster); if (poster != null) { - resource.RemotePoster = poster.Url; + resource.RemotePoster = poster.RemoteUrl; } var translation = GetTranslationFromDictionary(translations, currentMovie.MovieMetadata, language); diff --git a/src/Radarr.Api.V3/Movies/MovieResource.cs b/src/Radarr.Api.V3/Movies/MovieResource.cs index 50fddc7d1..e99990117 100644 --- a/src/Radarr.Api.V3/Movies/MovieResource.cs +++ b/src/Radarr.Api.V3/Movies/MovieResource.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using NzbDrone.Core.CustomFormats; +using NzbDrone.Common.Extensions; using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.Languages; using NzbDrone.Core.MediaCover; @@ -114,7 +115,7 @@ namespace Radarr.Api.V3.Movies Status = model.MovieMetadata.Value.Status, Overview = translatedOverview, - Images = model.MovieMetadata.Value.Images, + Images = model.MovieMetadata.Value.Images.JsonClone(), Year = model.Year, SecondaryYear = model.MovieMetadata.Value.SecondaryYear,