< Summary - Jellyfin

Information
Class: Emby.Server.Implementations.Library.MusicManager
Assembly: Emby.Server.Implementations
File(s): /srv/git/jellyfin/Emby.Server.Implementations/Library/MusicManager.cs
Line coverage
4%
Covered lines: 2
Uncovered lines: 48
Coverable lines: 50
Total lines: 130
Line coverage: 4%
Branch coverage
0%
Covered branches: 0
Total branches: 12
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

0255075100

Metrics

File(s)

/srv/git/jellyfin/Emby.Server.Implementations/Library/MusicManager.cs

#LineLine coverage
 1#pragma warning disable CS1591
 2
 3using System;
 4using System.Collections.Generic;
 5using System.Collections.Immutable;
 6using System.Linq;
 7using Jellyfin.Data.Enums;
 8using Jellyfin.Database.Implementations.Entities;
 9using Jellyfin.Database.Implementations.Enums;
 10using Jellyfin.Extensions;
 11using MediaBrowser.Controller.Dto;
 12using MediaBrowser.Controller.Entities;
 13using MediaBrowser.Controller.Entities.Audio;
 14using MediaBrowser.Controller.Library;
 15using MediaBrowser.Controller.Playlists;
 16using MusicAlbum = MediaBrowser.Controller.Entities.Audio.MusicAlbum;
 17
 18namespace Emby.Server.Implementations.Library
 19{
 20    public class MusicManager : IMusicManager
 21    {
 22        private readonly ILibraryManager _libraryManager;
 23
 24        public MusicManager(ILibraryManager libraryManager)
 25        {
 2126            _libraryManager = libraryManager;
 2127        }
 28
 29        public IReadOnlyList<BaseItem> GetInstantMixFromSong(Audio item, User? user, DtoOptions dtoOptions)
 30        {
 031            return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
 32        }
 33
 34        /// <inheritdoc />
 35        public IReadOnlyList<BaseItem> GetInstantMixFromArtist(MusicArtist artist, User? user, DtoOptions dtoOptions)
 36        {
 037            return GetInstantMixFromGenres(artist.Genres, user, dtoOptions);
 38        }
 39
 40        public IReadOnlyList<BaseItem> GetInstantMixFromAlbum(MusicAlbum item, User? user, DtoOptions dtoOptions)
 41        {
 042            return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
 43        }
 44
 45        public IReadOnlyList<BaseItem> GetInstantMixFromFolder(Folder item, User? user, DtoOptions dtoOptions)
 46        {
 047            var genres = item
 048               .GetRecursiveChildren(user, new InternalItemsQuery(user)
 049               {
 050                   IncludeItemTypes = [BaseItemKind.Audio],
 051                   DtoOptions = dtoOptions
 052               })
 053               .Cast<Audio>()
 054               .SelectMany(i => i.Genres)
 055               .Concat(item.Genres)
 056               .DistinctNames();
 57
 058            return GetInstantMixFromGenres(genres, user, dtoOptions);
 59        }
 60
 61        public IReadOnlyList<BaseItem> GetInstantMixFromPlaylist(Playlist item, User? user, DtoOptions dtoOptions)
 62        {
 063            return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
 64        }
 65
 66        public IReadOnlyList<BaseItem> GetInstantMixFromGenres(IEnumerable<string> genres, User? user, DtoOptions dtoOpt
 67        {
 068            var genreIds = genres.DistinctNames().Select(i =>
 069            {
 070                try
 071                {
 072                    return _libraryManager.GetMusicGenre(i).Id;
 073                }
 074                catch
 075                {
 076                    return Guid.Empty;
 077                }
 078            }).Where(i => !i.IsEmpty()).ToArray();
 79
 080            return GetInstantMixFromGenreIds(genreIds, user, dtoOptions);
 81        }
 82
 83        public IReadOnlyList<BaseItem> GetInstantMixFromGenreIds(Guid[] genreIds, User? user, DtoOptions dtoOptions)
 84        {
 085            return _libraryManager.GetItemList(new InternalItemsQuery(user)
 086            {
 087                IncludeItemTypes = [BaseItemKind.Audio],
 088                GenreIds = genreIds,
 089                Limit = 200,
 090                OrderBy = [(ItemSortBy.Random, SortOrder.Ascending)],
 091                DtoOptions = dtoOptions
 092            });
 93        }
 94
 95        public IReadOnlyList<BaseItem> GetInstantMixFromItem(BaseItem item, User? user, DtoOptions dtoOptions)
 96        {
 097            if (item is MusicGenre)
 98            {
 099                return GetInstantMixFromGenreIds([item.Id], user, dtoOptions);
 100            }
 101
 0102            if (item is Playlist playlist)
 103            {
 0104                return GetInstantMixFromPlaylist(playlist, user, dtoOptions);
 105            }
 106
 0107            if (item is MusicAlbum album)
 108            {
 0109                return GetInstantMixFromAlbum(album, user, dtoOptions);
 110            }
 111
 0112            if (item is MusicArtist artist)
 113            {
 0114                return GetInstantMixFromArtist(artist, user, dtoOptions);
 115            }
 116
 0117            if (item is Audio song)
 118            {
 0119                return GetInstantMixFromSong(song, user, dtoOptions);
 120            }
 121
 0122            if (item is Folder folder)
 123            {
 0124                return GetInstantMixFromFolder(folder, user, dtoOptions);
 125            }
 126
 0127            return new List<BaseItem>();
 128        }
 129    }
 130}