< 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
3%
Covered lines: 2
Uncovered lines: 51
Coverable lines: 53
Total lines: 133
Line coverage: 3.7%
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

Coverage history 0 25 50 75 100

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(
 049                user,
 050                new InternalItemsQuery(user)
 051                {
 052                    IncludeItemTypes = [BaseItemKind.Audio],
 053                    DtoOptions = dtoOptions
 054                },
 055                out _)
 056               .Cast<Audio>()
 057               .SelectMany(i => i.Genres)
 058               .Concat(item.Genres)
 059               .DistinctNames();
 60
 061            return GetInstantMixFromGenres(genres, user, dtoOptions);
 62        }
 63
 64        public IReadOnlyList<BaseItem> GetInstantMixFromPlaylist(Playlist item, User? user, DtoOptions dtoOptions)
 65        {
 066            return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
 67        }
 68
 69        public IReadOnlyList<BaseItem> GetInstantMixFromGenres(IEnumerable<string> genres, User? user, DtoOptions dtoOpt
 70        {
 071            var genreIds = genres.DistinctNames().Select(i =>
 072            {
 073                try
 074                {
 075                    return _libraryManager.GetMusicGenre(i).Id;
 076                }
 077                catch
 078                {
 079                    return Guid.Empty;
 080                }
 081            }).Where(i => !i.IsEmpty()).ToArray();
 82
 083            return GetInstantMixFromGenreIds(genreIds, user, dtoOptions);
 84        }
 85
 86        public IReadOnlyList<BaseItem> GetInstantMixFromGenreIds(Guid[] genreIds, User? user, DtoOptions dtoOptions)
 87        {
 088            return _libraryManager.GetItemList(new InternalItemsQuery(user)
 089            {
 090                IncludeItemTypes = [BaseItemKind.Audio],
 091                GenreIds = genreIds,
 092                Limit = 200,
 093                OrderBy = [(ItemSortBy.Random, SortOrder.Ascending)],
 094                DtoOptions = dtoOptions
 095            });
 96        }
 97
 98        public IReadOnlyList<BaseItem> GetInstantMixFromItem(BaseItem item, User? user, DtoOptions dtoOptions)
 99        {
 0100            if (item is MusicGenre)
 101            {
 0102                return GetInstantMixFromGenreIds([item.Id], user, dtoOptions);
 103            }
 104
 0105            if (item is Playlist playlist)
 106            {
 0107                return GetInstantMixFromPlaylist(playlist, user, dtoOptions);
 108            }
 109
 0110            if (item is MusicAlbum album)
 111            {
 0112                return GetInstantMixFromAlbum(album, user, dtoOptions);
 113            }
 114
 0115            if (item is MusicArtist artist)
 116            {
 0117                return GetInstantMixFromArtist(artist, user, dtoOptions);
 118            }
 119
 0120            if (item is Audio song)
 121            {
 0122                return GetInstantMixFromSong(song, user, dtoOptions);
 123            }
 124
 0125            if (item is Folder folder)
 126            {
 0127                return GetInstantMixFromFolder(folder, user, dtoOptions);
 128            }
 129
 0130            return new List<BaseItem>();
 131        }
 132    }
 133}