From 7d6ec0a5bd1bc62b764bd873f29ba542ce734729 Mon Sep 17 00:00:00 2001 From: Stanislav Ionascu Date: Wed, 7 Dec 2022 16:40:26 +0000 Subject: Fix to make sure that UDF streams are opened with Share.Read (#8276) Make sure that any subsequent requests to open the file for read will succeed. --- .../Library/Resolvers/BaseVideoResolver.cs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'Emby.Server.Implementations/Library') diff --git a/Emby.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs b/Emby.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs index cb377136ad..e8615e7db7 100644 --- a/Emby.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs @@ -163,17 +163,15 @@ namespace Emby.Server.Implementations.Library.Resolvers try { // use disc-utils, both DVDs and BDs use UDF filesystem - using (var videoFileStream = File.Open(video.Path, FileMode.Open, FileAccess.Read)) - using (UdfReader udfReader = new UdfReader(videoFileStream)) + using var videoFileStream = File.Open(video.Path, FileMode.Open, FileAccess.Read, FileShare.Read); + using UdfReader udfReader = new UdfReader(videoFileStream); + if (udfReader.DirectoryExists("VIDEO_TS")) { - if (udfReader.DirectoryExists("VIDEO_TS")) - { - video.IsoType = IsoType.Dvd; - } - else if (udfReader.DirectoryExists("BDMV")) - { - video.IsoType = IsoType.BluRay; - } + video.IsoType = IsoType.Dvd; + } + else if (udfReader.DirectoryExists("BDMV")) + { + video.IsoType = IsoType.BluRay; } } catch (Exception ex) -- cgit v1.2.3 From 9bb1bc5a3e744f8f7a4d4b63067c5db4e36d68c4 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 7 Dec 2022 18:02:12 +0100 Subject: Remove dependency on OptimizedPriorityQueue --- .../Library/LibraryManager.cs | 18 ++++++++-------- .../Providers/IProviderManager.cs | 2 +- MediaBrowser.Providers/Manager/ProviderManager.cs | 24 ++++++++-------------- .../MediaBrowser.Providers.csproj | 1 - 4 files changed, 18 insertions(+), 27 deletions(-) (limited to 'Emby.Server.Implementations/Library') diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 70439d258d..4bbb391cca 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -1154,7 +1154,7 @@ namespace Emby.Server.Implementations.Library .ToList(); } - private VirtualFolderInfo GetVirtualFolderInfo(string dir, List allCollectionFolders, Dictionary refreshQueue) + private VirtualFolderInfo GetVirtualFolderInfo(string dir, List allCollectionFolders, HashSet refreshQueue) { var info = new VirtualFolderInfo { @@ -1182,22 +1182,22 @@ namespace Emby.Server.Implementations.Library }; var libraryFolder = allCollectionFolders.FirstOrDefault(i => string.Equals(i.Path, dir, StringComparison.OrdinalIgnoreCase)); - - if (libraryFolder is not null && libraryFolder.HasImage(ImageType.Primary)) - { - info.PrimaryImageItemId = libraryFolder.Id.ToString("N", CultureInfo.InvariantCulture); - } - if (libraryFolder is not null) { - info.ItemId = libraryFolder.Id.ToString("N", CultureInfo.InvariantCulture); + var libraryFolderId = libraryFolder.Id.ToString("N", CultureInfo.InvariantCulture); + info.ItemId = libraryFolderId; + if (libraryFolder.HasImage(ImageType.Primary)) + { + info.PrimaryImageItemId = libraryFolderId; + } + info.LibraryOptions = GetLibraryOptions(libraryFolder); if (refreshQueue is not null) { info.RefreshProgress = libraryFolder.GetRefreshProgress(); - info.RefreshStatus = info.RefreshProgress.HasValue ? "Active" : refreshQueue.ContainsKey(libraryFolder.Id) ? "Queued" : "Idle"; + info.RefreshStatus = info.RefreshProgress.HasValue ? "Active" : refreshQueue.Contains(libraryFolder.Id) ? "Queued" : "Idle"; } } diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index 32a7951f62..7e0a69586c 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -216,7 +216,7 @@ namespace MediaBrowser.Controller.Providers /// Task{HttpResponseInfo}. Task GetSearchImage(string providerName, string url, CancellationToken cancellationToken); - Dictionary GetRefreshQueue(); + HashSet GetRefreshQueue(); void OnRefreshStart(BaseItem item); diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index d3ac2f6cda..914da33a96 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -31,7 +31,6 @@ using MediaBrowser.Model.IO; using MediaBrowser.Model.Net; using MediaBrowser.Model.Providers; using Microsoft.Extensions.Logging; -using Priority_Queue; using Book = MediaBrowser.Controller.Entities.Book; using Episode = MediaBrowser.Controller.Entities.TV.Episode; using Movie = MediaBrowser.Controller.Entities.Movies.Movie; @@ -58,7 +57,7 @@ namespace MediaBrowser.Providers.Manager private readonly IBaseItemManager _baseItemManager; private readonly ConcurrentDictionary _activeRefreshes = new(); private readonly CancellationTokenSource _disposeCancellationTokenSource = new(); - private readonly SimplePriorityQueue> _refreshQueue = new(); + private readonly PriorityQueue<(Guid ItemId, MetadataRefreshOptions RefreshOptions), RefreshPriority> _refreshQueue = new(); private IImageProvider[] _imageProviders = Array.Empty(); private IMetadataService[] _metadataServices = Array.Empty(); @@ -897,18 +896,11 @@ namespace MediaBrowser.Providers.Manager } /// - public Dictionary GetRefreshQueue() + public HashSet GetRefreshQueue() { lock (_refreshQueueLock) { - var dict = new Dictionary(); - - foreach (var item in _refreshQueue) - { - dict[item.Item1] = item.Item1; - } - - return dict; + return _refreshQueue.UnorderedItems.Select(x => x.Element.ItemId).ToHashSet(); } } @@ -969,7 +961,7 @@ namespace MediaBrowser.Providers.Manager return; } - _refreshQueue.Enqueue(new Tuple(itemId, options), (int)priority); + _refreshQueue.Enqueue((itemId, options), priority); lock (_refreshQueueLock) { @@ -992,7 +984,7 @@ namespace MediaBrowser.Providers.Manager var cancellationToken = _disposeCancellationTokenSource.Token; - while (_refreshQueue.TryDequeue(out Tuple refreshItem)) + while (_refreshQueue.TryDequeue(out var refreshItem, out _)) { if (_disposed) { @@ -1001,15 +993,15 @@ namespace MediaBrowser.Providers.Manager try { - var item = libraryManager.GetItemById(refreshItem.Item1); + var item = libraryManager.GetItemById(refreshItem.ItemId); if (item is null) { continue; } var task = item is MusicArtist artist - ? RefreshArtist(artist, refreshItem.Item2, cancellationToken) - : RefreshItem(item, refreshItem.Item2, cancellationToken); + ? RefreshArtist(artist, refreshItem.RefreshOptions, cancellationToken) + : RefreshItem(item, refreshItem.RefreshOptions, cancellationToken); await task.ConfigureAwait(false); } diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index d91402f51a..3712b50c6e 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -22,7 +22,6 @@ - -- cgit v1.2.3 From e4040ab812f30cc72436ce01b845f10717019276 Mon Sep 17 00:00:00 2001 From: Joe Rogers <1337joe@gmail.com> Date: Tue, 17 May 2022 22:58:49 +0200 Subject: Allow video extras to use owner library options --- .../Library/LibraryManager.cs | 37 ++++++++++------------ MediaBrowser.Controller/Entities/BaseItem.cs | 5 +++ MediaBrowser.Controller/Library/ILibraryManager.cs | 10 ++++-- 3 files changed, 30 insertions(+), 22 deletions(-) (limited to 'Emby.Server.Implementations/Library') diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 4bbb391cca..bf12e4e0aa 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -1998,39 +1998,36 @@ namespace Emby.Server.Implementations.Library } public List GetCollectionFolders(BaseItem item) + { + return GetCollectionFolders(item, GetUserRootFolder().Children.OfType()); + } + + public List GetCollectionFolders(BaseItem item, IEnumerable allUserRootChildren) { while (item is not null) { var parent = item.GetParent(); - if (parent is null || parent is AggregateFolder) + if (parent is AggregateFolder) { break; } - item = parent; - } - - if (item is null) - { - return new List(); - } - - return GetCollectionFoldersInternal(item, GetUserRootFolder().Children.OfType()); - } + if (parent is null) + { + var owner = item.GetOwner(); - public List GetCollectionFolders(BaseItem item, List allUserRootChildren) - { - while (item is not null) - { - var parent = item.GetParent(); + if (owner is null) + { + break; + } - if (parent is null || parent is AggregateFolder) + item = owner; + } + else { - break; + item = parent; } - - item = parent; } if (item is null) diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 32fe1b3b02..49dd151f36 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -2451,6 +2451,11 @@ namespace MediaBrowser.Controller.Entities return Task.FromResult(true); } + if (video.OwnerId.Equals(default)) + { + video.OwnerId = this.Id; + } + return RefreshMetadataForOwnedItem(video, copyTitleMetadata, newOptions, cancellationToken); } diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 5905c25a57..f34e3d68d9 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -429,10 +429,16 @@ namespace MediaBrowser.Controller.Library /// Gets the collection folders. /// /// The item. - /// IEnumerable<Folder>. + /// The folders that contain the item. List GetCollectionFolders(BaseItem item); - List GetCollectionFolders(BaseItem item, List allUserRootChildren); + /// + /// Gets the collection folders. + /// + /// The item. + /// The root folders to consider. + /// The folders that contain the item. + List GetCollectionFolders(BaseItem item, IEnumerable allUserRootChildren); LibraryOptions GetLibraryOptions(BaseItem item); -- cgit v1.2.3 From 497d8c495797e1bb37fbd92e7298439c1921a5fa Mon Sep 17 00:00:00 2001 From: Bond-009 Date: Mon, 19 Dec 2022 17:30:00 +0100 Subject: Use Order() introduced in .NET 7 (#8923) --- Emby.Server.Implementations/IO/LibraryMonitor.cs | 2 +- Emby.Server.Implementations/Library/LibraryManager.cs | 2 +- .../Library/Resolvers/Movies/MovieResolver.cs | 2 +- Jellyfin.Api/Controllers/FilterController.cs | 8 ++++---- MediaBrowser.Providers/Manager/MetadataService.cs | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) (limited to 'Emby.Server.Implementations/Library') diff --git a/Emby.Server.Implementations/IO/LibraryMonitor.cs b/Emby.Server.Implementations/IO/LibraryMonitor.cs index 4b999d40b8..f67a02be83 100644 --- a/Emby.Server.Implementations/IO/LibraryMonitor.cs +++ b/Emby.Server.Implementations/IO/LibraryMonitor.cs @@ -131,7 +131,7 @@ namespace Emby.Server.Implementations.IO .OfType() .SelectMany(f => f.PhysicalLocations) .Distinct(StringComparer.OrdinalIgnoreCase) - .OrderBy(i => i); + .Order(); foreach (var path in paths) { diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index bf12e4e0aa..a3c66dc798 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -1175,7 +1175,7 @@ namespace Emby.Server.Implementations.Library } }) .Where(i => i is not null) - .OrderBy(i => i) + .Order() .ToArray(), CollectionType = GetCollectionType(dir) diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index 5f1a3ec6de..1522cd3aef 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -529,7 +529,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies } return false; - }).OrderBy(i => i).ToList(); + }).Order().ToList(); // If different video types were found, don't allow this if (videoTypes.Distinct().Count() > 1) diff --git a/Jellyfin.Api/Controllers/FilterController.cs b/Jellyfin.Api/Controllers/FilterController.cs index b6780ee200..17d136384e 100644 --- a/Jellyfin.Api/Controllers/FilterController.cs +++ b/Jellyfin.Api/Controllers/FilterController.cs @@ -92,25 +92,25 @@ namespace Jellyfin.Api.Controllers Years = itemList.Select(i => i.ProductionYear ?? -1) .Where(i => i > 0) .Distinct() - .OrderBy(i => i) + .Order() .ToArray(), Genres = itemList.SelectMany(i => i.Genres) .DistinctNames() - .OrderBy(i => i) + .Order() .ToArray(), Tags = itemList .SelectMany(i => i.Tags) .Distinct(StringComparer.OrdinalIgnoreCase) - .OrderBy(i => i) + .Order() .ToArray(), OfficialRatings = itemList .Select(i => i.OfficialRating) .Where(i => !string.IsNullOrWhiteSpace(i)) .Distinct(StringComparer.OrdinalIgnoreCase) - .OrderBy(i => i) + .Order() .ToArray() }; } diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 5b5ca0fca1..ff06c7ce4d 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -465,7 +465,7 @@ namespace MediaBrowser.Providers.Manager .Distinct(StringComparer.OrdinalIgnoreCase) .ToArray(); - if (currentList.Length != item.Genres.Length || !currentList.OrderBy(i => i).SequenceEqual(item.Genres.OrderBy(i => i), StringComparer.OrdinalIgnoreCase)) + if (currentList.Length != item.Genres.Length || !currentList.Order().SequenceEqual(item.Genres.Order(), StringComparer.OrdinalIgnoreCase)) { updateType |= ItemUpdateType.MetadataEdit; } @@ -486,7 +486,7 @@ namespace MediaBrowser.Providers.Manager .Distinct(StringComparer.OrdinalIgnoreCase) .ToArray(); - if (currentList.Length != item.Studios.Length || !currentList.OrderBy(i => i).SequenceEqual(item.Studios.OrderBy(i => i), StringComparer.OrdinalIgnoreCase)) + if (currentList.Length != item.Studios.Length || !currentList.Order().SequenceEqual(item.Studios.Order(), StringComparer.OrdinalIgnoreCase)) { updateType |= ItemUpdateType.MetadataEdit; } -- cgit v1.2.3