From 60780399c51165a06a04d8a01d59252bc9c82d7f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 17 Sep 2013 22:43:34 -0400 Subject: [PATCH] allow request header overrides --- .../HttpClientManager/HttpClientManager.cs | 9 +--- MediaBrowser.Common/Net/HttpRequestOptions.cs | 33 +++++++++++-- .../Drawing/ImageExtensions.cs | 11 ++++- .../Drawing/ImageHeader.cs | 24 ++++++---- MediaBrowser.Controller/IO/FileData.cs | 13 +++-- .../Providers/BaseMetadataProvider.cs | 28 +++++++---- MediaBrowser.Model/Querying/ItemFields.cs | 5 ++ .../Web/QueryStringDictionary.cs | 4 +- .../ImageFromMediaLocationProvider.cs | 4 +- .../MediaInfo/FFProbeVideoInfoProvider.cs | 47 ++++++++++++++++--- .../Dto/DtoService.cs | 6 ++- .../EntryPoints/Notifications/Notifier.cs | 2 +- .../HttpServer/RangeRequestWriter.cs | 3 +- .../Library/CoreResolutionIgnoreRule.cs | 1 + .../Library/LibraryManager.cs | 8 ++++ .../Resolvers/Audio/MusicAlbumResolver.cs | 13 ++++- .../Resolvers/Audio/MusicArtistResolver.cs | 8 ++++ .../Resolvers/Movies/BoxSetResolver.cs | 2 +- .../Library/Resolvers/TV/EpisodeResolver.cs | 7 +-- .../Library/Resolvers/TV/SeriesResolver.cs | 4 +- .../Library/UserManager.cs | 26 ---------- .../Library/Validators/ArtistsValidator.cs | 26 +++++----- .../Library/Validators/CountHelpers.cs | 2 +- .../Library/Validators/PeoplePostScanTask.cs | 8 +--- .../Providers/ImageSaver.cs | 4 +- .../Providers/ProviderManager.cs | 17 +++++-- .../ServerManager/ServerManager.cs | 5 +- .../Session/SessionManager.cs | 1 - .../Sorting/AlbumCountComparer.cs | 7 +-- .../Sorting/ArtistComparer.cs | 3 +- .../Sorting/EpisodeCountComparer.cs | 7 +-- .../Sorting/MusicVideoCountComparer.cs | 7 +-- .../Sorting/SongCountComparer.cs | 7 +-- .../Udp/UdpServer.cs | 1 - 34 files changed, 213 insertions(+), 140 deletions(-) diff --git a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs index 9eab2cdd89..cd26d601de 100644 --- a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs +++ b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs @@ -470,14 +470,9 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager { var message = new HttpRequestMessage(HttpMethod.Get, options.Url); - if (!string.IsNullOrEmpty(options.UserAgent)) + foreach (var pair in options.RequestHeaders.ToArray()) { - message.Headers.Add("User-Agent", options.UserAgent); - } - - if (!string.IsNullOrEmpty(options.AcceptHeader)) - { - message.Headers.Add("Accept", options.AcceptHeader); + message.Headers.Add(pair.Key, pair.Value); } return message; diff --git a/MediaBrowser.Common/Net/HttpRequestOptions.cs b/MediaBrowser.Common/Net/HttpRequestOptions.cs index 5579eb1cee..977a6aabe8 100644 --- a/MediaBrowser.Common/Net/HttpRequestOptions.cs +++ b/MediaBrowser.Common/Net/HttpRequestOptions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading; namespace MediaBrowser.Common.Net @@ -18,8 +19,14 @@ namespace MediaBrowser.Common.Net /// Gets or sets the accept header. /// /// The accept header. - public string AcceptHeader { get; set; } - + public string AcceptHeader + { + get { return GetHeaderValue("Accept"); } + set + { + RequestHeaders["Accept"] = value; + } + } /// /// Gets or sets the cancellation token. /// @@ -36,7 +43,14 @@ namespace MediaBrowser.Common.Net /// Gets or sets the user agent. /// /// The user agent. - public string UserAgent { get; set; } + public string UserAgent + { + get { return GetHeaderValue("User-Agent"); } + set + { + RequestHeaders["User-Agent"] = value; + } + } /// /// Gets or sets the progress. @@ -50,12 +64,25 @@ namespace MediaBrowser.Common.Net /// true if [enable HTTP compression]; otherwise, false. public bool EnableHttpCompression { get; set; } + public Dictionary RequestHeaders { get; private set; } + + private string GetHeaderValue(string name) + { + string value; + + RequestHeaders.TryGetValue(name, out value); + + return value; + } + /// /// Initializes a new instance of the class. /// public HttpRequestOptions() { EnableHttpCompression = true; + + RequestHeaders = new Dictionary(StringComparer.OrdinalIgnoreCase); } } } diff --git a/MediaBrowser.Controller/Drawing/ImageExtensions.cs b/MediaBrowser.Controller/Drawing/ImageExtensions.cs index 3d3b947a09..92b2ec8357 100644 --- a/MediaBrowser.Controller/Drawing/ImageExtensions.cs +++ b/MediaBrowser.Controller/Drawing/ImageExtensions.cs @@ -3,7 +3,6 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; -using System.Linq; namespace MediaBrowser.Controller.Drawing { @@ -61,7 +60,15 @@ namespace MediaBrowser.Controller.Drawing /// ImageCodecInfo. private static ImageCodecInfo GetImageCodecInfo(string mimeType) { - return Encoders.FirstOrDefault(i => i.MimeType.Equals(mimeType, StringComparison.OrdinalIgnoreCase)) ?? Encoders.FirstOrDefault(); + foreach (var encoder in Encoders) + { + if (string.Equals(encoder.MimeType, mimeType, StringComparison.OrdinalIgnoreCase)) + { + return encoder; + } + } + + return Encoders.Length == 0 ? null : Encoders[0]; } /// diff --git a/MediaBrowser.Controller/Drawing/ImageHeader.cs b/MediaBrowser.Controller/Drawing/ImageHeader.cs index 11072ff0ca..95a753f004 100644 --- a/MediaBrowser.Controller/Drawing/ImageHeader.cs +++ b/MediaBrowser.Controller/Drawing/ImageHeader.cs @@ -18,19 +18,22 @@ namespace MediaBrowser.Controller.Drawing /// /// The error message /// - const string errorMessage = "Could not recognize image format."; + const string ErrorMessage = "Could not recognize image format."; /// /// The image format decoders /// - private static readonly Dictionary> imageFormatDecoders = new Dictionary> + private static readonly KeyValuePair>[] ImageFormatDecoders = new Dictionary> { { new byte[] { 0x42, 0x4D }, DecodeBitmap }, { new byte[] { 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif }, { new byte[] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif }, { new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng }, - { new byte[] { 0xff, 0xd8 }, DecodeJfif }, - }; + { new byte[] { 0xff, 0xd8 }, DecodeJfif } + + }.ToArray(); + + private static readonly int MaxMagicBytesLength = ImageFormatDecoders.Select(i => i.Key.Length).OrderByDescending(i => i).First(); /// /// Gets the dimensions of an image. @@ -81,12 +84,13 @@ namespace MediaBrowser.Controller.Drawing /// The image was of an unrecognized format. private static Size GetDimensions(BinaryReader binaryReader) { - int maxMagicBytesLength = imageFormatDecoders.Keys.OrderByDescending(x => x.Length).First().Length; - var magicBytes = new byte[maxMagicBytesLength]; - for (int i = 0; i < maxMagicBytesLength; i += 1) + var magicBytes = new byte[MaxMagicBytesLength]; + + for (var i = 0; i < MaxMagicBytesLength; i += 1) { magicBytes[i] = binaryReader.ReadByte(); - foreach (var kvPair in imageFormatDecoders) + + foreach (var kvPair in ImageFormatDecoders) { if (StartsWith(magicBytes, kvPair.Key)) { @@ -95,7 +99,7 @@ namespace MediaBrowser.Controller.Drawing } } - throw new ArgumentException(errorMessage, "binaryReader"); + throw new ArgumentException(ErrorMessage, "binaryReader"); } /// @@ -217,7 +221,7 @@ namespace MediaBrowser.Controller.Drawing } } - throw new ArgumentException(errorMessage); + throw new ArgumentException(ErrorMessage); } } } diff --git a/MediaBrowser.Controller/IO/FileData.cs b/MediaBrowser.Controller/IO/FileData.cs index dc2b49c754..b1fc28e7b7 100644 --- a/MediaBrowser.Controller/IO/FileData.cs +++ b/MediaBrowser.Controller/IO/FileData.cs @@ -3,8 +3,6 @@ using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using MoreLinq; namespace MediaBrowser.Controller.IO { @@ -40,9 +38,14 @@ namespace MediaBrowser.Controller.IO if (!resolveShortcuts && flattenFolderDepth == 0) { // Seeing dupes on some users file system for some reason - return entries - .DistinctBy(i => i.FullName, StringComparer.OrdinalIgnoreCase) - .ToDictionary(i => i.FullName, StringComparer.OrdinalIgnoreCase); + var dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); + + foreach (var info in entries) + { + dictionary[info.FullName] = info; + } + + return dictionary; } var dict = new Dictionary(StringComparer.OrdinalIgnoreCase); diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs index b524a11aa4..39c999e82a 100644 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs @@ -1,14 +1,14 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; using System.Threading; using System.Threading.Tasks; @@ -330,6 +330,16 @@ namespace MediaBrowser.Controller.Providers return GetFileSystemStamp(item); } + private Dictionary _fileStampExtensionsDictionary; + private Dictionary FileStampExtensionsDictionary + { + get + { + return _fileStampExtensionsDictionary ?? + (_fileStampExtensionsDictionary = + FilestampExtensions.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase)); + } + } /// /// Gets the file system stamp. /// @@ -362,20 +372,20 @@ namespace MediaBrowser.Controller.Providers var sb = new StringBuilder(); - var extensionsList = FilestampExtensions; - var extensions = extensionsList.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); + var extensions = FileStampExtensionsDictionary; + var numExtensions = extensions.Count; // Record the name of each file // Need to sort these because accoring to msdn docs, our i/o methods are not guaranteed in any order foreach (var file in resolveArgs.FileSystemChildren - .Where(i => IncludeInFileStamp(i, extensions, extensionsList.Length)) + .Where(i => IncludeInFileStamp(i, extensions, numExtensions)) .OrderBy(f => f.Name)) { sb.Append(file.Name); } foreach (var file in resolveArgs.MetadataFiles - .Where(i => IncludeInFileStamp(i, extensions, extensionsList.Length)) + .Where(i => IncludeInFileStamp(i, extensions, numExtensions)) .OrderBy(f => f.Name)) { sb.Append(file.Name); diff --git a/MediaBrowser.Model/Querying/ItemFields.cs b/MediaBrowser.Model/Querying/ItemFields.cs index b39325fe23..8b0910acc8 100644 --- a/MediaBrowser.Model/Querying/ItemFields.cs +++ b/MediaBrowser.Model/Querying/ItemFields.cs @@ -116,6 +116,11 @@ namespace MediaBrowser.Model.Querying /// Revenue, + /// + /// The screenshot image tags + /// + ScreenshotImageTags, + /// /// The soundtrack ids /// diff --git a/MediaBrowser.Model/Web/QueryStringDictionary.cs b/MediaBrowser.Model/Web/QueryStringDictionary.cs index 29d91f0e91..f6c07c2f42 100644 --- a/MediaBrowser.Model/Web/QueryStringDictionary.cs +++ b/MediaBrowser.Model/Web/QueryStringDictionary.cs @@ -208,7 +208,9 @@ namespace MediaBrowser.Model.Web throw new ArgumentNullException("value"); } - Add(name, string.Join(",", value.Select(v => v.ToString()).ToArray())); + var paramValue = string.Join(",", value.ToArray()); + + Add(name, paramValue); } /// diff --git a/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs index 7e06408a37..b571848877 100644 --- a/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs @@ -1,5 +1,4 @@ -using System.Globalization; -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; @@ -9,6 +8,7 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Threading; diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs index ea090c8690..1406d8cd96 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs @@ -140,14 +140,25 @@ namespace MediaBrowser.Providers.MediaInfo public override async Task FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) { - var myItem = (Video)item; + var video = (Video)item; - var isoMount = await MountIsoIfNeeded(myItem, cancellationToken).ConfigureAwait(false); + var isoMount = await MountIsoIfNeeded(video, cancellationToken).ConfigureAwait(false); try { - OnPreFetch(myItem, isoMount); + OnPreFetch(video, isoMount); + // If we didn't find any satisfying the min length, just take them all + if (video.VideoType == VideoType.Dvd || (video.IsoType.HasValue && video.IsoType == IsoType.Dvd)) + { + if (video.PlayableStreamFileNames.Count == 0) + { + Logger.Error("No playable vobs found in dvd structure, skipping ffprobe."); + SetLastRefreshed(item, DateTime.UtcNow); + return true; + } + } + var result = await GetMediaInfo(item, isoMount, cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); @@ -156,9 +167,8 @@ namespace MediaBrowser.Providers.MediaInfo cancellationToken.ThrowIfCancellationRequested(); - await Fetch(myItem, force, cancellationToken, result, isoMount).ConfigureAwait(false); + await Fetch(video, force, cancellationToken, result, isoMount).ConfigureAwait(false); - SetLastRefreshed(item, DateTime.UtcNow); } finally { @@ -222,7 +232,25 @@ namespace MediaBrowser.Providers.MediaInfo // Try to eliminate menus and intros by skipping all files at the front of the list that are less than the minimum size // Once we reach a file that is at least the minimum, return all subsequent ones - var files = Directory.EnumerateFiles(root, "*.vob", SearchOption.AllDirectories).SkipWhile(f => new FileInfo(f).Length < minPlayableSize).ToList(); + var allVobs = Directory.EnumerateFiles(root, "*.vob", SearchOption.AllDirectories).ToList(); + + // If we didn't find any satisfying the min length, just take them all + if (allVobs.Count == 0) + { + Logger.Error("No vobs found in dvd structure."); + return; + } + + var files = allVobs + .SkipWhile(f => new FileInfo(f).Length < minPlayableSize) + .ToList(); + + // If we didn't find any satisfying the min length, just take them all + if (files.Count == 0) + { + Logger.Warn("Vob size filter resulted in zero matches. Taking all vobs."); + files = allVobs; + } // Assuming they're named "vts_05_01", take all files whose second part matches that of the first file if (files.Count > 0) @@ -240,6 +268,13 @@ namespace MediaBrowser.Providers.MediaInfo return fileParts.Length == 3 && string.Equals(title, fileParts[1], StringComparison.OrdinalIgnoreCase); }).ToList(); + + // If this resulted in not getting any vobs, just take them all + if (files.Count == 0) + { + Logger.Warn("Vob filename filter resulted in zero matches. Taking all vobs."); + files = allVobs; + } } } diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index feadc488f1..24b6f0fcee 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -759,7 +759,11 @@ namespace MediaBrowser.Server.Implementations.Dto dto.AspectRatio = item.AspectRatio; dto.BackdropImageTags = GetBackdropImageTags(item); - dto.ScreenshotImageTags = GetScreenshotImageTags(item); + + if (fields.Contains(ItemFields.ScreenshotImageTags)) + { + dto.ScreenshotImageTags = GetScreenshotImageTags(item); + } if (fields.Contains(ItemFields.Genres)) { diff --git a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs index a97711684c..fcb4406abe 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs @@ -8,10 +8,10 @@ using MediaBrowser.Controller.Notifications; using MediaBrowser.Controller.Plugins; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Notifications; +using MediaBrowser.Model.Tasks; using System; using System.Linq; using System.Threading; -using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications { diff --git a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs index 24292f0a14..3956eb69d4 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Linq; using System.Net; using System.Threading.Tasks; @@ -84,7 +83,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// private void SetRangeValues() { - var requestedRange = RequestedRanges.First(); + var requestedRange = RequestedRanges[0]; TotalContentLength = SourceStream.Length; diff --git a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs index c2e87cbd70..ededca314e 100644 --- a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs +++ b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs @@ -107,6 +107,7 @@ namespace MediaBrowser.Server.Implementations.Library { if (args.Parent != null) { + // Don't resolve these into audio files if (string.Equals(Path.GetFileNameWithoutExtension(filename), BaseItem.ThemeSongFilename) && EntityResolutionHelper.IsAudioFile(filename)) { return true; diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 5230bb4c38..9b78f39805 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -1036,6 +1036,10 @@ namespace MediaBrowser.Server.Implementations.Library { await i.Run(innerProgress, cancellationToken); } + catch (OperationCanceledException) + { + _logger.Info("Pre-scan task cancelled: {0}", i.GetType().Name); + } catch (Exception ex) { _logger.ErrorException("Error running prescan task", ex); @@ -1077,6 +1081,10 @@ namespace MediaBrowser.Server.Implementations.Library { await i.Run(innerProgress, cancellationToken); } + catch (OperationCanceledException) + { + _logger.Info("Post-scan task cancelled: {0}", i.GetType().Name); + } catch (Exception ex) { _logger.ErrorException("Error running postscan task", ex); diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs index 73c26dd644..bf65265384 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs @@ -1,11 +1,12 @@ using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; using System.IO; -using System.Linq; namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio { @@ -37,6 +38,12 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio if (args.Parent.IsRoot) return null; if (args.Parent is MusicAlbum) return null; + // Optimization + if (args.Parent is BoxSet || args.Parent is Series || args.Parent is Season) + { + return null; + } + var collectionType = args.GetCollectionType(); // If there's a collection type and it's not music, it can't be a series @@ -102,8 +109,10 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio // If list contains at least 2 audio files or at least one and no video files consider it to contain music var foundAudio = 0; - foreach (var fullName in list.Select(file => file.FullName)) + foreach (var file in list) { + var fullName = file.FullName; + if (EntityResolutionHelper.IsAudioFile(fullName)) foundAudio++; if (foundAudio >= 2) { diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs index 8aafbb0f77..54a32c367c 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs @@ -1,4 +1,6 @@ using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Model.Entities; @@ -41,6 +43,12 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio return null; } + // Optimization + if (args.Parent is BoxSet || args.Parent is Series || args.Parent is Season) + { + return null; + } + var collectionType = args.GetCollectionType(); // If there's a collection type and it's not music, it can't be a series diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/BoxSetResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/BoxSetResolver.cs index c2c3335c31..9afeb8eb9b 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/BoxSetResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/BoxSetResolver.cs @@ -2,9 +2,9 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Library; +using MediaBrowser.Model.Entities; using System; using System.IO; -using MediaBrowser.Model.Entities; namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies { diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs index 84d57b9725..0a6a72fc10 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs @@ -20,7 +20,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV var season = args.Parent as Season; // If the parent is a Season or Series, then this is an Episode if the VideoResolver returns something - if (season != null || args.Parent is Series) + if (season != null) { Episode episode = null; @@ -51,10 +51,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV if (episode != null) { - if (season != null) - { - episode.ParentIndexNumber = season.IndexNumber; - } + episode.ParentIndexNumber = season.IndexNumber; if (episode.ParentIndexNumber == null) { diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs index 5b49ab630b..38a3d44bb3 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs @@ -1,4 +1,6 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; @@ -41,7 +43,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV } // Optimization to avoid running these tests against Seasons - if (args.Parent is Series) + if (args.Parent is Series || args.Parent is MusicArtist || args.Parent is MusicAlbum || args.Parent is BoxSet) { return null; } diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs index 6619162129..04d0f6ab27 100644 --- a/MediaBrowser.Server.Implementations/Library/UserManager.cs +++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs @@ -4,10 +4,8 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; -using MediaBrowser.Controller.Session; using MediaBrowser.Model.Logging; using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; @@ -23,12 +21,6 @@ namespace MediaBrowser.Server.Implementations.Library /// public class UserManager : IUserManager { - /// - /// The _active connections - /// - private readonly ConcurrentDictionary _activeConnections = - new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); - /// /// The _users /// @@ -64,24 +56,6 @@ namespace MediaBrowser.Server.Implementations.Library } } - /// - /// Gets all connections. - /// - /// All connections. - public IEnumerable AllConnections - { - get { return _activeConnections.Values.OrderByDescending(c => c.LastActivityDate); } - } - - /// - /// Gets the active connections. - /// - /// The active connections. - public IEnumerable RecentConnections - { - get { return AllConnections.Where(c => (DateTime.UtcNow - c.LastActivityDate).TotalMinutes <= 5); } - } - /// /// The _logger /// diff --git a/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs index 607f324279..d359d211c9 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs @@ -57,10 +57,10 @@ namespace MediaBrowser.Server.Implementations.Library.Validators /// Task. public async Task Run(IProgress progress, CancellationToken cancellationToken) { - var allItems = _libraryManager.RootFolder.RecursiveChildren.ToList(); + var allItems = _libraryManager.RootFolder.RecursiveChildren.ToArray(); - var allMusicArtists = allItems.OfType().ToList(); - var allSongs = allItems.OfType