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