diff --git a/MediaBrowser.Model/Entities/MetadataFields.cs b/MediaBrowser.Model/Entities/MetadataFields.cs
index 85f2da31e..a99fd0fe0 100644
--- a/MediaBrowser.Model/Entities/MetadataFields.cs
+++ b/MediaBrowser.Model/Entities/MetadataFields.cs
@@ -41,6 +41,18 @@ namespace MediaBrowser.Model.Entities
///
/// The official rating
///
- OfficialRating
+ OfficialRating,
+ ///
+ /// The images
+ ///
+ Images,
+ ///
+ /// The backdrops
+ ///
+ Backdrops,
+ ///
+ /// The screenshots
+ ///
+ Screenshots
}
}
diff --git a/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs b/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs
index f15d13222..6ea8e699a 100644
--- a/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs
+++ b/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs
@@ -132,7 +132,9 @@ namespace MediaBrowser.Providers.Movies
}
// Don't refresh if we already have both poster and backdrop and we're not refreshing images
- if (item.HasImage(ImageType.Primary) && item.BackdropImagePaths.Count >= ConfigurationManager.Configuration.MaxBackdrops)
+ if (item.HasImage(ImageType.Primary) &&
+ item.BackdropImagePaths.Count >= ConfigurationManager.Configuration.MaxBackdrops &&
+ !item.LockedFields.Contains(MetadataFields.Images))
{
return false;
}
@@ -167,7 +169,6 @@ namespace MediaBrowser.Providers.Movies
public override async Task FetchAsync(BaseItem item, bool force, BaseProviderInfo providerInfo, CancellationToken cancellationToken)
{
var images = await _providerManager.GetAvailableRemoteImages(item, cancellationToken, ManualMovieDbImageProvider.ProviderName).ConfigureAwait(false);
-
await ProcessImages(item, images.ToList(), cancellationToken).ConfigureAwait(false);
SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
@@ -190,7 +191,7 @@ namespace MediaBrowser.Providers.Movies
.ToList();
// poster
- if (eligiblePosters.Count > 0 && !item.HasImage(ImageType.Primary))
+ if (eligiblePosters.Count > 0 && !item.HasImage(ImageType.Primary) && !item.LockedFields.Contains(MetadataFields.Images))
{
var poster = eligiblePosters[0];
@@ -216,7 +217,10 @@ namespace MediaBrowser.Providers.Movies
var backdropLimit = ConfigurationManager.Configuration.MaxBackdrops;
// backdrops - only download if earlier providers didn't find any (fanart)
- if (eligibleBackdrops.Count > 0 && ConfigurationManager.Configuration.DownloadMovieImages.Backdrops && item.BackdropImagePaths.Count < backdropLimit)
+ if (eligibleBackdrops.Count > 0 &&
+ ConfigurationManager.Configuration.DownloadMovieImages.Backdrops &&
+ item.BackdropImagePaths.Count < backdropLimit &&
+ !item.LockedFields.Contains(MetadataFields.Backdrops))
{
for (var i = 0; i < eligibleBackdrops.Count; i++)
{
diff --git a/MediaBrowser.Providers/Movies/MovieDbPersonImageProvider.cs b/MediaBrowser.Providers/Movies/MovieDbPersonImageProvider.cs
index 8fa2ea249..f6c908a7c 100644
--- a/MediaBrowser.Providers/Movies/MovieDbPersonImageProvider.cs
+++ b/MediaBrowser.Providers/Movies/MovieDbPersonImageProvider.cs
@@ -164,7 +164,6 @@ namespace MediaBrowser.Providers.Movies
public override async Task FetchAsync(BaseItem item, bool force, BaseProviderInfo providerInfo, CancellationToken cancellationToken)
{
var images = await _providerManager.GetAvailableRemoteImages(item, cancellationToken, ManualMovieDbPersonImageProvider.ProviderName).ConfigureAwait(false);
-
await ProcessImages(item, images.ToList(), cancellationToken).ConfigureAwait(false);
SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
@@ -187,7 +186,7 @@ namespace MediaBrowser.Providers.Movies
.ToList();
// poster
- if (eligiblePosters.Count > 0 && !item.HasImage(ImageType.Primary))
+ if (eligiblePosters.Count > 0 && !item.HasImage(ImageType.Primary) && !item.LockedFields.Contains(MetadataFields.Images))
{
var poster = eligiblePosters[0];
diff --git a/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs b/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs
index 2e072b098..b6e0d61f7 100644
--- a/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs
+++ b/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs
@@ -154,9 +154,11 @@ namespace MediaBrowser.Providers.Music
/// Task{System.Boolean}.
public override async Task FetchAsync(BaseItem item, bool force, BaseProviderInfo providerInfo, CancellationToken cancellationToken)
{
- var images = await _providerManager.GetAvailableRemoteImages(item, cancellationToken, ManualFanartAlbumProvider.ProviderName).ConfigureAwait(false);
-
- await FetchFromXml(item, images.ToList(), cancellationToken).ConfigureAwait(false);
+ if (!item.LockedFields.Contains(MetadataFields.Images))
+ {
+ var images = await _providerManager.GetAvailableRemoteImages(item, cancellationToken, ManualFanartAlbumProvider.ProviderName).ConfigureAwait(false);
+ await FetchFromXml(item, images.ToList(), cancellationToken).ConfigureAwait(false);
+ }
SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
diff --git a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs
index 57a191ab1..454d56daf 100644
--- a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs
+++ b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs
@@ -213,13 +213,12 @@ namespace MediaBrowser.Providers.Music
}
if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Art ||
- ConfigurationManager.Configuration.DownloadMusicArtistImages.Backdrops ||
- ConfigurationManager.Configuration.DownloadMusicArtistImages.Banner ||
- ConfigurationManager.Configuration.DownloadMusicArtistImages.Logo ||
- ConfigurationManager.Configuration.DownloadMusicArtistImages.Primary)
+ ConfigurationManager.Configuration.DownloadMusicArtistImages.Backdrops ||
+ ConfigurationManager.Configuration.DownloadMusicArtistImages.Banner ||
+ ConfigurationManager.Configuration.DownloadMusicArtistImages.Logo ||
+ ConfigurationManager.Configuration.DownloadMusicArtistImages.Primary)
{
var images = await _providerManager.GetAvailableRemoteImages(item, cancellationToken, ManualFanartArtistProvider.ProviderName).ConfigureAwait(false);
-
await FetchFromXml(item, images.ToList(), cancellationToken).ConfigureAwait(false);
}
@@ -268,46 +267,52 @@ namespace MediaBrowser.Providers.Music
/// Task.
private async Task FetchFromXml(BaseItem item, List images , CancellationToken cancellationToken)
{
- cancellationToken.ThrowIfCancellationRequested();
-
- if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Primary && !item.HasImage(ImageType.Primary))
+ if (!item.LockedFields.Contains(MetadataFields.Images))
{
- await SaveImage(item, images, ImageType.Primary, cancellationToken).ConfigureAwait(false);
- }
+ cancellationToken.ThrowIfCancellationRequested();
- cancellationToken.ThrowIfCancellationRequested();
-
- if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Logo && !item.HasImage(ImageType.Logo))
- {
- await SaveImage(item, images, ImageType.Logo, cancellationToken).ConfigureAwait(false);
- }
-
- cancellationToken.ThrowIfCancellationRequested();
-
- if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Art && !item.HasImage(ImageType.Art))
- {
- await SaveImage(item, images, ImageType.Art, cancellationToken).ConfigureAwait(false);
- }
-
- cancellationToken.ThrowIfCancellationRequested();
-
- if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Banner && !item.HasImage(ImageType.Banner))
- {
- await SaveImage(item, images, ImageType.Banner, cancellationToken).ConfigureAwait(false);
- }
-
- cancellationToken.ThrowIfCancellationRequested();
-
- var backdropLimit = ConfigurationManager.Configuration.MaxBackdrops;
- if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Backdrops &&
- item.BackdropImagePaths.Count < backdropLimit)
- {
- foreach (var image in images.Where(i => i.Type == ImageType.Backdrop))
+ if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Primary && !item.HasImage(ImageType.Primary))
{
- await _providerManager.SaveImage(item, image.Url, FanArtResourcePool, ImageType.Backdrop, null, cancellationToken)
- .ConfigureAwait(false);
+ await SaveImage(item, images, ImageType.Primary, cancellationToken).ConfigureAwait(false);
+ }
- if (item.BackdropImagePaths.Count >= backdropLimit) break;
+ cancellationToken.ThrowIfCancellationRequested();
+
+ if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Logo && !item.HasImage(ImageType.Logo))
+ {
+ await SaveImage(item, images, ImageType.Logo, cancellationToken).ConfigureAwait(false);
+ }
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Art && !item.HasImage(ImageType.Art))
+ {
+ await SaveImage(item, images, ImageType.Art, cancellationToken).ConfigureAwait(false);
+ }
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Banner && !item.HasImage(ImageType.Banner))
+ {
+ await SaveImage(item, images, ImageType.Banner, cancellationToken).ConfigureAwait(false);
+ }
+ }
+
+ if (!item.LockedFields.Contains(MetadataFields.Backdrops))
+ {
+ cancellationToken.ThrowIfCancellationRequested();
+
+ var backdropLimit = ConfigurationManager.Configuration.MaxBackdrops;
+ if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Backdrops &&
+ item.BackdropImagePaths.Count < backdropLimit)
+ {
+ foreach (var image in images.Where(i => i.Type == ImageType.Backdrop))
+ {
+ await _providerManager.SaveImage(item, image.Url, FanArtResourcePool, ImageType.Backdrop, null, cancellationToken)
+ .ConfigureAwait(false);
+
+ if (item.BackdropImagePaths.Count >= backdropLimit) break;
+ }
}
}
}
diff --git a/MediaBrowser.Providers/Music/LastFmImageProvider.cs b/MediaBrowser.Providers/Music/LastFmImageProvider.cs
index 2a30a3a2e..98ba58fa8 100644
--- a/MediaBrowser.Providers/Music/LastFmImageProvider.cs
+++ b/MediaBrowser.Providers/Music/LastFmImageProvider.cs
@@ -90,7 +90,7 @@ namespace MediaBrowser.Providers.Music
? ConfigurationManager.Configuration.DownloadMusicAlbumImages
: ConfigurationManager.Configuration.DownloadMusicArtistImages;
- if (configSetting.Primary && !item.HasImage(ImageType.Primary))
+ if (configSetting.Primary && !item.HasImage(ImageType.Primary) && !item.LockedFields.Contains(MetadataFields.Images))
{
var image = images.FirstOrDefault(i => i.Type == ImageType.Primary);
diff --git a/MediaBrowser.Providers/TV/FanArtSeasonProvider.cs b/MediaBrowser.Providers/TV/FanArtSeasonProvider.cs
index 713a95b26..50ce72a89 100644
--- a/MediaBrowser.Providers/TV/FanArtSeasonProvider.cs
+++ b/MediaBrowser.Providers/TV/FanArtSeasonProvider.cs
@@ -101,11 +101,10 @@ namespace MediaBrowser.Providers.TV
{
cancellationToken.ThrowIfCancellationRequested();
- var season = (Season)item;
+ var season = (Season) item;
// Process images
var images = await _providerManager.GetAvailableRemoteImages(item, cancellationToken, ManualFanartSeasonImageProvider.ProviderName).ConfigureAwait(false);
-
await FetchImages(season, images.ToList(), cancellationToken).ConfigureAwait(false);
SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
@@ -121,7 +120,7 @@ namespace MediaBrowser.Providers.TV
/// Task.
private async Task FetchImages(Season season, List images, CancellationToken cancellationToken)
{
- if (ConfigurationManager.Configuration.DownloadSeasonImages.Thumb && !season.HasImage(ImageType.Thumb))
+ if (ConfigurationManager.Configuration.DownloadSeasonImages.Thumb && !season.HasImage(ImageType.Thumb) && !season.LockedFields.Contains(MetadataFields.Images))
{
await SaveImage(season, images, ImageType.Thumb, cancellationToken).ConfigureAwait(false);
}
diff --git a/MediaBrowser.Providers/TV/FanArtTVProvider.cs b/MediaBrowser.Providers/TV/FanArtTVProvider.cs
index 90af81ec3..d939951fb 100644
--- a/MediaBrowser.Providers/TV/FanArtTVProvider.cs
+++ b/MediaBrowser.Providers/TV/FanArtTVProvider.cs
@@ -196,56 +196,61 @@ namespace MediaBrowser.Providers.TV
/// Task.
private async Task FetchFromXml(BaseItem item, List images, CancellationToken cancellationToken)
{
- cancellationToken.ThrowIfCancellationRequested();
-
- if (ConfigurationManager.Configuration.DownloadSeriesImages.Primary && !item.HasImage(ImageType.Primary))
+ if (!item.LockedFields.Contains(MetadataFields.Images))
{
- await SaveImage(item, images, ImageType.Primary, cancellationToken).ConfigureAwait(false);
- }
+ cancellationToken.ThrowIfCancellationRequested();
- cancellationToken.ThrowIfCancellationRequested();
-
- if (ConfigurationManager.Configuration.DownloadSeriesImages.Logo && !item.HasImage(ImageType.Logo))
- {
- await SaveImage(item, images, ImageType.Logo, cancellationToken).ConfigureAwait(false);
- }
-
- cancellationToken.ThrowIfCancellationRequested();
-
- if (ConfigurationManager.Configuration.DownloadSeriesImages.Art && !item.HasImage(ImageType.Art))
- {
- await SaveImage(item, images, ImageType.Art, cancellationToken).ConfigureAwait(false);
- }
-
- cancellationToken.ThrowIfCancellationRequested();
-
- if (ConfigurationManager.Configuration.DownloadSeriesImages.Thumb && !item.HasImage(ImageType.Thumb))
- {
- await SaveImage(item, images, ImageType.Thumb, cancellationToken).ConfigureAwait(false);
- }
-
- cancellationToken.ThrowIfCancellationRequested();
-
- if (ConfigurationManager.Configuration.DownloadSeriesImages.Banner && !item.HasImage(ImageType.Banner))
- {
- await SaveImage(item, images, ImageType.Banner, cancellationToken).ConfigureAwait(false);
- }
-
- cancellationToken.ThrowIfCancellationRequested();
-
- var backdropLimit = ConfigurationManager.Configuration.MaxBackdrops;
- if (ConfigurationManager.Configuration.DownloadSeriesImages.Backdrops &&
- item.BackdropImagePaths.Count < backdropLimit)
- {
- foreach (var image in images.Where(i => i.Type == ImageType.Backdrop))
+ if (ConfigurationManager.Configuration.DownloadSeriesImages.Primary && !item.HasImage(ImageType.Primary))
{
- await _providerManager.SaveImage(item, image.Url, FanArtResourcePool, ImageType.Backdrop, null, cancellationToken)
- .ConfigureAwait(false);
+ await SaveImage(item, images, ImageType.Primary, cancellationToken).ConfigureAwait(false);
+ }
- if (item.BackdropImagePaths.Count >= backdropLimit) break;
+ cancellationToken.ThrowIfCancellationRequested();
+
+ if (ConfigurationManager.Configuration.DownloadSeriesImages.Logo && !item.HasImage(ImageType.Logo))
+ {
+ await SaveImage(item, images, ImageType.Logo, cancellationToken).ConfigureAwait(false);
+ }
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ if (ConfigurationManager.Configuration.DownloadSeriesImages.Art && !item.HasImage(ImageType.Art))
+ {
+ await SaveImage(item, images, ImageType.Art, cancellationToken).ConfigureAwait(false);
+ }
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ if (ConfigurationManager.Configuration.DownloadSeriesImages.Thumb && !item.HasImage(ImageType.Thumb))
+ {
+ await SaveImage(item, images, ImageType.Thumb, cancellationToken).ConfigureAwait(false);
+ }
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ if (ConfigurationManager.Configuration.DownloadSeriesImages.Banner && !item.HasImage(ImageType.Banner))
+ {
+ await SaveImage(item, images, ImageType.Banner, cancellationToken).ConfigureAwait(false);
}
}
+ if (!item.LockedFields.Contains(MetadataFields.Backdrops))
+ {
+ cancellationToken.ThrowIfCancellationRequested();
+
+ var backdropLimit = ConfigurationManager.Configuration.MaxBackdrops;
+ if (ConfigurationManager.Configuration.DownloadSeriesImages.Backdrops &&
+ item.BackdropImagePaths.Count < backdropLimit)
+ {
+ foreach (var image in images.Where(i => i.Type == ImageType.Backdrop))
+ {
+ await _providerManager.SaveImage(item, image.Url, FanArtResourcePool, ImageType.Backdrop, null, cancellationToken)
+ .ConfigureAwait(false);
+
+ if (item.BackdropImagePaths.Count >= backdropLimit) break;
+ }
+ }
+ }
}
private async Task SaveImage(BaseItem item, List images, ImageType type, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Providers/TV/TvdbPersonImageProvider.cs b/MediaBrowser.Providers/TV/TvdbPersonImageProvider.cs
index 3a503ea20..f2ce92efd 100644
--- a/MediaBrowser.Providers/TV/TvdbPersonImageProvider.cs
+++ b/MediaBrowser.Providers/TV/TvdbPersonImageProvider.cs
@@ -75,9 +75,10 @@ namespace MediaBrowser.Providers.TV
SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
return true;
}
+
private async Task DownloadImages(BaseItem item, List images, CancellationToken cancellationToken)
{
- if (!item.HasImage(ImageType.Primary))
+ if (!item.HasImage(ImageType.Primary) && !item.LockedFields.Contains(MetadataFields.Images))
{
var image = images.FirstOrDefault(i => i.Type == ImageType.Primary);
diff --git a/MediaBrowser.Providers/TV/TvdbSeasonProvider.cs b/MediaBrowser.Providers/TV/TvdbSeasonProvider.cs
index c5e5327c3..17ed6b5a2 100644
--- a/MediaBrowser.Providers/TV/TvdbSeasonProvider.cs
+++ b/MediaBrowser.Providers/TV/TvdbSeasonProvider.cs
@@ -159,17 +159,20 @@ namespace MediaBrowser.Providers.TV
private async Task DownloadImages(BaseItem item, List images, int backdropLimit, CancellationToken cancellationToken)
{
- if (!item.HasImage(ImageType.Primary))
+ if (!item.LockedFields.Contains(MetadataFields.Images))
{
- await SaveImage(item, images, ImageType.Primary, cancellationToken).ConfigureAwait(false);
+ if (!item.HasImage(ImageType.Primary))
+ {
+ await SaveImage(item, images, ImageType.Primary, cancellationToken).ConfigureAwait(false);
+ }
+
+ if (ConfigurationManager.Configuration.DownloadSeasonImages.Banner && !item.HasImage(ImageType.Banner))
+ {
+ await SaveImage(item, images, ImageType.Banner, cancellationToken).ConfigureAwait(false);
+ }
}
- if (ConfigurationManager.Configuration.DownloadSeasonImages.Banner && !item.HasImage(ImageType.Banner))
- {
- await SaveImage(item, images, ImageType.Banner, cancellationToken).ConfigureAwait(false);
- }
-
- if (ConfigurationManager.Configuration.DownloadSeasonImages.Backdrops && item.BackdropImagePaths.Count < backdropLimit)
+ if (ConfigurationManager.Configuration.DownloadSeasonImages.Backdrops && item.BackdropImagePaths.Count < backdropLimit && !item.LockedFields.Contains(MetadataFields.Backdrops))
{
foreach (var backdrop in images.Where(i => i.Type == ImageType.Backdrop))
{
diff --git a/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs
index c1ac0e386..9220b8fa0 100644
--- a/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs
+++ b/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs
@@ -143,7 +143,7 @@ namespace MediaBrowser.Providers.TV
}
return base.NeedsRefreshInternal(item, providerInfo);
}
-
+
///
/// Fetches metadata and returns true or false indicating if any work that requires persistence was done
///
@@ -167,29 +167,32 @@ namespace MediaBrowser.Providers.TV
private async Task DownloadImages(BaseItem item, List images, int backdropLimit, CancellationToken cancellationToken)
{
- if (!item.HasImage(ImageType.Primary))
+ if (!item.LockedFields.Contains(MetadataFields.Images))
{
- var image = images.FirstOrDefault(i => i.Type == ImageType.Primary);
-
- if (image != null)
+ if (!item.HasImage(ImageType.Primary))
{
- await _providerManager.SaveImage(item, image.Url, TvdbSeriesProvider.Current.TvDbResourcePool, ImageType.Primary, null, cancellationToken)
- .ConfigureAwait(false);
+ var image = images.FirstOrDefault(i => i.Type == ImageType.Primary);
+
+ if (image != null)
+ {
+ await _providerManager.SaveImage(item, image.Url, TvdbSeriesProvider.Current.TvDbResourcePool, ImageType.Primary, null, cancellationToken)
+ .ConfigureAwait(false);
+ }
+ }
+
+ if (ConfigurationManager.Configuration.DownloadSeriesImages.Banner && !item.HasImage(ImageType.Banner))
+ {
+ var image = images.FirstOrDefault(i => i.Type == ImageType.Banner);
+
+ if (image != null)
+ {
+ await _providerManager.SaveImage(item, image.Url, TvdbSeriesProvider.Current.TvDbResourcePool, ImageType.Banner, null, cancellationToken)
+ .ConfigureAwait(false);
+ }
}
}
- if (ConfigurationManager.Configuration.DownloadSeriesImages.Banner && !item.HasImage(ImageType.Banner))
- {
- var image = images.FirstOrDefault(i => i.Type == ImageType.Banner);
-
- if (image != null)
- {
- await _providerManager.SaveImage(item, image.Url, TvdbSeriesProvider.Current.TvDbResourcePool, ImageType.Banner, null, cancellationToken)
- .ConfigureAwait(false);
- }
- }
-
- if (ConfigurationManager.Configuration.DownloadSeriesImages.Backdrops && item.BackdropImagePaths.Count < backdropLimit)
+ if (ConfigurationManager.Configuration.DownloadSeriesImages.Backdrops && item.BackdropImagePaths.Count < backdropLimit && !item.LockedFields.Contains(MetadataFields.Backdrops))
{
foreach (var backdrop in images.Where(i => i.Type == ImageType.Backdrop &&
(!i.Width.HasValue ||