From aac392f4cd7da4fc40a4cf948783249365bc8e0c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 9 Feb 2014 02:27:44 -0500 Subject: [PATCH] add audio db for artists --- MediaBrowser.Api/Images/RemoteImageService.cs | 6 +- MediaBrowser.Api/ItemRefreshService.cs | 14 +- MediaBrowser.Controller/Entities/Folder.cs | 22 +- .../Entities/MetadataProviders.cs | 5 +- .../MediaBrowser.Providers.csproj | 2 + .../Music/AudioDbArtistImageProvider.cs | 164 ++++++++++++++ .../Music/AudioDbArtistProvider.cs | 212 ++++++++++++++++++ MediaBrowser.Providers/Music/Extensions.cs | 4 +- .../Music/LastFmImageProvider.cs | 6 +- .../Music/LastfmArtistProvider.cs | 8 +- .../Music/MusicBrainzAlbumProvider.cs | 2 +- .../Music/MusicBrainzArtistProvider.cs | 2 +- .../TV/MovieDbSeriesProvider.cs | 10 +- .../TV/SeriesMetadataService.cs | 2 +- .../TV/SeriesPostScanTask.cs | 2 +- .../TV/TvdbSeriesProvider.cs | 27 +-- .../Library/LibraryManager.cs | 6 +- 17 files changed, 444 insertions(+), 50 deletions(-) create mode 100644 MediaBrowser.Providers/Music/AudioDbArtistImageProvider.cs create mode 100644 MediaBrowser.Providers/Music/AudioDbArtistProvider.cs diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs index 895904da76..fc2ced1a69 100644 --- a/MediaBrowser.Api/Images/RemoteImageService.cs +++ b/MediaBrowser.Api/Images/RemoteImageService.cs @@ -320,6 +320,10 @@ namespace MediaBrowser.Api.Images return ToStaticFileResult(contentPath); } } + catch (DirectoryNotFoundException) + { + // Means the file isn't cached yet + } catch (FileNotFoundException) { // Means the file isn't cached yet @@ -356,7 +360,6 @@ namespace MediaBrowser.Api.Images var fullCachePath = GetFullCachePath(urlHash + "." + ext); Directory.CreateDirectory(Path.GetDirectoryName(fullCachePath)); - using (var stream = result.Content) { using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileMode.Create, FileAccess.Write, FileShare.Read, true)) @@ -365,6 +368,7 @@ namespace MediaBrowser.Api.Images } } + Directory.CreateDirectory(Path.GetDirectoryName(pointerCachePath)); using (var writer = new StreamWriter(pointerCachePath)) { await writer.WriteAsync(fullCachePath).ConfigureAwait(false); diff --git a/MediaBrowser.Api/ItemRefreshService.cs b/MediaBrowser.Api/ItemRefreshService.cs index ca56e40af8..25acfe3f37 100644 --- a/MediaBrowser.Api/ItemRefreshService.cs +++ b/MediaBrowser.Api/ItemRefreshService.cs @@ -111,13 +111,15 @@ namespace MediaBrowser.Api .OfType() .ToList(); - var musicArtistRefreshTasks = musicArtists.Select(i => i.ValidateChildren(new Progress(), cancellationToken, true, request.Forced)); + var options = GetRefreshOptions(request); + + var musicArtistRefreshTasks = musicArtists.Select(i => i.ValidateChildren(new Progress(), cancellationToken, options, true)); await Task.WhenAll(musicArtistRefreshTasks).ConfigureAwait(false); try { - await item.RefreshMetadata(GetRefreshOptions(request), CancellationToken.None).ConfigureAwait(false); + await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false); } catch (Exception ex) { @@ -250,9 +252,11 @@ namespace MediaBrowser.Api { var item = _dtoService.GetItemByDtoId(request.Id); + var options = GetRefreshOptions(request); + try { - await item.RefreshMetadata(GetRefreshOptions(request), CancellationToken.None).ConfigureAwait(false); + await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false); if (item.IsFolder) { @@ -267,7 +271,7 @@ namespace MediaBrowser.Api { var folder = (Folder)item; - await folder.ValidateChildren(new Progress(), CancellationToken.None, request.Recursive, request.Forced).ConfigureAwait(false); + await folder.ValidateChildren(new Progress(), CancellationToken.None, options, request.Recursive).ConfigureAwait(false); } } } @@ -295,7 +299,7 @@ namespace MediaBrowser.Api { var folder = (Folder)child; - await folder.ValidateChildren(new Progress(), CancellationToken.None, request.Recursive, request.Forced).ConfigureAwait(false); + await folder.ValidateChildren(new Progress(), CancellationToken.None, options, request.Recursive).ConfigureAwait(false); } } } diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 019361f159..933cf758c2 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -299,26 +299,24 @@ namespace MediaBrowser.Controller.Entities /// The current validation cancellation token source. private CancellationTokenSource CurrentValidationCancellationTokenSource { get; set; } + public Task ValidateChildren(IProgress progress, CancellationToken cancellationToken) + { + return ValidateChildren(progress, cancellationToken, new MetadataRefreshOptions()); + } + /// /// Validates that the children of the folder still exist /// /// The progress. /// The cancellation token. + /// The metadata refresh options. /// if set to true [recursive]. - /// if set to true [force refresh metadata]. /// Task. - public Task ValidateChildren(IProgress progress, CancellationToken cancellationToken, bool? recursive = null, bool forceRefreshMetadata = false) + public Task ValidateChildren(IProgress progress, CancellationToken cancellationToken, MetadataRefreshOptions metadataRefreshOptions, bool recursive = true) { - var directoryService = new DirectoryService(Logger); + metadataRefreshOptions.DirectoryService = metadataRefreshOptions.DirectoryService ?? new DirectoryService(Logger); - return ValidateChildrenWithCancellationSupport(progress, cancellationToken, recursive ?? true, true, - - new MetadataRefreshOptions - { - ReplaceAllMetadata = forceRefreshMetadata, - DirectoryService = directoryService - - }, directoryService); + return ValidateChildrenWithCancellationSupport(progress, cancellationToken, recursive, true, metadataRefreshOptions, metadataRefreshOptions.DirectoryService); } private async Task ValidateChildrenWithCancellationSupport(IProgress progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, DirectoryService directoryService) @@ -531,7 +529,7 @@ namespace MediaBrowser.Controller.Entities cancellationToken.ThrowIfCancellationRequested(); var innerProgress = new ActionableProgress(); - + // Avoid implicitly captured closure var currentChild = child; innerProgress.RegisterAction(p => diff --git a/MediaBrowser.Model/Entities/MetadataProviders.cs b/MediaBrowser.Model/Entities/MetadataProviders.cs index e021ab46a4..8e446bc261 100644 --- a/MediaBrowser.Model/Entities/MetadataProviders.cs +++ b/MediaBrowser.Model/Entities/MetadataProviders.cs @@ -38,6 +38,9 @@ namespace MediaBrowser.Model.Entities Zap2It, NesBox, NesBoxRom, - TvRageSeries + TvRage, + Freebase, + FreebaseMachine, + AudioDbArtist } } diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index efe2b05d11..957731e0f5 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -119,6 +119,8 @@ + + diff --git a/MediaBrowser.Providers/Music/AudioDbArtistImageProvider.cs b/MediaBrowser.Providers/Music/AudioDbArtistImageProvider.cs new file mode 100644 index 0000000000..79238fd514 --- /dev/null +++ b/MediaBrowser.Providers/Music/AudioDbArtistImageProvider.cs @@ -0,0 +1,164 @@ +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Providers; +using MediaBrowser.Model.Serialization; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Providers.Music +{ + public class AudioDbArtistImageProvider : IRemoteImageProvider, IHasOrder + { + private readonly IServerConfigurationManager _config; + private readonly IHttpClient _httpClient; + private readonly IJsonSerializer _json; + + public AudioDbArtistImageProvider(IServerConfigurationManager config, IJsonSerializer json, IHttpClient httpClient) + { + _config = config; + _json = json; + _httpClient = httpClient; + } + + public IEnumerable GetSupportedImages(IHasImages item) + { + return new List + { + ImageType.Primary, + ImageType.Logo, + ImageType.Banner, + ImageType.Backdrop + }; + } + + public async Task> GetImages(IHasImages item, ImageType imageType, CancellationToken cancellationToken) + { + var images = await GetAllImages(item, cancellationToken).ConfigureAwait(false); + + return images.Where(i => i.Type == imageType); + } + + public async Task> GetAllImages(IHasImages item, CancellationToken cancellationToken) + { + var id = item.GetProviderId(MetadataProviders.MusicBrainzArtist); + + if (!string.IsNullOrWhiteSpace(id)) + { + await AudioDbArtistProvider.Current.EnsureArtistInfo(id, cancellationToken).ConfigureAwait(false); + + var path = AudioDbArtistProvider.GetArtistInfoPath(_config.ApplicationPaths, id); + + var obj = _json.DeserializeFromFile(path); + + if (obj != null && obj.artists != null && obj.artists.Count > 0) + { + return GetImages(obj.artists[0]); + } + } + + return new List(); + } + + private IEnumerable GetImages(AudioDbArtistProvider.Artist item) + { + var list = new List(); + + if (!string.IsNullOrWhiteSpace(item.strArtistThumb)) + { + list.Add(new RemoteImageInfo + { + ProviderName = Name, + Url = item.strArtistThumb, + Type = ImageType.Primary + }); + } + + if (!string.IsNullOrWhiteSpace(item.strArtistLogo)) + { + list.Add(new RemoteImageInfo + { + ProviderName = Name, + Url = item.strArtistLogo, + Type = ImageType.Logo + }); + } + + if (!string.IsNullOrWhiteSpace(item.strArtistBanner)) + { + list.Add(new RemoteImageInfo + { + ProviderName = Name, + Url = item.strArtistBanner, + Type = ImageType.Banner + }); + } + + if (!string.IsNullOrWhiteSpace(item.strArtistFanart)) + { + list.Add(new RemoteImageInfo + { + ProviderName = Name, + Url = item.strArtistFanart, + Type = ImageType.Backdrop + }); + } + + if (!string.IsNullOrWhiteSpace(item.strArtistFanart2)) + { + list.Add(new RemoteImageInfo + { + ProviderName = Name, + Url = item.strArtistFanart2, + Type = ImageType.Backdrop + }); + } + + if (!string.IsNullOrWhiteSpace(item.strArtistFanart3)) + { + list.Add(new RemoteImageInfo + { + ProviderName = Name, + Url = item.strArtistFanart3, + Type = ImageType.Backdrop + }); + } + + return list; + } + + public Task GetImageResponse(string url, CancellationToken cancellationToken) + { + return _httpClient.GetResponse(new HttpRequestOptions + { + CancellationToken = cancellationToken, + Url = url, + ResourcePool = AudioDbArtistProvider.Current.AudioDbResourcePool + }); + } + + public string Name + { + get { return "TheAudioDB"; } + } + + public bool Supports(IHasImages item) + { + return item is MusicArtist; + } + + public int Order + { + get + { + // After fanart + return 1; + } + } + } +} diff --git a/MediaBrowser.Providers/Music/AudioDbArtistProvider.cs b/MediaBrowser.Providers/Music/AudioDbArtistProvider.cs new file mode 100644 index 0000000000..f87098e183 --- /dev/null +++ b/MediaBrowser.Providers/Music/AudioDbArtistProvider.cs @@ -0,0 +1,212 @@ +using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Serialization; +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Providers.Music +{ + public class AudioDbArtistProvider : IRemoteMetadataProvider, IHasOrder + { + private readonly IServerConfigurationManager _config; + private readonly IFileSystem _fileSystem; + private readonly IHttpClient _httpClient; + private readonly IJsonSerializer _json; + + public static AudioDbArtistProvider Current; + + public SemaphoreSlim AudioDbResourcePool = new SemaphoreSlim(2, 2); + private const string ApiKey = "49jhsf8248yfahka89724011"; + public const string BaseUrl = "http://www.theaudiodb.com/api/v1/json/" + ApiKey; + + public AudioDbArtistProvider(IServerConfigurationManager config, IFileSystem fileSystem, IHttpClient httpClient, IJsonSerializer json) + { + _config = config; + _fileSystem = fileSystem; + _httpClient = httpClient; + _json = json; + Current = this; + } + + public async Task> GetMetadata(ArtistInfo info, CancellationToken cancellationToken) + { + var result = new MetadataResult(); + + var id = info.GetMusicBrainzArtistId(); + + if (!string.IsNullOrWhiteSpace(id)) + { + await EnsureArtistInfo(id, cancellationToken).ConfigureAwait(false); + + var path = GetArtistInfoPath(_config.ApplicationPaths, id); + + var obj = _json.DeserializeFromFile(path); + + if (obj != null && obj.artists != null && obj.artists.Count > 0) + { + result.Item = new MusicArtist(); + result.HasMetadata = true; + ProcessResult(result.Item, obj.artists[0]); + } + } + + return result; + } + + private void ProcessResult(MusicArtist item, Artist result) + { + item.HomePageUrl = result.strWebsite; + item.Overview = result.strBiographyEN; + + item.SetProviderId(MetadataProviders.AudioDbArtist, result.idArtist); + item.SetProviderId(MetadataProviders.MusicBrainzArtist, result.strMusicBrainzID); + } + + public string Name + { + get { return "TheAudioDB"; } + } + + private readonly Task _cachedTask = Task.FromResult(true); + internal Task EnsureArtistInfo(string musicBrainzId, CancellationToken cancellationToken) + { + var xmlPath = GetArtistInfoPath(_config.ApplicationPaths, musicBrainzId); + + var fileInfo = _fileSystem.GetFileSystemInfo(xmlPath); + + if (fileInfo.Exists) + { + if (_config.Configuration.EnableFanArtUpdates || (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 7) + { + return _cachedTask; + } + } + + return DownloadArtistInfo(musicBrainzId, cancellationToken); + } + + internal async Task DownloadArtistInfo(string musicBrainzId, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + var url = BaseUrl + "/artist-mb.php?i=" + musicBrainzId; + + var path = GetArtistInfoPath(_config.ApplicationPaths, musicBrainzId); + + Directory.CreateDirectory(Path.GetDirectoryName(path)); + + using (var response = await _httpClient.Get(new HttpRequestOptions + { + Url = url, + ResourcePool = AudioDbResourcePool, + CancellationToken = cancellationToken + + }).ConfigureAwait(false)) + { + using (var xmlFileStream = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, true)) + { + await response.CopyToAsync(xmlFileStream).ConfigureAwait(false); + } + } + } + + /// + /// Gets the artist data path. + /// + /// The application paths. + /// The music brainz artist identifier. + /// System.String. + private static string GetArtistDataPath(IApplicationPaths appPaths, string musicBrainzArtistId) + { + var dataPath = Path.Combine(GetArtistDataPath(appPaths), musicBrainzArtistId); + + return dataPath; + } + + /// + /// Gets the artist data path. + /// + /// The application paths. + /// System.String. + internal static string GetArtistDataPath(IApplicationPaths appPaths) + { + var dataPath = Path.Combine(appPaths.DataPath, "audiodb"); + + return dataPath; + } + + internal static string GetArtistInfoPath(IApplicationPaths appPaths, string musicBrainzArtistId) + { + var dataPath = GetArtistDataPath(appPaths, musicBrainzArtistId); + + return Path.Combine(dataPath, "artist.json"); + } + + public class Artist + { + public string idArtist { get; set; } + public string strArtist { get; set; } + public string strArtistAlternate { get; set; } + public object idLabel { get; set; } + public string intFormedYear { get; set; } + public string intBornYear { get; set; } + public object intDiedYear { get; set; } + public object strDisbanded { get; set; } + public string strGenre { get; set; } + public string strSubGenre { get; set; } + public string strWebsite { get; set; } + public string strFacebook { get; set; } + public string strTwitter { get; set; } + public string strBiographyEN { get; set; } + public string strBiographyDE { get; set; } + public string strBiographyFR { get; set; } + public object strBiographyCN { get; set; } + public string strBiographyIT { get; set; } + public object strBiographyJP { get; set; } + public object strBiographyRU { get; set; } + public object strBiographyES { get; set; } + public object strBiographyPT { get; set; } + public object strBiographySE { get; set; } + public object strBiographyNL { get; set; } + public object strBiographyHU { get; set; } + public object strBiographyNO { get; set; } + public object strBiographyIL { get; set; } + public object strBiographyPL { get; set; } + public string strGender { get; set; } + public string intMembers { get; set; } + public string strCountry { get; set; } + public string strCountryCode { get; set; } + public string strArtistThumb { get; set; } + public string strArtistLogo { get; set; } + public string strArtistFanart { get; set; } + public string strArtistFanart2 { get; set; } + public string strArtistFanart3 { get; set; } + public string strArtistBanner { get; set; } + public string strMusicBrainzID { get; set; } + public object strLastFMChart { get; set; } + public string strLocked { get; set; } + } + + public class RootObject + { + public List artists { get; set; } + } + + public int Order + { + get + { + // After musicbrainz + return 1; + } + } + } +} diff --git a/MediaBrowser.Providers/Music/Extensions.cs b/MediaBrowser.Providers/Music/Extensions.cs index 671242eed1..a959eb08ca 100644 --- a/MediaBrowser.Providers/Music/Extensions.cs +++ b/MediaBrowser.Providers/Music/Extensions.cs @@ -45,7 +45,7 @@ namespace MediaBrowser.Providers.Music return id; } - public static string GetArtistId(this AlbumInfo info) + public static string GetMusicBrainzArtistId(this AlbumInfo info) { string id; info.ProviderIds.TryGetValue(MetadataProviders.MusicBrainzAlbumArtist.ToString(), out id); @@ -64,7 +64,7 @@ namespace MediaBrowser.Providers.Music return id; } - public static string GetArtistId(this ArtistInfo info) + public static string GetMusicBrainzArtistId(this ArtistInfo info) { string id; info.ProviderIds.TryGetValue(MetadataProviders.MusicBrainzArtist.ToString(), out id); diff --git a/MediaBrowser.Providers/Music/LastFmImageProvider.cs b/MediaBrowser.Providers/Music/LastFmImageProvider.cs index 26a89fa956..701e74da00 100644 --- a/MediaBrowser.Providers/Music/LastFmImageProvider.cs +++ b/MediaBrowser.Providers/Music/LastFmImageProvider.cs @@ -151,7 +151,11 @@ namespace MediaBrowser.Providers.Music public int Order { - get { return 1; } + get + { + // After all others + return 3; + } } public Task GetImageResponse(string url, CancellationToken cancellationToken) diff --git a/MediaBrowser.Providers/Music/LastfmArtistProvider.cs b/MediaBrowser.Providers/Music/LastfmArtistProvider.cs index 7aceff41ad..7246bbe177 100644 --- a/MediaBrowser.Providers/Music/LastfmArtistProvider.cs +++ b/MediaBrowser.Providers/Music/LastfmArtistProvider.cs @@ -42,7 +42,7 @@ namespace MediaBrowser.Providers.Music { var result = new MetadataResult(); - var musicBrainzId = id.GetArtistId(); + var musicBrainzId = id.GetMusicBrainzArtistId(); if (!String.IsNullOrWhiteSpace(musicBrainzId)) { @@ -161,7 +161,11 @@ namespace MediaBrowser.Providers.Music public int Order { - get { return 1; } + get + { + // After fanart & audiodb + return 2; + } } } } diff --git a/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs b/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs index 2fbcf64ca5..1a3860dab6 100644 --- a/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs +++ b/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs @@ -39,7 +39,7 @@ namespace MediaBrowser.Providers.Music if (string.IsNullOrEmpty(releaseId)) { - var artistMusicBrainzId = id.GetArtistId(); + var artistMusicBrainzId = id.GetMusicBrainzArtistId(); var releaseResult = await GetReleaseResult(artistMusicBrainzId, id.GetAlbumArtist(), id.Name, cancellationToken).ConfigureAwait(false); diff --git a/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs b/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs index 52a5981714..3c45a7a488 100644 --- a/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs +++ b/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs @@ -18,7 +18,7 @@ namespace MediaBrowser.Providers.Music { var result = new MetadataResult(); - var musicBrainzId = id.GetArtistId() ?? await FindId(id, cancellationToken).ConfigureAwait(false); + var musicBrainzId = id.GetMusicBrainzArtistId() ?? await FindId(id, cancellationToken).ConfigureAwait(false); if (!string.IsNullOrWhiteSpace(musicBrainzId)) { diff --git a/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs b/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs index 0901860f16..3acfd42b68 100644 --- a/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs @@ -169,12 +169,20 @@ namespace MediaBrowser.Providers.TV } if (ids.tvrage_id > 0) { - series.SetProviderId(MetadataProviders.TvRageSeries, ids.tvrage_id.ToString(_usCulture)); + series.SetProviderId(MetadataProviders.TvRage, ids.tvrage_id.ToString(_usCulture)); } if (ids.tvdb_id > 0) { series.SetProviderId(MetadataProviders.Tvdb, ids.tvdb_id.ToString(_usCulture)); } + if (!string.IsNullOrWhiteSpace(ids.freebase_id)) + { + series.SetProviderId(MetadataProviders.Freebase, ids.freebase_id); + } + if (!string.IsNullOrWhiteSpace(ids.freebase_mid)) + { + series.SetProviderId(MetadataProviders.FreebaseMachine, ids.freebase_mid); + } } } diff --git a/MediaBrowser.Providers/TV/SeriesMetadataService.cs b/MediaBrowser.Providers/TV/SeriesMetadataService.cs index 76c66ea361..bc9f543cf6 100644 --- a/MediaBrowser.Providers/TV/SeriesMetadataService.cs +++ b/MediaBrowser.Providers/TV/SeriesMetadataService.cs @@ -13,7 +13,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.TV { - public class SeriesMetadataService : MetadataService + public class SeriesMetadataService : MetadataService { private readonly ILibraryManager _libraryManager; diff --git a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs index 68d05012f0..528661680b 100644 --- a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs +++ b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs @@ -176,7 +176,7 @@ namespace MediaBrowser.Providers.TV { }, cancellationToken).ConfigureAwait(false); - await series.ValidateChildren(new Progress(), cancellationToken, true) + await series.ValidateChildren(new Progress(), cancellationToken, new MetadataRefreshOptions(), true) .ConfigureAwait(false); } } diff --git a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs index 80c50e9589..73fd4e4984 100644 --- a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs @@ -158,33 +158,24 @@ namespace MediaBrowser.Providers.TV var automaticUpdatesEnabled = _config.Configuration.EnableTvDbUpdates; var seriesFile = files.FirstOrDefault(i => string.Equals(seriesXmlFilename, i.Name, StringComparison.OrdinalIgnoreCase)); - if (seriesFile == null || !seriesFile.Exists) + // No need to check age if automatic updates are enabled + if (seriesFile == null || !seriesFile.Exists || (!automaticUpdatesEnabled && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(seriesFile)).TotalDays > 7)) { - // No need to check age if automatic updates are enabled - if (!automaticUpdatesEnabled && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(seriesFile)).TotalDays > 7) - { - download = true; - } + download = true; } var actorsXml = files.FirstOrDefault(i => string.Equals("actors.xml", i.Name, StringComparison.OrdinalIgnoreCase)); - if (actorsXml == null || !actorsXml.Exists) + // No need to check age if automatic updates are enabled + if (actorsXml == null || !actorsXml.Exists || (!automaticUpdatesEnabled && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(actorsXml)).TotalDays > 7)) { - // No need to check age if automatic updates are enabled - if (!automaticUpdatesEnabled && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(actorsXml)).TotalDays > 7) - { - download = true; - } + download = true; } var bannersXml = files.FirstOrDefault(i => string.Equals("banners.xml", i.Name, StringComparison.OrdinalIgnoreCase)); - if (bannersXml == null || !bannersXml.Exists) + // No need to check age if automatic updates are enabled + if (bannersXml == null || !bannersXml.Exists || (!automaticUpdatesEnabled && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(bannersXml)).TotalDays > 7)) { - // No need to check age if automatic updates are enabled - if (!automaticUpdatesEnabled && (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(bannersXml)).TotalDays > 7) - { - download = true; - } + download = true; } // Only download if not already there diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 6428c4a3ca..49b2ad5621 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -955,7 +955,7 @@ namespace MediaBrowser.Server.Implementations.Library progress.Report(.5); // Start by just validating the children of the root, but go no further - await RootFolder.ValidateChildren(new Progress(), cancellationToken, recursive: false); + await RootFolder.ValidateChildren(new Progress(), cancellationToken, new MetadataRefreshOptions(), recursive: false); progress.Report(1); @@ -980,7 +980,7 @@ namespace MediaBrowser.Server.Implementations.Library innerProgress.RegisterAction(pct => progress.Report(15 + pct * .6)); // Now validate the entire media library - await RootFolder.ValidateChildren(innerProgress, cancellationToken, recursive: true).ConfigureAwait(false); + await RootFolder.ValidateChildren(innerProgress, cancellationToken, new MetadataRefreshOptions(), recursive: true).ConfigureAwait(false); progress.Report(75); @@ -1109,7 +1109,7 @@ namespace MediaBrowser.Server.Implementations.Library cancellationToken.ThrowIfCancellationRequested(); - await userRootFolder.ValidateChildren(new Progress(), cancellationToken, recursive: false).ConfigureAwait(false); + await userRootFolder.ValidateChildren(new Progress(), cancellationToken, new MetadataRefreshOptions(), recursive: false).ConfigureAwait(false); } ///