diff --git a/MediaBrowser.Controller/Providers/Music/FanArtAlbumProvider.cs b/MediaBrowser.Controller/Providers/Music/FanArtAlbumProvider.cs index 9f3befae4f..b9a5cd06df 100644 --- a/MediaBrowser.Controller/Providers/Music/FanArtAlbumProvider.cs +++ b/MediaBrowser.Controller/Providers/Music/FanArtAlbumProvider.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; @@ -82,7 +83,7 @@ namespace MediaBrowser.Controller.Providers.Music { get { - return "12"; + return "16"; } } @@ -105,9 +106,24 @@ namespace MediaBrowser.Controller.Providers.Music return false; } + // Refresh anytime the parent mbz id changes + if (providerInfo.Data != GetComparisonData(item.Parent.GetProviderId(MetadataProviders.Musicbrainz))) + { + return true; + } + return base.NeedsRefreshInternal(item, providerInfo); } + /// + /// Gets the comparison data. + /// + /// Guid. + private Guid GetComparisonData(string id) + { + return string.IsNullOrEmpty(id) ? Guid.Empty : id.GetMD5(); + } + /// /// Fetches metadata and returns true or false indicating if any work that requires persistence was done /// @@ -119,67 +135,69 @@ namespace MediaBrowser.Controller.Providers.Music { cancellationToken.ThrowIfCancellationRequested(); - var album = (MusicAlbum)item; + var artistMusicBrainzId = item.Parent.GetProviderId(MetadataProviders.Musicbrainz); - if (string.IsNullOrEmpty(album.MusicBrainzReleaseGroupId)) + BaseProviderInfo data; + + if (!item.ProviderData.TryGetValue(Id, out data)) { - album.MusicBrainzReleaseGroupId = await GetReleaseGroupId(item.GetProviderId(MetadataProviders.Musicbrainz), cancellationToken).ConfigureAwait(false); + data = new BaseProviderInfo(); + item.ProviderData[Id] = data; } - // If still empty there's nothing more we can do - if (string.IsNullOrEmpty(album.MusicBrainzReleaseGroupId)) + if (!string.IsNullOrEmpty(artistMusicBrainzId)) { - SetLastRefreshed(item, DateTime.UtcNow); + var album = (MusicAlbum)item; - return true; - } + if (string.IsNullOrEmpty(album.MusicBrainzReleaseGroupId)) + { + album.MusicBrainzReleaseGroupId = await GetReleaseGroupId(item.GetProviderId(MetadataProviders.Musicbrainz), cancellationToken).ConfigureAwait(false); + } - var url = string.Format("http://api.fanart.tv/webservice/album/{0}/{1}/xml/all/1/1", ApiKey, album.MusicBrainzReleaseGroupId); + // If still empty there's nothing more we can do + if (!string.IsNullOrEmpty(album.MusicBrainzReleaseGroupId)) + { + var artistXmlPath = FanArtArtistProvider.GetArtistDataPath(ConfigurationManager.CommonApplicationPaths, artistMusicBrainzId); + artistXmlPath = Path.Combine(artistXmlPath, "fanart.xml"); - var doc = new XmlDocument(); + var artistXmlFileInfo = new FileInfo(artistXmlPath); - using (var xml = await HttpClient.Get(new HttpRequestOptions - { - Url = url, - ResourcePool = FanArtResourcePool, - CancellationToken = cancellationToken + if (artistXmlFileInfo.Exists) + { + var doc = new XmlDocument(); - }).ConfigureAwait(false)) - { - doc.Load(xml); - } + doc.Load(artistXmlPath); - cancellationToken.ThrowIfCancellationRequested(); + cancellationToken.ThrowIfCancellationRequested(); - if (doc.HasChildNodes) - { - if (ConfigurationManager.Configuration.DownloadMusicAlbumImages.Disc && !item.HasImage(ImageType.Disc)) - { - var node = doc.SelectSingleNode("//fanart/music/albums/album/cdart/@url"); + if (ConfigurationManager.Configuration.DownloadMusicAlbumImages.Disc && !item.HasImage(ImageType.Disc)) + { + var node = doc.SelectSingleNode("//fanart/music/albums/album[@id=\"" + album.MusicBrainzReleaseGroupId + "\"]/cdart/@url"); - var path = node != null ? node.Value : null; + var path = node != null ? node.Value : null; - if (!string.IsNullOrEmpty(path)) - { - Logger.Debug("FanArtProvider getting Disc for " + item.Name); - item.SetImage(ImageType.Disc, await _providerManager.DownloadAndSaveImage(item, path, DiscFile, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false)); - } - } + if (!string.IsNullOrEmpty(path)) + { + item.SetImage(ImageType.Disc, await _providerManager.DownloadAndSaveImage(item, path, DiscFile, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false)); + } + } - if (ConfigurationManager.Configuration.DownloadMusicAlbumImages.Primary && !item.HasImage(ImageType.Primary)) - { - var node = doc.SelectSingleNode("//fanart/music/albums/album/albumcover/@url"); + if (ConfigurationManager.Configuration.DownloadMusicAlbumImages.Primary && !item.HasImage(ImageType.Primary)) + { + var node = doc.SelectSingleNode("//fanart/music/albums/album[@id=\"" + album.MusicBrainzReleaseGroupId + "\"]/albumcover/@url"); - var path = node != null ? node.Value : null; + var path = node != null ? node.Value : null; - if (!string.IsNullOrEmpty(path)) - { - Logger.Debug("FanArtProvider getting albumcover for " + item.Name); - item.SetImage(ImageType.Primary, await _providerManager.DownloadAndSaveImage(item, path, PrimaryFile, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false)); + if (!string.IsNullOrEmpty(path)) + { + item.SetImage(ImageType.Primary, await _providerManager.DownloadAndSaveImage(item, path, PrimaryFile, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false)); + } + } } } } + data.Data = GetComparisonData(artistMusicBrainzId); SetLastRefreshed(item, DateTime.UtcNow); return true; diff --git a/MediaBrowser.Controller/Providers/Music/FanArtArtistProvider.cs b/MediaBrowser.Controller/Providers/Music/FanArtArtistProvider.cs index 02f531cb0f..22075a08a2 100644 --- a/MediaBrowser.Controller/Providers/Music/FanArtArtistProvider.cs +++ b/MediaBrowser.Controller/Providers/Music/FanArtArtistProvider.cs @@ -1,4 +1,8 @@ -using MediaBrowser.Common.Net; +using System.IO; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; @@ -69,7 +73,7 @@ namespace MediaBrowser.Controller.Providers.Music { get { - return "4"; + return "5"; } } @@ -99,6 +103,41 @@ namespace MediaBrowser.Controller.Providers.Music } protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); + + /// + /// Gets the series data path. + /// + /// The app paths. + /// The music brainz artist id. + /// System.String. + internal static string GetArtistDataPath(IApplicationPaths appPaths, string musicBrainzArtistId) + { + var seriesDataPath = Path.Combine(GetArtistDataPath(appPaths), musicBrainzArtistId); + + if (!Directory.Exists(seriesDataPath)) + { + Directory.CreateDirectory(seriesDataPath); + } + + return seriesDataPath; + } + + /// + /// Gets the series data path. + /// + /// The app paths. + /// System.String. + internal static string GetArtistDataPath(IApplicationPaths appPaths) + { + var dataPath = Path.Combine(appPaths.DataPath, "fanart-music"); + + if (!Directory.Exists(dataPath)) + { + Directory.CreateDirectory(dataPath); + } + + return dataPath; + } /// /// Fetches metadata and returns true or false indicating if any work that requires persistence was done @@ -113,12 +152,14 @@ namespace MediaBrowser.Controller.Providers.Music //var artist = item; - var url = string.Format(FanArtBaseUrl, ApiKey, item.GetProviderId(MetadataProviders.Musicbrainz)); - var doc = new XmlDocument(); + var musicBrainzId = item.GetProviderId(MetadataProviders.Musicbrainz); + var url = string.Format(FanArtBaseUrl, ApiKey, musicBrainzId); var status = ProviderRefreshStatus.Success; + + var xmlPath = Path.Combine(GetArtistDataPath(ConfigurationManager.ApplicationPaths, musicBrainzId), "fanart.xml"); - using (var xml = await HttpClient.Get(new HttpRequestOptions + using (var response = await HttpClient.Get(new HttpRequestOptions { Url = url, ResourcePool = FanArtResourcePool, @@ -126,16 +167,22 @@ namespace MediaBrowser.Controller.Providers.Music }).ConfigureAwait(false)) { - doc.Load(xml); + using (var xmlFileStream = new FileStream(xmlPath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) + { + await response.CopyToAsync(xmlFileStream).ConfigureAwait(false); + } } + var doc = new XmlDocument(); + doc.Load(xmlPath); + cancellationToken.ThrowIfCancellationRequested(); if (doc.HasChildNodes) { string path; var hd = ConfigurationManager.Configuration.DownloadHDFanArt ? "hd" : ""; - if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Logo && !item.ResolveArgs.ContainsMetaFileByName(LogoFile)) + if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Logo && !item.HasImage(ImageType.Logo)) { var node = doc.SelectSingleNode("//fanart/music/musiclogos/" + hd + "musiclogo/@url") ?? @@ -149,7 +196,7 @@ namespace MediaBrowser.Controller.Providers.Music } cancellationToken.ThrowIfCancellationRequested(); - if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Backdrops && !item.ResolveArgs.ContainsMetaFileByName(BackdropFile)) + if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Backdrops && item.BackdropImagePaths.Count == 0) { var nodes = doc.SelectNodes("//fanart/music/artistbackgrounds//@url"); if (nodes != null)