Gadael Sedubun 1 month ago committed by GitHub
commit 81affb4932
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -95,11 +95,10 @@ namespace Emby.Server.Implementations.Collections
var libraryOptions = new LibraryOptions var libraryOptions = new LibraryOptions
{ {
PathInfos = new[] { new MediaPathInfo(path) },
EnableRealtimeMonitor = false, EnableRealtimeMonitor = false,
SaveLocalMetadata = true SaveLocalMetadata = true
}; };
libraryOptions.SetPathInfos(new[] { new MediaPathInfo(path) });
var name = _localizationManager.GetLocalizedString("Collections"); var name = _localizationManager.GetLocalizedString("Collections");
await _libraryManager.AddVirtualFolder(name, CollectionTypeOptions.boxsets, libraryOptions, true).ConfigureAwait(false); await _libraryManager.AddVirtualFolder(name, CollectionTypeOptions.boxsets, libraryOptions, true).ConfigureAwait(false);

@ -3038,7 +3038,7 @@ namespace Emby.Server.Implementations.Library
{ {
var libraryOptions = CollectionFolder.GetLibraryOptions(virtualFolderPath); var libraryOptions = CollectionFolder.GetLibraryOptions(virtualFolderPath);
libraryOptions.PathInfos = [..libraryOptions.PathInfos, pathInfo]; libraryOptions.PathInfos.Add(pathInfo);
SyncLibraryOptionsToLocations(virtualFolderPath, libraryOptions); SyncLibraryOptionsToLocations(virtualFolderPath, libraryOptions);
@ -3074,7 +3074,7 @@ namespace Emby.Server.Implementations.Library
var topLibraryFolders = GetUserRootFolder().Children.ToList(); var topLibraryFolders = GetUserRootFolder().Children.ToList();
var info = GetVirtualFolderInfo(virtualFolderPath, topLibraryFolders, null); 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(); var list = options.PathInfos.ToList();
@ -3086,7 +3086,7 @@ namespace Emby.Server.Implementations.Library
} }
} }
options.PathInfos = list.ToArray(); options.SetPathInfos(list.ToArray());
} }
} }
@ -3184,10 +3184,10 @@ namespace Emby.Server.Implementations.Library
var libraryOptions = CollectionFolder.GetLibraryOptions(virtualFolderPath); var libraryOptions = CollectionFolder.GetLibraryOptions(virtualFolderPath);
libraryOptions.PathInfos = libraryOptions libraryOptions.SetPathInfos(libraryOptions
.PathInfos .PathInfos
.Where(i => !string.Equals(i.Path, mediaPath, StringComparison.Ordinal)) .Where(i => !string.Equals(i.Path, mediaPath, StringComparison.Ordinal))
.ToArray(); .ToArray());
CollectionFolder.SaveLibraryOptions(virtualFolderPath, libraryOptions); CollectionFolder.SaveLibraryOptions(virtualFolderPath, libraryOptions);
} }

@ -85,7 +85,7 @@ public class LibraryStructureController : BaseJellyfinApiController
if (paths is not null && paths.Length > 0) if (paths is not null && paths.Length > 0)
{ {
libraryOptions.PathInfos = Array.ConvertAll(paths, i => new MediaPathInfo(i)); libraryOptions.SetPathInfos(paths.Select(i => new MediaPathInfo(i)).ToArray());
} }
await _libraryManager.AddVirtualFolder(name, collectionType, libraryOptions, refreshLibrary).ConfigureAwait(false); await _libraryManager.AddVirtualFolder(name, collectionType, libraryOptions, refreshLibrary).ConfigureAwait(false);

@ -1,19 +1,25 @@
#pragma warning disable CS1591 #pragma warning disable CS1591
using System; using System;
using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
namespace MediaBrowser.Model.Configuration namespace MediaBrowser.Model.Configuration
{ {
public class LibraryOptions public class LibraryOptions
{ {
private ICollection<TypeOptions> _typeOptions;
private ICollection<string>? _localMetadataReaderOrder = [];
private ICollection<MediaPathInfo> _pathInfos = [];
public LibraryOptions() public LibraryOptions()
{ {
TypeOptions = Array.Empty<TypeOptions>(); _typeOptions = Array.Empty<TypeOptions>();
DisabledSubtitleFetchers = Array.Empty<string>(); DisabledSubtitleFetchers = [];
SubtitleDownloadLanguages = [];
SubtitleFetcherOrder = Array.Empty<string>(); SubtitleFetcherOrder = Array.Empty<string>();
DisabledLocalMetadataReaders = Array.Empty<string>(); DisabledLocalMetadataReaders = Array.Empty<string>();
MetadataSavers = [];
SkipSubtitlesIfAudioTrackMatches = true; SkipSubtitlesIfAudioTrackMatches = true;
RequirePerfectSubtitleMatch = true; RequirePerfectSubtitleMatch = true;
AllowEmbeddedSubtitles = EmbeddedSubtitleOptions.AllowAll; AllowEmbeddedSubtitles = EmbeddedSubtitleOptions.AllowAll;
@ -22,7 +28,7 @@ namespace MediaBrowser.Model.Configuration
EnablePhotos = true; EnablePhotos = true;
SaveSubtitlesWithMedia = true; SaveSubtitlesWithMedia = true;
SaveLyricsWithMedia = true; SaveLyricsWithMedia = true;
PathInfos = Array.Empty<MediaPathInfo>(); _pathInfos = Array.Empty<MediaPathInfo>();
EnableAutomaticSeriesGrouping = true; EnableAutomaticSeriesGrouping = true;
SeasonZeroDisplayName = "Specials"; SeasonZeroDisplayName = "Specials";
} }
@ -43,7 +49,10 @@ namespace MediaBrowser.Model.Configuration
public bool ExtractTrickplayImagesDuringLibraryScan { get; set; } public bool ExtractTrickplayImagesDuringLibraryScan { get; set; }
public MediaPathInfo[] PathInfos { get; set; } public ICollection<MediaPathInfo> PathInfos
{
get => _pathInfos;
}
public bool SaveLocalMetadata { get; set; } public bool SaveLocalMetadata { get; set; }
@ -74,21 +83,24 @@ namespace MediaBrowser.Model.Configuration
public string SeasonZeroDisplayName { get; set; } public string SeasonZeroDisplayName { get; set; }
public string[]? MetadataSavers { get; set; } public ICollection<string>? MetadataSavers { get; }
public string[] DisabledLocalMetadataReaders { get; set; } public ICollection<string> DisabledLocalMetadataReaders { get; }
public string[]? LocalMetadataReaderOrder { get; set; } public ICollection<string>? LocalMetadataReaderOrder
{
get => _localMetadataReaderOrder;
}
public string[] DisabledSubtitleFetchers { get; set; } public ICollection<string> DisabledSubtitleFetchers { get; }
public string[] SubtitleFetcherOrder { get; set; } public ICollection<string> SubtitleFetcherOrder { get; }
public bool SkipSubtitlesIfEmbeddedSubtitlesPresent { get; set; } public bool SkipSubtitlesIfEmbeddedSubtitlesPresent { get; set; }
public bool SkipSubtitlesIfAudioTrackMatches { get; set; } public bool SkipSubtitlesIfAudioTrackMatches { get; set; }
public string[]? SubtitleDownloadLanguages { get; set; } public ICollection<string> SubtitleDownloadLanguages { get; }
public bool RequirePerfectSubtitleMatch { get; set; } public bool RequirePerfectSubtitleMatch { get; set; }
@ -101,9 +113,12 @@ namespace MediaBrowser.Model.Configuration
public EmbeddedSubtitleOptions AllowEmbeddedSubtitles { get; set; } public EmbeddedSubtitleOptions AllowEmbeddedSubtitles { get; set; }
public TypeOptions[] TypeOptions { get; set; } public ICollection<TypeOptions> TypeOptions
{
get => _typeOptions;
}
public TypeOptions? GetTypeOptions(string type) public TypeOptions? GetTypeOption(string type)
{ {
foreach (var options in TypeOptions) foreach (var options in TypeOptions)
{ {
@ -115,5 +130,20 @@ namespace MediaBrowser.Model.Configuration
return null; return null;
} }
public void SetTypeOptions(ICollection<TypeOptions> typeOptions)
{
_typeOptions = typeOptions;
}
public void SetLocalMetadataReaderOrder(string[]? localMetadataReaderOrder)
{
_localMetadataReaderOrder = localMetadataReaderOrder ?? [];
}
public void SetPathInfos(MediaPathInfo[] pathInfos)
{
_pathInfos = new List<MediaPathInfo>(pathInfos);
}
} }
} }

@ -138,7 +138,7 @@ namespace MediaBrowser.Providers.Manager
var result = new RefreshResult { UpdateType = ItemUpdateType.None }; var result = new RefreshResult { UpdateType = ItemUpdateType.None };
var typeName = item.GetType().Name; 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 // track library limits, adding buffer to allow lazy replacing of current images
var backdropLimit = typeOptions.GetLimit(ImageType.Backdrop) + oldBackdropImages.Length; var backdropLimit = typeOptions.GetLimit(ImageType.Backdrop) + oldBackdropImages.Length;

@ -368,7 +368,7 @@ namespace MediaBrowser.Providers.Manager
private IEnumerable<IImageProvider> GetImageProvidersInternal(BaseItem item, LibraryOptions libraryOptions, MetadataOptions options, ImageRefreshOptions refreshOptions, bool includeDisabled) private IEnumerable<IImageProvider> 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; var fetcherOrder = typeOptions?.ImageFetcherOrder ?? options.ImageFetcherOrder;
return _imageProviders.Where(i => CanRefreshImages(i, item, typeOptions, refreshOptions, includeDisabled)) return _imageProviders.Where(i => CanRefreshImages(i, item, typeOptions, refreshOptions, includeDisabled))
@ -422,7 +422,7 @@ namespace MediaBrowser.Providers.Manager
where T : BaseItem where T : BaseItem
{ {
var localMetadataReaderOrder = libraryOptions.LocalMetadataReaderOrder ?? globalMetadataOptions.LocalMetadataReaderOrder; 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; var metadataFetcherOrder = typeOptions?.MetadataFetcherOrder ?? globalMetadataOptions.MetadataFetcherOrder;
return _metadataProviders.OfType<IMetadataProvider<T>>() return _metadataProviders.OfType<IMetadataProvider<T>>()
@ -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 // only relative order within a type matters: consumers of the list filter to one or the other
i switch i switch
{ {
ILocalMetadataProvider => GetConfiguredOrder(localMetadataReaderOrder, i.Name), ILocalMetadataProvider => GetConfiguredOrder(localMetadataReaderOrder.ToArray(), i.Name),
IRemoteMetadataProvider => GetConfiguredOrder(metadataFetcherOrder, i.Name), IRemoteMetadataProvider => GetConfiguredOrder(metadataFetcherOrder, i.Name),
// Default to end // Default to end
_ => int.MaxValue _ => int.MaxValue

@ -561,7 +561,7 @@ namespace MediaBrowser.Providers.MediaInfo
} }
else else
{ {
subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages; subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages.ToArray();
skipIfEmbeddedSubtitlesPresent = libraryOptions.SkipSubtitlesIfEmbeddedSubtitlesPresent; skipIfEmbeddedSubtitlesPresent = libraryOptions.SkipSubtitlesIfEmbeddedSubtitlesPresent;
skipIfAudioTrackMatches = libraryOptions.SkipSubtitlesIfAudioTrackMatches; skipIfAudioTrackMatches = libraryOptions.SkipSubtitlesIfAudioTrackMatches;
requirePerfectMatch = libraryOptions.RequirePerfectSubtitleMatch; requirePerfectMatch = libraryOptions.RequirePerfectSubtitleMatch;
@ -579,8 +579,8 @@ namespace MediaBrowser.Providers.MediaInfo
skipIfAudioTrackMatches, skipIfAudioTrackMatches,
requirePerfectMatch, requirePerfectMatch,
subtitleDownloadLanguages, subtitleDownloadLanguages,
libraryOptions.DisabledSubtitleFetchers, libraryOptions.DisabledSubtitleFetchers.ToArray(),
libraryOptions.SubtitleFetcherOrder, libraryOptions.SubtitleFetcherOrder.ToArray(),
true, true,
cancellationToken).ConfigureAwait(false); cancellationToken).ConfigureAwait(false);

@ -88,7 +88,7 @@ namespace MediaBrowser.Providers.MediaInfo
} }
else else
{ {
subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages; subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages.ToArray();
skipIfEmbeddedSubtitlesPresent = libraryOptions.SkipSubtitlesIfEmbeddedSubtitlesPresent; skipIfEmbeddedSubtitlesPresent = libraryOptions.SkipSubtitlesIfEmbeddedSubtitlesPresent;
skipIfAudioTrackMatches = libraryOptions.SkipSubtitlesIfAudioTrackMatches; skipIfAudioTrackMatches = libraryOptions.SkipSubtitlesIfAudioTrackMatches;
} }
@ -181,7 +181,7 @@ namespace MediaBrowser.Providers.MediaInfo
} }
else else
{ {
subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages; subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages.ToArray();
skipIfEmbeddedSubtitlesPresent = libraryOptions.SkipSubtitlesIfEmbeddedSubtitlesPresent; skipIfEmbeddedSubtitlesPresent = libraryOptions.SkipSubtitlesIfEmbeddedSubtitlesPresent;
skipIfAudioTrackMatches = libraryOptions.SkipSubtitlesIfAudioTrackMatches; skipIfAudioTrackMatches = libraryOptions.SkipSubtitlesIfAudioTrackMatches;
requirePerfectMatch = libraryOptions.RequirePerfectSubtitleMatch; requirePerfectMatch = libraryOptions.RequirePerfectSubtitleMatch;
@ -196,8 +196,8 @@ namespace MediaBrowser.Providers.MediaInfo
skipIfAudioTrackMatches, skipIfAudioTrackMatches,
requirePerfectMatch, requirePerfectMatch,
subtitleDownloadLanguages, subtitleDownloadLanguages,
libraryOptions.DisabledSubtitleFetchers, libraryOptions.DisabledSubtitleFetchers.ToArray(),
libraryOptions.SubtitleFetcherOrder, libraryOptions.SubtitleFetcherOrder.ToArray(),
true, true,
cancellationToken).ConfigureAwait(false); cancellationToken).ConfigureAwait(false);

@ -201,10 +201,8 @@ public sealed class RecordingsManager : IRecordingsManager, IDisposable
} }
var mediaPathInfos = pathsToCreate.Select(i => new MediaPathInfo(i)).ToArray(); var mediaPathInfos = pathsToCreate.Select(i => new MediaPathInfo(i)).ToArray();
var libraryOptions = new LibraryOptions var libraryOptions = new LibraryOptions();
{ libraryOptions.SetPathInfos(mediaPathInfos);
PathInfos = mediaPathInfos
};
try try
{ {

@ -507,24 +507,9 @@ namespace Jellyfin.Providers.Tests.Manager
var item = new Video(); var item = new Video();
var libraryOptions = new LibraryOptions var typeOptions = new[] { new TypeOptions { Type = item.GetType().Name, ImageOptions = new[] { new ImageOption { Type = imageType, MinWidth = 10 } } } };
{ var libraryOptions = new LibraryOptions();
TypeOptions = new[] libraryOptions.SetTypeOptions(typeOptions);
{
new TypeOptions
{
Type = item.GetType().Name,
ImageOptions = new[]
{
new ImageOption
{
Type = imageType,
MinWidth = 10
}
}
}
}
};
var remoteProvider = new Mock<IRemoteImageProvider>(MockBehavior.Strict); var remoteProvider = new Mock<IRemoteImageProvider>(MockBehavior.Strict);
remoteProvider.Setup(rp => rp.Name).Returns("MockRemoteProvider"); remoteProvider.Setup(rp => rp.Name).Returns("MockRemoteProvider");
@ -626,24 +611,10 @@ namespace Jellyfin.Providers.Tests.Manager
/// </summary> /// </summary>
private static LibraryOptions GetLibraryOptions(BaseItem item, ImageType type, int count) private static LibraryOptions GetLibraryOptions(BaseItem item, ImageType type, int count)
{ {
return new LibraryOptions var typeOptions = new[] { new TypeOptions { Type = item.GetType().Name, ImageOptions = new[] { new ImageOption { Type = type, Limit = count, } } } };
{ var lib = new LibraryOptions();
TypeOptions = new[] lib.SetTypeOptions(typeOptions.ToList());
{ return lib;
new TypeOptions
{
Type = item.GetType().Name,
ImageOptions = new[]
{
new ImageOption
{
Type = type,
Limit = count,
}
}
}
}
};
} }
} }
} }

@ -495,10 +495,8 @@ namespace Jellyfin.Providers.Tests.Manager
string[]? localMetadataReaderOrder = null, string[]? localMetadataReaderOrder = null,
string[]? metadataFetcherOrder = null) string[]? metadataFetcherOrder = null)
{ {
var libraryOptions = new LibraryOptions var libraryOptions = new LibraryOptions();
{ libraryOptions.SetLocalMetadataReaderOrder(localMetadataReaderOrder);
LocalMetadataReaderOrder = localMetadataReaderOrder
};
// only create type options if populating it with something // only create type options if populating it with something
if (imageFetcherOrder is not null || metadataFetcherOrder is not null) if (imageFetcherOrder is not null || metadataFetcherOrder is not null)
@ -506,7 +504,7 @@ namespace Jellyfin.Providers.Tests.Manager
imageFetcherOrder ??= Array.Empty<string>(); imageFetcherOrder ??= Array.Empty<string>();
metadataFetcherOrder ??= Array.Empty<string>(); metadataFetcherOrder ??= Array.Empty<string>();
libraryOptions.TypeOptions = new[] libraryOptions.SetTypeOptions(new[]
{ {
new TypeOptions new TypeOptions
{ {
@ -514,7 +512,7 @@ namespace Jellyfin.Providers.Tests.Manager
ImageFetcherOrder = imageFetcherOrder, ImageFetcherOrder = imageFetcherOrder,
MetadataFetcherOrder = metadataFetcherOrder MetadataFetcherOrder = metadataFetcherOrder
} }
}; });
} }
return libraryOptions; return libraryOptions;

Loading…
Cancel
Save