From b38bcdf3a7f7c465b5f7c11c474165a1f0314d30 Mon Sep 17 00:00:00 2001 From: del Date: Wed, 1 May 2024 14:26:32 +0700 Subject: [PATCH 1/2] fix warning CA1819 in LibraryOptions.cs --- .../Collections/CollectionManager.cs | 3 +- .../Library/LibraryManager.cs | 12 ++-- .../Controllers/LibraryStructureController.cs | 2 +- .../Configuration/LibraryOptions.cs | 56 ++++++++++++++----- .../Manager/ItemImageProvider.cs | 2 +- .../Manager/ProviderManager.cs | 6 +- .../MediaInfo/FFProbeVideoInfo.cs | 6 +- .../MediaInfo/SubtitleScheduledTask.cs | 8 +-- .../Recordings/RecordingsManager.cs | 6 +- .../Manager/ItemImageProviderTests.cs | 43 +++----------- .../Manager/ProviderManagerTests.cs | 10 ++-- 11 files changed, 75 insertions(+), 79 deletions(-) diff --git a/Emby.Server.Implementations/Collections/CollectionManager.cs b/Emby.Server.Implementations/Collections/CollectionManager.cs index e414792ba0..e72265f3d7 100644 --- a/Emby.Server.Implementations/Collections/CollectionManager.cs +++ b/Emby.Server.Implementations/Collections/CollectionManager.cs @@ -95,11 +95,10 @@ namespace Emby.Server.Implementations.Collections var libraryOptions = new LibraryOptions { - PathInfos = new[] { new MediaPathInfo(path) }, EnableRealtimeMonitor = false, SaveLocalMetadata = true }; - + libraryOptions.SetPathInfos(new[] { new MediaPathInfo(path) }); var name = _localizationManager.GetLocalizedString("Collections"); await _libraryManager.AddVirtualFolder(name, CollectionTypeOptions.boxsets, libraryOptions, true).ConfigureAwait(false); diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 3e41a50485..fa52bbae49 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -3040,7 +3040,7 @@ namespace Emby.Server.Implementations.Library var list = libraryOptions.PathInfos.ToList(); list.Add(pathInfo); - libraryOptions.PathInfos = list.ToArray(); + libraryOptions.SetPathInfos(list.ToArray()); SyncLibraryOptionsToLocations(virtualFolderPath, libraryOptions); @@ -3069,7 +3069,7 @@ namespace Emby.Server.Implementations.Library } } - libraryOptions.PathInfos = list.ToArray(); + libraryOptions.SetPathInfos(list.ToArray()); CollectionFolder.SaveLibraryOptions(virtualFolderPath, libraryOptions); } @@ -3079,7 +3079,7 @@ namespace Emby.Server.Implementations.Library var topLibraryFolders = GetUserRootFolder().Children.ToList(); var info = GetVirtualFolderInfo(virtualFolderPath, topLibraryFolders, null); - if (info.Locations.Length > 0 && info.Locations.Length != options.PathInfos.Length) + if (info.Locations.Length > 0 && info.Locations.Length != options.PathInfos.Count) { var list = options.PathInfos.ToList(); @@ -3091,7 +3091,7 @@ namespace Emby.Server.Implementations.Library } } - options.PathInfos = list.ToArray(); + options.SetPathInfos(list.ToArray()); } } @@ -3189,10 +3189,10 @@ namespace Emby.Server.Implementations.Library var libraryOptions = CollectionFolder.GetLibraryOptions(virtualFolderPath); - libraryOptions.PathInfos = libraryOptions + libraryOptions.SetPathInfos(libraryOptions .PathInfos .Where(i => !string.Equals(i.Path, mediaPath, StringComparison.Ordinal)) - .ToArray(); + .ToArray()); CollectionFolder.SaveLibraryOptions(virtualFolderPath, libraryOptions); } diff --git a/Jellyfin.Api/Controllers/LibraryStructureController.cs b/Jellyfin.Api/Controllers/LibraryStructureController.cs index f685eeaa0e..d71ddbdbfe 100644 --- a/Jellyfin.Api/Controllers/LibraryStructureController.cs +++ b/Jellyfin.Api/Controllers/LibraryStructureController.cs @@ -85,7 +85,7 @@ public class LibraryStructureController : BaseJellyfinApiController if (paths is not null && paths.Length > 0) { - libraryOptions.PathInfos = paths.Select(i => new MediaPathInfo(i)).ToArray(); + libraryOptions.SetPathInfos(paths.Select(i => new MediaPathInfo(i)).ToArray()); } await _libraryManager.AddVirtualFolder(name, collectionType, libraryOptions, refreshLibrary).ConfigureAwait(false); diff --git a/MediaBrowser.Model/Configuration/LibraryOptions.cs b/MediaBrowser.Model/Configuration/LibraryOptions.cs index 7ce75b2bce..057f3aacc9 100644 --- a/MediaBrowser.Model/Configuration/LibraryOptions.cs +++ b/MediaBrowser.Model/Configuration/LibraryOptions.cs @@ -1,19 +1,25 @@ #pragma warning disable CS1591 using System; +using System.Collections.Generic; using System.ComponentModel; namespace MediaBrowser.Model.Configuration { public class LibraryOptions { + private ICollection _typeOptions; + private ICollection? _localMetadataReaderOrder = []; + private ICollection _pathInfos = []; + public LibraryOptions() { - TypeOptions = Array.Empty(); - DisabledSubtitleFetchers = Array.Empty(); + _typeOptions = Array.Empty(); + DisabledSubtitleFetchers = []; + SubtitleDownloadLanguages = []; SubtitleFetcherOrder = Array.Empty(); DisabledLocalMetadataReaders = Array.Empty(); - + MetadataSavers = []; SkipSubtitlesIfAudioTrackMatches = true; RequirePerfectSubtitleMatch = true; AllowEmbeddedSubtitles = EmbeddedSubtitleOptions.AllowAll; @@ -22,7 +28,7 @@ namespace MediaBrowser.Model.Configuration EnablePhotos = true; SaveSubtitlesWithMedia = true; SaveLyricsWithMedia = true; - PathInfos = Array.Empty(); + _pathInfos = Array.Empty(); EnableAutomaticSeriesGrouping = true; SeasonZeroDisplayName = "Specials"; } @@ -43,7 +49,10 @@ namespace MediaBrowser.Model.Configuration public bool ExtractTrickplayImagesDuringLibraryScan { get; set; } - public MediaPathInfo[] PathInfos { get; set; } + public ICollection PathInfos + { + get => _pathInfos; + } public bool SaveLocalMetadata { get; set; } @@ -74,21 +83,24 @@ namespace MediaBrowser.Model.Configuration public string SeasonZeroDisplayName { get; set; } - public string[]? MetadataSavers { get; set; } + public ICollection? MetadataSavers { get; } - public string[] DisabledLocalMetadataReaders { get; set; } + public ICollection DisabledLocalMetadataReaders { get; } - public string[]? LocalMetadataReaderOrder { get; set; } + public ICollection? LocalMetadataReaderOrder + { + get => _localMetadataReaderOrder; + } - public string[] DisabledSubtitleFetchers { get; set; } + public ICollection DisabledSubtitleFetchers { get; } - public string[] SubtitleFetcherOrder { get; set; } + public ICollection SubtitleFetcherOrder { get; } public bool SkipSubtitlesIfEmbeddedSubtitlesPresent { get; set; } public bool SkipSubtitlesIfAudioTrackMatches { get; set; } - public string[]? SubtitleDownloadLanguages { get; set; } + public ICollection SubtitleDownloadLanguages { get; } public bool RequirePerfectSubtitleMatch { get; set; } @@ -101,9 +113,12 @@ namespace MediaBrowser.Model.Configuration public EmbeddedSubtitleOptions AllowEmbeddedSubtitles { get; set; } - public TypeOptions[] TypeOptions { get; set; } + public ICollection TypeOptions + { + get => _typeOptions; + } - public TypeOptions? GetTypeOptions(string type) + public TypeOptions? GetTypeOption(string type) { foreach (var options in TypeOptions) { @@ -115,5 +130,20 @@ namespace MediaBrowser.Model.Configuration return null; } + + public void SetTypeOptions(ICollection typeOptions) + { + _typeOptions = typeOptions; + } + + public void SetLocalMetadataReaderOrder(string[]? localMetadataReaderOrder) + { + _localMetadataReaderOrder = localMetadataReaderOrder ?? []; + } + + public void SetPathInfos(MediaPathInfo[] pathInfos) + { + _pathInfos = new List(pathInfos); + } } } diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index 1a5dbd7a55..ea6ec40858 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -138,7 +138,7 @@ namespace MediaBrowser.Providers.Manager var result = new RefreshResult { UpdateType = ItemUpdateType.None }; var typeName = item.GetType().Name; - var typeOptions = libraryOptions.GetTypeOptions(typeName) ?? new TypeOptions { Type = typeName }; + var typeOptions = libraryOptions.GetTypeOption(typeName) ?? new TypeOptions { Type = typeName }; // track library limits, adding buffer to allow lazy replacing of current images var backdropLimit = typeOptions.GetLimit(ImageType.Backdrop) + oldBackdropImages.Length; diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index 275f4028d0..b30bbb71b5 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -368,7 +368,7 @@ namespace MediaBrowser.Providers.Manager private IEnumerable GetImageProvidersInternal(BaseItem item, LibraryOptions libraryOptions, MetadataOptions options, ImageRefreshOptions refreshOptions, bool includeDisabled) { - var typeOptions = libraryOptions.GetTypeOptions(item.GetType().Name); + var typeOptions = libraryOptions.GetTypeOption(item.GetType().Name); var fetcherOrder = typeOptions?.ImageFetcherOrder ?? options.ImageFetcherOrder; return _imageProviders.Where(i => CanRefreshImages(i, item, typeOptions, refreshOptions, includeDisabled)) @@ -422,7 +422,7 @@ namespace MediaBrowser.Providers.Manager where T : BaseItem { var localMetadataReaderOrder = libraryOptions.LocalMetadataReaderOrder ?? globalMetadataOptions.LocalMetadataReaderOrder; - var typeOptions = libraryOptions.GetTypeOptions(item.GetType().Name); + var typeOptions = libraryOptions.GetTypeOption(item.GetType().Name); var metadataFetcherOrder = typeOptions?.MetadataFetcherOrder ?? globalMetadataOptions.MetadataFetcherOrder; return _metadataProviders.OfType>() @@ -432,7 +432,7 @@ namespace MediaBrowser.Providers.Manager // only relative order within a type matters: consumers of the list filter to one or the other i switch { - ILocalMetadataProvider => GetConfiguredOrder(localMetadataReaderOrder, i.Name), + ILocalMetadataProvider => GetConfiguredOrder(localMetadataReaderOrder.ToArray(), i.Name), IRemoteMetadataProvider => GetConfiguredOrder(metadataFetcherOrder, i.Name), // Default to end _ => int.MaxValue diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs index 5d0fccbe15..02580fd3ec 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs @@ -561,7 +561,7 @@ namespace MediaBrowser.Providers.MediaInfo } else { - subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages; + subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages.ToArray(); skipIfEmbeddedSubtitlesPresent = libraryOptions.SkipSubtitlesIfEmbeddedSubtitlesPresent; skipIfAudioTrackMatches = libraryOptions.SkipSubtitlesIfAudioTrackMatches; requirePerfectMatch = libraryOptions.RequirePerfectSubtitleMatch; @@ -579,8 +579,8 @@ namespace MediaBrowser.Providers.MediaInfo skipIfAudioTrackMatches, requirePerfectMatch, subtitleDownloadLanguages, - libraryOptions.DisabledSubtitleFetchers, - libraryOptions.SubtitleFetcherOrder, + libraryOptions.DisabledSubtitleFetchers.ToArray(), + libraryOptions.SubtitleFetcherOrder.ToArray(), true, cancellationToken).ConfigureAwait(false); diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs index 6eb75891aa..e46d944579 100644 --- a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs +++ b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs @@ -88,7 +88,7 @@ namespace MediaBrowser.Providers.MediaInfo } else { - subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages; + subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages.ToArray(); skipIfEmbeddedSubtitlesPresent = libraryOptions.SkipSubtitlesIfEmbeddedSubtitlesPresent; skipIfAudioTrackMatches = libraryOptions.SkipSubtitlesIfAudioTrackMatches; } @@ -181,7 +181,7 @@ namespace MediaBrowser.Providers.MediaInfo } else { - subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages; + subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages.ToArray(); skipIfEmbeddedSubtitlesPresent = libraryOptions.SkipSubtitlesIfEmbeddedSubtitlesPresent; skipIfAudioTrackMatches = libraryOptions.SkipSubtitlesIfAudioTrackMatches; requirePerfectMatch = libraryOptions.RequirePerfectSubtitleMatch; @@ -196,8 +196,8 @@ namespace MediaBrowser.Providers.MediaInfo skipIfAudioTrackMatches, requirePerfectMatch, subtitleDownloadLanguages, - libraryOptions.DisabledSubtitleFetchers, - libraryOptions.SubtitleFetcherOrder, + libraryOptions.DisabledSubtitleFetchers.ToArray(), + libraryOptions.SubtitleFetcherOrder.ToArray(), true, cancellationToken).ConfigureAwait(false); diff --git a/src/Jellyfin.LiveTv/Recordings/RecordingsManager.cs b/src/Jellyfin.LiveTv/Recordings/RecordingsManager.cs index 2f4caa3867..4fa2faaaee 100644 --- a/src/Jellyfin.LiveTv/Recordings/RecordingsManager.cs +++ b/src/Jellyfin.LiveTv/Recordings/RecordingsManager.cs @@ -201,10 +201,8 @@ public sealed class RecordingsManager : IRecordingsManager, IDisposable } var mediaPathInfos = pathsToCreate.Select(i => new MediaPathInfo(i)).ToArray(); - var libraryOptions = new LibraryOptions - { - PathInfos = mediaPathInfos - }; + var libraryOptions = new LibraryOptions(); + libraryOptions.SetPathInfos(mediaPathInfos); try { diff --git a/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs b/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs index be5a401b1a..466fed6c05 100644 --- a/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs +++ b/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs @@ -507,24 +507,9 @@ namespace Jellyfin.Providers.Tests.Manager var item = new Video(); - var libraryOptions = new LibraryOptions - { - TypeOptions = new[] - { - new TypeOptions - { - Type = item.GetType().Name, - ImageOptions = new[] - { - new ImageOption - { - Type = imageType, - MinWidth = 10 - } - } - } - } - }; + var typeOptions = new[] { new TypeOptions { Type = item.GetType().Name, ImageOptions = new[] { new ImageOption { Type = imageType, MinWidth = 10 } } } }; + var libraryOptions = new LibraryOptions(); + libraryOptions.SetTypeOptions(typeOptions); var remoteProvider = new Mock(MockBehavior.Strict); remoteProvider.Setup(rp => rp.Name).Returns("MockRemoteProvider"); @@ -626,24 +611,10 @@ namespace Jellyfin.Providers.Tests.Manager /// private static LibraryOptions GetLibraryOptions(BaseItem item, ImageType type, int count) { - return new LibraryOptions - { - TypeOptions = new[] - { - new TypeOptions - { - Type = item.GetType().Name, - ImageOptions = new[] - { - new ImageOption - { - Type = type, - Limit = count, - } - } - } - } - }; + var typeOptions = new[] { new TypeOptions { Type = item.GetType().Name, ImageOptions = new[] { new ImageOption { Type = type, Limit = count, } } } }; + var lib = new LibraryOptions(); + lib.SetTypeOptions(typeOptions.ToList()); + return lib; } } } diff --git a/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs b/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs index 6fccce0497..2cf8705eea 100644 --- a/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs +++ b/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs @@ -495,10 +495,8 @@ namespace Jellyfin.Providers.Tests.Manager string[]? localMetadataReaderOrder = null, string[]? metadataFetcherOrder = null) { - var libraryOptions = new LibraryOptions - { - LocalMetadataReaderOrder = localMetadataReaderOrder - }; + var libraryOptions = new LibraryOptions(); + libraryOptions.SetLocalMetadataReaderOrder(localMetadataReaderOrder); // only create type options if populating it with something if (imageFetcherOrder is not null || metadataFetcherOrder is not null) @@ -506,7 +504,7 @@ namespace Jellyfin.Providers.Tests.Manager imageFetcherOrder ??= Array.Empty(); metadataFetcherOrder ??= Array.Empty(); - libraryOptions.TypeOptions = new[] + libraryOptions.SetTypeOptions(new[] { new TypeOptions { @@ -514,7 +512,7 @@ namespace Jellyfin.Providers.Tests.Manager ImageFetcherOrder = imageFetcherOrder, MetadataFetcherOrder = metadataFetcherOrder } - }; + }); } return libraryOptions; From e8d8452b9dda882ad43dd26b8bc86d513a1bfbfa Mon Sep 17 00:00:00 2001 From: del Date: Wed, 1 May 2024 15:05:36 +0700 Subject: [PATCH 2/2] remove SetPathInfos in UpdateMediaPath --- Emby.Server.Implementations/Library/LibraryManager.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 96b3d1957f..f95c7d7254 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -3038,9 +3038,7 @@ namespace Emby.Server.Implementations.Library { var libraryOptions = CollectionFolder.GetLibraryOptions(virtualFolderPath); - var list = libraryOptions.PathInfos.ToList(); - list.Add(pathInfo); - libraryOptions.SetPathInfos(list.ToArray()); + libraryOptions.PathInfos.Add(pathInfo); SyncLibraryOptionsToLocations(virtualFolderPath, libraryOptions); @@ -3068,8 +3066,6 @@ namespace Emby.Server.Implementations.Library } } - libraryOptions.SetPathInfos(list.ToArray()); - CollectionFolder.SaveLibraryOptions(virtualFolderPath, libraryOptions); }