diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs index 49a582937f..960de017de 100644 --- a/MediaBrowser.Api/Images/RemoteImageService.cs +++ b/MediaBrowser.Api/Images/RemoteImageService.cs @@ -221,10 +221,17 @@ namespace MediaBrowser.Api.Images var imagesList = images.ToList(); + var allProviders = _providerManager.GetRemoteImageProviderInfo(item); + + if (request.Type.HasValue) + { + allProviders = allProviders.Where(i => i.SupportedImages.Contains(request.Type.Value)); + } + var result = new RemoteImageResult { TotalRecordCount = imagesList.Count, - Providers = imagesList.Select(i => i.ProviderName) + Providers = allProviders.Select(i => i.Name) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList() }; diff --git a/MediaBrowser.Api/Library/LibraryStructureService.cs b/MediaBrowser.Api/Library/LibraryStructureService.cs index f08d79c0db..ed086398ff 100644 --- a/MediaBrowser.Api/Library/LibraryStructureService.cs +++ b/MediaBrowser.Api/Library/LibraryStructureService.cs @@ -167,15 +167,32 @@ namespace MediaBrowser.Api.Library public bool RefreshLibrary { get; set; } } - [Route("/Library/Changes/Path", "POST")] + [Route("/Library/Changes/New", "POST")] public class ReportChangedPath : IReturnVoid { /// /// Gets or sets the name. /// /// The name. - [ApiMember(Name = "Path", Description = "The path that was changed.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] + [ApiMember(Name = "Path", Description = "The path that was changed.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] public string Path { get; set; } + + [ApiMember(Name = "ImageUrl", Description = "Optional thumbnail image url of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] + public string ImageUrl { get; set; } + } + + [Route("/Library/Episodes/New", "POST")] + public class ReportNewEpisode : IReturnVoid + { + /// + /// Gets or sets the name. + /// + /// The name. + [ApiMember(Name = "TvdbId", Description = "The tvdb id of the new episode.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] + public string TvdbId { get; set; } + + [ApiMember(Name = "ImageUrl", Description = "Optional thumbnail image url of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] + public string ImageUrl { get; set; } } /// diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 310ddf64ca..cb14ed099e 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 >= 2) + if (tasks.Count >= 8) { await Task.WhenAll(tasks).ConfigureAwait(false); tasks.Clear(); diff --git a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs index 81515a2e9a..a4a85ec04e 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs @@ -67,5 +67,13 @@ namespace MediaBrowser.Controller.LiveTv { return false; } + + public override bool SupportsLocalMetadata + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs index 3f8d67e3b7..6e3644b4aa 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs @@ -67,5 +67,13 @@ namespace MediaBrowser.Controller.LiveTv { return false; } + + public override bool SupportsLocalMetadata + { + get + { + return false; + } + } } } diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index e7eb275033..a4800955d1 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -94,6 +94,6 @@ namespace MediaBrowser.Controller.Providers /// /// The item. /// MetadataOptions. - MetadataOptions GetMetadataOptions(IHasMetadata item); + MetadataOptions GetMetadataOptions(IHasImages item); } } \ No newline at end of file diff --git a/MediaBrowser.Model/Configuration/MetadataOptions.cs b/MediaBrowser.Model/Configuration/MetadataOptions.cs index 9fdcf045ec..d666f6ccea 100644 --- a/MediaBrowser.Model/Configuration/MetadataOptions.cs +++ b/MediaBrowser.Model/Configuration/MetadataOptions.cs @@ -15,8 +15,14 @@ namespace MediaBrowser.Model.Configuration public ImageOption[] ImageOptions { get; set; } public string[] DisabledMetadataSavers { get; set; } - public string[] LocalMetadataReaders { get; set; } + public string[] LocalMetadataReaderOrder { get; set; } + public string[] DisabledMetadataFetchers { get; set; } + public string[] MetadataFetcherOrder { get; set; } + + public string[] DisabledImageFetchers { get; set; } + public string[] ImageFetcherOrder { get; set; } + public MetadataOptions() : this(3, 1280) { @@ -36,7 +42,12 @@ namespace MediaBrowser.Model.Configuration ImageOptions = imageOptions.ToArray(); DisabledMetadataSavers = new string[] { }; - LocalMetadataReaders = new string[] { }; + LocalMetadataReaderOrder = new string[] { }; + + DisabledMetadataFetchers = new string[] { }; + MetadataFetcherOrder = new string[] { }; + DisabledImageFetchers = new string[] { }; + ImageFetcherOrder = new string[] { }; } public int GetLimit(ImageType type) diff --git a/MediaBrowser.Model/Providers/ImageProviderInfo.cs b/MediaBrowser.Model/Providers/ImageProviderInfo.cs index 4b5a07805d..c519d66cb5 100644 --- a/MediaBrowser.Model/Providers/ImageProviderInfo.cs +++ b/MediaBrowser.Model/Providers/ImageProviderInfo.cs @@ -1,4 +1,7 @@ -namespace MediaBrowser.Model.Providers +using System.Collections.Generic; +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Model.Providers { /// /// Class ImageProviderInfo. @@ -10,5 +13,12 @@ /// /// The name. public string Name { get; set; } + + public List SupportedImages { get; set; } + + public ImageProviderInfo() + { + SupportedImages = new List(); + } } } diff --git a/MediaBrowser.Providers/AdultVideos/AdultVideoXmlProvider.cs b/MediaBrowser.Providers/AdultVideos/AdultVideoXmlProvider.cs index d98989503b..fcdaf29fd3 100644 --- a/MediaBrowser.Providers/AdultVideos/AdultVideoXmlProvider.cs +++ b/MediaBrowser.Providers/AdultVideos/AdultVideoXmlProvider.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.Providers.AdultVideos new MovieXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { return MovieXmlProvider.GetXmlFileInfo(info, FileSystem); } diff --git a/MediaBrowser.Providers/BaseXmlProvider.cs b/MediaBrowser.Providers/BaseXmlProvider.cs index eb3be0eeb6..9086880868 100644 --- a/MediaBrowser.Providers/BaseXmlProvider.cs +++ b/MediaBrowser.Providers/BaseXmlProvider.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Logging; using System; using System.IO; using System.Threading; @@ -17,7 +18,7 @@ namespace MediaBrowser.Providers { var result = new LocalMetadataResult(); - var file = GetXmlFile(info); + var file = GetXmlFile(info, new DirectoryService(new NullLogger())); if (file == null) { @@ -58,12 +59,7 @@ namespace MediaBrowser.Providers FileSystem = fileSystem; } - protected abstract FileInfo GetXmlFile(ItemInfo info); - - protected virtual FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) - { - return GetXmlFile(info); - } + protected abstract FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService); public bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date) { diff --git a/MediaBrowser.Providers/BoxSets/BoxSetXmlProvider.cs b/MediaBrowser.Providers/BoxSets/BoxSetXmlProvider.cs index f3f60abdc4..e9896c28ed 100644 --- a/MediaBrowser.Providers/BoxSets/BoxSetXmlProvider.cs +++ b/MediaBrowser.Providers/BoxSets/BoxSetXmlProvider.cs @@ -25,9 +25,9 @@ namespace MediaBrowser.Providers.BoxSets new BaseItemXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { - return new FileInfo(Path.Combine(info.Path, "collection.xml")); + return directoryService.GetFile(Path.Combine(info.Path, "collection.xml")); } } } diff --git a/MediaBrowser.Providers/Folders/FolderXmlProvider.cs b/MediaBrowser.Providers/Folders/FolderXmlProvider.cs index 612cef79b5..978fb0f0cd 100644 --- a/MediaBrowser.Providers/Folders/FolderXmlProvider.cs +++ b/MediaBrowser.Providers/Folders/FolderXmlProvider.cs @@ -25,7 +25,7 @@ namespace MediaBrowser.Providers.Folders new BaseItemXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { return new FileInfo(Path.Combine(info.Path, "folder.xml")); } diff --git a/MediaBrowser.Providers/Games/GameSystemXmlProvider.cs b/MediaBrowser.Providers/Games/GameSystemXmlProvider.cs index e35d849dba..9efa93dfa0 100644 --- a/MediaBrowser.Providers/Games/GameSystemXmlProvider.cs +++ b/MediaBrowser.Providers/Games/GameSystemXmlProvider.cs @@ -22,9 +22,9 @@ namespace MediaBrowser.Providers.Games new GameSystemXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { - return new FileInfo(Path.Combine(info.Path, "gamesystem.xml")); + return directoryService.GetFile(Path.Combine(info.Path, "gamesystem.xml")); } } } diff --git a/MediaBrowser.Providers/Games/GameXmlProvider.cs b/MediaBrowser.Providers/Games/GameXmlProvider.cs index 4c09ce1a05..c12feb85c4 100644 --- a/MediaBrowser.Providers/Games/GameXmlProvider.cs +++ b/MediaBrowser.Providers/Games/GameXmlProvider.cs @@ -22,7 +22,7 @@ namespace MediaBrowser.Providers.Games new GameXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { var fileInfo = FileSystem.GetFileSystemInfo(info.Path); diff --git a/MediaBrowser.Providers/LiveTv/ChannelXmlProvider.cs b/MediaBrowser.Providers/LiveTv/ChannelXmlProvider.cs index 3d001596be..400ac825fc 100644 --- a/MediaBrowser.Providers/LiveTv/ChannelXmlProvider.cs +++ b/MediaBrowser.Providers/LiveTv/ChannelXmlProvider.cs @@ -22,9 +22,9 @@ namespace MediaBrowser.Providers.LiveTv new BaseItemXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { - return new FileInfo(Path.Combine(info.Path, "channel.xml")); + return directoryService.GetFile(Path.Combine(info.Path, "channel.xml")); } } } diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index 8f72e601b1..ea8c14a8c2 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -55,7 +55,7 @@ namespace MediaBrowser.Providers.Manager { var result = new RefreshResult { UpdateType = ItemUpdateType.None }; - var providers = GetImageProviders(item, imageProviders).ToList(); + var providers = imageProviders.ToList(); var providerIds = new List(); @@ -213,7 +213,7 @@ namespace MediaBrowser.Providers.Manager _logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name); - var images = await provider.GetAllImages(item, cancellationToken).ConfigureAwait(false); + var images = await _providerManager.GetAvailableRemoteImages(item, cancellationToken, provider.Name).ConfigureAwait(false); var list = images.ToList(); foreach (var type in _singularImages) @@ -244,24 +244,6 @@ namespace MediaBrowser.Providers.Manager } } - /// - /// Gets the image providers. - /// - /// The item. - /// The image providers. - /// IEnumerable{IImageProvider}. - private IEnumerable GetImageProviders(IHasImages item, IEnumerable imageProviders) - { - var providers = imageProviders; - - if (!_config.Configuration.EnableInternetProviders) - { - providers = providers.Where(i => !(i is IRemoteImageProvider)); - } - - return providers; - } - public bool MergeImages(IHasImages item, List images) { var changed = false; diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index d64c98d5b3..5b22677322 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -159,7 +159,15 @@ namespace MediaBrowser.Providers.Manager /// ItemUpdateType. protected virtual ItemUpdateType BeforeSave(TItemType item) { - return ItemUpdateType.None; + var updateType = ItemUpdateType.None; + + if (string.IsNullOrEmpty(item.Name) && !string.IsNullOrEmpty(item.Path)) + { + item.Name = Path.GetFileNameWithoutExtension(item.Path); + updateType = updateType | ItemUpdateType.MetadataEdit; + } + + return updateType; } /// @@ -318,7 +326,7 @@ namespace MediaBrowser.Providers.Manager } // Local metadata is king - if any is found don't run remote providers - if (!options.ReplaceAllMetadata && !hasLocalMetadata) + if ((!options.ReplaceAllMetadata && !hasLocalMetadata) || options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh) { await ExecuteRemoteProviders(item, temp, providers.OfType>(), refreshResult, cancellationToken).ConfigureAwait(false); } diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index a7af795a12..db0a25ec6f 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -211,7 +211,7 @@ namespace MediaBrowser.Providers.Manager /// Task{IEnumerable{RemoteImageInfo}}. public async Task> GetAvailableRemoteImages(IHasImages item, CancellationToken cancellationToken, string providerName = null, ImageType? type = null) { - var providers = GetRemoteImageProviders(item); + var providers = GetRemoteImageProviders(item, true); if (!string.IsNullOrEmpty(providerName)) { @@ -277,27 +277,38 @@ namespace MediaBrowser.Providers.Manager /// IEnumerable{IImageProvider}. public IEnumerable GetRemoteImageProviderInfo(IHasImages item) { - return GetRemoteImageProviders(item).Select(i => new ImageProviderInfo + return GetRemoteImageProviders(item, true).Select(i => new ImageProviderInfo { - Name = i.Name + Name = i.Name, + SupportedImages = i.GetSupportedImages(item).ToList() }); } public IEnumerable GetImageProviders(IHasImages item) { - return ImageProviders.Where(i => + return GetImageProviders(item, GetMetadataOptions(item), false); + } + + private IEnumerable GetImageProviders(IHasImages item, MetadataOptions options, bool includeDisabled) + { + return ImageProviders.Where(i => CanRefresh(i, item, options, includeDisabled)) + .OrderBy(i => { - try + // See if there's a user-defined order + if (!(i is ILocalImageProvider)) { - return i.Supports(item); - } - catch (Exception ex) - { - _logger.ErrorException("{0} failed in Supports for type {1}", ex, i.GetType().Name, item.GetType().Name); - return false; + var index = Array.IndexOf(options.ImageFetcherOrder, i.Name); + + if (index != -1) + { + return index; + } } - }).OrderBy(GetOrder); + // Not configured. Just return some high number to put it at the end. + return 100; + }) + .ThenBy(GetOrder); } public IEnumerable> GetMetadataProviders(IHasMetadata item) @@ -312,13 +323,13 @@ namespace MediaBrowser.Providers.Manager where T : IHasMetadata { return _metadataProviders.OfType>() - .Where(i => CanRefresh(i, item, includeDisabled)) + .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.LocalMetadataReaders, i.Name); + var index = Array.IndexOf(options.LocalMetadataReaderOrder, i.Name); if (index != -1) { @@ -326,29 +337,46 @@ namespace MediaBrowser.Providers.Manager } } + // 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; + } + } + // Not configured. Just return some high number to put it at the end. return 100; }) .ThenBy(GetOrder); } - private IEnumerable GetRemoteImageProviders(IHasImages item) + private IEnumerable GetRemoteImageProviders(IHasImages item, bool includeDisabled) { - return GetImageProviders(item).OfType(); + var options = GetMetadataOptions(item); + + return GetImageProviders(item, options, includeDisabled).OfType(); } - /// - /// Determines whether this instance can refresh the specified provider. - /// - /// The provider. - /// The item. - /// if set to true [include disabled]. - /// true if this instance can refresh the specified provider; otherwise, false. - private bool CanRefresh(IMetadataProvider provider, IHasMetadata item, bool includeDisabled) + private bool CanRefresh(IMetadataProvider provider, IHasMetadata item, MetadataOptions options, bool includeDisabled) { - if (!includeDisabled && !ConfigurationManager.Configuration.EnableInternetProviders && provider is IRemoteMetadataProvider) + if (!includeDisabled) { - return false; + if (provider is IRemoteMetadataProvider) + { + if (!ConfigurationManager.Configuration.EnableInternetProviders) + { + return false; + } + + if (Array.IndexOf(options.DisabledMetadataFetchers, provider.Name) != -1) + { + return false; + } + } } if (!item.SupportsLocalMetadata && provider is ILocalMetadataProvider) @@ -368,6 +396,40 @@ namespace MediaBrowser.Providers.Manager return true; } + private bool CanRefresh(IImageProvider provider, IHasImages item, MetadataOptions options, bool includeDisabled) + { + if (!includeDisabled) + { + if (provider is IRemoteImageProvider) + { + if (!ConfigurationManager.Configuration.EnableInternetProviders) + { + return false; + } + + if (Array.IndexOf(options.DisabledImageFetchers, provider.Name) != -1) + { + return false; + } + } + } + + if (!item.SupportsLocalMetadata && provider is ILocalImageProvider) + { + return false; + } + + try + { + return provider.Supports(item); + } + catch (Exception ex) + { + _logger.ErrorException("{0} failed in Supports for type {1}", ex, provider.GetType().Name, item.GetType().Name); + return false; + } + } + /// /// Gets the order. /// @@ -454,7 +516,7 @@ namespace MediaBrowser.Providers.Manager ItemType = typeof(T).Name }; - var imageProviders = GetImageProviders(dummy).ToList(); + var imageProviders = GetImageProviders(dummy, options, true).ToList(); AddMetadataPlugins(summary.Plugins, dummy, options); AddImagePlugins(summary.Plugins, dummy, imageProviders); @@ -513,7 +575,7 @@ namespace MediaBrowser.Providers.Manager })); } - public MetadataOptions GetMetadataOptions(IHasMetadata item) + public MetadataOptions GetMetadataOptions(IHasImages item) { var type = item.GetType().Name; diff --git a/MediaBrowser.Providers/Movies/MovieXmlProvider.cs b/MediaBrowser.Providers/Movies/MovieXmlProvider.cs index afc0055a78..bb76502552 100644 --- a/MediaBrowser.Providers/Movies/MovieXmlProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieXmlProvider.cs @@ -22,7 +22,7 @@ namespace MediaBrowser.Providers.Movies new MovieXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { return GetXmlFileInfo(info, FileSystem); } diff --git a/MediaBrowser.Providers/Movies/TrailerXmlProvider.cs b/MediaBrowser.Providers/Movies/TrailerXmlProvider.cs index 044d87a48a..df90d32cad 100644 --- a/MediaBrowser.Providers/Movies/TrailerXmlProvider.cs +++ b/MediaBrowser.Providers/Movies/TrailerXmlProvider.cs @@ -22,7 +22,7 @@ namespace MediaBrowser.Providers.Movies new MovieXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { return MovieXmlProvider.GetXmlFileInfo(info, FileSystem); } diff --git a/MediaBrowser.Providers/Music/AlbumXmlProvider.cs b/MediaBrowser.Providers/Music/AlbumXmlProvider.cs index 18e59fe68b..60bc18b2f6 100644 --- a/MediaBrowser.Providers/Music/AlbumXmlProvider.cs +++ b/MediaBrowser.Providers/Music/AlbumXmlProvider.cs @@ -22,9 +22,9 @@ namespace MediaBrowser.Providers.Music new BaseItemXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { - return new FileInfo(Path.Combine(info.Path, "album.xml")); + return directoryService.GetFile(Path.Combine(info.Path, "album.xml")); } } } diff --git a/MediaBrowser.Providers/Music/ArtistXmlProvider.cs b/MediaBrowser.Providers/Music/ArtistXmlProvider.cs index f6da70702f..89ba1c7943 100644 --- a/MediaBrowser.Providers/Music/ArtistXmlProvider.cs +++ b/MediaBrowser.Providers/Music/ArtistXmlProvider.cs @@ -22,9 +22,9 @@ namespace MediaBrowser.Providers.Music new BaseItemXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { - return new FileInfo(Path.Combine(info.Path, "artist.xml")); + return directoryService.GetFile(Path.Combine(info.Path, "artist.xml")); } } } diff --git a/MediaBrowser.Providers/Music/MusicVideoXmlProvider.cs b/MediaBrowser.Providers/Music/MusicVideoXmlProvider.cs index 3911777c1c..4291f23693 100644 --- a/MediaBrowser.Providers/Music/MusicVideoXmlProvider.cs +++ b/MediaBrowser.Providers/Music/MusicVideoXmlProvider.cs @@ -24,7 +24,7 @@ namespace MediaBrowser.Providers.Music new MusicVideoXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { return MovieXmlProvider.GetXmlFileInfo(info, FileSystem); } diff --git a/MediaBrowser.Providers/People/PersonXmlProvider.cs b/MediaBrowser.Providers/People/PersonXmlProvider.cs index 9248e1b670..4a145a1c04 100644 --- a/MediaBrowser.Providers/People/PersonXmlProvider.cs +++ b/MediaBrowser.Providers/People/PersonXmlProvider.cs @@ -22,9 +22,9 @@ namespace MediaBrowser.Providers.People new BaseItemXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { - return new FileInfo(Path.Combine(info.Path, "person.xml")); + return directoryService.GetFile(Path.Combine(info.Path, "person.xml")); } } } diff --git a/MediaBrowser.Providers/TV/EpisodeXmlProvider.cs b/MediaBrowser.Providers/TV/EpisodeXmlProvider.cs index 0f4ad14857..3def297e72 100644 --- a/MediaBrowser.Providers/TV/EpisodeXmlProvider.cs +++ b/MediaBrowser.Providers/TV/EpisodeXmlProvider.cs @@ -22,15 +22,6 @@ namespace MediaBrowser.Providers.TV new EpisodeXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) - { - var metadataPath = Path.GetDirectoryName(info.Path); - metadataPath = Path.Combine(metadataPath, "metadata"); - var metadataFile = Path.Combine(metadataPath, Path.ChangeExtension(Path.GetFileName(info.Path), ".xml")); - - return new FileInfo(metadataFile); - } - protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { var metadataPath = Path.GetDirectoryName(info.Path); diff --git a/MediaBrowser.Providers/TV/SeasonXmlProvider.cs b/MediaBrowser.Providers/TV/SeasonXmlProvider.cs index 07bec8dc95..e53a2deff4 100644 --- a/MediaBrowser.Providers/TV/SeasonXmlProvider.cs +++ b/MediaBrowser.Providers/TV/SeasonXmlProvider.cs @@ -25,9 +25,9 @@ namespace MediaBrowser.Providers.TV new BaseItemXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { - return new FileInfo(Path.Combine(info.Path, "season.xml")); + return directoryService.GetFile(Path.Combine(info.Path, "season.xml")); } } } diff --git a/MediaBrowser.Providers/TV/SeriesXmlProvider.cs b/MediaBrowser.Providers/TV/SeriesXmlProvider.cs index 3a0c7f9d78..53599ef555 100644 --- a/MediaBrowser.Providers/TV/SeriesXmlProvider.cs +++ b/MediaBrowser.Providers/TV/SeriesXmlProvider.cs @@ -25,9 +25,9 @@ namespace MediaBrowser.Providers.TV new SeriesXmlParser(_logger).Fetch(result.Item, path, cancellationToken); } - protected override FileInfo GetXmlFile(ItemInfo info) + protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService) { - return new FileInfo(Path.Combine(info.Path, "series.xml")); + return directoryService.GetFile(Path.Combine(info.Path, "series.xml")); } } } diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs index b9def8e262..f25cf541b4 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs @@ -793,10 +793,15 @@ namespace MediaBrowser.Server.Implementations.LiveTv double percent = numComplete; percent /= allChannelsList.Count; - progress.Report(90 * percent + 10); + progress.Report(80 * percent + 10); } _programs = programs.ToDictionary(i => i.Id); + + // Load these now which will prefetch metadata + await GetRecordings(new RecordingQuery(), cancellationToken).ConfigureAwait(false); + + progress.Report(100); } private double GetGuideDays(int channelCount) diff --git a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs index 6713122742..4e84693262 100644 --- a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs +++ b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs @@ -210,7 +210,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager } catch (Exception ex) { - _logger.ErrorException("{0} failed processing WebSocket message {1}", ex, i.GetType().Name, result.MessageType); + _logger.ErrorException("{0} failed processing WebSocket message {1}", ex, i.GetType().Name, result.MessageType ?? string.Empty); } }));