From 312ff4f3d875b9e5c738ee20273cd9f3bd32a58c Mon Sep 17 00:00:00 2001 From: JPVenson Date: Wed, 30 Oct 2024 10:05:52 +0000 Subject: [PATCH 1/8] Fixed disabled providers not beeing returned --- .../MediaSegments/MediaSegmentManager.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs index d641f521b9..9d38167ac6 100644 --- a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs +++ b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs @@ -141,6 +141,19 @@ public class MediaSegmentManager : IMediaSegmentManager /// public async Task> GetSegmentsAsync(Guid itemId, IEnumerable? typeFilter) { + var baseItem = _libraryManager.GetItemById(itemId); + + if (baseItem is null) + { + _logger.LogError("Tried to request segments for an invalid item"); + return []; + } + + var libraryOptions = _libraryManager.GetLibraryOptions(baseItem); + var providers = _segmentProviders + .Where(e => !libraryOptions.DisabledMediaSegmentProviders.Contains(GetProviderId(e.Name))) + .ToArray(); + using var db = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false); var query = db.MediaSegments @@ -151,6 +164,9 @@ public class MediaSegmentManager : IMediaSegmentManager query = query.Where(e => typeFilter.Contains(e.Type)); } + var providerIds = providers.Select(f => GetProviderId(f.Name)).ToArray(); + query = query.Where(e => providerIds.Contains(e.SegmentProviderId)); + return query .OrderBy(e => e.StartTicks) .AsNoTracking() From c08d1d5b7f45b41ef200e9604fa38096c1560a85 Mon Sep 17 00:00:00 2001 From: JPVenson Date: Wed, 30 Oct 2024 10:09:39 +0000 Subject: [PATCH 2/8] Added parameter to enable or disable library filter --- .../MediaSegments/MediaSegmentManager.cs | 18 ++++++++++-------- .../MediaSegements/IMediaSegmentManager.cs | 3 ++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs index 9d38167ac6..4abf5f9f8a 100644 --- a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs +++ b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs @@ -139,7 +139,7 @@ public class MediaSegmentManager : IMediaSegmentManager } /// - public async Task> GetSegmentsAsync(Guid itemId, IEnumerable? typeFilter) + public async Task> GetSegmentsAsync(Guid itemId, IEnumerable? typeFilter, bool filterByProvider = true) { var baseItem = _libraryManager.GetItemById(itemId); @@ -149,11 +149,6 @@ public class MediaSegmentManager : IMediaSegmentManager return []; } - var libraryOptions = _libraryManager.GetLibraryOptions(baseItem); - var providers = _segmentProviders - .Where(e => !libraryOptions.DisabledMediaSegmentProviders.Contains(GetProviderId(e.Name))) - .ToArray(); - using var db = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false); var query = db.MediaSegments @@ -164,8 +159,15 @@ public class MediaSegmentManager : IMediaSegmentManager query = query.Where(e => typeFilter.Contains(e.Type)); } - var providerIds = providers.Select(f => GetProviderId(f.Name)).ToArray(); - query = query.Where(e => providerIds.Contains(e.SegmentProviderId)); + if (filterByProvider) + { + var libraryOptions = _libraryManager.GetLibraryOptions(baseItem); + var providers = _segmentProviders + .Where(e => !libraryOptions.DisabledMediaSegmentProviders.Contains(GetProviderId(e.Name))) + .ToArray(); + var providerIds = providers.Select(f => GetProviderId(f.Name)).ToArray(); + query = query.Where(e => providerIds.Contains(e.SegmentProviderId)); + } return query .OrderBy(e => e.StartTicks) diff --git a/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs b/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs index 010d7edb4f..7980a38261 100644 --- a/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs +++ b/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs @@ -50,8 +50,9 @@ public interface IMediaSegmentManager /// /// The id of the . /// filteres all media segments of the given type to be included. If null all types are included. + /// When set filteres the segments to only return those that which providers are currently enabled on their library. /// An enumerator of 's. - Task> GetSegmentsAsync(Guid itemId, IEnumerable? typeFilter); + Task> GetSegmentsAsync(Guid itemId, IEnumerable? typeFilter, bool filterByProvider = true); /// /// Gets information about any media segments stored for the given itemId. From aa4dd04b992bdcb7f40a82ca09bc5ebc70d23df7 Mon Sep 17 00:00:00 2001 From: JPVenson Date: Wed, 30 Oct 2024 10:10:55 +0000 Subject: [PATCH 3/8] Added fast fail for no provider selected segment query --- .../MediaSegments/MediaSegmentManager.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs index 4abf5f9f8a..453b8e03dd 100644 --- a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs +++ b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs @@ -165,6 +165,11 @@ public class MediaSegmentManager : IMediaSegmentManager var providers = _segmentProviders .Where(e => !libraryOptions.DisabledMediaSegmentProviders.Contains(GetProviderId(e.Name))) .ToArray(); + if (providers.Length == 0) + { + return []; + } + var providerIds = providers.Select(f => GetProviderId(f.Name)).ToArray(); query = query.Where(e => providerIds.Contains(e.SegmentProviderId)); } From 013058015172d596ae67327e203ca03e20658813 Mon Sep 17 00:00:00 2001 From: JPVenson Date: Wed, 30 Oct 2024 10:25:57 +0000 Subject: [PATCH 4/8] Fixed interface definition --- .../Controllers/MediaSegmentsController.cs | 2 +- .../MediaSegments/MediaSegmentManager.cs | 14 ++++++++++---- .../MediaSegements/IMediaSegmentManager.cs | 9 +++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Jellyfin.Api/Controllers/MediaSegmentsController.cs b/Jellyfin.Api/Controllers/MediaSegmentsController.cs index 3dc5167a2e..2d1d4e2c8a 100644 --- a/Jellyfin.Api/Controllers/MediaSegmentsController.cs +++ b/Jellyfin.Api/Controllers/MediaSegmentsController.cs @@ -55,7 +55,7 @@ public class MediaSegmentsController : BaseJellyfinApiController return NotFound(); } - var items = await _mediaSegmentManager.GetSegmentsAsync(item.Id, includeSegmentTypes).ConfigureAwait(false); + var items = await _mediaSegmentManager.GetSegmentsAsync(item, includeSegmentTypes).ConfigureAwait(false); return Ok(new QueryResult(items.ToArray())); } } diff --git a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs index 453b8e03dd..1b9e7a17f0 100644 --- a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs +++ b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs @@ -139,20 +139,26 @@ public class MediaSegmentManager : IMediaSegmentManager } /// - public async Task> GetSegmentsAsync(Guid itemId, IEnumerable? typeFilter, bool filterByProvider = true) + public Task> GetSegmentsAsync(Guid itemId, IEnumerable? typeFilter, bool filterByProvider = true) { var baseItem = _libraryManager.GetItemById(itemId); if (baseItem is null) { _logger.LogError("Tried to request segments for an invalid item"); - return []; + return Task.FromResult>([]); } + return GetSegmentsAsync(baseItem, typeFilter, filterByProvider); + } + + /// + public async Task> GetSegmentsAsync(BaseItem item, IEnumerable? typeFilter, bool filterByProvider = true) + { using var db = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false); var query = db.MediaSegments - .Where(e => e.ItemId.Equals(itemId)); + .Where(e => e.ItemId.Equals(item.Id)); if (typeFilter is not null) { @@ -161,7 +167,7 @@ public class MediaSegmentManager : IMediaSegmentManager if (filterByProvider) { - var libraryOptions = _libraryManager.GetLibraryOptions(baseItem); + var libraryOptions = _libraryManager.GetLibraryOptions(item); var providers = _segmentProviders .Where(e => !libraryOptions.DisabledMediaSegmentProviders.Contains(GetProviderId(e.Name))) .ToArray(); diff --git a/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs b/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs index 7980a38261..72bd1da8aa 100644 --- a/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs +++ b/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs @@ -54,6 +54,15 @@ public interface IMediaSegmentManager /// An enumerator of 's. Task> GetSegmentsAsync(Guid itemId, IEnumerable? typeFilter, bool filterByProvider = true); + /// + /// Obtains all segments accociated with the itemId. + /// + /// The . + /// filteres all media segments of the given type to be included. If null all types are included. + /// When set filteres the segments to only return those that which providers are currently enabled on their library. + /// An enumerator of 's. + Task> GetSegmentsAsync(BaseItem itemId, IEnumerable? typeFilter, bool filterByProvider = true); + /// /// Gets information about any media segments stored for the given itemId. /// From 54a6a33c017fb50812cb8c849b50843b25fc782d Mon Sep 17 00:00:00 2001 From: JPVenson Date: Wed, 30 Oct 2024 10:31:10 +0000 Subject: [PATCH 5/8] renamed param --- .../MediaSegements/IMediaSegmentManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs b/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs index 72bd1da8aa..672f27eca2 100644 --- a/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs +++ b/MediaBrowser.Controller/MediaSegements/IMediaSegmentManager.cs @@ -57,11 +57,11 @@ public interface IMediaSegmentManager /// /// Obtains all segments accociated with the itemId. /// - /// The . + /// The . /// filteres all media segments of the given type to be included. If null all types are included. /// When set filteres the segments to only return those that which providers are currently enabled on their library. /// An enumerator of 's. - Task> GetSegmentsAsync(BaseItem itemId, IEnumerable? typeFilter, bool filterByProvider = true); + Task> GetSegmentsAsync(BaseItem item, IEnumerable? typeFilter, bool filterByProvider = true); /// /// Gets information about any media segments stored for the given itemId. From fe9c6fb8ae7d8b5c4b6362902b6e3acbc2e6df55 Mon Sep 17 00:00:00 2001 From: JPVenson Date: Thu, 31 Oct 2024 07:40:47 +0000 Subject: [PATCH 6/8] Fixed enumerable --- .../MediaSegments/MediaSegmentManager.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs index 1b9e7a17f0..33879dbf40 100644 --- a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs +++ b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs @@ -183,8 +183,9 @@ public class MediaSegmentManager : IMediaSegmentManager return query .OrderBy(e => e.StartTicks) .AsNoTracking() - .ToImmutableList() - .Select(Map); + .AsEnumerable() + .Select(Map) + .ToImmutableArray(); } private static MediaSegmentDto Map(MediaSegment segment) From 584be05e9340b11adf9cf49bec674f4c280116c1 Mon Sep 17 00:00:00 2001 From: JPVenson Date: Thu, 31 Oct 2024 17:51:56 +0000 Subject: [PATCH 7/8] reduced providerid build --- .../MediaSegments/MediaSegmentManager.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs index 33879dbf40..b7cf2c6655 100644 --- a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs +++ b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs @@ -168,15 +168,15 @@ public class MediaSegmentManager : IMediaSegmentManager if (filterByProvider) { var libraryOptions = _libraryManager.GetLibraryOptions(item); - var providers = _segmentProviders + var providerIds = _segmentProviders .Where(e => !libraryOptions.DisabledMediaSegmentProviders.Contains(GetProviderId(e.Name))) + .Select(f => GetProviderId(f.Name)) .ToArray(); - if (providers.Length == 0) + if (providerIds.Length == 0) { return []; } - var providerIds = providers.Select(f => GetProviderId(f.Name)).ToArray(); query = query.Where(e => providerIds.Contains(e.SegmentProviderId)); } From 1b4ab5e7777b88d6b4082dfa44b69783daed28ab Mon Sep 17 00:00:00 2001 From: JPVenson Date: Sat, 16 Nov 2024 18:39:11 +0000 Subject: [PATCH 8/8] pr review stuff --- .../MediaSegments/MediaSegmentManager.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs index b7cf2c6655..a044fec0d9 100644 --- a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs +++ b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs @@ -139,17 +139,17 @@ public class MediaSegmentManager : IMediaSegmentManager } /// - public Task> GetSegmentsAsync(Guid itemId, IEnumerable? typeFilter, bool filterByProvider = true) + public async Task> GetSegmentsAsync(Guid itemId, IEnumerable? typeFilter, bool filterByProvider = true) { var baseItem = _libraryManager.GetItemById(itemId); if (baseItem is null) { _logger.LogError("Tried to request segments for an invalid item"); - return Task.FromResult>([]); + return []; } - return GetSegmentsAsync(baseItem, typeFilter, filterByProvider); + return await GetSegmentsAsync(baseItem, typeFilter, filterByProvider).ConfigureAwait(false); } /// @@ -185,7 +185,7 @@ public class MediaSegmentManager : IMediaSegmentManager .AsNoTracking() .AsEnumerable() .Select(Map) - .ToImmutableArray(); + .ToArray(); } private static MediaSegmentDto Map(MediaSegment segment)