From 4e38c3537398b01776f6e1c5e1c08bce73eec82e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 19 Feb 2014 00:21:03 -0500 Subject: [PATCH] fixed remote control flyout --- MediaBrowser.Api/ItemUpdateService.cs | 18 +- .../BaseProgressiveStreamingService.cs | 12 +- .../Entities/Audio/MusicArtist.cs | 2 +- MediaBrowser.Controller/Entities/BaseItem.cs | 10 + MediaBrowser.Controller/Entities/Folder.cs | 2 +- .../Entities/IHasImages.cs | 6 + .../Entities/Movies/BoxSet.cs | 2 +- .../MediaBrowser.Controller.csproj | 5 +- .../Providers/BaseItemXmlParser.cs | 2 +- .../Providers/BaseMetadataProvider.cs | 268 ----------------- .../Providers/BaseProviderInfo.cs | 51 ---- .../Providers/IForcedProvider.cs | 10 + .../Providers/IImageSaver.cs | 29 ++ .../Providers/IMetadataProvider.cs | 5 +- .../Providers/IProviderManager.cs | 4 +- .../Providers/IRemoteMetadataProvider.cs | 21 +- .../Providers/ProviderRefreshStatus.cs | 22 ++ MediaBrowser.Model/Dto/BaseItemDto.cs | 2 +- MediaBrowser.Model/Entities/LocationType.cs | 8 +- .../Notifications/NotificationLevel.cs | 6 +- .../Genres/GenreMetadataService.cs | 8 +- .../Manager/ProviderManager.cs | 185 +++++------- .../MediaBrowser.Providers.csproj | 1 + .../MediaInfo/FFProbeProvider.cs | 3 +- .../People/MovieDbPersonProvider.cs | 94 ++++-- .../Savers/XmlSaverHelpers.cs | 5 +- MediaBrowser.Providers/Xbmc/XbmcImageSaver.cs | 272 ++++++++++++++++++ .../Dto/DtoService.cs | 2 +- .../HttpServer/HttpResultFactory.cs | 38 ++- .../HttpServer/ResponseFilter.cs | 2 +- .../ServerManager/ServerManager.cs | 3 +- .../ApplicationHost.cs | 5 +- 32 files changed, 594 insertions(+), 509 deletions(-) delete mode 100644 MediaBrowser.Controller/Providers/BaseMetadataProvider.cs delete mode 100644 MediaBrowser.Controller/Providers/BaseProviderInfo.cs create mode 100644 MediaBrowser.Controller/Providers/IForcedProvider.cs create mode 100644 MediaBrowser.Controller/Providers/IImageSaver.cs create mode 100644 MediaBrowser.Controller/Providers/ProviderRefreshStatus.cs create mode 100644 MediaBrowser.Providers/Xbmc/XbmcImageSaver.cs diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index 84f495efa8..1eaf4acb1b 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -5,7 +5,6 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.LiveTv; using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Entities; using ServiceStack; using System; using System.Linq; @@ -94,8 +93,8 @@ namespace MediaBrowser.Api { var item = _dtoService.GetItemByDtoId(request.ItemId); - var newEnableInternetProviders = request.EnableInternetProviders ?? true; - var dontFetchMetaChanged = item.DontFetchMeta != !newEnableInternetProviders; + var newLockData = request.LockData ?? false; + var dontFetchMetaChanged = item.DontFetchMeta != newLockData; UpdateItem(request, item); @@ -107,7 +106,7 @@ namespace MediaBrowser.Api foreach (var child in folder.RecursiveChildren.ToList()) { - child.DontFetchMeta = !newEnableInternetProviders; + child.DontFetchMeta = newLockData; await _libraryManager.UpdateItem(child, ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); } } @@ -307,16 +306,13 @@ namespace MediaBrowser.Api { hasAspectRatio.AspectRatio = request.AspectRatio; } - - item.DontFetchMeta = !(request.EnableInternetProviders ?? true); - if (request.EnableInternetProviders ?? true) + + item.DontFetchMeta = (request.LockData ?? false); + + if (request.LockedFields != null) { item.LockedFields = request.LockedFields; } - else - { - item.LockedFields.Clear(); - } // Only allow this for series. Runtimes for media comes from ffprobe. if (item is Series) diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs index 65e6c04b72..09b87bce9a 100644 --- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -240,6 +240,13 @@ namespace MediaBrowser.Api.Playback.Progressive responseHeaders["Accept-Ranges"] = "none"; + var length = response.Headers["Content-Length"]; + + if (!string.IsNullOrEmpty(length)) + { + responseHeaders["Content-Length"] = length; + } + if (isHeadRequest) { using (response.Content) @@ -273,13 +280,13 @@ namespace MediaBrowser.Api.Playback.Progressive // Use the command line args with a dummy playlist path var outputPath = GetOutputFilePath(state); + responseHeaders["Accept-Ranges"] = "none"; + var contentType = MimeTypes.GetMimeType(outputPath); // Headers only if (isHeadRequest) { - responseHeaders["Accept-Ranges"] = "none"; - return ResultFactory.GetResult(new byte[] { }, contentType, responseHeaders); } @@ -294,7 +301,6 @@ namespace MediaBrowser.Api.Playback.Progressive var result = new ProgressiveStreamWriter(outputPath, Logger, FileSystem); - result.Options["Accept-Ranges"] = "none"; result.Options["Content-Type"] = contentType; // Add the response headers to the result object diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index 2583450a3b..27e1643075 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -179,7 +179,7 @@ namespace MediaBrowser.Controller.Entities.Audio // Refresh all non-songs foreach (var item in others) { - if (tasks.Count > 3) + if (tasks.Count >= 3) { await Task.WhenAll(tasks).ConfigureAwait(false); tasks.Clear(); diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 62ea0cf5d1..224907a72a 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -216,8 +216,18 @@ namespace MediaBrowser.Controller.Entities /// Returns true if this item should not attempt to fetch metadata /// /// true if [dont fetch meta]; otherwise, false. + [Obsolete("Please use IsLocked instead of DontFetchMeta")] public bool DontFetchMeta { get; set; } + [IgnoreDataMember] + public bool IsLocked + { + get + { + return DontFetchMeta; + } + } + /// /// Gets or sets the locked fields. /// diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index c928a130e0..c08a2ddf2f 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -521,7 +521,7 @@ namespace MediaBrowser.Controller.Entities foreach (var child in children) { - if (tasks.Count >= 4) + if (tasks.Count >= 3) { await Task.WhenAll(tasks).ConfigureAwait(false); tasks.Clear(); diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs index e07db88c4e..8e66605dd9 100644 --- a/MediaBrowser.Controller/Entities/IHasImages.cs +++ b/MediaBrowser.Controller/Entities/IHasImages.cs @@ -148,6 +148,12 @@ namespace MediaBrowser.Controller.Entities /// /// true if this instance is in mixed folder; otherwise, false. bool IsInMixedFolder { get; } + + /// + /// Gets a value indicating whether this instance is locked. + /// + /// true if this instance is locked; otherwise, false. + bool IsLocked { get; } } public static class HasImagesExtensions diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs index 3fd2af0917..6cd078677d 100644 --- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs +++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs @@ -99,7 +99,7 @@ namespace MediaBrowser.Controller.Entities.Movies // Refresh songs foreach (var item in items) { - if (tasks.Count >= 4) + if (tasks.Count >= 3) { await Task.WhenAll(tasks).ConfigureAwait(false); tasks.Clear(); diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index b62492bfed..32f2d151d4 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -147,9 +147,11 @@ + + @@ -216,7 +218,7 @@ - + @@ -224,7 +226,6 @@ - diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs index 59b7cd8db9..ada0aa6e29 100644 --- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs +++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs @@ -719,7 +719,7 @@ namespace MediaBrowser.Controller.Providers } break; } - case "TvRageId": + case "TVRageId": { var id = reader.ReadElementContentAsString(); if (!string.IsNullOrWhiteSpace(id)) diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs deleted file mode 100644 index f8580244a1..0000000000 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ /dev/null @@ -1,268 +0,0 @@ -using MediaBrowser.Common.Extensions; -using MediaBrowser.Controller.Configuration; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Library; -using MediaBrowser.Model.Logging; -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Controller.Providers -{ - /// - /// Class BaseMetadataProvider - /// - public abstract class BaseMetadataProvider - { - /// - /// Gets the logger. - /// - /// The logger. - protected ILogger Logger { get; set; } - - protected ILogManager LogManager { get; set; } - - /// - /// Gets the configuration manager. - /// - /// The configuration manager. - protected IServerConfigurationManager ConfigurationManager { get; private set; } - - /// - /// The _id - /// - public readonly Guid Id; - - /// - /// The true task result - /// - protected static readonly Task TrueTaskResult = Task.FromResult(true); - - protected static readonly Task FalseTaskResult = Task.FromResult(false); - - /// - /// Supportses the specified item. - /// - /// The item. - /// true if XXXX, false otherwise - public abstract bool Supports(BaseItem item); - - /// - /// Gets a value indicating whether [requires internet]. - /// - /// true if [requires internet]; otherwise, false. - public virtual bool RequiresInternet - { - get - { - return false; - } - } - - /// - /// Gets the provider version. - /// - /// The provider version. - protected virtual string ProviderVersion - { - get - { - return null; - } - } - - public virtual ItemUpdateType ItemUpdateType - { - get { return RequiresInternet ? ItemUpdateType.MetadataDownload : ItemUpdateType.MetadataImport; } - } - - /// - /// Gets a value indicating whether [refresh on version change]. - /// - /// true if [refresh on version change]; otherwise, false. - protected virtual bool RefreshOnVersionChange - { - get - { - return false; - } - } - - /// - /// Determines if this provider is relatively slow and, therefore, should be skipped - /// in certain instances. Default is whether or not it requires internet. Can be overridden - /// for explicit designation. - /// - /// true if this instance is slow; otherwise, false. - public virtual bool IsSlow - { - get { return RequiresInternet; } - } - - /// - /// Initializes a new instance of the class. - /// - protected BaseMetadataProvider(ILogManager logManager, IServerConfigurationManager configurationManager) - { - Logger = logManager.GetLogger(GetType().Name); - LogManager = logManager; - ConfigurationManager = configurationManager; - Id = GetType().FullName.GetMD5(); - - Initialize(); - } - - /// - /// Initializes this instance. - /// - protected virtual void Initialize() - { - } - - /// - /// Sets the persisted last refresh date on the item for this provider. - /// - /// The item. - /// The value. - /// The provider version. - /// The provider information. - /// The status. - /// item - public virtual void SetLastRefreshed(BaseItem item, DateTime value, string providerVersion, - BaseProviderInfo providerInfo, ProviderRefreshStatus status = ProviderRefreshStatus.Success) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - providerInfo.LastRefreshed = value; - providerInfo.LastRefreshStatus = status; - providerInfo.ProviderVersion = providerVersion; - } - - /// - /// Sets the last refreshed. - /// - /// The item. - /// The value. - /// The provider information. - /// The status. - public void SetLastRefreshed(BaseItem item, DateTime value, - BaseProviderInfo providerInfo, ProviderRefreshStatus status = ProviderRefreshStatus.Success) - { - SetLastRefreshed(item, value, ProviderVersion, providerInfo, status); - } - - /// - /// Returns whether or not this provider should be re-fetched. Default functionality can - /// compare a provided date with a last refresh time. This can be overridden for more complex - /// determinations. - /// - /// The item. - /// true if XXXX, false otherwise - /// - public bool NeedsRefresh(BaseItem item, BaseProviderInfo data) - { - if (item == null) - { - throw new ArgumentNullException(); - } - - return NeedsRefreshInternal(item, data); - } - - /// - /// Gets a value indicating whether [enforce dont fetch metadata]. - /// - /// true if [enforce dont fetch metadata]; otherwise, false. - public virtual bool EnforceDontFetchMetadata - { - get - { - return true; - } - } - - /// - /// Needses the refresh internal. - /// - /// The item. - /// The provider info. - /// true if XXXX, false otherwise - /// - protected virtual bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - if (providerInfo == null) - { - throw new ArgumentNullException("providerInfo"); - } - - if (providerInfo.LastRefreshed == default(DateTime)) - { - return true; - } - - if (NeedsRefreshBasedOnCompareDate(item, providerInfo)) - { - return true; - } - - if (RefreshOnVersionChange && !String.Equals(ProviderVersion, providerInfo.ProviderVersion)) - { - return true; - } - - if (providerInfo.LastRefreshStatus != ProviderRefreshStatus.Success) - { - return true; - } - - return false; - } - - /// - /// Needses the refresh based on compare date. - /// - /// The item. - /// The provider info. - /// true if XXXX, false otherwise - protected virtual bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) - { - return CompareDate(item) > providerInfo.LastRefreshed; - } - - /// - /// Override this to return the date that should be compared to the last refresh date - /// to determine if this provider should be re-fetched. - /// - /// The item. - /// DateTime. - protected virtual DateTime CompareDate(BaseItem item) - { - return DateTime.MinValue.AddMinutes(1); // want this to be greater than mindate so new items will refresh - } - - /// - /// Fetches metadata and returns true or false indicating if any work that requires persistence was done - /// - /// The item. - /// if set to true [force]. - /// The provider information. - /// The cancellation token. - /// Task{System.Boolean}. - /// - public abstract Task FetchAsync(BaseItem item, bool force, BaseProviderInfo providerInfo, CancellationToken cancellationToken); - - /// - /// Gets the priority. - /// - /// The priority. - public abstract MetadataProviderPriority Priority { get; } - } -} diff --git a/MediaBrowser.Controller/Providers/BaseProviderInfo.cs b/MediaBrowser.Controller/Providers/BaseProviderInfo.cs deleted file mode 100644 index 3a33924f0d..0000000000 --- a/MediaBrowser.Controller/Providers/BaseProviderInfo.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; - -namespace MediaBrowser.Controller.Providers -{ - /// - /// Class BaseProviderInfo - /// - public class BaseProviderInfo - { - public Guid ProviderId { get; set; } - /// - /// Gets or sets the last refreshed. - /// - /// The last refreshed. - public DateTime LastRefreshed { get; set; } - /// - /// Gets or sets the file system stamp. - /// - /// The file system stamp. - public Guid FileStamp { get; set; } - /// - /// Gets or sets the last refresh status. - /// - /// The last refresh status. - public ProviderRefreshStatus LastRefreshStatus { get; set; } - /// - /// Gets or sets the provider version. - /// - /// The provider version. - public string ProviderVersion { get; set; } - } - - /// - /// Enum ProviderRefreshStatus - /// - public enum ProviderRefreshStatus - { - /// - /// The success - /// - Success = 0, - /// - /// The completed with errors - /// - CompletedWithErrors = 1, - /// - /// The failure - /// - Failure = 2 - } -} diff --git a/MediaBrowser.Controller/Providers/IForcedProvider.cs b/MediaBrowser.Controller/Providers/IForcedProvider.cs new file mode 100644 index 0000000000..9e35b00ad6 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IForcedProvider.cs @@ -0,0 +1,10 @@ + +namespace MediaBrowser.Controller.Providers +{ + /// + /// This is a marker interface that will cause a provider to run even if IsLocked=true + /// + public interface IForcedProvider + { + } +} diff --git a/MediaBrowser.Controller/Providers/IImageSaver.cs b/MediaBrowser.Controller/Providers/IImageSaver.cs new file mode 100644 index 0000000000..5516c08f6a --- /dev/null +++ b/MediaBrowser.Controller/Providers/IImageSaver.cs @@ -0,0 +1,29 @@ +using MediaBrowser.Controller.Drawing; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Entities; +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Providers +{ + public interface IImageSaver + { + /// + /// Gets the name. + /// + /// The name. + string Name { get; } + } + + public interface IImageFileSaver : IImageSaver + { + /// + /// Gets the save paths. + /// + /// The item. + /// The type. + /// The format. + /// The index. + /// IEnumerable{System.String}. + IEnumerable GetSavePaths(IHasImages item, ImageType type, ImageFormat format, int index); + } +} diff --git a/MediaBrowser.Controller/Providers/IMetadataProvider.cs b/MediaBrowser.Controller/Providers/IMetadataProvider.cs index 70bc060594..d33b2c9eb0 100644 --- a/MediaBrowser.Controller/Providers/IMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/IMetadataProvider.cs @@ -1,5 +1,4 @@ -using System; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; namespace MediaBrowser.Controller.Providers { @@ -26,10 +25,8 @@ namespace MediaBrowser.Controller.Providers } public class MetadataResult - where T : IHasMetadata { public bool HasMetadata { get; set; } public T Item { get; set; } } - } diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index 4aeb86a6a0..eb4d3d9a65 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -55,8 +55,10 @@ namespace MediaBrowser.Controller.Providers /// The metadata services. /// The metadata providers. /// The savers. + /// The image savers. void AddParts(IEnumerable imageProviders, IEnumerable metadataServices, IEnumerable metadataProviders, - IEnumerable savers); + IEnumerable savers, + IEnumerable imageSavers); /// /// Gets the available remote images. diff --git a/MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs b/MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs index cbbd62557e..065017cce4 100644 --- a/MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs @@ -1,6 +1,7 @@ -using System.Threading; +using MediaBrowser.Controller.Entities; +using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Controller.Entities; namespace MediaBrowser.Controller.Providers { @@ -8,10 +9,24 @@ namespace MediaBrowser.Controller.Providers { } - public interface IRemoteMetadataProvider : IMetadataProvider, IRemoteMetadataProvider + public interface IRemoteMetadataProvider : IMetadataProvider, IRemoteMetadataProvider where TItemType : IHasMetadata, IHasLookupInfo where TLookupInfoType : ItemLookupInfo, new() { Task> GetMetadata(TLookupInfoType info, CancellationToken cancellationToken); } + + public interface IRemoteSearchProvider + where TLookupInfoType : ItemLookupInfo + { + Task>> GetSearchResults(TLookupInfoType searchInfo, CancellationToken cancellationToken); + } + + public class SearchResult + where T : ItemLookupInfo + { + public T Item { get; set; } + + public string ImageUrl { get; set; } + } } diff --git a/MediaBrowser.Controller/Providers/ProviderRefreshStatus.cs b/MediaBrowser.Controller/Providers/ProviderRefreshStatus.cs new file mode 100644 index 0000000000..6523dc4173 --- /dev/null +++ b/MediaBrowser.Controller/Providers/ProviderRefreshStatus.cs @@ -0,0 +1,22 @@ + +namespace MediaBrowser.Controller.Providers +{ + /// + /// Enum ProviderRefreshStatus + /// + public enum ProviderRefreshStatus + { + /// + /// The success + /// + Success = 0, + /// + /// The completed with errors + /// + CompletedWithErrors = 1, + /// + /// The failure + /// + Failure = 2 + } +} diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs index 566c136b76..8f43304463 100644 --- a/MediaBrowser.Model/Dto/BaseItemDto.cs +++ b/MediaBrowser.Model/Dto/BaseItemDto.cs @@ -657,7 +657,7 @@ namespace MediaBrowser.Model.Dto /// Gets or sets a value indicating whether [enable internet providers]. /// /// true if [enable internet providers]; otherwise, false. - public bool? EnableInternetProviders { get; set; } + public bool? LockData { get; set; } /// /// Gets a value indicating whether this instance can resume. diff --git a/MediaBrowser.Model/Entities/LocationType.cs b/MediaBrowser.Model/Entities/LocationType.cs index 09c0b20cab..84de803aa2 100644 --- a/MediaBrowser.Model/Entities/LocationType.cs +++ b/MediaBrowser.Model/Entities/LocationType.cs @@ -9,18 +9,18 @@ namespace MediaBrowser.Model.Entities /// /// The file system /// - FileSystem = 1, + FileSystem = 0, /// /// The remote /// - Remote = 2, + Remote = 1, /// /// The virtual /// - Virtual = 3, + Virtual = 2, /// /// The offline /// - Offline = 4 + Offline = 3 } } diff --git a/MediaBrowser.Model/Notifications/NotificationLevel.cs b/MediaBrowser.Model/Notifications/NotificationLevel.cs index c7e68b163a..a49ee2fe63 100644 --- a/MediaBrowser.Model/Notifications/NotificationLevel.cs +++ b/MediaBrowser.Model/Notifications/NotificationLevel.cs @@ -3,8 +3,8 @@ namespace MediaBrowser.Model.Notifications { public enum NotificationLevel { - Normal = 1, - Warning = 2, - Error = 3 + Normal = 0, + Warning = 1, + Error = 2 } } diff --git a/MediaBrowser.Providers/Genres/GenreMetadataService.cs b/MediaBrowser.Providers/Genres/GenreMetadataService.cs index b19241095f..f408d026b1 100644 --- a/MediaBrowser.Providers/Genres/GenreMetadataService.cs +++ b/MediaBrowser.Providers/Genres/GenreMetadataService.cs @@ -1,25 +1,19 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Providers.Manager; using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace MediaBrowser.Providers.Genres { public class GenreMetadataService : MetadataService { - private readonly ILibraryManager _libraryManager; - - public GenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, ILibraryManager libraryManager) + public GenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem) : base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem) { - _libraryManager = libraryManager; } /// diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index ced9e48680..19d1e3ba2f 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -52,11 +52,10 @@ namespace MediaBrowser.Providers.Manager private readonly IFileSystem _fileSystem; - private readonly IProviderRepository _providerRepo; - private IMetadataService[] _metadataServices = { }; private IMetadataProvider[] _metadataProviders = { }; private IEnumerable _savers; + private IImageSaver[] _imageSavers; /// /// Initializes a new instance of the class. @@ -66,15 +65,13 @@ namespace MediaBrowser.Providers.Manager /// The directory watchers. /// The log manager. /// The file system. - /// The provider repo. - public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IProviderRepository providerRepo) + public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem) { _logger = logManager.GetLogger("ProviderManager"); _httpClient = httpClient; ConfigurationManager = configurationManager; _libraryMonitor = libraryMonitor; _fileSystem = fileSystem; - _providerRepo = providerRepo; } /// @@ -84,13 +81,16 @@ namespace MediaBrowser.Providers.Manager /// The metadata services. /// The metadata providers. /// The metadata savers. - public void AddParts(IEnumerable imageProviders, IEnumerable metadataServices, IEnumerable metadataProviders, IEnumerable metadataSavers) + /// The image savers. + public void AddParts(IEnumerable imageProviders, IEnumerable metadataServices, IEnumerable metadataProviders, IEnumerable metadataSavers, + IEnumerable imageSavers) { ImageProviders = imageProviders.ToArray(); _metadataServices = metadataServices.OrderBy(i => i.Order).ToArray(); _metadataProviders = metadataProviders.ToArray(); _savers = metadataSavers.ToArray(); + _imageSavers = imageSavers.ToArray(); } public Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken) @@ -106,62 +106,6 @@ namespace MediaBrowser.Providers.Manager return Task.FromResult(true); } - /// - /// Saves to library filesystem. - /// - /// The item. - /// The path. - /// The data to save. - /// The cancellation token. - /// Task. - /// - public async Task SaveToLibraryFilesystem(BaseItem item, string path, Stream dataToSave, CancellationToken cancellationToken) - { - if (item == null) - { - throw new ArgumentNullException(); - } - if (string.IsNullOrEmpty(path)) - { - throw new ArgumentNullException(); - } - if (dataToSave == null) - { - throw new ArgumentNullException(); - } - - if (cancellationToken.IsCancellationRequested) - { - dataToSave.Dispose(); - cancellationToken.ThrowIfCancellationRequested(); - } - - //Tell the watchers to ignore - _libraryMonitor.ReportFileSystemChangeBeginning(path); - - if (dataToSave.CanSeek) - { - dataToSave.Position = 0; - } - - try - { - using (dataToSave) - { - using (var fs = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, true)) - { - await dataToSave.CopyToAsync(fs, StreamDefaults.DefaultCopyToBufferSize, cancellationToken).ConfigureAwait(false); - } - } - } - finally - { - //Remove the ignore - _libraryMonitor.ReportFileSystemChangeComplete(path, false); - } - } - - /// /// Saves the image. /// @@ -252,8 +196,13 @@ namespace MediaBrowser.Providers.Manager result = result.Where(i => i.Type == type.Value); } - return string.IsNullOrEmpty(preferredLanguage) ? result : - FilterImages(result, preferredLanguage); + if (string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase)) + { + result = result.Where(i => string.IsNullOrEmpty(i.Language) || + string.Equals(i.Language, "en", StringComparison.OrdinalIgnoreCase)); + } + + return result; } catch (Exception ex) { @@ -262,17 +211,6 @@ namespace MediaBrowser.Providers.Manager } } - private IEnumerable FilterImages(IEnumerable images, string preferredLanguage) - { - if (string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase)) - { - images = images.Where(i => string.IsNullOrEmpty(i.Language) || - string.Equals(i.Language, "en", StringComparison.OrdinalIgnoreCase)); - } - - return images; - } - /// /// Gets the supported image providers. /// @@ -294,13 +232,16 @@ namespace MediaBrowser.Providers.Manager private IEnumerable GetImageProviders(IHasImages item, MetadataOptions options, bool includeDisabled) { + // Avoid implicitly captured closure + var currentOptions = options; + return ImageProviders.Where(i => CanRefresh(i, item, options, includeDisabled)) .OrderBy(i => { // See if there's a user-defined order if (!(i is ILocalImageProvider)) { - var index = Array.IndexOf(options.ImageFetcherOrder, i.Name); + var index = Array.IndexOf(currentOptions.ImageFetcherOrder, i.Name); if (index != -1) { @@ -325,36 +266,13 @@ namespace MediaBrowser.Providers.Manager private IEnumerable> GetMetadataProvidersInternal(IHasMetadata item, MetadataOptions options, bool includeDisabled) where T : IHasMetadata { - return _metadataProviders.OfType>() - .Where(i => CanRefresh(i, item, options, includeDisabled)) - .OrderBy(i => - { - // See if there's a user-defined order - if (i is ILocalMetadataProvider) - { - var index = Array.IndexOf(options.LocalMetadataReaderOrder, i.Name); - - if (index != -1) - { - return index; - } - } - - // See if there's a user-defined order - if (i is IRemoteMetadataProvider) - { - var index = Array.IndexOf(options.MetadataFetcherOrder, i.Name); - - if (index != -1) - { - return index; - } - } + // Avoid implicitly captured closure + var currentOptions = options; - // Not configured. Just return some high number to put it at the end. - return 100; - }) - .ThenBy(GetOrder); + return _metadataProviders.OfType>() + .Where(i => CanRefresh(i, item, currentOptions, includeDisabled)) + .OrderBy(i => GetConfiguredOrder(i, options)) + .ThenBy(GetDefaultOrder); } private IEnumerable GetRemoteImageProviders(IHasImages item, bool includeDisabled) @@ -368,6 +286,12 @@ namespace MediaBrowser.Providers.Manager { if (!includeDisabled) { + // If locked only allow local providers + if (item.IsLocked && !(provider is ILocalMetadataProvider) && !(provider is IForcedProvider)) + { + return false; + } + if (provider is IRemoteMetadataProvider) { if (Array.IndexOf(options.DisabledMetadataFetchers, provider.Name) != -1) @@ -398,6 +322,12 @@ namespace MediaBrowser.Providers.Manager { if (!includeDisabled) { + // If locked only allow local providers + if (item.IsLocked && !(provider is ILocalImageProvider)) + { + return false; + } + if (provider is IRemoteImageProvider) { if (Array.IndexOf(options.DisabledImageFetchers, provider.Name) != -1) @@ -440,12 +370,35 @@ namespace MediaBrowser.Providers.Manager return hasOrder.Order; } - /// - /// Gets the order. - /// - /// The provider. - /// System.Int32. - private int GetOrder(IMetadataProvider provider) + private int GetConfiguredOrder(IMetadataProvider provider, MetadataOptions options) + { + // See if there's a user-defined order + if (provider is ILocalMetadataProvider) + { + var index = Array.IndexOf(options.LocalMetadataReaderOrder, provider.Name); + + if (index != -1) + { + return index; + } + } + + // See if there's a user-defined order + if (provider is IRemoteMetadataProvider) + { + var index = Array.IndexOf(options.MetadataFetcherOrder, provider.Name); + + if (index != -1) + { + return index; + } + } + + // Not configured. Just return some high number to put it at the end. + return 100; + } + + private int GetDefaultOrder(IMetadataProvider provider) { var hasOrder = provider as IHasOrder; @@ -578,6 +531,7 @@ namespace MediaBrowser.Providers.Manager } private readonly ConcurrentDictionary _fileLocks = new ConcurrentDictionary(); + /// /// Saves the metadata. /// @@ -658,5 +612,14 @@ namespace MediaBrowser.Providers.Manager return false; } } + + //private IEnumerable GetRemoteSearchResults(TLookupType searchInfo, + // CancellationToken cancellationToken) + // where TLookupType : ItemLookupInfo + //{ + // var providers = _metadataProviders.OfType>(); + + + //} } } \ No newline at end of file diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index 3a7fcd918d..724a60b97c 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -198,6 +198,7 @@ + diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs index 7ac48655a9..161532fd31 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs @@ -31,7 +31,8 @@ namespace MediaBrowser.Providers.MediaInfo ICustomMetadataProvider