From be48cdd9e90ed147c5526ef3fed0624bcbad7741 Mon Sep 17 00:00:00 2001
From: JPVenson <6794763+JPVenson@users.noreply.github.com>
Date: Wed, 9 Oct 2024 09:53:39 +0000
Subject: Naming refactoring and WIP porting of new interface repositories
---
.../Item/MediaStreamRepository.cs | 201 +++++++++++++++++++++
1 file changed, 201 insertions(+)
create mode 100644 Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
(limited to 'Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs')
diff --git a/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs b/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
new file mode 100644
index 0000000000..f7b714c296
--- /dev/null
+++ b/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
@@ -0,0 +1,201 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Linq;
+using System.Threading;
+using Jellyfin.Data.Entities;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Persistence;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Globalization;
+using Microsoft.EntityFrameworkCore;
+
+namespace Jellyfin.Server.Implementations.Item;
+
+///
+/// Initializes a new instance of the class.
+///
+/// The EFCore db factory.
+/// The Application host.
+/// The Localisation Provider.
+public class MediaStreamRepository(IDbContextFactory dbProvider, IServerApplicationHost serverApplicationHost, ILocalizationManager localization) : IMediaStreamRepository
+{
+ ///
+ public void SaveMediaStreams(Guid id, IReadOnlyList streams, CancellationToken cancellationToken)
+ {
+ using var context = dbProvider.CreateDbContext();
+ using var transaction = context.Database.BeginTransaction();
+
+ context.MediaStreamInfos.Where(e => e.ItemId.Equals(id)).ExecuteDelete();
+ context.MediaStreamInfos.AddRange(streams.Select(f => Map(f, id)));
+ context.SaveChanges();
+
+ transaction.Commit();
+ }
+
+ ///
+ public IReadOnlyList GetMediaStreams(MediaStreamQuery filter)
+ {
+ using var context = dbProvider.CreateDbContext();
+ return TranslateQuery(context.MediaStreamInfos, filter).ToList().Select(Map).ToImmutableArray();
+ }
+
+ private string? GetPathToSave(string? path)
+ {
+ if (path is null)
+ {
+ return null;
+ }
+
+ return serverApplicationHost.ReverseVirtualPath(path);
+ }
+
+ private string? RestorePath(string? path)
+ {
+ if (path is null)
+ {
+ return null;
+ }
+
+ return serverApplicationHost.ExpandVirtualPath(path);
+ }
+
+ private IQueryable TranslateQuery(IQueryable query, MediaStreamQuery filter)
+ {
+ query = query.Where(e => e.ItemId.Equals(filter.ItemId));
+ if (filter.Index.HasValue)
+ {
+ query = query.Where(e => e.StreamIndex == filter.Index);
+ }
+
+ if (filter.Type.HasValue)
+ {
+ query = query.Where(e => e.StreamType == filter.Type.ToString());
+ }
+
+ return query;
+ }
+
+ private MediaStream Map(MediaStreamInfo entity)
+ {
+ var dto = new MediaStream();
+ dto.Index = entity.StreamIndex;
+ if (entity.StreamType != null)
+ {
+ dto.Type = Enum.Parse(entity.StreamType);
+ }
+
+ dto.IsAVC = entity.IsAvc;
+ dto.Codec = entity.Codec;
+ dto.Language = entity.Language;
+ dto.ChannelLayout = entity.ChannelLayout;
+ dto.Profile = entity.Profile;
+ dto.AspectRatio = entity.AspectRatio;
+ dto.Path = RestorePath(entity.Path);
+ dto.IsInterlaced = entity.IsInterlaced;
+ dto.BitRate = entity.BitRate;
+ dto.Channels = entity.Channels;
+ dto.SampleRate = entity.SampleRate;
+ dto.IsDefault = entity.IsDefault;
+ dto.IsForced = entity.IsForced;
+ dto.IsExternal = entity.IsExternal;
+ dto.Height = entity.Height;
+ dto.Width = entity.Width;
+ dto.AverageFrameRate = entity.AverageFrameRate;
+ dto.RealFrameRate = entity.RealFrameRate;
+ dto.Level = entity.Level;
+ dto.PixelFormat = entity.PixelFormat;
+ dto.BitDepth = entity.BitDepth;
+ dto.IsAnamorphic = entity.IsAnamorphic;
+ dto.RefFrames = entity.RefFrames;
+ dto.CodecTag = entity.CodecTag;
+ dto.Comment = entity.Comment;
+ dto.NalLengthSize = entity.NalLengthSize;
+ dto.Title = entity.Title;
+ dto.TimeBase = entity.TimeBase;
+ dto.CodecTimeBase = entity.CodecTimeBase;
+ dto.ColorPrimaries = entity.ColorPrimaries;
+ dto.ColorSpace = entity.ColorSpace;
+ dto.ColorTransfer = entity.ColorTransfer;
+ dto.DvVersionMajor = entity.DvVersionMajor;
+ dto.DvVersionMinor = entity.DvVersionMinor;
+ dto.DvProfile = entity.DvProfile;
+ dto.DvLevel = entity.DvLevel;
+ dto.RpuPresentFlag = entity.RpuPresentFlag;
+ dto.ElPresentFlag = entity.ElPresentFlag;
+ dto.BlPresentFlag = entity.BlPresentFlag;
+ dto.DvBlSignalCompatibilityId = entity.DvBlSignalCompatibilityId;
+ dto.IsHearingImpaired = entity.IsHearingImpaired;
+ dto.Rotation = entity.Rotation;
+
+ if (dto.Type is MediaStreamType.Audio or MediaStreamType.Subtitle)
+ {
+ dto.LocalizedDefault = localization.GetLocalizedString("Default");
+ dto.LocalizedExternal = localization.GetLocalizedString("External");
+
+ if (dto.Type is MediaStreamType.Subtitle)
+ {
+ dto.LocalizedUndefined = localization.GetLocalizedString("Undefined");
+ dto.LocalizedForced = localization.GetLocalizedString("Forced");
+ dto.LocalizedHearingImpaired = localization.GetLocalizedString("HearingImpaired");
+ }
+ }
+
+ return dto;
+ }
+
+ private MediaStreamInfo Map(MediaStream dto, Guid itemId)
+ {
+ var entity = new MediaStreamInfo
+ {
+ Item = null!,
+ ItemId = itemId,
+ StreamIndex = dto.Index,
+ StreamType = dto.Type.ToString(),
+ IsAvc = dto.IsAVC.GetValueOrDefault(),
+
+ Codec = dto.Codec,
+ Language = dto.Language,
+ ChannelLayout = dto.ChannelLayout,
+ Profile = dto.Profile,
+ AspectRatio = dto.AspectRatio,
+ Path = GetPathToSave(dto.Path),
+ IsInterlaced = dto.IsInterlaced,
+ BitRate = dto.BitRate.GetValueOrDefault(0),
+ Channels = dto.Channels.GetValueOrDefault(0),
+ SampleRate = dto.SampleRate.GetValueOrDefault(0),
+ IsDefault = dto.IsDefault,
+ IsForced = dto.IsForced,
+ IsExternal = dto.IsExternal,
+ Height = dto.Height.GetValueOrDefault(0),
+ Width = dto.Width.GetValueOrDefault(0),
+ AverageFrameRate = dto.AverageFrameRate.GetValueOrDefault(0),
+ RealFrameRate = dto.RealFrameRate.GetValueOrDefault(0),
+ Level = (float)dto.Level.GetValueOrDefault(),
+ PixelFormat = dto.PixelFormat,
+ BitDepth = dto.BitDepth.GetValueOrDefault(0),
+ IsAnamorphic = dto.IsAnamorphic.GetValueOrDefault(0),
+ RefFrames = dto.RefFrames.GetValueOrDefault(0),
+ CodecTag = dto.CodecTag,
+ Comment = dto.Comment,
+ NalLengthSize = dto.NalLengthSize,
+ Title = dto.Title,
+ TimeBase = dto.TimeBase,
+ CodecTimeBase = dto.CodecTimeBase,
+ ColorPrimaries = dto.ColorPrimaries,
+ ColorSpace = dto.ColorSpace,
+ ColorTransfer = dto.ColorTransfer,
+ DvVersionMajor = dto.DvVersionMajor.GetValueOrDefault(0),
+ DvVersionMinor = dto.DvVersionMinor.GetValueOrDefault(0),
+ DvProfile = dto.DvProfile.GetValueOrDefault(0),
+ DvLevel = dto.DvLevel.GetValueOrDefault(0),
+ RpuPresentFlag = dto.RpuPresentFlag.GetValueOrDefault(0),
+ ElPresentFlag = dto.ElPresentFlag.GetValueOrDefault(0),
+ BlPresentFlag = dto.BlPresentFlag.GetValueOrDefault(0),
+ DvBlSignalCompatibilityId = dto.DvBlSignalCompatibilityId.GetValueOrDefault(0),
+ IsHearingImpaired = dto.IsHearingImpaired,
+ Rotation = dto.Rotation.GetValueOrDefault(0)
+ };
+ return entity;
+ }
+}
--
cgit v1.2.3
From b09a41ad1f05664a6099734cb44e068f993a8e93 Mon Sep 17 00:00:00 2001
From: JPVenson <6794763+JPVenson@users.noreply.github.com>
Date: Wed, 9 Oct 2024 10:36:08 +0000
Subject: WIP porting new Repository structure
---
.editorconfig | 3 ++
Emby.Server.Implementations/Dto/DtoService.cs | 12 +++++---
.../Library/LibraryManager.cs | 35 ++++++++++++----------
.../Library/MediaSourceManager.cs | 25 +++++++++-------
.../Library/MusicManager.cs | 19 ++++++------
.../Library/SearchEngine.cs | 2 +-
.../ScheduledTasks/Tasks/ChapterImagesTask.cs | 9 ++++--
Jellyfin.Api/Controllers/LibraryController.cs | 2 +-
Jellyfin.Api/Controllers/MoviesController.cs | 4 +--
Jellyfin.Api/Controllers/YearsController.cs | 7 +++--
.../Item/MediaStreamRepository.cs | 2 +-
.../Item/PeopleRepository.cs | 4 ++-
.../ModelConfiguration/ChapterConfiguration.cs | 1 -
.../Trickplay/TrickplayManager.cs | 2 +-
.../Entities/AggregateFolder.cs | 2 +-
.../Entities/Audio/MusicArtist.cs | 2 +-
.../Entities/Audio/MusicGenre.cs | 2 +-
MediaBrowser.Controller/Entities/BaseItem.cs | 9 +++---
MediaBrowser.Controller/Entities/Folder.cs | 31 ++++++++++---------
MediaBrowser.Controller/Entities/Genre.cs | 2 +-
.../Entities/IHasMediaSources.cs | 4 +--
MediaBrowser.Controller/Entities/IItemByName.cs | 2 +-
MediaBrowser.Controller/Entities/Movies/BoxSet.cs | 13 ++++----
MediaBrowser.Controller/Entities/PeopleHelper.cs | 2 +-
MediaBrowser.Controller/Entities/Person.cs | 2 +-
MediaBrowser.Controller/Entities/Studio.cs | 2 +-
MediaBrowser.Controller/Entities/TV/Series.cs | 4 +--
MediaBrowser.Controller/Entities/UserRootFolder.cs | 2 +-
MediaBrowser.Controller/Entities/UserView.cs | 4 +--
.../Entities/UserViewBuilder.cs | 2 +-
MediaBrowser.Controller/Entities/Year.cs | 2 +-
MediaBrowser.Controller/Library/ILibraryManager.cs | 18 +++++------
.../Library/IMediaSourceManager.cs | 8 ++---
MediaBrowser.Controller/Library/IMusicManager.cs | 6 ++--
MediaBrowser.Controller/LiveTv/LiveTvChannel.cs | 9 +++---
MediaBrowser.Controller/Playlists/Playlist.cs | 10 +++----
.../Providers/MetadataResult.cs | 16 ++++++----
.../BoxSets/BoxSetMetadataService.cs | 2 +-
MediaBrowser.Providers/Manager/MetadataService.cs | 25 +++++++---------
.../MediaInfo/AudioFileProber.cs | 8 +++--
.../MediaInfo/AudioImageProvider.cs | 2 +-
.../MediaInfo/FFProbeVideoInfo.cs | 15 +++++++---
MediaBrowser.Providers/MediaInfo/ProbeProvider.cs | 13 ++++++--
.../MediaInfo/SubtitleDownloader.cs | 6 ++--
.../Music/AlbumMetadataService.cs | 4 +--
.../Music/ArtistMetadataService.cs | 5 ++--
.../Playlists/PlaylistMetadataService.cs | 2 +-
MediaBrowser.Providers/TV/SeasonMetadataService.cs | 6 ++--
MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs | 2 +-
MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs | 2 +-
50 files changed, 211 insertions(+), 162 deletions(-)
(limited to 'Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs')
diff --git a/.editorconfig b/.editorconfig
index b84e563efa..147b76c141 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -192,3 +192,6 @@ csharp_space_between_method_call_empty_parameter_list_parentheses = false
# Wrapping preferences
csharp_preserve_single_line_statements = true
csharp_preserve_single_line_blocks = true
+
+# CA1826: Do not use Enumerable methods on indexable collections
+dotnet_diagnostic.CA1826.severity = suggestion
diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs
index 0c0ba74533..356d1e437a 100644
--- a/Emby.Server.Implementations/Dto/DtoService.cs
+++ b/Emby.Server.Implementations/Dto/DtoService.cs
@@ -10,6 +10,7 @@ using Jellyfin.Data.Enums;
using Jellyfin.Extensions;
using MediaBrowser.Common;
using MediaBrowser.Controller.Channels;
+using MediaBrowser.Controller.Chapters;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
@@ -51,6 +52,7 @@ namespace Emby.Server.Implementations.Dto
private readonly Lazy _livetvManagerFactory;
private readonly ITrickplayManager _trickplayManager;
+ private readonly IChapterRepository _chapterRepository;
public DtoService(
ILogger logger,
@@ -63,7 +65,8 @@ namespace Emby.Server.Implementations.Dto
IApplicationHost appHost,
IMediaSourceManager mediaSourceManager,
Lazy livetvManagerFactory,
- ITrickplayManager trickplayManager)
+ ITrickplayManager trickplayManager,
+ IChapterRepository chapterRepository)
{
_logger = logger;
_libraryManager = libraryManager;
@@ -76,6 +79,7 @@ namespace Emby.Server.Implementations.Dto
_mediaSourceManager = mediaSourceManager;
_livetvManagerFactory = livetvManagerFactory;
_trickplayManager = trickplayManager;
+ _chapterRepository = chapterRepository;
}
private ILiveTvManager LivetvManager => _livetvManagerFactory.Value;
@@ -165,7 +169,7 @@ namespace Emby.Server.Implementations.Dto
return dto;
}
- private static IList GetTaggedItems(IItemByName byName, User? user, DtoOptions options)
+ private static IReadOnlyList GetTaggedItems(IItemByName byName, User? user, DtoOptions options)
{
return byName.GetTaggedItems(
new InternalItemsQuery(user)
@@ -327,7 +331,7 @@ namespace Emby.Server.Implementations.Dto
return dto;
}
- private static void SetItemByNameInfo(BaseItem item, BaseItemDto dto, IList taggedItems)
+ private static void SetItemByNameInfo(BaseItem item, BaseItemDto dto, IReadOnlyList taggedItems)
{
if (item is MusicArtist)
{
@@ -1060,7 +1064,7 @@ namespace Emby.Server.Implementations.Dto
if (options.ContainsField(ItemFields.Chapters))
{
- dto.Chapters = _itemRepo.GetChapters(item);
+ dto.Chapters = _chapterRepository.GetChapters(item.Id).ToList();
}
if (options.ContainsField(ItemFields.Trickplay))
diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs
index 28f7ed6598..0a98d54351 100644
--- a/Emby.Server.Implementations/Library/LibraryManager.cs
+++ b/Emby.Server.Implementations/Library/LibraryManager.cs
@@ -76,6 +76,7 @@ namespace Emby.Server.Implementations.Library
private readonly IItemRepository _itemRepository;
private readonly IImageProcessor _imageProcessor;
private readonly NamingOptions _namingOptions;
+ private readonly IPeopleRepository _peopleRepository;
private readonly ExtraResolver _extraResolver;
///
@@ -112,6 +113,7 @@ namespace Emby.Server.Implementations.Library
/// The image processor.
/// The naming options.
/// The directory service.
+ /// The People Repository.
public LibraryManager(
IServerApplicationHost appHost,
ILoggerFactory loggerFactory,
@@ -127,7 +129,8 @@ namespace Emby.Server.Implementations.Library
IItemRepository itemRepository,
IImageProcessor imageProcessor,
NamingOptions namingOptions,
- IDirectoryService directoryService)
+ IDirectoryService directoryService,
+ IPeopleRepository peopleRepository)
{
_appHost = appHost;
_logger = loggerFactory.CreateLogger();
@@ -144,7 +147,7 @@ namespace Emby.Server.Implementations.Library
_imageProcessor = imageProcessor;
_cache = new ConcurrentDictionary();
_namingOptions = namingOptions;
-
+ _peopleRepository = peopleRepository;
_extraResolver = new ExtraResolver(loggerFactory.CreateLogger(), namingOptions, directoryService);
_configurationManager.ConfigurationUpdated += ConfigurationUpdated;
@@ -1274,7 +1277,7 @@ namespace Emby.Server.Implementations.Library
return ItemIsVisible(item, user) ? item : null;
}
- public List GetItemList(InternalItemsQuery query, bool allowExternalContent)
+ public IReadOnlyList GetItemList(InternalItemsQuery query, bool allowExternalContent)
{
if (query.Recursive && !query.ParentId.IsEmpty())
{
@@ -1300,7 +1303,7 @@ namespace Emby.Server.Implementations.Library
return itemList;
}
- public List GetItemList(InternalItemsQuery query)
+ public IReadOnlyList GetItemList(InternalItemsQuery query)
{
return GetItemList(query, true);
}
@@ -1324,7 +1327,7 @@ namespace Emby.Server.Implementations.Library
return _itemRepository.GetCount(query);
}
- public List GetItemList(InternalItemsQuery query, List parents)
+ public IReadOnlyList GetItemList(InternalItemsQuery query, List parents)
{
SetTopParentIdsOrAncestors(query, parents);
@@ -1357,7 +1360,7 @@ namespace Emby.Server.Implementations.Library
_itemRepository.GetItemList(query));
}
- public List GetItemIds(InternalItemsQuery query)
+ public IReadOnlyList GetItemIds(InternalItemsQuery query)
{
if (query.User is not null)
{
@@ -2736,12 +2739,12 @@ namespace Emby.Server.Implementations.Library
return path;
}
- public List GetPeople(InternalPeopleQuery query)
+ public IReadOnlyList GetPeople(InternalPeopleQuery query)
{
- return _itemRepository.GetPeople(query);
+ return _peopleRepository.GetPeople(query);
}
- public List GetPeople(BaseItem item)
+ public IReadOnlyList GetPeople(BaseItem item)
{
if (item.SupportsPeople)
{
@@ -2756,12 +2759,12 @@ namespace Emby.Server.Implementations.Library
}
}
- return new List();
+ return [];
}
- public List GetPeopleItems(InternalPeopleQuery query)
+ public IReadOnlyList GetPeopleItems(InternalPeopleQuery query)
{
- return _itemRepository.GetPeopleNames(query)
+ return _peopleRepository.GetPeopleNames(query)
.Select(i =>
{
try
@@ -2779,9 +2782,9 @@ namespace Emby.Server.Implementations.Library
.ToList()!; // null values are filtered out
}
- public List GetPeopleNames(InternalPeopleQuery query)
+ public IReadOnlyList GetPeopleNames(InternalPeopleQuery query)
{
- return _itemRepository.GetPeopleNames(query);
+ return _peopleRepository.GetPeopleNames(query);
}
public void UpdatePeople(BaseItem item, List people)
@@ -2790,14 +2793,14 @@ namespace Emby.Server.Implementations.Library
}
///
- public async Task UpdatePeopleAsync(BaseItem item, List people, CancellationToken cancellationToken)
+ public async Task UpdatePeopleAsync(BaseItem item, IReadOnlyList people, CancellationToken cancellationToken)
{
if (!item.SupportsPeople)
{
return;
}
- _itemRepository.UpdatePeople(item.Id, people);
+ _peopleRepository.UpdatePeople(item.Id, people);
if (people is not null)
{
await SavePeopleMetadataAsync(people, cancellationToken).ConfigureAwait(false);
diff --git a/Emby.Server.Implementations/Library/MediaSourceManager.cs b/Emby.Server.Implementations/Library/MediaSourceManager.cs
index 90a01c052c..a5a715721f 100644
--- a/Emby.Server.Implementations/Library/MediaSourceManager.cs
+++ b/Emby.Server.Implementations/Library/MediaSourceManager.cs
@@ -51,7 +51,8 @@ namespace Emby.Server.Implementations.Library
private readonly ILocalizationManager _localizationManager;
private readonly IApplicationPaths _appPaths;
private readonly IDirectoryService _directoryService;
-
+ private readonly IMediaStreamRepository _mediaStreamRepository;
+ private readonly IMediaAttachmentRepository _mediaAttachmentRepository;
private readonly ConcurrentDictionary _openStreams = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase);
private readonly AsyncNonKeyedLocker _liveStreamLocker = new(1);
private readonly JsonSerializerOptions _jsonOptions = JsonDefaults.Options;
@@ -69,7 +70,9 @@ namespace Emby.Server.Implementations.Library
IFileSystem fileSystem,
IUserDataManager userDataManager,
IMediaEncoder mediaEncoder,
- IDirectoryService directoryService)
+ IDirectoryService directoryService,
+ IMediaStreamRepository mediaStreamRepository,
+ IMediaAttachmentRepository mediaAttachmentRepository)
{
_appHost = appHost;
_itemRepo = itemRepo;
@@ -82,6 +85,8 @@ namespace Emby.Server.Implementations.Library
_localizationManager = localizationManager;
_appPaths = applicationPaths;
_directoryService = directoryService;
+ _mediaStreamRepository = mediaStreamRepository;
+ _mediaAttachmentRepository = mediaAttachmentRepository;
}
public void AddParts(IEnumerable providers)
@@ -89,9 +94,9 @@ namespace Emby.Server.Implementations.Library
_providers = providers.ToArray();
}
- public List GetMediaStreams(MediaStreamQuery query)
+ public IReadOnlyList GetMediaStreams(MediaStreamQuery query)
{
- var list = _itemRepo.GetMediaStreams(query);
+ var list = _mediaStreamRepository.GetMediaStreams(query);
foreach (var stream in list)
{
@@ -121,7 +126,7 @@ namespace Emby.Server.Implementations.Library
return false;
}
- public List GetMediaStreams(Guid itemId)
+ public IReadOnlyList GetMediaStreams(Guid itemId)
{
var list = GetMediaStreams(new MediaStreamQuery
{
@@ -131,7 +136,7 @@ namespace Emby.Server.Implementations.Library
return GetMediaStreamsForItem(list);
}
- private List GetMediaStreamsForItem(List streams)
+ private IReadOnlyList GetMediaStreamsForItem(IReadOnlyList streams)
{
foreach (var stream in streams)
{
@@ -145,13 +150,13 @@ namespace Emby.Server.Implementations.Library
}
///
- public List GetMediaAttachments(MediaAttachmentQuery query)
+ public IReadOnlyList GetMediaAttachments(MediaAttachmentQuery query)
{
- return _itemRepo.GetMediaAttachments(query);
+ return _mediaAttachmentRepository.GetMediaAttachments(query);
}
///
- public List GetMediaAttachments(Guid itemId)
+ public IReadOnlyList GetMediaAttachments(Guid itemId)
{
return GetMediaAttachments(new MediaAttachmentQuery
{
@@ -332,7 +337,7 @@ namespace Emby.Server.Implementations.Library
return sources.FirstOrDefault(i => string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase));
}
- public List GetStaticMediaSources(BaseItem item, bool enablePathSubstitution, User user = null)
+ public IReadOnlyList GetStaticMediaSources(BaseItem item, bool enablePathSubstitution, User user = null)
{
ArgumentNullException.ThrowIfNull(item);
diff --git a/Emby.Server.Implementations/Library/MusicManager.cs b/Emby.Server.Implementations/Library/MusicManager.cs
index a69a0f33f3..c83737cec2 100644
--- a/Emby.Server.Implementations/Library/MusicManager.cs
+++ b/Emby.Server.Implementations/Library/MusicManager.cs
@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
+using System.Collections.Immutable;
using System.Linq;
using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
@@ -24,7 +25,7 @@ namespace Emby.Server.Implementations.Library
_libraryManager = libraryManager;
}
- public List GetInstantMixFromSong(Audio item, User? user, DtoOptions dtoOptions)
+ public IReadOnlyList GetInstantMixFromSong(Audio item, User? user, DtoOptions dtoOptions)
{
var list = new List
{
@@ -33,21 +34,21 @@ namespace Emby.Server.Implementations.Library
list.AddRange(GetInstantMixFromGenres(item.Genres, user, dtoOptions));
- return list;
+ return list.ToImmutableList();
}
///
- public List GetInstantMixFromArtist(MusicArtist artist, User? user, DtoOptions dtoOptions)
+ public IReadOnlyList GetInstantMixFromArtist(MusicArtist artist, User? user, DtoOptions dtoOptions)
{
return GetInstantMixFromGenres(artist.Genres, user, dtoOptions);
}
- public List GetInstantMixFromAlbum(MusicAlbum item, User? user, DtoOptions dtoOptions)
+ public IReadOnlyList GetInstantMixFromAlbum(MusicAlbum item, User? user, DtoOptions dtoOptions)
{
return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
}
- public List GetInstantMixFromFolder(Folder item, User? user, DtoOptions dtoOptions)
+ public IReadOnlyList GetInstantMixFromFolder(Folder item, User? user, DtoOptions dtoOptions)
{
var genres = item
.GetRecursiveChildren(user, new InternalItemsQuery(user)
@@ -63,12 +64,12 @@ namespace Emby.Server.Implementations.Library
return GetInstantMixFromGenres(genres, user, dtoOptions);
}
- public List GetInstantMixFromPlaylist(Playlist item, User? user, DtoOptions dtoOptions)
+ public IReadOnlyList GetInstantMixFromPlaylist(Playlist item, User? user, DtoOptions dtoOptions)
{
return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
}
- public List GetInstantMixFromGenres(IEnumerable genres, User? user, DtoOptions dtoOptions)
+ public IReadOnlyList GetInstantMixFromGenres(IEnumerable genres, User? user, DtoOptions dtoOptions)
{
var genreIds = genres.DistinctNames().Select(i =>
{
@@ -85,7 +86,7 @@ namespace Emby.Server.Implementations.Library
return GetInstantMixFromGenreIds(genreIds, user, dtoOptions);
}
- public List GetInstantMixFromGenreIds(Guid[] genreIds, User? user, DtoOptions dtoOptions)
+ public IReadOnlyList GetInstantMixFromGenreIds(Guid[] genreIds, User? user, DtoOptions dtoOptions)
{
return _libraryManager.GetItemList(new InternalItemsQuery(user)
{
@@ -97,7 +98,7 @@ namespace Emby.Server.Implementations.Library
});
}
- public List GetInstantMixFromItem(BaseItem item, User? user, DtoOptions dtoOptions)
+ public IReadOnlyList GetInstantMixFromItem(BaseItem item, User? user, DtoOptions dtoOptions)
{
if (item is MusicGenre)
{
diff --git a/Emby.Server.Implementations/Library/SearchEngine.cs b/Emby.Server.Implementations/Library/SearchEngine.cs
index 7f3f8615e2..3ac1d02192 100644
--- a/Emby.Server.Implementations/Library/SearchEngine.cs
+++ b/Emby.Server.Implementations/Library/SearchEngine.cs
@@ -171,7 +171,7 @@ namespace Emby.Server.Implementations.Library
}
};
- List mediaItems;
+ IReadOnlyList mediaItems;
if (searchQuery.IncludeItemTypes.Length == 1 && searchQuery.IncludeItemTypes[0] == BaseItemKind.MusicArtist)
{
diff --git a/Emby.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs b/Emby.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs
index cb3f5b8363..c0ab535a34 100644
--- a/Emby.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs
+++ b/Emby.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs
@@ -7,6 +7,7 @@ using System.Threading.Tasks;
using Jellyfin.Data.Enums;
using Jellyfin.Extensions;
using MediaBrowser.Common.Configuration;
+using MediaBrowser.Controller.Chapters;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
@@ -32,6 +33,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
private readonly IEncodingManager _encodingManager;
private readonly IFileSystem _fileSystem;
private readonly ILocalizationManager _localization;
+ private readonly IChapterRepository _chapterRepository;
///
/// Initializes a new instance of the class.
@@ -43,6 +45,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
/// Instance of the interface.
/// Instance of the interface.
/// Instance of the interface.
+ /// Instance of the interface.
public ChapterImagesTask(
ILogger logger,
ILibraryManager libraryManager,
@@ -50,7 +53,8 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
IApplicationPaths appPaths,
IEncodingManager encodingManager,
IFileSystem fileSystem,
- ILocalizationManager localization)
+ ILocalizationManager localization,
+ IChapterRepository chapterRepository)
{
_logger = logger;
_libraryManager = libraryManager;
@@ -59,6 +63,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
_encodingManager = encodingManager;
_fileSystem = fileSystem;
_localization = localization;
+ _chapterRepository = chapterRepository;
}
///
@@ -141,7 +146,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
try
{
- var chapters = _itemRepo.GetChapters(video);
+ var chapters = _chapterRepository.GetChapters(video.Id);
var success = await _encodingManager.RefreshChapterImages(video, directoryService, chapters, extract, true, cancellationToken).ConfigureAwait(false);
diff --git a/Jellyfin.Api/Controllers/LibraryController.cs b/Jellyfin.Api/Controllers/LibraryController.cs
index afc93c3a8d..b2d75d5a38 100644
--- a/Jellyfin.Api/Controllers/LibraryController.cs
+++ b/Jellyfin.Api/Controllers/LibraryController.cs
@@ -793,7 +793,7 @@ public class LibraryController : BaseJellyfinApiController
query.ExcludeArtistIds = excludeArtistIds;
}
- List itemsResult = _libraryManager.GetItemList(query);
+ var itemsResult = _libraryManager.GetItemList(query);
var returnList = _dtoService.GetBaseItemDtos(itemsResult, dtoOptions, user);
diff --git a/Jellyfin.Api/Controllers/MoviesController.cs b/Jellyfin.Api/Controllers/MoviesController.cs
index 471bcd096e..11559419c1 100644
--- a/Jellyfin.Api/Controllers/MoviesController.cs
+++ b/Jellyfin.Api/Controllers/MoviesController.cs
@@ -97,7 +97,7 @@ public class MoviesController : BaseJellyfinApiController
DtoOptions = dtoOptions
};
- var recentlyPlayedMovies = _libraryManager.GetItemList(query);
+ var recentlyPlayedMovies = _libraryManager.GetItemList(query)!;
var itemTypes = new List { BaseItemKind.Movie };
if (_serverConfigurationManager.Configuration.EnableExternalContentInSuggestions)
@@ -120,7 +120,7 @@ public class MoviesController : BaseJellyfinApiController
DtoOptions = dtoOptions
});
- var mostRecentMovies = recentlyPlayedMovies.GetRange(0, Math.Min(recentlyPlayedMovies.Count, 6));
+ var mostRecentMovies = recentlyPlayedMovies.Take(Math.Min(recentlyPlayedMovies.Count, 6));
// Get recently played directors
var recentDirectors = GetDirectors(mostRecentMovies)
.ToList();
diff --git a/Jellyfin.Api/Controllers/YearsController.cs b/Jellyfin.Api/Controllers/YearsController.cs
index e4aa0ea42d..ffc34a5d97 100644
--- a/Jellyfin.Api/Controllers/YearsController.cs
+++ b/Jellyfin.Api/Controllers/YearsController.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Collections.Immutable;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using Jellyfin.Api.Extensions;
@@ -105,18 +106,18 @@ public class YearsController : BaseJellyfinApiController
bool Filter(BaseItem i) => FilterItem(i, excludeItemTypes, includeItemTypes, mediaTypes);
- IList items;
+ IReadOnlyList items;
if (parentItem.IsFolder)
{
var folder = (Folder)parentItem;
if (userId.IsNullOrEmpty())
{
- items = recursive ? folder.GetRecursiveChildren(Filter) : folder.Children.Where(Filter).ToList();
+ items = recursive ? folder.GetRecursiveChildren(Filter) : folder.Children.Where(Filter).ToImmutableList();
}
else
{
- items = recursive ? folder.GetRecursiveChildren(user, query).ToList() : folder.GetChildren(user, true).Where(Filter).ToList();
+ items = recursive ? folder.GetRecursiveChildren(user, query) : folder.GetChildren(user, true).Where(Filter).ToImmutableList();
}
}
else
diff --git a/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs b/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
index f7b714c296..f44ead6e02 100644
--- a/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
@@ -174,7 +174,7 @@ public class MediaStreamRepository(IDbContextFactory dbProvid
Level = (float)dto.Level.GetValueOrDefault(),
PixelFormat = dto.PixelFormat,
BitDepth = dto.BitDepth.GetValueOrDefault(0),
- IsAnamorphic = dto.IsAnamorphic.GetValueOrDefault(0),
+ IsAnamorphic = dto.IsAnamorphic.GetValueOrDefault(),
RefFrames = dto.RefFrames.GetValueOrDefault(0),
CodecTag = dto.CodecTag,
Comment = dto.Comment,
diff --git a/Jellyfin.Server.Implementations/Item/PeopleRepository.cs b/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
index 3ced6e24e3..584dbd1b65 100644
--- a/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
@@ -89,7 +89,9 @@ public class PeopleRepository(IDbContextFactory dbProvider) :
Name = people.Name,
Role = people.Role,
SortOrder = people.SortOrder,
- PersonType = people.Type.ToString()
+ PersonType = people.Type.ToString(),
+ Item = null!,
+ ListOrder = people.SortOrder
};
return personInfo;
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/ChapterConfiguration.cs b/Jellyfin.Server.Implementations/ModelConfiguration/ChapterConfiguration.cs
index 0e7c88931a..464fbfb014 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/ChapterConfiguration.cs
+++ b/Jellyfin.Server.Implementations/ModelConfiguration/ChapterConfiguration.cs
@@ -5,7 +5,6 @@ using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Jellyfin.Server.Implementations.ModelConfiguration;
-
///
/// Chapter configuration.
///
diff --git a/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs b/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
index f6c48498ca..9fe3ee010b 100644
--- a/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
+++ b/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
@@ -179,7 +179,7 @@ public class TrickplayManager : ITrickplayManager
{
// Extract images
// Note: Media sources under parent items exist as their own video/item as well. Only use this video stream for trickplay.
- var mediaSource = video.GetMediaSources(false).Find(source => Guid.Parse(source.Id).Equals(video.Id));
+ var mediaSource = video.GetMediaSources(false).FirstOrDefault(source => Guid.Parse(source.Id).Equals(video.Id));
if (mediaSource is null)
{
diff --git a/MediaBrowser.Controller/Entities/AggregateFolder.cs b/MediaBrowser.Controller/Entities/AggregateFolder.cs
index 40cdd6c91e..00b06dc79c 100644
--- a/MediaBrowser.Controller/Entities/AggregateFolder.cs
+++ b/MediaBrowser.Controller/Entities/AggregateFolder.cs
@@ -64,7 +64,7 @@ namespace MediaBrowser.Controller.Entities
return CreateResolveArgs(directoryService, true).FileSystemChildren;
}
- protected override List LoadChildren()
+ protected override IReadOnlyList LoadChildren()
{
lock (_childIdsLock)
{
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
index 1ab6c97066..6d3249399b 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
@@ -84,7 +84,7 @@ namespace MediaBrowser.Controller.Entities.Audio
return !IsAccessedByName;
}
- public IList GetTaggedItems(InternalItemsQuery query)
+ public IReadOnlyList GetTaggedItems(InternalItemsQuery query)
{
if (query.IncludeItemTypes.Length == 0)
{
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
index 7448d02ea5..80f3902be7 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
@@ -64,7 +64,7 @@ namespace MediaBrowser.Controller.Entities.Audio
return true;
}
- public IList GetTaggedItems(InternalItemsQuery query)
+ public IReadOnlyList GetTaggedItems(InternalItemsQuery query)
{
query.GenreIds = new[] { Id };
query.IncludeItemTypes = new[] { BaseItemKind.MusicVideo, BaseItemKind.Audio, BaseItemKind.MusicAlbum, BaseItemKind.MusicArtist };
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index a4764dd33f..054c71db7e 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
+using System.Collections.Immutable;
using System.Globalization;
using System.IO;
using System.Linq;
@@ -1044,7 +1045,7 @@ namespace MediaBrowser.Controller.Entities
return PlayAccess.Full;
}
- public virtual List GetMediaStreams()
+ public virtual IReadOnlyList GetMediaStreams()
{
return MediaSourceManager.GetMediaStreams(new MediaStreamQuery
{
@@ -1057,7 +1058,7 @@ namespace MediaBrowser.Controller.Entities
return false;
}
- public virtual List GetMediaSources(bool enablePathSubstitution)
+ public virtual IReadOnlyList GetMediaSources(bool enablePathSubstitution)
{
if (SourceType == SourceType.Channel)
{
@@ -1091,7 +1092,7 @@ namespace MediaBrowser.Controller.Entities
return 1;
}).ThenBy(i => i.Video3DFormat.HasValue ? 1 : 0)
.ThenByDescending(i => i, new MediaSourceWidthComparator())
- .ToList();
+ .ToImmutableList();
}
protected virtual IEnumerable<(BaseItem Item, MediaSourceType MediaSourceType)> GetAllItemsForMediaSources()
@@ -2527,7 +2528,7 @@ namespace MediaBrowser.Controller.Entities
///
/// Media children.
/// true if the rating was updated; otherwise false.
- public bool UpdateRatingToItems(IList children)
+ public bool UpdateRatingToItems(IReadOnlyList children)
{
var currentOfficialRating = OfficialRating;
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 83c19a54e1..1bec66f952 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
+using System.Collections.Immutable;
using System.IO;
using System.Linq;
using System.Security;
@@ -11,6 +12,7 @@ using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
+using J2N.Collections.Generic.Extensions;
using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
using Jellyfin.Extensions;
@@ -247,7 +249,7 @@ namespace MediaBrowser.Controller.Entities
/// We want this synchronous.
///
/// Returns children.
- protected virtual List LoadChildren()
+ protected virtual IReadOnlyList LoadChildren()
{
// logger.LogDebug("Loading children from {0} {1} {2}", GetType().Name, Id, Path);
// just load our children from the repo - the library will be validated and maintained in other processes
@@ -659,7 +661,7 @@ namespace MediaBrowser.Controller.Entities
/// Get our children from the repo - stubbed for now.
///
/// IEnumerable{BaseItem}.
- protected List GetCachedChildren()
+ protected IReadOnlyList GetCachedChildren()
{
return ItemRepository.GetItemList(new InternalItemsQuery
{
@@ -1283,14 +1285,14 @@ namespace MediaBrowser.Controller.Entities
return true;
}
- public List GetChildren(User user, bool includeLinkedChildren)
+ public IReadOnlyList GetChildren(User user, bool includeLinkedChildren)
{
ArgumentNullException.ThrowIfNull(user);
return GetChildren(user, includeLinkedChildren, new InternalItemsQuery(user));
}
- public virtual List GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
+ public virtual IReadOnlyList GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
{
ArgumentNullException.ThrowIfNull(user);
@@ -1304,7 +1306,7 @@ namespace MediaBrowser.Controller.Entities
AddChildren(user, includeLinkedChildren, result, false, query);
- return result.Values.ToList();
+ return result.Values.ToImmutableList();
}
protected virtual IEnumerable GetEligibleChildrenForRecursiveChildren(User user)
@@ -1369,7 +1371,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- public virtual IEnumerable GetRecursiveChildren(User user, InternalItemsQuery query)
+ public virtual IReadOnlyList GetRecursiveChildren(User user, InternalItemsQuery query)
{
ArgumentNullException.ThrowIfNull(user);
@@ -1377,35 +1379,35 @@ namespace MediaBrowser.Controller.Entities
AddChildren(user, true, result, true, query);
- return result.Values;
+ return result.Values.ToImmutableList();
}
///
/// Gets the recursive children.
///
/// IList{BaseItem}.
- public IList GetRecursiveChildren()
+ public IReadOnlyList GetRecursiveChildren()
{
return GetRecursiveChildren(true);
}
- public IList GetRecursiveChildren(bool includeLinkedChildren)
+ public IReadOnlyList GetRecursiveChildren(bool includeLinkedChildren)
{
return GetRecursiveChildren(i => true, includeLinkedChildren);
}
- public IList GetRecursiveChildren(Func filter)
+ public IReadOnlyList GetRecursiveChildren(Func filter)
{
return GetRecursiveChildren(filter, true);
}
- public IList GetRecursiveChildren(Func filter, bool includeLinkedChildren)
+ public IReadOnlyList GetRecursiveChildren(Func filter, bool includeLinkedChildren)
{
var result = new Dictionary();
AddChildrenToList(result, includeLinkedChildren, true, filter);
- return result.Values.ToList();
+ return result.Values.ToImmutableList();
}
///
@@ -1556,11 +1558,12 @@ namespace MediaBrowser.Controller.Entities
/// Gets the linked children.
///
/// IEnumerable{BaseItem}.
- public IEnumerable> GetLinkedChildrenInfos()
+ public IReadOnlyList> GetLinkedChildrenInfos()
{
return LinkedChildren
.Select(i => new Tuple(i, GetLinkedChild(i)))
- .Where(i => i.Item2 is not null);
+ .Where(i => i.Item2 is not null)
+ .ToImmutableList();
}
protected override async Task RefreshedOwnedItems(MetadataRefreshOptions options, IReadOnlyList fileSystemChildren, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs
index ddf62dd4cb..e5353d7bd9 100644
--- a/MediaBrowser.Controller/Entities/Genre.cs
+++ b/MediaBrowser.Controller/Entities/Genre.cs
@@ -61,7 +61,7 @@ namespace MediaBrowser.Controller.Entities
return false;
}
- public IList GetTaggedItems(InternalItemsQuery query)
+ public IReadOnlyList GetTaggedItems(InternalItemsQuery query)
{
query.GenreIds = new[] { Id };
query.ExcludeItemTypes = new[]
diff --git a/MediaBrowser.Controller/Entities/IHasMediaSources.cs b/MediaBrowser.Controller/Entities/IHasMediaSources.cs
index 90d9bdd2d3..ad35494c28 100644
--- a/MediaBrowser.Controller/Entities/IHasMediaSources.cs
+++ b/MediaBrowser.Controller/Entities/IHasMediaSources.cs
@@ -22,8 +22,8 @@ namespace MediaBrowser.Controller.Entities
///
/// true to enable path substitution, false to not.
/// A list of media sources.
- List GetMediaSources(bool enablePathSubstitution);
+ IReadOnlyList GetMediaSources(bool enablePathSubstitution);
- List GetMediaStreams();
+ IReadOnlyList GetMediaStreams();
}
}
diff --git a/MediaBrowser.Controller/Entities/IItemByName.cs b/MediaBrowser.Controller/Entities/IItemByName.cs
index cac8aa61a5..4928bda7a2 100644
--- a/MediaBrowser.Controller/Entities/IItemByName.cs
+++ b/MediaBrowser.Controller/Entities/IItemByName.cs
@@ -9,7 +9,7 @@ namespace MediaBrowser.Controller.Entities
///
public interface IItemByName
{
- IList GetTaggedItems(InternalItemsQuery query);
+ IReadOnlyList GetTaggedItems(InternalItemsQuery query);
}
public interface IHasDualAccess : IItemByName
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index a07187d2fd..4cddc91252 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
+using System.Collections.Immutable;
using System.Linq;
using System.Text.Json.Serialization;
using Jellyfin.Data.Entities;
@@ -91,7 +92,7 @@ namespace MediaBrowser.Controller.Entities.Movies
return Enumerable.Empty();
}
- protected override List LoadChildren()
+ protected override IReadOnlyList LoadChildren()
{
if (IsLegacyBoxSet)
{
@@ -99,7 +100,7 @@ namespace MediaBrowser.Controller.Entities.Movies
}
// Save a trip to the database
- return new List();
+ return [];
}
public override bool IsAuthorizedToDelete(User user, List allCollectionFolders)
@@ -127,16 +128,16 @@ namespace MediaBrowser.Controller.Entities.Movies
return LibraryManager.Sort(items, user, new[] { sortBy }, SortOrder.Ascending);
}
- public override List GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
+ public override IReadOnlyList GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
{
var children = base.GetChildren(user, includeLinkedChildren, query);
- return Sort(children, user).ToList();
+ return Sort(children, user).ToImmutableList();
}
- public override IEnumerable GetRecursiveChildren(User user, InternalItemsQuery query)
+ public override IReadOnlyList GetRecursiveChildren(User user, InternalItemsQuery query)
{
var children = base.GetRecursiveChildren(user, query);
- return Sort(children, user).ToList();
+ return Sort(children, user).ToImmutableList();
}
public BoxSetInfo GetLookupInfo()
diff --git a/MediaBrowser.Controller/Entities/PeopleHelper.cs b/MediaBrowser.Controller/Entities/PeopleHelper.cs
index 5292bd7727..4141b17127 100644
--- a/MediaBrowser.Controller/Entities/PeopleHelper.cs
+++ b/MediaBrowser.Controller/Entities/PeopleHelper.cs
@@ -10,7 +10,7 @@ namespace MediaBrowser.Controller.Entities
{
public static class PeopleHelper
{
- public static void AddPerson(List people, PersonInfo person)
+ public static void AddPerson(ICollection people, PersonInfo person)
{
ArgumentNullException.ThrowIfNull(person);
ArgumentException.ThrowIfNullOrEmpty(person.Name);
diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs
index 7f265084fb..b0933d23f4 100644
--- a/MediaBrowser.Controller/Entities/Person.cs
+++ b/MediaBrowser.Controller/Entities/Person.cs
@@ -62,7 +62,7 @@ namespace MediaBrowser.Controller.Entities
return value;
}
- public IList GetTaggedItems(InternalItemsQuery query)
+ public IReadOnlyList GetTaggedItems(InternalItemsQuery query)
{
query.PersonIds = new[] { Id };
diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs
index a3736a4bfc..b46a3d1bcf 100644
--- a/MediaBrowser.Controller/Entities/Studio.cs
+++ b/MediaBrowser.Controller/Entities/Studio.cs
@@ -63,7 +63,7 @@ namespace MediaBrowser.Controller.Entities
return true;
}
- public IList GetTaggedItems(InternalItemsQuery query)
+ public IReadOnlyList GetTaggedItems(InternalItemsQuery query)
{
query.StudioIds = new[] { Id };
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index a324f79eff..137d91f1cf 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -189,12 +189,12 @@ namespace MediaBrowser.Controller.Entities.TV
return list;
}
- public override List GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
+ public override IReadOnlyList GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
{
return GetSeasons(user, new DtoOptions(true));
}
- public List GetSeasons(User user, DtoOptions options)
+ public IReadOnlyList GetSeasons(User user, DtoOptions options)
{
var query = new InternalItemsQuery(user)
{
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs
index a687adeddc..7cf447fb8d 100644
--- a/MediaBrowser.Controller/Entities/UserRootFolder.cs
+++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs
@@ -52,7 +52,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- protected override List LoadChildren()
+ protected override IReadOnlyList LoadChildren()
{
lock (_childIdsLock)
{
diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs
index e4fb340f78..f5ca3737c2 100644
--- a/MediaBrowser.Controller/Entities/UserView.cs
+++ b/MediaBrowser.Controller/Entities/UserView.cs
@@ -134,7 +134,7 @@ namespace MediaBrowser.Controller.Entities
}
///
- public override IEnumerable GetRecursiveChildren(User user, InternalItemsQuery query)
+ public override IReadOnlyList GetRecursiveChildren(User user, InternalItemsQuery query)
{
query.SetUser(user);
query.Recursive = true;
@@ -145,7 +145,7 @@ namespace MediaBrowser.Controller.Entities
}
///
- protected override IEnumerable GetEligibleChildrenForRecursiveChildren(User user)
+ protected override IReadOnlyList GetEligibleChildrenForRecursiveChildren(User user)
{
return GetChildren(user, false);
}
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index 420349f35c..4ec2e4c0a4 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -236,7 +236,7 @@ namespace MediaBrowser.Controller.Entities
return ConvertToResult(_libraryManager.GetItemList(query));
}
- private QueryResult ConvertToResult(List items)
+ private QueryResult ConvertToResult(IReadOnlyList items)
{
return new QueryResult(items);
}
diff --git a/MediaBrowser.Controller/Entities/Year.cs b/MediaBrowser.Controller/Entities/Year.cs
index afdaf448b7..587d7ce7e5 100644
--- a/MediaBrowser.Controller/Entities/Year.cs
+++ b/MediaBrowser.Controller/Entities/Year.cs
@@ -55,7 +55,7 @@ namespace MediaBrowser.Controller.Entities
return true;
}
- public IList GetTaggedItems(InternalItemsQuery query)
+ public IReadOnlyList GetTaggedItems(InternalItemsQuery query)
{
if (!int.TryParse(Name, NumberStyles.Integer, CultureInfo.InvariantCulture, out var year))
{
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index b802b7e6ea..47b1cb16e8 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -483,21 +483,21 @@ namespace MediaBrowser.Controller.Library
///
/// The item.
/// List<PersonInfo>.
- List GetPeople(BaseItem item);
+ IReadOnlyList GetPeople(BaseItem item);
///
/// Gets the people.
///
/// The query.
/// List<PersonInfo>.
- List GetPeople(InternalPeopleQuery query);
+ IReadOnlyList GetPeople(InternalPeopleQuery query);
///
/// Gets the people items.
///
/// The query.
/// List<Person>.
- List GetPeopleItems(InternalPeopleQuery query);
+ IReadOnlyList GetPeopleItems(InternalPeopleQuery query);
///
/// Updates the people.
@@ -513,21 +513,21 @@ namespace MediaBrowser.Controller.Library
/// The people.
/// The cancellation token.
/// The async task.
- Task UpdatePeopleAsync(BaseItem item, List people, CancellationToken cancellationToken);
+ Task UpdatePeopleAsync(BaseItem item, IReadOnlyList people, CancellationToken cancellationToken);
///
/// Gets the item ids.
///
/// The query.
/// List<Guid>.
- List GetItemIds(InternalItemsQuery query);
+ IReadOnlyList GetItemIds(InternalItemsQuery query);
///
/// Gets the people names.
///
/// The query.
/// List<System.String>.
- List GetPeopleNames(InternalPeopleQuery query);
+ IReadOnlyList GetPeopleNames(InternalPeopleQuery query);
///
/// Queries the items.
@@ -553,9 +553,9 @@ namespace MediaBrowser.Controller.Library
///
/// The query.
/// QueryResult<BaseItem>.
- List GetItemList(InternalItemsQuery query);
+ IReadOnlyList GetItemList(InternalItemsQuery query);
- List GetItemList(InternalItemsQuery query, bool allowExternalContent);
+ IReadOnlyList GetItemList(InternalItemsQuery query, bool allowExternalContent);
///
/// Gets the items.
@@ -563,7 +563,7 @@ namespace MediaBrowser.Controller.Library
/// The query to use.
/// Items to use for query.
/// List of items.
- List GetItemList(InternalItemsQuery query, List parents);
+ IReadOnlyList GetItemList(InternalItemsQuery query, List parents);
///
/// Gets the items result.
diff --git a/MediaBrowser.Controller/Library/IMediaSourceManager.cs b/MediaBrowser.Controller/Library/IMediaSourceManager.cs
index 44a1a85e30..5ed3a49c38 100644
--- a/MediaBrowser.Controller/Library/IMediaSourceManager.cs
+++ b/MediaBrowser.Controller/Library/IMediaSourceManager.cs
@@ -29,28 +29,28 @@ namespace MediaBrowser.Controller.Library
///
/// The item identifier.
/// IEnumerable<MediaStream>.
- List GetMediaStreams(Guid itemId);
+ IReadOnlyList GetMediaStreams(Guid itemId);
///
/// Gets the media streams.
///
/// The query.
/// IEnumerable<MediaStream>.
- List GetMediaStreams(MediaStreamQuery query);
+ IReadOnlyList GetMediaStreams(MediaStreamQuery query);
///
/// Gets the media attachments.
///
/// The item identifier.
/// IEnumerable<MediaAttachment>.
- List GetMediaAttachments(Guid itemId);
+ IReadOnlyList GetMediaAttachments(Guid itemId);
///
/// Gets the media attachments.
///
/// The query.
/// IEnumerable<MediaAttachment>.
- List GetMediaAttachments(MediaAttachmentQuery query);
+ IReadOnlyList GetMediaAttachments(MediaAttachmentQuery query);
///
/// Gets the playack media sources.
diff --git a/MediaBrowser.Controller/Library/IMusicManager.cs b/MediaBrowser.Controller/Library/IMusicManager.cs
index 93073cc79b..7ba8fc20cf 100644
--- a/MediaBrowser.Controller/Library/IMusicManager.cs
+++ b/MediaBrowser.Controller/Library/IMusicManager.cs
@@ -17,7 +17,7 @@ namespace MediaBrowser.Controller.Library
/// The user to use.
/// The options to use.
/// List of items.
- List GetInstantMixFromItem(BaseItem item, User? user, DtoOptions dtoOptions);
+ IReadOnlyList GetInstantMixFromItem(BaseItem item, User? user, DtoOptions dtoOptions);
///
/// Gets the instant mix from artist.
@@ -26,7 +26,7 @@ namespace MediaBrowser.Controller.Library
/// The user to use.
/// The options to use.
/// List of items.
- List GetInstantMixFromArtist(MusicArtist artist, User? user, DtoOptions dtoOptions);
+ IReadOnlyList GetInstantMixFromArtist(MusicArtist artist, User? user, DtoOptions dtoOptions);
///
/// Gets the instant mix from genre.
@@ -35,6 +35,6 @@ namespace MediaBrowser.Controller.Library
/// The user to use.
/// The options to use.
/// List of items.
- List GetInstantMixFromGenres(IEnumerable genres, User? user, DtoOptions dtoOptions);
+ IReadOnlyList GetInstantMixFromGenres(IEnumerable genres, User? user, DtoOptions dtoOptions);
}
}
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
index 3c2cf8e3d2..64d49d8c48 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
+using System.Collections.Immutable;
using System.Globalization;
using System.Linq;
using System.Text.Json.Serialization;
@@ -122,7 +123,7 @@ namespace MediaBrowser.Controller.LiveTv
public IEnumerable GetTaggedItems()
=> Enumerable.Empty();
- public override List GetMediaSources(bool enablePathSubstitution)
+ public override IReadOnlyList GetMediaSources(bool enablePathSubstitution)
{
var list = new List();
@@ -140,12 +141,12 @@ namespace MediaBrowser.Controller.LiveTv
list.Add(info);
- return list;
+ return list.ToImmutableList();
}
- public override List GetMediaStreams()
+ public override IReadOnlyList GetMediaStreams()
{
- return new List();
+ return [];
}
protected override string GetInternalMetadataPath(string basePath)
diff --git a/MediaBrowser.Controller/Playlists/Playlist.cs b/MediaBrowser.Controller/Playlists/Playlist.cs
index 45aefacf6d..bf6871a745 100644
--- a/MediaBrowser.Controller/Playlists/Playlist.cs
+++ b/MediaBrowser.Controller/Playlists/Playlist.cs
@@ -137,27 +137,27 @@ namespace MediaBrowser.Controller.Playlists
return Task.CompletedTask;
}
- public override List GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
+ public override IReadOnlyList GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
{
return GetPlayableItems(user, query);
}
- protected override IEnumerable GetNonCachedChildren(IDirectoryService directoryService)
+ protected override IReadOnlyList GetNonCachedChildren(IDirectoryService directoryService)
{
return [];
}
- public override IEnumerable GetRecursiveChildren(User user, InternalItemsQuery query)
+ public override IReadOnlyList GetRecursiveChildren(User user, InternalItemsQuery query)
{
return GetPlayableItems(user, query);
}
- public IEnumerable> GetManageableItems()
+ public IReadOnlyList> GetManageableItems()
{
return GetLinkedChildrenInfos();
}
- private List GetPlayableItems(User user, InternalItemsQuery query)
+ private IReadOnlyList GetPlayableItems(User user, InternalItemsQuery query)
{
query ??= new InternalItemsQuery(user);
diff --git a/MediaBrowser.Controller/Providers/MetadataResult.cs b/MediaBrowser.Controller/Providers/MetadataResult.cs
index cfff3eb144..eabbe73cde 100644
--- a/MediaBrowser.Controller/Providers/MetadataResult.cs
+++ b/MediaBrowser.Controller/Providers/MetadataResult.cs
@@ -3,6 +3,7 @@
#pragma warning disable CA1002, CA2227, CS1591
using System.Collections.Generic;
+using System.Linq;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
@@ -13,6 +14,7 @@ namespace MediaBrowser.Controller.Providers
// Images aren't always used so the allocation is a waste a lot of the time
private List _images;
private List<(string Url, ImageType Type)> _remoteImages;
+ private List _people;
public MetadataResult()
{
@@ -21,17 +23,21 @@ namespace MediaBrowser.Controller.Providers
public List Images
{
- get => _images ??= new List();
+ get => _images ??= [];
set => _images = value;
}
public List<(string Url, ImageType Type)> RemoteImages
{
- get => _remoteImages ??= new List<(string Url, ImageType Type)>();
+ get => _remoteImages ??= [];
set => _remoteImages = value;
}
- public List People { get; set; }
+ public IReadOnlyList People
+ {
+ get => _people;
+ set => _people = value.ToList();
+ }
public bool HasMetadata { get; set; }
@@ -47,7 +53,7 @@ namespace MediaBrowser.Controller.Providers
{
People ??= new List();
- PeopleHelper.AddPerson(People, p);
+ PeopleHelper.AddPerson(_people, p);
}
///
@@ -61,7 +67,7 @@ namespace MediaBrowser.Controller.Providers
}
else
{
- People.Clear();
+ _people.Clear();
}
}
}
diff --git a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
index 32ab7716f7..b51ab4c08e 100644
--- a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
+++ b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
@@ -39,7 +39,7 @@ namespace MediaBrowser.Providers.BoxSets
protected override bool EnableUpdatingPremiereDateFromChildren => true;
///
- protected override IList GetChildrenForMetadataUpdates(BoxSet item)
+ protected override IReadOnlyList GetChildrenForMetadataUpdates(BoxSet item)
{
return item.GetLinkedChildren();
}
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index 7203bf1158..4c9d162c4b 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -322,17 +322,17 @@ namespace MediaBrowser.Providers.Manager
return false;
}
- protected virtual IList GetChildrenForMetadataUpdates(TItemType item)
+ protected virtual IReadOnlyList GetChildrenForMetadataUpdates(TItemType item)
{
if (item is Folder folder)
{
return folder.GetRecursiveChildren();
}
- return Array.Empty();
+ return [];
}
- protected virtual ItemUpdateType UpdateMetadataFromChildren(TItemType item, IList children, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected virtual ItemUpdateType UpdateMetadataFromChildren(TItemType item, IReadOnlyList children, bool isFullRefresh, ItemUpdateType currentUpdateType)
{
var updateType = ItemUpdateType.None;
@@ -371,7 +371,7 @@ namespace MediaBrowser.Providers.Manager
return updateType;
}
- private ItemUpdateType UpdateCumulativeRunTimeTicks(TItemType item, IList children)
+ private ItemUpdateType UpdateCumulativeRunTimeTicks(TItemType item, IReadOnlyList children)
{
if (item is Folder folder && folder.SupportsCumulativeRunTimeTicks)
{
@@ -395,7 +395,7 @@ namespace MediaBrowser.Providers.Manager
return ItemUpdateType.None;
}
- private ItemUpdateType UpdateDateLastMediaAdded(TItemType item, IList children)
+ private ItemUpdateType UpdateDateLastMediaAdded(TItemType item, IReadOnlyList children)
{
var updateType = ItemUpdateType.None;
@@ -429,7 +429,7 @@ namespace MediaBrowser.Providers.Manager
return updateType;
}
- private ItemUpdateType UpdatePremiereDate(TItemType item, IList children)
+ private ItemUpdateType UpdatePremiereDate(TItemType item, IReadOnlyList children)
{
var updateType = ItemUpdateType.None;
@@ -467,7 +467,7 @@ namespace MediaBrowser.Providers.Manager
return updateType;
}
- private ItemUpdateType UpdateGenres(TItemType item, IList children)
+ private ItemUpdateType UpdateGenres(TItemType item, IReadOnlyList children)
{
var updateType = ItemUpdateType.None;
@@ -488,7 +488,7 @@ namespace MediaBrowser.Providers.Manager
return updateType;
}
- private ItemUpdateType UpdateStudios(TItemType item, IList children)
+ private ItemUpdateType UpdateStudios(TItemType item, IReadOnlyList children)
{
var updateType = ItemUpdateType.None;
@@ -509,7 +509,7 @@ namespace MediaBrowser.Providers.Manager
return updateType;
}
- private ItemUpdateType UpdateOfficialRating(TItemType item, IList children)
+ private ItemUpdateType UpdateOfficialRating(TItemType item, IReadOnlyList children)
{
var updateType = ItemUpdateType.None;
@@ -1142,13 +1142,8 @@ namespace MediaBrowser.Providers.Manager
}
}
- private static void MergePeople(List source, List target)
+ private static void MergePeople(IReadOnlyList source, IReadOnlyList target)
{
- if (target is null)
- {
- target = new List();
- }
-
foreach (var person in target)
{
var normalizedName = person.Name.RemoveDiacritics();
diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs
index 27f6d120f9..3add439f9c 100644
--- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs
+++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs
@@ -36,6 +36,7 @@ namespace MediaBrowser.Providers.MediaInfo
private readonly IMediaSourceManager _mediaSourceManager;
private readonly LyricResolver _lyricResolver;
private readonly ILyricManager _lyricManager;
+ private readonly IMediaStreamRepository _mediaStreamRepository;
///
/// Initializes a new instance of the class.
@@ -47,6 +48,7 @@ namespace MediaBrowser.Providers.MediaInfo
/// Instance of the interface.
/// Instance of the interface.
/// Instance of the interface.
+ /// Instance of the .
public AudioFileProber(
ILogger logger,
IMediaSourceManager mediaSourceManager,
@@ -54,7 +56,8 @@ namespace MediaBrowser.Providers.MediaInfo
IItemRepository itemRepo,
ILibraryManager libraryManager,
LyricResolver lyricResolver,
- ILyricManager lyricManager)
+ ILyricManager lyricManager,
+ IMediaStreamRepository mediaStreamRepository)
{
_mediaEncoder = mediaEncoder;
_itemRepo = itemRepo;
@@ -63,6 +66,7 @@ namespace MediaBrowser.Providers.MediaInfo
_mediaSourceManager = mediaSourceManager;
_lyricResolver = lyricResolver;
_lyricManager = lyricManager;
+ _mediaStreamRepository = mediaStreamRepository;
ATL.Settings.DisplayValueSeparator = InternalValueSeparator;
ATL.Settings.UseFileNameWhenNoTitle = false;
ATL.Settings.ID3v2_separatev2v3Values = false;
@@ -149,7 +153,7 @@ namespace MediaBrowser.Providers.MediaInfo
audio.HasLyrics = mediaStreams.Any(s => s.Type == MediaStreamType.Lyric);
- _itemRepo.SaveMediaStreams(audio.Id, mediaStreams, cancellationToken);
+ _mediaStreamRepository.SaveMediaStreams(audio.Id, mediaStreams, cancellationToken);
}
///
diff --git a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs
index d1c0ddb375..bfe4f3300f 100644
--- a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs
+++ b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs
@@ -74,7 +74,7 @@ namespace MediaBrowser.Providers.MediaInfo
return GetImage((Audio)item, imageStreams, cancellationToken);
}
- private async Task GetImage(Audio item, List imageStreams, CancellationToken cancellationToken)
+ private async Task GetImage(Audio item, IReadOnlyList imageStreams, CancellationToken cancellationToken)
{
var path = GetAudioImagePath(item);
diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
index 62c5909441..301555eefa 100644
--- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
+++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
@@ -31,6 +31,7 @@ namespace MediaBrowser.Providers.MediaInfo
public class FFProbeVideoInfo
{
private readonly ILogger _logger;
+ private readonly IMediaSourceManager _mediaSourceManager;
private readonly IMediaEncoder _mediaEncoder;
private readonly IItemRepository _itemRepo;
private readonly IBlurayExaminer _blurayExaminer;
@@ -42,7 +43,8 @@ namespace MediaBrowser.Providers.MediaInfo
private readonly ILibraryManager _libraryManager;
private readonly AudioResolver _audioResolver;
private readonly SubtitleResolver _subtitleResolver;
- private readonly IMediaSourceManager _mediaSourceManager;
+ private readonly IMediaAttachmentRepository _mediaAttachmentRepository;
+ private readonly IMediaStreamRepository _mediaStreamRepository;
public FFProbeVideoInfo(
ILogger logger,
@@ -57,7 +59,9 @@ namespace MediaBrowser.Providers.MediaInfo
IChapterRepository chapterManager,
ILibraryManager libraryManager,
AudioResolver audioResolver,
- SubtitleResolver subtitleResolver)
+ SubtitleResolver subtitleResolver,
+ IMediaAttachmentRepository mediaAttachmentRepository,
+ IMediaStreamRepository mediaStreamRepository)
{
_logger = logger;
_mediaSourceManager = mediaSourceManager;
@@ -72,6 +76,9 @@ namespace MediaBrowser.Providers.MediaInfo
_libraryManager = libraryManager;
_audioResolver = audioResolver;
_subtitleResolver = subtitleResolver;
+ _mediaAttachmentRepository = mediaAttachmentRepository;
+ _mediaStreamRepository = mediaStreamRepository;
+ _mediaStreamRepository = mediaStreamRepository;
}
public async Task ProbeVideo(
@@ -267,11 +274,11 @@ namespace MediaBrowser.Providers.MediaInfo
video.HasSubtitles = mediaStreams.Any(i => i.Type == MediaStreamType.Subtitle);
- _itemRepo.SaveMediaStreams(video.Id, mediaStreams, cancellationToken);
+ _mediaStreamRepository.SaveMediaStreams(video.Id, mediaStreams, cancellationToken);
if (mediaAttachments.Any())
{
- _itemRepo.SaveMediaAttachments(video.Id, mediaAttachments, cancellationToken);
+ _mediaAttachmentRepository.SaveMediaAttachments(video.Id, mediaAttachments, cancellationToken);
}
if (options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh
diff --git a/MediaBrowser.Providers/MediaInfo/ProbeProvider.cs b/MediaBrowser.Providers/MediaInfo/ProbeProvider.cs
index f5e9dddcfc..1c2f8b9134 100644
--- a/MediaBrowser.Providers/MediaInfo/ProbeProvider.cs
+++ b/MediaBrowser.Providers/MediaInfo/ProbeProvider.cs
@@ -67,6 +67,8 @@ namespace MediaBrowser.Providers.MediaInfo
/// Instance of the interface.
/// The .
/// Instance of the interface.
+ /// Instance of the interface.
+ /// Instance of the interface.
public ProbeProvider(
IMediaSourceManager mediaSourceManager,
IMediaEncoder mediaEncoder,
@@ -81,7 +83,9 @@ namespace MediaBrowser.Providers.MediaInfo
IFileSystem fileSystem,
ILoggerFactory loggerFactory,
NamingOptions namingOptions,
- ILyricManager lyricManager)
+ ILyricManager lyricManager,
+ IMediaAttachmentRepository mediaAttachmentRepository,
+ IMediaStreamRepository mediaStreamRepository)
{
_logger = loggerFactory.CreateLogger();
_audioResolver = new AudioResolver(loggerFactory.CreateLogger(), localization, mediaEncoder, fileSystem, namingOptions);
@@ -101,7 +105,9 @@ namespace MediaBrowser.Providers.MediaInfo
chapterManager,
libraryManager,
_audioResolver,
- _subtitleResolver);
+ _subtitleResolver,
+ mediaAttachmentRepository,
+ mediaStreamRepository);
_audioProber = new AudioFileProber(
loggerFactory.CreateLogger(),
@@ -110,7 +116,8 @@ namespace MediaBrowser.Providers.MediaInfo
itemRepo,
libraryManager,
_lyricResolver,
- lyricManager);
+ lyricManager,
+ mediaStreamRepository);
}
///
diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs b/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs
index 20fb4dab9c..227f310255 100644
--- a/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs
+++ b/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs
@@ -31,7 +31,7 @@ namespace MediaBrowser.Providers.MediaInfo
public async Task> DownloadSubtitles(
Video video,
- List mediaStreams,
+ IReadOnlyList mediaStreams,
bool skipIfEmbeddedSubtitlesPresent,
bool skipIfAudioTrackMatches,
bool requirePerfectMatch,
@@ -68,7 +68,7 @@ namespace MediaBrowser.Providers.MediaInfo
public Task DownloadSubtitles(
Video video,
- List mediaStreams,
+ IReadOnlyList mediaStreams,
bool skipIfEmbeddedSubtitlesPresent,
bool skipIfAudioTrackMatches,
bool requirePerfectMatch,
@@ -120,7 +120,7 @@ namespace MediaBrowser.Providers.MediaInfo
private async Task DownloadSubtitles(
Video video,
- List mediaStreams,
+ IReadOnlyList mediaStreams,
bool skipIfEmbeddedSubtitlesPresent,
bool skipIfAudioTrackMatches,
bool requirePerfectMatch,
diff --git a/MediaBrowser.Providers/Music/AlbumMetadataService.cs b/MediaBrowser.Providers/Music/AlbumMetadataService.cs
index a39bd16cea..25698d8cb5 100644
--- a/MediaBrowser.Providers/Music/AlbumMetadataService.cs
+++ b/MediaBrowser.Providers/Music/AlbumMetadataService.cs
@@ -47,11 +47,11 @@ namespace MediaBrowser.Providers.Music
protected override bool EnableUpdatingStudiosFromChildren => true;
///
- protected override IList GetChildrenForMetadataUpdates(MusicAlbum item)
+ protected override IReadOnlyList GetChildrenForMetadataUpdates(MusicAlbum item)
=> item.GetRecursiveChildren(i => i is Audio);
///
- protected override ItemUpdateType UpdateMetadataFromChildren(MusicAlbum item, IList children, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected override ItemUpdateType UpdateMetadataFromChildren(MusicAlbum item, IReadOnlyList children, bool isFullRefresh, ItemUpdateType currentUpdateType)
{
var updateType = base.UpdateMetadataFromChildren(item, children, isFullRefresh, currentUpdateType);
diff --git a/MediaBrowser.Providers/Music/ArtistMetadataService.cs b/MediaBrowser.Providers/Music/ArtistMetadataService.cs
index 1f342c0db1..8af6de9259 100644
--- a/MediaBrowser.Providers/Music/ArtistMetadataService.cs
+++ b/MediaBrowser.Providers/Music/ArtistMetadataService.cs
@@ -1,6 +1,7 @@
#pragma warning disable CS1591
using System.Collections.Generic;
+using System.Collections.Immutable;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
@@ -28,7 +29,7 @@ namespace MediaBrowser.Providers.Music
protected override bool EnableUpdatingGenresFromChildren => true;
///
- protected override IList GetChildrenForMetadataUpdates(MusicArtist item)
+ protected override IReadOnlyList GetChildrenForMetadataUpdates(MusicArtist item)
{
return item.IsAccessedByName
? item.GetTaggedItems(new InternalItemsQuery
@@ -36,7 +37,7 @@ namespace MediaBrowser.Providers.Music
Recursive = true,
IsFolder = false
})
- : item.GetRecursiveChildren(i => i is IHasArtist && !i.IsFolder);
+ : item.GetRecursiveChildren(i => i is IHasArtist && !i.IsFolder).ToImmutableArray();
}
}
}
diff --git a/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs b/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs
index 43889bfbf5..7be54453f8 100644
--- a/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs
+++ b/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs
@@ -36,7 +36,7 @@ namespace MediaBrowser.Providers.Playlists
protected override bool EnableUpdatingStudiosFromChildren => true;
///
- protected override IList GetChildrenForMetadataUpdates(Playlist item)
+ protected override IReadOnlyList GetChildrenForMetadataUpdates(Playlist item)
=> item.GetLinkedChildren();
///
diff --git a/MediaBrowser.Providers/TV/SeasonMetadataService.cs b/MediaBrowser.Providers/TV/SeasonMetadataService.cs
index 8b690193ee..b27ccaa6a3 100644
--- a/MediaBrowser.Providers/TV/SeasonMetadataService.cs
+++ b/MediaBrowser.Providers/TV/SeasonMetadataService.cs
@@ -80,11 +80,11 @@ namespace MediaBrowser.Providers.TV
}
///
- protected override IList GetChildrenForMetadataUpdates(Season item)
+ protected override IReadOnlyList GetChildrenForMetadataUpdates(Season item)
=> item.GetEpisodes();
///
- protected override ItemUpdateType UpdateMetadataFromChildren(Season item, IList children, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected override ItemUpdateType UpdateMetadataFromChildren(Season item, IReadOnlyList children, bool isFullRefresh, ItemUpdateType currentUpdateType)
{
var updateType = base.UpdateMetadataFromChildren(item, children, isFullRefresh, currentUpdateType);
@@ -96,7 +96,7 @@ namespace MediaBrowser.Providers.TV
return updateType;
}
- private ItemUpdateType SaveIsVirtualItem(Season item, IList episodes)
+ private ItemUpdateType SaveIsVirtualItem(Season item, IReadOnlyList episodes)
{
var isVirtualItem = item.LocationType == LocationType.Virtual && (episodes.Count == 0 || episodes.All(i => i.LocationType == LocationType.Virtual));
diff --git a/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs
index 813d75f6c1..4cd676be12 100644
--- a/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs
@@ -67,7 +67,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
AddAlbums(albums, writer);
}
- private void AddAlbums(IList albums, XmlWriter writer)
+ private void AddAlbums(IReadOnlyList albums, XmlWriter writer)
{
foreach (var album in albums)
{
diff --git a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
index 79e9e7503c..51c5a20803 100644
--- a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
@@ -914,7 +914,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
writer.WriteEndElement();
}
- private void AddActors(List people, XmlWriter writer, ILibraryManager libraryManager, bool saveImagePath)
+ private void AddActors(IReadOnlyList people, XmlWriter writer, ILibraryManager libraryManager, bool saveImagePath)
{
foreach (var person in people)
{
--
cgit v1.2.3
From 473628ba3a9f68479e0051e76594dc47f7fa08f3 Mon Sep 17 00:00:00 2001
From: JPVenson
Date: Wed, 9 Oct 2024 21:03:57 +0200
Subject: Apply suggestions from code review
Co-authored-by: Cody Robibero
---
Emby.Server.Implementations/Data/ItemTypeLookup.cs | 2 +-
Jellyfin.Api/Controllers/MoviesController.cs | 2 +-
Jellyfin.Data/Entities/BaseItemProvider.cs | 2 +-
Jellyfin.Data/Entities/MediaStreamInfo.cs | 4 ----
Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs | 2 +-
MediaBrowser.Controller/Persistence/IItemTypeLookup.cs | 2 +-
MediaBrowser.Controller/Persistence/IPeopleRepository.cs | 4 ++--
7 files changed, 7 insertions(+), 11 deletions(-)
(limited to 'Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs')
diff --git a/Emby.Server.Implementations/Data/ItemTypeLookup.cs b/Emby.Server.Implementations/Data/ItemTypeLookup.cs
index 14dc68a327..1f73755f5d 100644
--- a/Emby.Server.Implementations/Data/ItemTypeLookup.cs
+++ b/Emby.Server.Implementations/Data/ItemTypeLookup.cs
@@ -12,7 +12,7 @@ using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Playlists;
using MediaBrowser.Model.Querying;
-namespace Jellyfin.Server.Implementations.Item;
+namespace Emby.Server.Implementations.Data;
///
/// Provides static topic based lookups for the BaseItemKind.
diff --git a/Jellyfin.Api/Controllers/MoviesController.cs b/Jellyfin.Api/Controllers/MoviesController.cs
index 11559419c1..f537ffa11e 100644
--- a/Jellyfin.Api/Controllers/MoviesController.cs
+++ b/Jellyfin.Api/Controllers/MoviesController.cs
@@ -97,7 +97,7 @@ public class MoviesController : BaseJellyfinApiController
DtoOptions = dtoOptions
};
- var recentlyPlayedMovies = _libraryManager.GetItemList(query)!;
+ var recentlyPlayedMovies = _libraryManager.GetItemList(query);
var itemTypes = new List { BaseItemKind.Movie };
if (_serverConfigurationManager.Configuration.EnableExternalContentInSuggestions)
diff --git a/Jellyfin.Data/Entities/BaseItemProvider.cs b/Jellyfin.Data/Entities/BaseItemProvider.cs
index 1fc721d6a2..9a1565728d 100644
--- a/Jellyfin.Data/Entities/BaseItemProvider.cs
+++ b/Jellyfin.Data/Entities/BaseItemProvider.cs
@@ -6,7 +6,7 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace Jellyfin.Data.Entities;
///
-/// Represents an Key-Value relaten of an BaseItem's provider.
+/// Represents a Key-Value relation of an BaseItem's provider.
///
public class BaseItemProvider
{
diff --git a/Jellyfin.Data/Entities/MediaStreamInfo.cs b/Jellyfin.Data/Entities/MediaStreamInfo.cs
index a46d3f1958..1198026e72 100644
--- a/Jellyfin.Data/Entities/MediaStreamInfo.cs
+++ b/Jellyfin.Data/Entities/MediaStreamInfo.cs
@@ -6,10 +6,6 @@ namespace Jellyfin.Data.Entities;
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
public class MediaStreamInfo
{
- public MediaStreamInfo()
- {
- }
-
public required Guid ItemId { get; set; }
public required BaseItemEntity Item { get; set; }
diff --git a/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs b/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
index f44ead6e02..df434fdb36 100644
--- a/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
@@ -37,7 +37,7 @@ public class MediaStreamRepository(IDbContextFactory dbProvid
public IReadOnlyList GetMediaStreams(MediaStreamQuery filter)
{
using var context = dbProvider.CreateDbContext();
- return TranslateQuery(context.MediaStreamInfos, filter).ToList().Select(Map).ToImmutableArray();
+ return TranslateQuery(context.MediaStreamInfos, filter).AsEnumerable().Select(Map).ToImmutableArray();
}
private string? GetPathToSave(string? path)
diff --git a/MediaBrowser.Controller/Persistence/IItemTypeLookup.cs b/MediaBrowser.Controller/Persistence/IItemTypeLookup.cs
index 1b2ca2acb5..6ad8380d7c 100644
--- a/MediaBrowser.Controller/Persistence/IItemTypeLookup.cs
+++ b/MediaBrowser.Controller/Persistence/IItemTypeLookup.cs
@@ -51,7 +51,7 @@ public interface IItemTypeLookup
public IReadOnlyList ArtistsTypes { get; }
///
- /// Gets mapping for all BaseItemKinds and their expected serialisaition target.
+ /// Gets mapping for all BaseItemKinds and their expected serialization target.
///
public IDictionary BaseItemKindNames { get; }
}
diff --git a/MediaBrowser.Controller/Persistence/IPeopleRepository.cs b/MediaBrowser.Controller/Persistence/IPeopleRepository.cs
index 43a24703e4..418289cb4c 100644
--- a/MediaBrowser.Controller/Persistence/IPeopleRepository.cs
+++ b/MediaBrowser.Controller/Persistence/IPeopleRepository.cs
@@ -14,7 +14,7 @@ public interface IPeopleRepository
/// Gets the people.
///
/// The query.
- /// List<PersonInfo>.
+ /// The list of people matching the filter.
IReadOnlyList GetPeople(InternalPeopleQuery filter);
///
@@ -28,6 +28,6 @@ public interface IPeopleRepository
/// Gets the people names.
///
/// The query.
- /// List<System.String>.
+ /// The list of people names matching the filter.
IReadOnlyList GetPeopleNames(InternalPeopleQuery filter);
}
--
cgit v1.2.3
From 2955f2f56275fca01cd3f586b3475dcdfbea78ed Mon Sep 17 00:00:00 2001
From: JPVenson
Date: Wed, 9 Oct 2024 23:19:24 +0000
Subject: Fixed AncestorIds and applied review comments
---
Jellyfin.Api/Controllers/MoviesController.cs | 3 +-
Jellyfin.Data/Entities/AncestorId.cs | 20 +-
Jellyfin.Data/Entities/MediaStreamInfo.cs | 2 +-
Jellyfin.Data/Entities/MediaStreamTypeEntity.cs | 37 +
Jellyfin.Data/Entities/PeopleKind.cs | 133 --
.../Item/BaseItemRepository.cs | 20 +-
.../Item/MediaAttachmentRepository.cs | 2 +-
.../Item/MediaStreamRepository.cs | 7 +-
.../Item/PeopleRepository.cs | 2 +-
.../20241009231203_FixedAncestorIds.Designer.cs | 1536 ++++++++++++++++++++
.../Migrations/20241009231203_FixedAncestorIds.cs | 89 ++
.../20241009231912_FixedStreamType.Designer.cs | 1536 ++++++++++++++++++++
.../Migrations/20241009231912_FixedStreamType.cs | 36 +
.../Migrations/JellyfinDbModelSnapshot.cs | 22 +-
.../ModelConfiguration/AncestorIdConfiguration.cs | 5 +-
.../Migrations/Routines/MigrateLibraryDb.cs | 6 +-
16 files changed, 3275 insertions(+), 181 deletions(-)
create mode 100644 Jellyfin.Data/Entities/MediaStreamTypeEntity.cs
delete mode 100644 Jellyfin.Data/Entities/PeopleKind.cs
create mode 100644 Jellyfin.Server.Implementations/Migrations/20241009231203_FixedAncestorIds.Designer.cs
create mode 100644 Jellyfin.Server.Implementations/Migrations/20241009231203_FixedAncestorIds.cs
create mode 100644 Jellyfin.Server.Implementations/Migrations/20241009231912_FixedStreamType.Designer.cs
create mode 100644 Jellyfin.Server.Implementations/Migrations/20241009231912_FixedStreamType.cs
(limited to 'Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs')
diff --git a/Jellyfin.Api/Controllers/MoviesController.cs b/Jellyfin.Api/Controllers/MoviesController.cs
index f537ffa11e..c2bdf71c5a 100644
--- a/Jellyfin.Api/Controllers/MoviesController.cs
+++ b/Jellyfin.Api/Controllers/MoviesController.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Collections.Immutable;
using System.Globalization;
using System.Linq;
using Jellyfin.Api.Extensions;
@@ -120,7 +121,7 @@ public class MoviesController : BaseJellyfinApiController
DtoOptions = dtoOptions
});
- var mostRecentMovies = recentlyPlayedMovies.Take(Math.Min(recentlyPlayedMovies.Count, 6));
+ var mostRecentMovies = recentlyPlayedMovies.Take(Math.Min(recentlyPlayedMovies.Count, 6)).ToImmutableList();
// Get recently played directors
var recentDirectors = GetDirectors(mostRecentMovies)
.ToList();
diff --git a/Jellyfin.Data/Entities/AncestorId.cs b/Jellyfin.Data/Entities/AncestorId.cs
index 54e938347b..941a8eb2e1 100644
--- a/Jellyfin.Data/Entities/AncestorId.cs
+++ b/Jellyfin.Data/Entities/AncestorId.cs
@@ -1,19 +1,19 @@
using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.ComponentModel.DataAnnotations.Schema;
namespace Jellyfin.Data.Entities;
-#pragma warning disable CA1708 // Identifiers should differ by more than case
-#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
+///
+/// Represents the relational informations for an .
+///
public class AncestorId
{
- public Guid Id { get; set; }
+ ///
+ /// Gets or Sets the AncestorId that may or may not be an database managed Item or an materialised local item.
+ ///
+ public required Guid ParentItemId { get; set; }
+ ///
+ /// Gets or Sets the related that may or may not be an database managed Item or an materialised local item.
+ ///
public required Guid ItemId { get; set; }
-
- public required BaseItemEntity Item { get; set; }
-
- public string? AncestorIdText { get; set; }
}
diff --git a/Jellyfin.Data/Entities/MediaStreamInfo.cs b/Jellyfin.Data/Entities/MediaStreamInfo.cs
index 1198026e72..28037de9db 100644
--- a/Jellyfin.Data/Entities/MediaStreamInfo.cs
+++ b/Jellyfin.Data/Entities/MediaStreamInfo.cs
@@ -12,7 +12,7 @@ public class MediaStreamInfo
public int StreamIndex { get; set; }
- public string? StreamType { get; set; }
+ public MediaStreamTypeEntity? StreamType { get; set; }
public string? Codec { get; set; }
diff --git a/Jellyfin.Data/Entities/MediaStreamTypeEntity.cs b/Jellyfin.Data/Entities/MediaStreamTypeEntity.cs
new file mode 100644
index 0000000000..d1f6f1b187
--- /dev/null
+++ b/Jellyfin.Data/Entities/MediaStreamTypeEntity.cs
@@ -0,0 +1,37 @@
+namespace Jellyfin.Data.Entities;
+
+///
+/// Enum MediaStreamType.
+///
+public enum MediaStreamTypeEntity
+{
+ ///
+ /// The audio.
+ ///
+ Audio,
+
+ ///
+ /// The video.
+ ///
+ Video,
+
+ ///
+ /// The subtitle.
+ ///
+ Subtitle,
+
+ ///
+ /// The embedded image.
+ ///
+ EmbeddedImage,
+
+ ///
+ /// The data.
+ ///
+ Data,
+
+ ///
+ /// The lyric.
+ ///
+ Lyric
+}
diff --git a/Jellyfin.Data/Entities/PeopleKind.cs b/Jellyfin.Data/Entities/PeopleKind.cs
deleted file mode 100644
index 967f7c11f6..0000000000
--- a/Jellyfin.Data/Entities/PeopleKind.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-namespace Jellyfin.Data.Entities;
-
-///
-/// The person kind.
-///
-public enum PeopleKind
-{
- ///
- /// An unknown person kind.
- ///
- Unknown,
-
- ///
- /// A person whose profession is acting on the stage, in films, or on television.
- ///
- Actor,
-
- ///
- /// A person who supervises the actors and other staff in a film, play, or similar production.
- ///
- Director,
-
- ///
- /// A person who writes music, especially as a professional occupation.
- ///
- Composer,
-
- ///
- /// A writer of a book, article, or document. Can also be used as a generic term for music writer if there is a lack of specificity.
- ///
- Writer,
-
- ///
- /// A well-known actor or other performer who appears in a work in which they do not have a regular role.
- ///
- GuestStar,
-
- ///
- /// A person responsible for the financial and managerial aspects of the making of a film or broadcast or for staging a play, opera, etc.
- ///
- Producer,
-
- ///
- /// A person who directs the performance of an orchestra or choir.
- ///
- Conductor,
-
- ///
- /// A person who writes the words to a song or musical.
- ///
- Lyricist,
-
- ///
- /// A person who adapts a musical composition for performance.
- ///
- Arranger,
-
- ///
- /// An audio engineer who performed a general engineering role.
- ///
- Engineer,
-
- ///
- /// An engineer responsible for using a mixing console to mix a recorded track into a single piece of music suitable for release.
- ///
- Mixer,
-
- ///
- /// A person who remixed a recording by taking one or more other tracks, substantially altering them and mixing them together with other material.
- ///
- Remixer,
-
- ///
- /// A person who created the material.
- ///
- Creator,
-
- ///
- /// A person who was the artist.
- ///
- Artist,
-
- ///
- /// A person who was the album artist.
- ///
- AlbumArtist,
-
- ///
- /// A person who was the author.
- ///
- Author,
-
- ///
- /// A person who was the illustrator.
- ///
- Illustrator,
-
- ///
- /// A person responsible for drawing the art.
- ///
- Penciller,
-
- ///
- /// A person responsible for inking the pencil art.
- ///
- Inker,
-
- ///
- /// A person responsible for applying color to drawings.
- ///
- Colorist,
-
- ///
- /// A person responsible for drawing text and speech bubbles.
- ///
- Letterer,
-
- ///
- /// A person responsible for drawing the cover art.
- ///
- CoverArtist,
-
- ///
- /// A person contributing to a resource by revising or elucidating the content, e.g., adding an introduction, notes, or other critical matter.
- /// An editor may also prepare a resource for production, publication, or distribution.
- ///
- Editor,
-
- ///
- /// A person who renders a text from one language into another.
- ///
- Translator
-}
diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
index 6ddab9e3db..6603b15e29 100644
--- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
@@ -83,7 +83,7 @@ public sealed class BaseItemRepository(IDbContextFactory dbPr
using var transaction = context.Database.BeginTransaction();
context.ItemValues.Where(e => e.Type == 6).ExecuteDelete();
- context.ItemValues.AddRange(context.ItemValues.Where(e => e.Type == 4).Select(e => new Data.Entities.ItemValue()
+ context.ItemValues.AddRange(context.ItemValues.Where(e => e.Type == 4).Select(e => new ItemValue()
{
CleanValue = e.CleanValue,
ItemId = e.ItemId,
@@ -93,7 +93,7 @@ public sealed class BaseItemRepository(IDbContextFactory dbPr
}));
context.ItemValues.AddRange(
- context.AncestorIds.Where(e => e.AncestorIdText != null).Join(context.ItemValues.Where(e => e.Value != null && e.Type == 4), e => e.Id, e => e.ItemId, (e, f) => new Data.Entities.ItemValue()
+ context.AncestorIds.Join(context.ItemValues.Where(e => e.Value != null && e.Type == 4), e => e.ParentItemId, e => e.ItemId, (e, f) => new ItemValue()
{
CleanValue = f.CleanValue,
ItemId = e.ItemId,
@@ -893,31 +893,31 @@ public sealed class BaseItemRepository(IDbContextFactory dbPr
if (!string.IsNullOrWhiteSpace(filter.HasNoAudioTrackWithLanguage))
{
baseQuery = baseQuery
- .Where(e => !e.MediaStreams!.Any(e => e.StreamType == "Audio" && e.Language == filter.HasNoAudioTrackWithLanguage));
+ .Where(e => !e.MediaStreams!.Any(e => e.StreamType == MediaStreamTypeEntity.Audio && e.Language == filter.HasNoAudioTrackWithLanguage));
}
if (!string.IsNullOrWhiteSpace(filter.HasNoInternalSubtitleTrackWithLanguage))
{
baseQuery = baseQuery
- .Where(e => !e.MediaStreams!.Any(e => e.StreamType == "Subtitle" && !e.IsExternal && e.Language == filter.HasNoInternalSubtitleTrackWithLanguage));
+ .Where(e => !e.MediaStreams!.Any(e => e.StreamType == MediaStreamTypeEntity.Subtitle && !e.IsExternal && e.Language == filter.HasNoInternalSubtitleTrackWithLanguage));
}
if (!string.IsNullOrWhiteSpace(filter.HasNoExternalSubtitleTrackWithLanguage))
{
baseQuery = baseQuery
- .Where(e => !e.MediaStreams!.Any(e => e.StreamType == "Subtitle" && e.IsExternal && e.Language == filter.HasNoExternalSubtitleTrackWithLanguage));
+ .Where(e => !e.MediaStreams!.Any(e => e.StreamType == MediaStreamTypeEntity.Subtitle && e.IsExternal && e.Language == filter.HasNoExternalSubtitleTrackWithLanguage));
}
if (!string.IsNullOrWhiteSpace(filter.HasNoSubtitleTrackWithLanguage))
{
baseQuery = baseQuery
- .Where(e => !e.MediaStreams!.Any(e => e.StreamType == "Subtitle" && e.Language == filter.HasNoSubtitleTrackWithLanguage));
+ .Where(e => !e.MediaStreams!.Any(e => e.StreamType == MediaStreamTypeEntity.Subtitle && e.Language == filter.HasNoSubtitleTrackWithLanguage));
}
if (filter.HasSubtitles.HasValue)
{
baseQuery = baseQuery
- .Where(e => e.MediaStreams!.Any(e => e.StreamType == "Subtitle") == filter.HasSubtitles.Value);
+ .Where(e => e.MediaStreams!.Any(e => e.StreamType == MediaStreamTypeEntity.Subtitle) == filter.HasSubtitles.Value);
}
if (filter.HasChapterImages.HasValue)
@@ -1062,7 +1062,7 @@ public sealed class BaseItemRepository(IDbContextFactory dbPr
if (filter.AncestorIds.Length > 0)
{
- baseQuery = baseQuery.Where(e => e.AncestorIds!.Any(f => filter.AncestorIds.Contains(f.Id)));
+ baseQuery = baseQuery.Where(e => e.AncestorIds!.Any(f => filter.AncestorIds.Contains(f.ParentItemId)));
}
if (!string.IsNullOrWhiteSpace(filter.AncestorWithPresentationUniqueKey))
@@ -1273,9 +1273,7 @@ public sealed class BaseItemRepository(IDbContextFactory dbPr
{
entity.AncestorIds.Add(new AncestorId()
{
- Item = entity,
- AncestorIdText = ancestorId.ToString(),
- Id = ancestorId,
+ ParentItemId = ancestorId,
ItemId = entity.Id
});
}
diff --git a/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs b/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs
index 70c5ff1e2e..d2034f6c5e 100644
--- a/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs
@@ -40,7 +40,7 @@ public class MediaAttachmentRepository(IDbContextFactory dbPr
query = query.Where(e => e.Index == filter.Index);
}
- return query.ToList().Select(Map).ToImmutableArray();
+ return query.AsEnumerable().Select(Map).ToImmutableArray();
}
private MediaAttachment Map(AttachmentStreamInfo attachment)
diff --git a/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs b/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
index df434fdb36..203071a6e0 100644
--- a/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
@@ -70,7 +70,8 @@ public class MediaStreamRepository(IDbContextFactory dbProvid
if (filter.Type.HasValue)
{
- query = query.Where(e => e.StreamType == filter.Type.ToString());
+ var typeValue = (MediaStreamTypeEntity)filter.Type.Value;
+ query = query.Where(e => e.StreamType!.Value == typeValue);
}
return query;
@@ -82,7 +83,7 @@ public class MediaStreamRepository(IDbContextFactory dbProvid
dto.Index = entity.StreamIndex;
if (entity.StreamType != null)
{
- dto.Type = Enum.Parse(entity.StreamType);
+ dto.Type = (MediaStreamType)entity.StreamType;
}
dto.IsAVC = entity.IsAvc;
@@ -151,7 +152,7 @@ public class MediaStreamRepository(IDbContextFactory dbProvid
Item = null!,
ItemId = itemId,
StreamIndex = dto.Index,
- StreamType = dto.Type.ToString(),
+ StreamType = (MediaStreamTypeEntity)dto.Type,
IsAvc = dto.IsAVC.GetValueOrDefault(),
Codec = dto.Codec,
diff --git a/Jellyfin.Server.Implementations/Item/PeopleRepository.cs b/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
index 584dbd1b65..57f0503b9e 100644
--- a/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
@@ -34,7 +34,7 @@ public class PeopleRepository(IDbContextFactory dbProvider) :
dbQuery = dbQuery.Take(filter.Limit);
}
- return dbQuery.ToList().Select(Map).ToImmutableArray();
+ return dbQuery.AsEnumerable().Select(Map).ToImmutableArray();
}
///
diff --git a/Jellyfin.Server.Implementations/Migrations/20241009231203_FixedAncestorIds.Designer.cs b/Jellyfin.Server.Implementations/Migrations/20241009231203_FixedAncestorIds.Designer.cs
new file mode 100644
index 0000000000..533a7ccd7f
--- /dev/null
+++ b/Jellyfin.Server.Implementations/Migrations/20241009231203_FixedAncestorIds.Designer.cs
@@ -0,0 +1,1536 @@
+//
+using System;
+using Jellyfin.Server.Implementations;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace Jellyfin.Server.Implementations.Migrations
+{
+ [DbContext(typeof(JellyfinDbContext))]
+ [Migration("20241009231203_FixedAncestorIds")]
+ partial class FixedAncestorIds
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "8.0.10");
+
+ modelBuilder.Entity("Jellyfin.Data.Entities.AccessSchedule", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("DayOfWeek")
+ .HasColumnType("INTEGER");
+
+ b.Property("EndHour")
+ .HasColumnType("REAL");
+
+ b.Property("StartHour")
+ .HasColumnType("REAL");
+
+ b.Property("UserId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AccessSchedules");
+ });
+
+ modelBuilder.Entity("Jellyfin.Data.Entities.ActivityLog", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("DateCreated")
+ .HasColumnType("TEXT");
+
+ b.Property("ItemId")
+ .HasMaxLength(256)
+ .HasColumnType("TEXT");
+
+ b.Property("LogSeverity")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("TEXT");
+
+ b.Property("Overview")
+ .HasMaxLength(512)
+ .HasColumnType("TEXT");
+
+ b.Property("RowVersion")
+ .IsConcurrencyToken()
+ .HasColumnType("INTEGER");
+
+ b.Property("ShortOverview")
+ .HasMaxLength(512)
+ .HasColumnType("TEXT");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("TEXT");
+
+ b.Property("UserId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DateCreated");
+
+ b.ToTable("ActivityLogs");
+ });
+
+ modelBuilder.Entity("Jellyfin.Data.Entities.AncestorId", b =>
+ {
+ b.Property("ItemId")
+ .HasColumnType("TEXT");
+
+ b.Property("ParentItemId")
+ .HasColumnType("TEXT");
+
+ b.Property("BaseItemEntityId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("ItemId", "ParentItemId");
+
+ b.HasIndex("BaseItemEntityId");
+
+ b.HasIndex("ParentItemId");
+
+ b.ToTable("AncestorIds");
+ });
+
+ modelBuilder.Entity("Jellyfin.Data.Entities.AttachmentStreamInfo", b =>
+ {
+ b.Property("ItemId")
+ .HasColumnType("TEXT");
+
+ b.Property("Index")
+ .HasColumnType("INTEGER");
+
+ b.Property("Codec")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CodecTag")
+ .HasColumnType("TEXT");
+
+ b.Property("Comment")
+ .HasColumnType("TEXT");
+
+ b.Property("Filename")
+ .HasColumnType("TEXT");
+
+ b.Property