From 67fde8c16d5a238c2d18a4c0b1795f17d38191df Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 31 Jan 2014 14:55:21 -0500 Subject: [PATCH] convert album providers --- .../Entities/Audio/MusicAlbum.cs | 3 - .../MediaBrowser.Controller.csproj | 2 + .../Providers/IImageProvider.cs | 6 - .../Providers/ILocalMetadataProvider.cs | 27 + .../Providers/IMetadataProvider.cs | 33 +- .../Providers/IMetadataService.cs | 3 +- .../Providers/IProviderManager.cs | 4 +- .../Providers/IRemoteMetadataProvider.cs | 21 + MediaBrowser.Controller/Providers/ItemId.cs | 14 + .../All/LocalImageProvider.cs | 4 +- .../BoxSets/BoxSetMetadataService.cs | 2 +- .../BoxSets/MovieDbBoxSetImageProvider.cs | 2 +- .../GameGenres/GameGenreMetadataService.cs | 2 +- .../Genres/GenreMetadataService.cs | 2 +- .../LiveTv/ChannelMetadataService.cs | 2 +- .../LiveTv/ProgramMetadataService.cs | 2 +- .../Manager/ConcreteMetadataService.cs | 5 +- .../Manager/ItemImageProvider.cs | 37 +- .../Manager/MetadataService.cs | 79 +-- .../Manager/ProviderManager.cs | 107 +++- .../MediaBrowser.Providers.csproj | 19 +- .../Movies/FanArtMovieProvider.cs | 8 +- .../Movies/FanArtMovieUpdatesPrescanTask.cs | 10 +- .../Movies/ManualFanartMovieImageProvider.cs | 8 +- .../Movies/ManualMovieDbImageProvider.cs | 2 +- .../Music/AlbumInfoFromSongProvider.cs | 154 ------ .../Music/AlbumMetadataService.cs | 188 +++++++ .../Music/AlbumProviderFromXml.cs | 92 ---- .../Music/AlbumXmlProvider.cs | 59 +++ .../Music/ArtistMetadataService.cs | 6 +- .../Music/FanArtAlbumProvider.cs | 473 ++++++++++++------ .../Music/FanArtArtistProvider.cs | 2 +- .../Music/FanArtUpdatesPrescanTask.cs | 4 +- .../Music/LastFmImageProvider.cs | 192 ++++--- .../Music/LastfmAlbumProvider.cs | 315 +++++++----- .../Music/LastfmArtistProvider.cs | 28 +- .../Music/LastfmBaseProvider.cs | 194 ------- MediaBrowser.Providers/Music/LastfmHelper.cs | 50 +- .../Music/ManualFanartAlbumProvider.cs | 354 ------------- .../Music/ManualLastFmImageProvider.cs | 150 ------ .../Music/MusicBrainzAlbumProvider.cs | 65 ++- .../MusicGenres/MusicGenreMetadataService.cs | 2 +- .../People/MovieDbPersonImageProvider.cs | 2 +- .../People/PersonMetadataService.cs | 2 +- .../People/TvdbPersonImageProvider.cs | 2 +- .../Studios/StudioMetadataService.cs | 2 +- .../TV/FanArtTvUpdatesPrescanTask.cs | 2 +- .../TV/ManualFanartSeasonProvider.cs | 2 +- .../TV/ManualFanartSeriesProvider.cs | 2 +- .../TV/ManualTvdbSeasonImageProvider.cs | 2 +- .../TV/ManualTvdbSeriesImageProvider.cs | 2 +- .../Users/UserMetadataService.cs | 2 +- 52 files changed, 1181 insertions(+), 1571 deletions(-) create mode 100644 MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs create mode 100644 MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs delete mode 100644 MediaBrowser.Providers/Music/AlbumInfoFromSongProvider.cs create mode 100644 MediaBrowser.Providers/Music/AlbumMetadataService.cs delete mode 100644 MediaBrowser.Providers/Music/AlbumProviderFromXml.cs create mode 100644 MediaBrowser.Providers/Music/AlbumXmlProvider.cs delete mode 100644 MediaBrowser.Providers/Music/LastfmBaseProvider.cs delete mode 100644 MediaBrowser.Providers/Music/ManualFanartAlbumProvider.cs delete mode 100644 MediaBrowser.Providers/Music/ManualLastFmImageProvider.cs diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs index 203e6dc431..b3bf0d2b66 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs @@ -21,9 +21,6 @@ namespace MediaBrowser.Controller.Entities.Audio Tags = new List(); } - public string LastFmImageUrl { get; set; } - public string LastFmImageSize { get; set; } - /// /// Gets or sets the tags. /// diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index ee8bb27619..b05f14a13d 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -146,11 +146,13 @@ + + diff --git a/MediaBrowser.Controller/Providers/IImageProvider.cs b/MediaBrowser.Controller/Providers/IImageProvider.cs index 61f5579f4b..1e5bdfeafc 100644 --- a/MediaBrowser.Controller/Providers/IImageProvider.cs +++ b/MediaBrowser.Controller/Providers/IImageProvider.cs @@ -19,11 +19,5 @@ namespace MediaBrowser.Controller.Providers /// The item. /// true if XXXX, false otherwise bool Supports(IHasImages item); - - /// - /// Gets the order. - /// - /// The order. - int Order { get; } } } diff --git a/MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs b/MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs new file mode 100644 index 0000000000..62b208b59b --- /dev/null +++ b/MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs @@ -0,0 +1,27 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Providers +{ + public interface ILocalMetadataProvider : IMetadataProvider + { + /// + /// Determines whether [has local metadata] [the specified item]. + /// + /// The item. + /// true if [has local metadata] [the specified item]; otherwise, false. + bool HasLocalMetadata(IHasMetadata item); + } + + public interface ILocalMetadataProvider : IMetadataProvider, ILocalMetadataProvider + where TItemType : IHasMetadata + { + /// + /// Gets the metadata. + /// + /// The path. + /// The cancellation token. + /// Task{MetadataResult{`0}}. + Task> GetMetadata(string path, CancellationToken cancellationToken); + } +} diff --git a/MediaBrowser.Controller/Providers/IMetadataProvider.cs b/MediaBrowser.Controller/Providers/IMetadataProvider.cs index 843ba263bc..123e806ed5 100644 --- a/MediaBrowser.Controller/Providers/IMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/IMetadataProvider.cs @@ -1,6 +1,4 @@ using System; -using System.Threading; -using System.Threading.Tasks; namespace MediaBrowser.Controller.Providers { @@ -20,32 +18,6 @@ namespace MediaBrowser.Controller.Providers where TItemType : IHasMetadata { } - - public interface ILocalMetadataProvider : IMetadataProvider - { - /// - /// Determines whether [has local metadata] [the specified item]. - /// - /// The item. - /// true if [has local metadata] [the specified item]; otherwise, false. - bool HasLocalMetadata(IHasMetadata item); - } - - public interface IRemoteMetadataProvider : IMetadataProvider - { - } - - public interface IRemoteMetadataProvider : IMetadataProvider, IRemoteMetadataProvider - where TItemType : IHasMetadata - { - Task> GetMetadata(ItemId id, CancellationToken cancellationToken); - } - - public interface ILocalMetadataProvider : IMetadataProvider, ILocalMetadataProvider - where TItemType : IHasMetadata - { - Task> GetMetadata(string path, CancellationToken cancellationToken); - } public interface IHasChangeMonitor { @@ -58,6 +30,11 @@ namespace MediaBrowser.Controller.Providers bool HasChanged(IHasMetadata item, DateTime date); } + public interface IHasOrder + { + int Order { get; } + } + public class MetadataResult where T : IHasMetadata { diff --git a/MediaBrowser.Controller/Providers/IMetadataService.cs b/MediaBrowser.Controller/Providers/IMetadataService.cs index c6cc2b716e..e9ce320ab4 100644 --- a/MediaBrowser.Controller/Providers/IMetadataService.cs +++ b/MediaBrowser.Controller/Providers/IMetadataService.cs @@ -10,8 +10,7 @@ namespace MediaBrowser.Controller.Providers /// Adds the parts. /// /// The providers. - /// The image providers. - void AddParts(IEnumerable providers, IEnumerable imageProviders); + void AddParts(IEnumerable providers); /// /// Determines whether this instance can refresh the specified item. diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index dc57552c44..0159f778ff 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -74,13 +74,13 @@ namespace MediaBrowser.Controller.Providers /// Name of the provider. /// The type. /// Task{IEnumerable{RemoteImageInfo}}. - Task> GetAvailableRemoteImages(BaseItem item, CancellationToken cancellationToken, string providerName = null, ImageType? type = null); + Task> GetAvailableRemoteImages(IHasImages item, CancellationToken cancellationToken, string providerName = null, ImageType? type = null); /// /// Gets the image providers. /// /// The item. /// IEnumerable{ImageProviderInfo}. - IEnumerable GetImageProviderInfo(BaseItem item); + IEnumerable GetImageProviderInfo(IHasImages item); } } \ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs b/MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs new file mode 100644 index 0000000000..6007a5af60 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs @@ -0,0 +1,21 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Providers +{ + public interface IRemoteMetadataProvider : IMetadataProvider + { + } + + public interface IRemoteMetadataProvider : IMetadataProvider, IRemoteMetadataProvider + where TItemType : IHasMetadata + { + /// + /// Gets the metadata. + /// + /// The identifier. + /// The cancellation token. + /// Task{MetadataResult{`0}}. + Task> GetMetadata(ItemId id, CancellationToken cancellationToken); + } +} diff --git a/MediaBrowser.Controller/Providers/ItemId.cs b/MediaBrowser.Controller/Providers/ItemId.cs index b3fe5bee53..3abb64bfb2 100644 --- a/MediaBrowser.Controller/Providers/ItemId.cs +++ b/MediaBrowser.Controller/Providers/ItemId.cs @@ -37,4 +37,18 @@ namespace MediaBrowser.Controller.Providers ProviderIds = new Dictionary(StringComparer.OrdinalIgnoreCase); } } + + public class AlbumId : ItemId + { + /// + /// Gets or sets the album artist. + /// + /// The album artist. + public string AlbumArtist { get; set; } + /// + /// Gets or sets the artist music brainz identifier. + /// + /// The artist music brainz identifier. + public string ArtistMusicBrainzId { get; set; } + } } diff --git a/MediaBrowser.Providers/All/LocalImageProvider.cs b/MediaBrowser.Providers/All/LocalImageProvider.cs index 88a68bc155..089cfe549c 100644 --- a/MediaBrowser.Providers/All/LocalImageProvider.cs +++ b/MediaBrowser.Providers/All/LocalImageProvider.cs @@ -1,5 +1,6 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Providers; @@ -38,13 +39,14 @@ namespace MediaBrowser.Providers.All if (locationType == LocationType.FileSystem) { // Episode has it's own provider - if (item is Episode) + if (item is Episode || item is Audio) { return false; } return true; } + if (locationType == LocationType.Virtual) { var season = item as Season; diff --git a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs index b9b4e40d7a..53ab3614d3 100644 --- a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs +++ b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs @@ -15,7 +15,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.BoxSets { - public class BoxSetMetadataService : ConcreteMetadataService + public class BoxSetMetadataService : ConcreteMetadataService { private readonly ILibraryManager _libraryManager; private readonly ILocalizationManager _iLocalizationManager; diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs index 2e75a66cb9..b7672a6a71 100644 --- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs +++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs @@ -14,7 +14,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.BoxSets { - class MovieDbBoxSetImageProvider : IRemoteImageProvider + class MovieDbBoxSetImageProvider : IRemoteImageProvider, IHasOrder { private readonly IHttpClient _httpClient; diff --git a/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs b/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs index 94209c309c..1eefb07988 100644 --- a/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs +++ b/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.GameGenres { - public class GameGenreMetadataService : ConcreteMetadataService + public class GameGenreMetadataService : ConcreteMetadataService { private readonly ILibraryManager _libraryManager; diff --git a/MediaBrowser.Providers/Genres/GenreMetadataService.cs b/MediaBrowser.Providers/Genres/GenreMetadataService.cs index 21addc3908..fa4a4c955f 100644 --- a/MediaBrowser.Providers/Genres/GenreMetadataService.cs +++ b/MediaBrowser.Providers/Genres/GenreMetadataService.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Genres { - public class GenreMetadataService : ConcreteMetadataService + public class GenreMetadataService : ConcreteMetadataService { private readonly ILibraryManager _libraryManager; diff --git a/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs b/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs index 0678943371..5c476c89dd 100644 --- a/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs +++ b/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.LiveTv { - public class ChannelMetadataService : ConcreteMetadataService + public class ChannelMetadataService : ConcreteMetadataService { private readonly ILibraryManager _libraryManager; diff --git a/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs b/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs index 6f08b199a5..0a22daf2f1 100644 --- a/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs +++ b/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.LiveTv { - public class ProgramMetadataService : ConcreteMetadataService + public class ProgramMetadataService : ConcreteMetadataService { private readonly ILibraryManager _libraryManager; diff --git a/MediaBrowser.Providers/Manager/ConcreteMetadataService.cs b/MediaBrowser.Providers/Manager/ConcreteMetadataService.cs index 3a4bc06ca5..f3644581e3 100644 --- a/MediaBrowser.Providers/Manager/ConcreteMetadataService.cs +++ b/MediaBrowser.Providers/Manager/ConcreteMetadataService.cs @@ -4,8 +4,9 @@ using MediaBrowser.Model.Logging; namespace MediaBrowser.Providers.Manager { - public abstract class ConcreteMetadataService : MetadataService - where TItemType : IHasMetadata, new() + public abstract class ConcreteMetadataService : MetadataService + where TItemType : IHasMetadata, new() + where TIdType : ItemId, new() { protected ConcreteMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo) : base(serverConfigurationManager, logger, providerManager, providerRepo) diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index e8bae1d2fa..7f0dc8b89d 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -1,4 +1,6 @@ -using MediaBrowser.Common.Extensions; +using System.IO; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; @@ -21,6 +23,7 @@ namespace MediaBrowser.Providers.Manager private readonly ILogger _logger; private readonly IProviderManager _providerManager; private readonly IServerConfigurationManager _config; + private readonly IFileSystem _fileSystem; public ItemImageProvider(ILogger logger, IProviderManager providerManager, IServerConfigurationManager config) { @@ -97,9 +100,21 @@ namespace MediaBrowser.Providers.Manager if (response.HasImage) { - var mimeType = "image/" + response.Format.ToString().ToLower(); + if (!string.IsNullOrEmpty(response.Path)) + { + var mimeType = "image/" + Path.GetExtension(response.Path).TrimStart('.').ToLower(); - await _providerManager.SaveImage((BaseItem)item, response.Stream, mimeType, imageType, null, Guid.NewGuid().ToString(), cancellationToken).ConfigureAwait(false); + var stream = _fileSystem.GetFileStream(response.Path, FileMode.Open, FileAccess.Read, + FileShare.Read, true); + + await _providerManager.SaveImage((BaseItem)item, stream, mimeType, imageType, null, Guid.NewGuid().ToString(), cancellationToken).ConfigureAwait(false); + } + else + { + var mimeType = "image/" + response.Format.ToString().ToLower(); + + await _providerManager.SaveImage((BaseItem)item, response.Stream, mimeType, imageType, null, Guid.NewGuid().ToString(), cancellationToken).ConfigureAwait(false); + } result.UpdateType = result.UpdateType | ItemUpdateType.ImageUpdate; } @@ -227,26 +242,14 @@ namespace MediaBrowser.Providers.Manager /// IEnumerable{IImageProvider}. private IEnumerable GetImageProviders(IHasImages item, IEnumerable imageProviders) { - var providers = imageProviders.Where(i => - { - try - { - return i.Supports(item); - } - catch (Exception ex) - { - _logger.ErrorException("Error in ImageProvider.Supports", ex, i.Name); - - return false; - } - }); + var providers = imageProviders; if (!_config.Configuration.EnableInternetProviders) { providers = providers.Where(i => !(i is IRemoteImageProvider)); } - return providers.OrderBy(i => i.Order); + return providers; } private bool MergeImages(IHasImages item, List images) diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index d8d9ee0cac..19f155a07e 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -1,6 +1,5 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Configuration; -using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; @@ -13,8 +12,9 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Manager { - public abstract class MetadataService : IMetadataService + public abstract class MetadataService : IMetadataService where TItemType : IHasMetadata + where TIdType : ItemId, new() { protected readonly IServerConfigurationManager ServerConfigurationManager; protected readonly ILogger Logger; @@ -23,8 +23,6 @@ namespace MediaBrowser.Providers.Manager private IMetadataProvider[] _providers = { }; - private IImageProvider[] _imageProviders = { }; - protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo) { ServerConfigurationManager = serverConfigurationManager; @@ -37,13 +35,10 @@ namespace MediaBrowser.Providers.Manager /// Adds the parts. /// /// The providers. - /// The image providers. - public void AddParts(IEnumerable providers, IEnumerable imageProviders) + public void AddParts(IEnumerable providers) { _providers = providers.OfType>() .ToArray(); - - _imageProviders = imageProviders.OrderBy(i => i.Order).ToArray(); } /// @@ -79,11 +74,13 @@ namespace MediaBrowser.Providers.Manager var itemImageProvider = new ItemImageProvider(Logger, ProviderManager, ServerConfigurationManager); var localImagesFailed = false; + var allImageProviders = ((ProviderManager)ProviderManager).GetImageProviders(item).ToList(); + // Start by validating images try { // Always validate images and check for new locally stored ones. - if (itemImageProvider.ValidateImages(item, GetLocalImageProviders(item))) + if (itemImageProvider.ValidateImages(item, allImageProviders.OfType())) { updateType = updateType | ItemUpdateType.ImageUpdate; } @@ -114,7 +111,7 @@ namespace MediaBrowser.Providers.Manager // Next run remote image providers, but only if local image providers didn't throw an exception if (!localImagesFailed && options.ImageRefreshMode != ImageRefreshMode.ValidationOnly) { - var providers = GetNonLocalImageProviders(item, lastResult.DateLastImagesRefresh.HasValue, options).ToList(); + var providers = GetNonLocalImageProviders(item, allImageProviders, lastResult.DateLastImagesRefresh.HasValue, options).ToList(); if (providers.Count > 0) { @@ -135,7 +132,7 @@ namespace MediaBrowser.Providers.Manager { if (string.IsNullOrEmpty(item.Name)) { - throw new InvalidOperationException("Item has no name"); + throw new InvalidOperationException(item.GetType().Name + " has no name: " + item.Path); } // Save to database @@ -167,7 +164,7 @@ namespace MediaBrowser.Providers.Manager protected virtual IEnumerable GetProviders(IHasMetadata item, bool hasRefreshedMetadata, MetadataRefreshOptions options) { // Get providers to refresh - var providers = _providers.Where(i => CanRefresh(i, item)).ToList(); + var providers = ((ProviderManager) ProviderManager).GetMetadataProviders(item).ToList(); // Run all if either of these flags are true var runAllProviders = options.ReplaceAllMetadata || options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || !hasRefreshedMetadata; @@ -193,22 +190,10 @@ namespace MediaBrowser.Providers.Manager return providers; } - protected virtual IEnumerable GetNonLocalImageProviders(IHasMetadata item, bool hasRefreshedImages, ImageRefreshOptions options) + protected virtual IEnumerable GetNonLocalImageProviders(IHasMetadata item, IEnumerable allImageProviders, bool hasRefreshedImages, ImageRefreshOptions options) { // Get providers to refresh - var providers = _imageProviders.Where(i => - { - try - { - return !(i is ILocalImageProvider) && i.Supports(item); - } - catch (Exception ex) - { - Logger.ErrorException("Error in ImageProvider.Supports", ex, i.Name); - - return false; - } - }).ToList(); + var providers = allImageProviders.Where(i => !(i is ILocalImageProvider)).ToList(); // Run all if either of these flags are true var runAllProviders = options.ImageRefreshMode == ImageRefreshMode.FullRefresh || !hasRefreshedImages; @@ -226,33 +211,12 @@ namespace MediaBrowser.Providers.Manager return providers; } - - /// - /// Determines whether this instance can refresh the specified provider. - /// - /// The provider. - /// The item. - /// true if this instance can refresh the specified provider; otherwise, false. - protected bool CanRefresh(IMetadataProvider provider, IHasMetadata item) - { - if (!ServerConfigurationManager.Configuration.EnableInternetProviders && provider is IRemoteMetadataProvider) - { - return false; - } - - if (item.LocationType != LocationType.FileSystem && provider is ILocalMetadataProvider) - { - return false; - } - - return true; - } protected abstract Task SaveItem(TItemType item, ItemUpdateType reason, CancellationToken cancellationToken); - protected virtual ItemId GetId(IHasMetadata item) + protected virtual TIdType GetId(TItemType item) { - return new ItemId + return new TIdType { MetadataCountryCode = item.GetPreferredMetadataCountryCode(), MetadataLanguage = item.GetPreferredMetadataLanguage(), @@ -371,23 +335,6 @@ namespace MediaBrowser.Providers.Manager return 0; } } - - private IEnumerable GetLocalImageProviders(IHasImages item) - { - return _imageProviders.OfType().Where(i => - { - try - { - return i.Supports(item); - } - catch (Exception ex) - { - Logger.ErrorException("Error in ImageProvider.Supports", ex, i.Name); - - return false; - } - }); - } } public class RefreshResult diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index 3696bd02f5..77a9298eeb 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -50,7 +50,6 @@ namespace MediaBrowser.Providers.Manager /// The metadata providers enumerable. private BaseMetadataProvider[] MetadataProviders { get; set; } - private IRemoteImageProvider[] RemoteImageProviders { get; set; } private IImageProvider[] ImageProviders { get; set; } private readonly IFileSystem _fileSystem; @@ -58,6 +57,7 @@ namespace MediaBrowser.Providers.Manager private readonly IProviderRepository _providerRepo; private IMetadataService[] _metadataServices = { }; + private IMetadataProvider[] _metadataProviders = { }; /// /// Initializes a new instance of the class. @@ -89,16 +89,10 @@ namespace MediaBrowser.Providers.Manager { MetadataProviders = providers.OrderBy(e => e.Priority).ToArray(); - ImageProviders = imageProviders.OrderBy(i => i.Order).ToArray(); - RemoteImageProviders = ImageProviders.OfType().ToArray(); + ImageProviders = imageProviders.ToArray(); _metadataServices = metadataServices.OrderBy(i => i.Order).ToArray(); - - var providerList = metadataProviders.ToList(); - foreach (var service in _metadataServices) - { - service.AddParts(providerList, ImageProviders); - } + _metadataProviders = metadataProviders.ToArray(); } public Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken) @@ -391,7 +385,7 @@ namespace MediaBrowser.Providers.Manager /// Name of the provider. /// The type. /// Task{IEnumerable{RemoteImageInfo}}. - public async Task> GetAvailableRemoteImages(BaseItem item, CancellationToken cancellationToken, string providerName = null, ImageType? type = null) + public async Task> GetAvailableRemoteImages(IHasImages item, CancellationToken cancellationToken, string providerName = null, ImageType? type = null) { var providers = GetRemoteImageProviders(item); @@ -418,7 +412,7 @@ namespace MediaBrowser.Providers.Manager /// The preferred language. /// The type. /// Task{IEnumerable{RemoteImageInfo}}. - private async Task> GetImages(BaseItem item, CancellationToken cancellationToken, IRemoteImageProvider i, string preferredLanguage, ImageType? type = null) + private async Task> GetImages(IHasImages item, CancellationToken cancellationToken, IRemoteImageProvider i, string preferredLanguage, ImageType? type = null) { try { @@ -452,9 +446,23 @@ namespace MediaBrowser.Providers.Manager return images; } - private IEnumerable GetRemoteImageProviders(BaseItem item) + /// + /// Gets the supported image providers. + /// + /// The item. + /// IEnumerable{IImageProvider}. + public IEnumerable GetImageProviderInfo(IHasImages item) { - return RemoteImageProviders.Where(i => + return GetRemoteImageProviders(item).Select(i => new ImageProviderInfo + { + Name = i.Name, + Order = GetOrder(item, i) + }); + } + + public IEnumerable GetImageProviders(IHasImages item) + { + return ImageProviders.Where(i => { try { @@ -466,22 +474,77 @@ namespace MediaBrowser.Providers.Manager return false; } - }); + }).OrderBy(i => GetOrder(item, i)); + } + + public IEnumerable> GetMetadataProviders(IHasMetadata item) + where T : IHasMetadata + { + return _metadataProviders.OfType>() + .Where(i => CanRefresh(i, item)) + .OrderBy(i => GetOrder(item, i)); + } + + private IEnumerable GetRemoteImageProviders(IHasImages item) + { + return GetImageProviders(item).OfType(); } /// - /// Gets the supported image providers. + /// Determines whether this instance can refresh the specified provider. + /// + /// The provider. + /// The item. + /// true if this instance can refresh the specified provider; otherwise, false. + protected bool CanRefresh(IMetadataProvider provider, IHasMetadata item) + { + if (!ConfigurationManager.Configuration.EnableInternetProviders && provider is IRemoteMetadataProvider) + { + return false; + } + + if (item.LocationType != LocationType.FileSystem && provider is ILocalMetadataProvider) + { + return false; + } + + return true; + } + + /// + /// Gets the order. /// /// The item. - /// IEnumerable{IImageProvider}. - public IEnumerable GetImageProviderInfo(BaseItem item) + /// The provider. + /// System.Int32. + private int GetOrder(IHasImages item, IImageProvider provider) { - return GetRemoteImageProviders(item).Select(i => new ImageProviderInfo - { - Name = i.Name, - Order = i.Order + var hasOrder = provider as IHasOrder; - }); + if (hasOrder == null) + { + return 0; + } + + return hasOrder.Order; + } + + /// + /// Gets the order. + /// + /// The item. + /// The provider. + /// System.Int32. + private int GetOrder(IHasMetadata item, IMetadataProvider provider) + { + var hasOrder = provider as IHasOrder; + + if (hasOrder == null) + { + return 0; + } + + return hasOrder.Order; } } } diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index 83c628e23e..512b110516 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -100,29 +100,26 @@ + - + - - + + - - + - - + - - - + - + diff --git a/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs b/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs index 2cf403b09c..f2cd2718a0 100644 --- a/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs +++ b/MediaBrowser.Providers/Movies/FanArtMovieProvider.cs @@ -24,7 +24,7 @@ namespace MediaBrowser.Providers.Movies /// /// Class FanArtMovieProvider /// - class FanArtMovieProvider : BaseMetadataProvider + class FanartMovieProvider : BaseMetadataProvider { /// /// Gets the HTTP client. @@ -37,18 +37,18 @@ namespace MediaBrowser.Providers.Movies /// private readonly IProviderManager _providerManager; - internal static FanArtMovieProvider Current { get; private set; } + internal static FanartMovieProvider Current { get; private set; } private readonly IFileSystem _fileSystem; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The HTTP client. /// The log manager. /// The configuration manager. /// The provider manager. /// httpClient - public FanArtMovieProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) + public FanartMovieProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem) : base(logManager, configurationManager) { if (httpClient == null) diff --git a/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs b/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs index 88f478d1c3..47948455b0 100644 --- a/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs +++ b/MediaBrowser.Providers/Movies/FanArtMovieUpdatesPrescanTask.cs @@ -16,7 +16,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Movies { - class FanArtMovieUpdatesPrescanTask : ILibraryPostScanTask + class FanartMovieUpdatesPrescanTask : ILibraryPostScanTask { private const string UpdatesUrl = "http://api.fanart.tv/webservice/newmovies/{0}/{1}/"; @@ -37,7 +37,7 @@ namespace MediaBrowser.Providers.Movies private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); - public FanArtMovieUpdatesPrescanTask(IJsonSerializer jsonSerializer, IServerConfigurationManager config, ILogger logger, IHttpClient httpClient, IFileSystem fileSystem) + public FanartMovieUpdatesPrescanTask(IJsonSerializer jsonSerializer, IServerConfigurationManager config, ILogger logger, IHttpClient httpClient, IFileSystem fileSystem) { _jsonSerializer = jsonSerializer; _config = config; @@ -60,7 +60,7 @@ namespace MediaBrowser.Providers.Movies return; } - var path = FanArtMovieProvider.GetMoviesDataPath(_config.CommonApplicationPaths); + var path = FanartMovieProvider.GetMoviesDataPath(_config.CommonApplicationPaths); Directory.CreateDirectory(path); @@ -118,7 +118,7 @@ namespace MediaBrowser.Providers.Movies return new List(); } - var updates = _jsonSerializer.DeserializeFromString>(json); + var updates = _jsonSerializer.DeserializeFromString>(json); var existingDictionary = existingIds.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); @@ -136,7 +136,7 @@ namespace MediaBrowser.Providers.Movies { _logger.Info("Updating movie " + id); - await FanArtMovieProvider.Current.DownloadMovieXml(id, cancellationToken).ConfigureAwait(false); + await FanartMovieProvider.Current.DownloadMovieXml(id, cancellationToken).ConfigureAwait(false); numComplete++; double percent = numComplete; diff --git a/MediaBrowser.Providers/Movies/ManualFanartMovieImageProvider.cs b/MediaBrowser.Providers/Movies/ManualFanartMovieImageProvider.cs index c94339a7e4..70aaec526c 100644 --- a/MediaBrowser.Providers/Movies/ManualFanartMovieImageProvider.cs +++ b/MediaBrowser.Providers/Movies/ManualFanartMovieImageProvider.cs @@ -20,7 +20,7 @@ using MediaBrowser.Providers.Music; namespace MediaBrowser.Providers.Movies { - public class ManualFanartMovieImageProvider : IRemoteImageProvider, IHasChangeMonitor + public class ManualFanartMovieImageProvider : IRemoteImageProvider, IHasChangeMonitor, IHasOrder { private readonly CultureInfo _usCulture = new CultureInfo("en-US"); private readonly IServerConfigurationManager _config; @@ -86,9 +86,9 @@ namespace MediaBrowser.Providers.Movies if (!string.IsNullOrEmpty(movieId)) { - await FanArtMovieProvider.Current.EnsureMovieXml(movieId, cancellationToken).ConfigureAwait(false); + await FanartMovieProvider.Current.EnsureMovieXml(movieId, cancellationToken).ConfigureAwait(false); - var xmlPath = FanArtMovieProvider.Current.GetFanartXmlPath(movieId); + var xmlPath = FanartMovieProvider.Current.GetFanartXmlPath(movieId); try { @@ -344,7 +344,7 @@ namespace MediaBrowser.Providers.Movies if (!string.IsNullOrEmpty(id)) { // Process images - var xmlPath = FanArtMovieProvider.Current.GetFanartXmlPath(id); + var xmlPath = FanartMovieProvider.Current.GetFanartXmlPath(id); var fileInfo = new FileInfo(xmlPath); diff --git a/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs b/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs index 8c6e2d92e8..bc4652e2c5 100644 --- a/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs +++ b/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs @@ -15,7 +15,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Movies { - class ManualMovieDbImageProvider : IRemoteImageProvider + class ManualMovieDbImageProvider : IRemoteImageProvider, IHasOrder { private readonly IJsonSerializer _jsonSerializer; private readonly IHttpClient _httpClient; diff --git a/MediaBrowser.Providers/Music/AlbumInfoFromSongProvider.cs b/MediaBrowser.Providers/Music/AlbumInfoFromSongProvider.cs deleted file mode 100644 index 47799b8f3c..0000000000 --- a/MediaBrowser.Providers/Music/AlbumInfoFromSongProvider.cs +++ /dev/null @@ -1,154 +0,0 @@ -using MediaBrowser.Common.Extensions; -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.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Providers.Music -{ - public class AlbumInfoFromSongProvider : BaseMetadataProvider - { - public AlbumInfoFromSongProvider(ILogManager logManager, IServerConfigurationManager configurationManager) - : base(logManager, configurationManager) - { - } - - public override bool Supports(BaseItem item) - { - return item is MusicAlbum; - } - - protected override bool RefreshOnVersionChange - { - get - { - return true; - } - } - - protected override string ProviderVersion - { - get - { - return "2"; - } - } - - protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) - { - // If song metadata has changed - if (GetComparisonData((MusicAlbum)item) != providerInfo.FileStamp) - { - return true; - } - - return base.NeedsRefreshInternal(item, providerInfo); - } - /// - /// Gets the data. - /// - /// The album. - /// Guid. - private Guid GetComparisonData(MusicAlbum album) - { - var songs = album.RecursiveChildren.OfType