From 062d2dc29f9387ba437e92bf797793adc6f71e21 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 6 Sep 2013 11:38:22 -0400 Subject: fixes #522 - Use last fm as a secondary provider for album images --- .../Entities/Audio/MusicAlbum.cs | 2 + .../MediaBrowser.Providers.csproj | 2 +- .../Music/LastFmArtistImageProvider.cs | 120 ------------------- .../Music/LastFmImageProvider.cs | 127 +++++++++++++++++++++ .../Music/LastfmAlbumProvider.cs | 13 ++- MediaBrowser.Providers/Music/LastfmBaseProvider.cs | 10 +- MediaBrowser.Providers/Music/LastfmHelper.cs | 10 +- 7 files changed, 157 insertions(+), 127 deletions(-) delete mode 100644 MediaBrowser.Providers/Music/LastFmArtistImageProvider.cs create mode 100644 MediaBrowser.Providers/Music/LastFmImageProvider.cs diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs index 3cb2b51fe1..7bfbbaf194 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs @@ -8,6 +8,8 @@ namespace MediaBrowser.Controller.Entities.Audio /// public class MusicAlbum : Folder { + public string LastFmImageUrl { get; set; } + /// /// Songs will group into us so don't also include us in the index /// diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index c49424f65e..ef86566701 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -77,7 +77,7 @@ - + diff --git a/MediaBrowser.Providers/Music/LastFmArtistImageProvider.cs b/MediaBrowser.Providers/Music/LastFmArtistImageProvider.cs deleted file mode 100644 index b5fb160c3f..0000000000 --- a/MediaBrowser.Providers/Music/LastFmArtistImageProvider.cs +++ /dev/null @@ -1,120 +0,0 @@ -using MediaBrowser.Controller.Configuration; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Entities.Audio; -using MediaBrowser.Controller.Providers; -using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Logging; -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Providers.Music -{ - /// - /// Class LastFmArtistImageProvider - /// - public class LastFmArtistImageProvider : BaseMetadataProvider - { - /// - /// The _provider manager - /// - private readonly IProviderManager _providerManager; - - /// - /// Initializes a new instance of the class. - /// - /// The log manager. - /// The configuration manager. - /// The provider manager. - public LastFmArtistImageProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) : - base(logManager, configurationManager) - { - _providerManager = providerManager; - } - - /// - /// Supportses the specified item. - /// - /// The item. - /// true if XXXX, false otherwise - public override bool Supports(BaseItem item) - { - return item is Artist || item is MusicArtist; - } - - /// - /// Needses the refresh internal. - /// - /// The item. - /// The provider info. - /// true if XXXX, false otherwise - protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) - { - if (item.HasImage(ImageType.Primary)) - { - return false; - } - - if (string.IsNullOrWhiteSpace(GetImageUrl(item))) - { - return false; - } - - return base.NeedsRefreshInternal(item, providerInfo); - } - - /// - /// Fetches metadata and returns true or false indicating if any work that requires persistence was done - /// - /// The item. - /// if set to true [force]. - /// The cancellation token. - /// Task{System.Boolean}. - public override async Task FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) - { - var url = GetImageUrl(item); - - if (!string.IsNullOrWhiteSpace(url)) - { - await _providerManager.SaveImage(item, url, LastfmBaseProvider.LastfmResourcePool, ImageType.Primary, null, cancellationToken) - .ConfigureAwait(false); - } - - SetLastRefreshed(item, DateTime.UtcNow); - return true; - } - - /// - /// Gets the priority. - /// - /// The priority. - public override MetadataProviderPriority Priority - { - get { return MetadataProviderPriority.Fifth; } - } - - /// - /// Gets the image URL. - /// - /// The item. - /// System.String. - private string GetImageUrl(BaseItem item) - { - var musicArtist = item as MusicArtist; - - if (musicArtist != null) - { - return musicArtist.LastFmImageUrl; - } - - var artistByName = item as Artist; - - if (artistByName != null) - { - return artistByName.LastFmImageUrl; - } - - return null; - } - } -} diff --git a/MediaBrowser.Providers/Music/LastFmImageProvider.cs b/MediaBrowser.Providers/Music/LastFmImageProvider.cs new file mode 100644 index 0000000000..9ebad8b385 --- /dev/null +++ b/MediaBrowser.Providers/Music/LastFmImageProvider.cs @@ -0,0 +1,127 @@ +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Providers.Music +{ + /// + /// Class LastFmArtistImageProvider + /// + public class LastFmImageProvider : BaseMetadataProvider + { + /// + /// The _provider manager + /// + private readonly IProviderManager _providerManager; + + /// + /// Initializes a new instance of the class. + /// + /// The log manager. + /// The configuration manager. + /// The provider manager. + public LastFmImageProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) : + base(logManager, configurationManager) + { + _providerManager = providerManager; + } + + /// + /// Supportses the specified item. + /// + /// The item. + /// true if XXXX, false otherwise + public override bool Supports(BaseItem item) + { + return item is Artist || item is MusicArtist || item is MusicAlbum; + } + + /// + /// Needses the refresh internal. + /// + /// The item. + /// The provider info. + /// true if XXXX, false otherwise + protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) + { + if (item.HasImage(ImageType.Primary)) + { + return false; + } + + if (string.IsNullOrWhiteSpace(GetImageUrl(item))) + { + return false; + } + + return base.NeedsRefreshInternal(item, providerInfo); + } + + /// + /// Fetches metadata and returns true or false indicating if any work that requires persistence was done + /// + /// The item. + /// if set to true [force]. + /// The cancellation token. + /// Task{System.Boolean}. + public override async Task FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) + { + var url = GetImageUrl(item); + + if (!string.IsNullOrWhiteSpace(url)) + { + await _providerManager.SaveImage(item, url, LastfmBaseProvider.LastfmResourcePool, ImageType.Primary, null, cancellationToken) + .ConfigureAwait(false); + } + + SetLastRefreshed(item, DateTime.UtcNow); + return true; + } + + /// + /// Gets the priority. + /// + /// The priority. + public override MetadataProviderPriority Priority + { + get { return MetadataProviderPriority.Fifth; } + } + + /// + /// Gets the image URL. + /// + /// The item. + /// System.String. + private string GetImageUrl(BaseItem item) + { + var musicArtist = item as MusicArtist; + + if (musicArtist != null) + { + return musicArtist.LastFmImageUrl; + } + + var artistByName = item as Artist; + + if (artistByName != null) + { + return artistByName.LastFmImageUrl; + } + + var album = item as MusicAlbum; + + if (album != null) + { + return album.LastFmImageUrl; + } + + return null; + } + } +} diff --git a/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs b/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs index 275b3c0aff..9ed1ee333c 100644 --- a/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs +++ b/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Extensions; +using System.IO; +using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; @@ -143,7 +144,15 @@ namespace MediaBrowser.Providers.Music }).ConfigureAwait(false)) { - return JsonSerializer.DeserializeFromStream(json); + using (var reader = new StreamReader(json)) + { + var jsonText = await reader.ReadToEndAsync().ConfigureAwait(false); + + // Fix their bad json + jsonText = jsonText.Replace("\"#text\"", "\"url\""); + + return JsonSerializer.DeserializeFromString(jsonText); + } } } diff --git a/MediaBrowser.Providers/Music/LastfmBaseProvider.cs b/MediaBrowser.Providers/Music/LastfmBaseProvider.cs index 36099509dd..82fc2e2412 100644 --- a/MediaBrowser.Providers/Music/LastfmBaseProvider.cs +++ b/MediaBrowser.Providers/Music/LastfmBaseProvider.cs @@ -193,7 +193,7 @@ namespace MediaBrowser.Providers.Music public string size { get; set; } } - public class LastfmArtist + public class LastfmArtist : IHasLastFmImages { public string name { get; set; } public string mbid { get; set; } @@ -208,7 +208,7 @@ namespace MediaBrowser.Providers.Music } - public class LastfmAlbum + public class LastfmAlbum : IHasLastFmImages { public string name { get; set; } public string artist { get; set; } @@ -219,6 +219,12 @@ namespace MediaBrowser.Providers.Music public int playcount { get; set; } public LastfmTags toptags { get; set; } public LastFmBio wiki { get; set; } + public List image { get; set; } + } + + public interface IHasLastFmImages + { + List image { get; set; } } public class LastfmGetAlbumResult diff --git a/MediaBrowser.Providers/Music/LastfmHelper.cs b/MediaBrowser.Providers/Music/LastfmHelper.cs index a955ecbd57..f48874350e 100644 --- a/MediaBrowser.Providers/Music/LastfmHelper.cs +++ b/MediaBrowser.Providers/Music/LastfmHelper.cs @@ -47,14 +47,17 @@ namespace MediaBrowser.Providers.Music } } - private static string GetImageUrl(LastfmArtist data) + private static string GetImageUrl(IHasLastFmImages data) { if (data.image == null) { return null; } - var img = data.image.FirstOrDefault(i => string.Equals(i.size, "extralarge", StringComparison.OrdinalIgnoreCase)) ?? + var img = data.image + .Where(i => !string.IsNullOrWhiteSpace(i.url)) + .FirstOrDefault(i => string.Equals(i.size, "mega", StringComparison.OrdinalIgnoreCase)) ?? + data.image.FirstOrDefault(i => string.Equals(i.size, "extralarge", StringComparison.OrdinalIgnoreCase)) ?? data.image.FirstOrDefault(i => string.Equals(i.size, "large", StringComparison.OrdinalIgnoreCase)) ?? data.image.FirstOrDefault(i => string.Equals(i.size, "medium", StringComparison.OrdinalIgnoreCase)) ?? data.image.FirstOrDefault(); @@ -99,6 +102,9 @@ namespace MediaBrowser.Providers.Music { AddTags(item, data.toptags); } + + var album = (MusicAlbum)item; + album.LastFmImageUrl = GetImageUrl(data); } private static void AddTags(BaseItem item, LastfmTags tags) -- cgit v1.2.3