diff options
13 files changed, 91 insertions, 96 deletions
diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs index d5df769a9..7e266a928 100644 --- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs +++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs @@ -54,7 +54,6 @@ namespace MediaBrowser.Controller.Providers CheckCharacters = false, IgnoreProcessingInstructions = true, IgnoreComments = true, - IgnoreWhitespace = true, ValidationType = ValidationType.None }; diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs index b69ece418..dd03c88de 100644 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs @@ -31,6 +31,12 @@ namespace MediaBrowser.Controller.Providers /// </summary> protected readonly Guid Id; + /// <summary> + /// The true task result + /// </summary> + protected static readonly Task<bool> TrueTaskResult = Task.FromResult(true); + protected static readonly Task<bool> FalseTaskResult = Task.FromResult(false); + protected static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(5, 5); /// <summary> @@ -207,7 +213,7 @@ namespace MediaBrowser.Controller.Providers return true; } - if (RefreshOnVersionChange && !string.Equals(ProviderVersion, providerInfo.ProviderVersion)) + if (RefreshOnVersionChange && !String.Equals(ProviderVersion, providerInfo.ProviderVersion)) { return true; } @@ -223,7 +229,7 @@ namespace MediaBrowser.Controller.Providers /// <returns><c>true</c> if [has file system stamp changed] [the specified item]; otherwise, <c>false</c>.</returns> protected bool HasFileSystemStampChanged(BaseItem item, BaseProviderInfo providerInfo) { - return !string.Equals(GetCurrentFileSystemStamp(item), providerInfo.FileSystemStamp); + return !String.Equals(GetCurrentFileSystemStamp(item), providerInfo.FileSystemStamp); } /// <summary> diff --git a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs index 465cfec92..f11ba8f97 100644 --- a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs @@ -53,11 +53,6 @@ namespace MediaBrowser.Controller.Providers } /// <summary> - /// The true task result - /// </summary> - protected static readonly Task<bool> TrueTaskResult = Task.FromResult(true); - - /// <summary> /// Fetches metadata and returns true or false indicating if any work that requires persistence was done /// </summary> /// <param name="item">The item.</param> diff --git a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs index b81e0c51d..4529e4890 100644 --- a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs +++ b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs @@ -81,26 +81,22 @@ namespace MediaBrowser.Controller.Providers.Movies /// <returns>Task{System.Boolean}.</returns> public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) { - // Since we don't have anything truly async, and since deserializing can be expensive, create a task to force parallelism - return Task.Run(() => + cancellationToken.ThrowIfCancellationRequested(); + + var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, LOCAL_META_FILE_NAME)); + if (entry.HasValue) { - cancellationToken.ThrowIfCancellationRequested(); - - var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, LOCAL_META_FILE_NAME)); - if (entry.HasValue) - { - // read in our saved meta and pass to processing function - var movieData = JsonSerializer.DeserializeFromFile<CompleteMovieData>(entry.Value.Path); + // read in our saved meta and pass to processing function + var movieData = JsonSerializer.DeserializeFromFile<CompleteMovieData>(entry.Value.Path); - cancellationToken.ThrowIfCancellationRequested(); + cancellationToken.ThrowIfCancellationRequested(); - ProcessMainInfo(item, movieData); + ProcessMainInfo(item, movieData); - SetLastRefreshed(item, DateTime.UtcNow); - return true; - } - return false; - }); + SetLastRefreshed(item, DateTime.UtcNow); + return TrueTaskResult; + } + return FalseTaskResult; } } } diff --git a/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs b/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs index e89f1a044..1860f16c2 100644 --- a/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs +++ b/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs @@ -92,28 +92,24 @@ namespace MediaBrowser.Controller.Providers.Movies /// <returns>Task{System.Boolean}.</returns> public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) { - return Task.Run(() => - { - cancellationToken.ThrowIfCancellationRequested(); + cancellationToken.ThrowIfCancellationRequested(); - try - { - var personInfo = JsonSerializer.DeserializeFromFile<PersonResult>(Path.Combine(item.MetaLocation, MetaFileName)); + try + { + var personInfo = JsonSerializer.DeserializeFromFile<PersonResult>(Path.Combine(item.MetaLocation, MetaFileName)); - cancellationToken.ThrowIfCancellationRequested(); - - ProcessInfo((Person)item, personInfo); + cancellationToken.ThrowIfCancellationRequested(); - SetLastRefreshed(item, DateTime.UtcNow); - return true; - } - catch (FileNotFoundException) - { - // This is okay - just means we force refreshed and there isn't a json file - return false; - } + ProcessInfo((Person)item, personInfo); - }); + SetLastRefreshed(item, DateTime.UtcNow); + return TrueTaskResult; + } + catch (FileNotFoundException) + { + // This is okay - just means we force refreshed and there isn't a json file + return FalseTaskResult; + } } } } diff --git a/MediaBrowser.Controller/Providers/Music/MusicArtistProviderFromJson.cs b/MediaBrowser.Controller/Providers/Music/MusicArtistProviderFromJson.cs index 6ff6a5182..ce96cd107 100644 --- a/MediaBrowser.Controller/Providers/Music/MusicArtistProviderFromJson.cs +++ b/MediaBrowser.Controller/Providers/Music/MusicArtistProviderFromJson.cs @@ -32,27 +32,24 @@ namespace MediaBrowser.Controller.Providers.Music public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) { - return Task.Run(() => - { - cancellationToken.ThrowIfCancellationRequested(); + cancellationToken.ThrowIfCancellationRequested(); - var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, LastfmHelper.LocalArtistMetaFileName)); - if (entry.HasValue) - { - // read in our saved meta and pass to processing function - var data = JsonSerializer.DeserializeFromFile<LastfmArtist>(entry.Value.Path); + var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, LastfmHelper.LocalArtistMetaFileName)); + if (entry.HasValue) + { + // read in our saved meta and pass to processing function + var data = JsonSerializer.DeserializeFromFile<LastfmArtist>(entry.Value.Path); - cancellationToken.ThrowIfCancellationRequested(); + cancellationToken.ThrowIfCancellationRequested(); - LastfmHelper.ProcessArtistData(item, data); + LastfmHelper.ProcessArtistData(item, data); - item.SetProviderId(MetadataProviders.Musicbrainz, data.mbid); + item.SetProviderId(MetadataProviders.Musicbrainz, data.mbid); - SetLastRefreshed(item, DateTime.UtcNow); - return true; - } - return false; - }); + SetLastRefreshed(item, DateTime.UtcNow); + return TrueTaskResult; + } + return FalseTaskResult; } public override MetadataProviderPriority Priority diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 6436e7716..eccaf2da4 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -574,7 +574,7 @@ namespace MediaBrowser.Server.Implementations.Library /// <summary> /// The images by name item cache /// </summary> - private readonly ConcurrentDictionary<string, object> _imagesByNameItemCache = new ConcurrentDictionary<string, object>(StringComparer.OrdinalIgnoreCase); + private readonly ConcurrentDictionary<string, BaseItem> _imagesByNameItemCache = new ConcurrentDictionary<string, BaseItem>(StringComparer.OrdinalIgnoreCase); /// <summary> /// Generically retrieves an IBN item @@ -588,7 +588,7 @@ namespace MediaBrowser.Server.Implementations.Library /// <returns>Task{``0}.</returns> /// <exception cref="System.ArgumentNullException"> /// </exception> - private Task<T> GetImagesByNameItem<T>(string path, string name, CancellationToken cancellationToken, bool allowSlowProviders = true, bool forceCreation = false) + private async Task<T> GetImagesByNameItem<T>(string path, string name, CancellationToken cancellationToken, bool allowSlowProviders = true, bool forceCreation = false) where T : BaseItem, new() { if (string.IsNullOrEmpty(path)) @@ -603,18 +603,16 @@ namespace MediaBrowser.Server.Implementations.Library var key = Path.Combine(path, FileSystem.GetValidFilename(name)); - if (forceCreation) - { - var task = CreateImagesByNameItem<T>(path, name, cancellationToken, allowSlowProviders); + BaseItem obj; - _imagesByNameItemCache.AddOrUpdate(key, task, (keyName, oldValue) => task); + if (forceCreation || !_imagesByNameItemCache.TryGetValue(key, out obj)) + { + obj = await CreateImagesByNameItem<T>(path, name, cancellationToken, allowSlowProviders).ConfigureAwait(false); - return task; + _imagesByNameItemCache.AddOrUpdate(key, obj, (keyName, oldValue) => obj); } - var obj = _imagesByNameItemCache.GetOrAdd(key, keyname => CreateImagesByNameItem<T>(path, name, cancellationToken, allowSlowProviders)); - - return obj as Task<T>; + return obj as T; } /// <summary> diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/VideoImagesTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/VideoImagesTask.cs index a995f1a47..a5c2f28b7 100644 --- a/MediaBrowser.Server.Implementations/ScheduledTasks/VideoImagesTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/VideoImagesTask.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.MediaInfo; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers.MediaInfo; using MediaBrowser.Model.Entities; @@ -95,33 +96,40 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks /// <returns>Task.</returns> public async Task Execute(CancellationToken cancellationToken, IProgress<double> progress) { - var items = _libraryManager.RootFolder.RecursiveChildren - .OfType<Video>() - .Where(i => - { - if (!string.IsNullOrEmpty(i.PrimaryImagePath)) - { - return false; - } + var allItems = _libraryManager.RootFolder.RecursiveChildren.ToList(); - if (i.LocationType != LocationType.FileSystem) - { - return false; - } + var localTrailers = allItems.SelectMany(i => i.LocalTrailers); - if (i.VideoType == VideoType.HdDvd) - { - return false; - } + var videos = allItems.OfType<Video>().ToList(); - if (i.VideoType == VideoType.Iso && !i.IsoType.HasValue) - { - return false; - } + var items = videos; + items.AddRange(localTrailers); + items.AddRange(videos.OfType<Movie>().SelectMany(i => i.SpecialFeatures).ToList()); + + items = items.Where(i => + { + if (!string.IsNullOrEmpty(i.PrimaryImagePath)) + { + return false; + } + + if (i.LocationType != LocationType.FileSystem) + { + return false; + } + + if (i.VideoType == VideoType.HdDvd) + { + return false; + } + + if (i.VideoType == VideoType.Iso && !i.IsoType.HasValue) + { + return false; + } - return i.MediaStreams != null && i.MediaStreams.Any(m => m.Type == MediaStreamType.Video); - }) - .ToList(); + return i.MediaStreams != null && i.MediaStreams.Any(m => m.Type == MediaStreamType.Video); + }).ToList(); progress.Report(0); diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteDisplayPreferencesRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteDisplayPreferencesRepository.cs index fbb0e4f8c..64a48c54d 100644 --- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteDisplayPreferencesRepository.cs +++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteDisplayPreferencesRepository.cs @@ -86,7 +86,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite { var dbFile = Path.Combine(_appPaths.DataPath, "displaypreferences.db"); - await ConnectToDB(dbFile).ConfigureAwait(false); + await ConnectToDb(dbFile).ConfigureAwait(false); string[] queries = { diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs index 3403cf79f..a3d184888 100644 --- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs @@ -82,7 +82,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite { var dbFile = Path.Combine(_appPaths.DataPath, "library.db"); - await ConnectToDB(dbFile).ConfigureAwait(false); + await ConnectToDb(dbFile).ConfigureAwait(false); string[] queries = { diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteRepository.cs index baeb0b1a7..6824442f1 100644 --- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteRepository.cs +++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteRepository.cs @@ -76,7 +76,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite /// <param name="dbPath">The db path.</param> /// <returns>Task{System.Boolean}.</returns> /// <exception cref="System.ArgumentNullException">dbPath</exception> - protected async Task ConnectToDB(string dbPath) + protected async Task ConnectToDb(string dbPath) { if (string.IsNullOrEmpty(dbPath)) { diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs index 8124733e5..6a7207d37 100644 --- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs +++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs @@ -86,7 +86,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite { var dbFile = Path.Combine(_appPaths.DataPath, "userdata.db"); - await ConnectToDB(dbFile).ConfigureAwait(false); + await ConnectToDb(dbFile).ConfigureAwait(false); string[] queries = { diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserRepository.cs index 75bb42774..b95a54156 100644 --- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserRepository.cs +++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserRepository.cs @@ -88,7 +88,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite { var dbFile = Path.Combine(_appPaths.DataPath, "users.db"); - await ConnectToDB(dbFile).ConfigureAwait(false); + await ConnectToDb(dbFile).ConfigureAwait(false); string[] queries = { |
