< 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: 52
Coverable lines: 54
Total lines: 135
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 7/25/2025 - 12:11:10 AM Line coverage: 4% (2/50) Branch coverage: 0% (0/12) Total lines: 1309/17/2025 - 12:11:23 AM Line coverage: 3.7% (2/53) Branch coverage: 0% (0/12) Total lines: 13310/28/2025 - 12:11:27 AM Line coverage: 3.7% (2/54) Branch coverage: 0% (0/12) Total lines: 135 7/25/2025 - 12:11:10 AM Line coverage: 4% (2/50) Branch coverage: 0% (0/12) Total lines: 1309/17/2025 - 12:11:23 AM Line coverage: 3.7% (2/53) Branch coverage: 0% (0/12) Total lines: 13310/28/2025 - 12:11:27 AM Line coverage: 3.7% (2/54) Branch coverage: 0% (0/12) Total lines: 135

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            var instantMixItems = GetInstantMixFromGenres(item.Genres, user, dtoOptions);
 32
 033            return [item, .. instantMixItems.Where(i => !i.Id.Equals(item.Id))];
 34        }
 35
 36        /// <inheritdoc />
 37        public IReadOnlyList<BaseItem> GetInstantMixFromArtist(MusicArtist artist, User? user, DtoOptions dtoOptions)
 38        {
 039            return GetInstantMixFromGenres(artist.Genres, user, dtoOptions);
 40        }
 41
 42        public IReadOnlyList<BaseItem> GetInstantMixFromAlbum(MusicAlbum item, User? user, DtoOptions dtoOptions)
 43        {
 044            return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
 45        }
 46
 47        public IReadOnlyList<BaseItem> GetInstantMixFromFolder(Folder item, User? user, DtoOptions dtoOptions)
 48        {
 049            var genres = item
 050               .GetRecursiveChildren(
 051                user,
 052                new InternalItemsQuery(user)
 053                {
 054                    IncludeItemTypes = [BaseItemKind.Audio],
 055                    DtoOptions = dtoOptions
 056                },
 057                out _)
 058               .Cast<Audio>()
 059               .SelectMany(i => i.Genres)
 060               .Concat(item.Genres)
 061               .DistinctNames();
 62
 063            return GetInstantMixFromGenres(genres, user, dtoOptions);
 64        }
 65
 66        public IReadOnlyList<BaseItem> GetInstantMixFromPlaylist(Playlist item, User? user, DtoOptions dtoOptions)
 67        {
 068            return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
 69        }
 70
 71        public IReadOnlyList<BaseItem> GetInstantMixFromGenres(IEnumerable<string> genres, User? user, DtoOptions dtoOpt
 72        {
 073            var genreIds = genres.DistinctNames().Select(i =>
 074            {
 075                try
 076                {
 077                    return _libraryManager.GetMusicGenre(i).Id;
 078                }
 079                catch
 080                {
 081                    return Guid.Empty;
 082                }
 083            }).Where(i => !i.IsEmpty()).ToArray();
 84
 085            return GetInstantMixFromGenreIds(genreIds, user, dtoOptions);
 86        }
 87
 88        public IReadOnlyList<BaseItem> GetInstantMixFromGenreIds(Guid[] genreIds, User? user, DtoOptions dtoOptions)
 89        {
 090            return _libraryManager.GetItemList(new InternalItemsQuery(user)
 091            {
 092                IncludeItemTypes = [BaseItemKind.Audio],
 093                GenreIds = genreIds,
 094                Limit = 200,
 095                OrderBy = [(ItemSortBy.Random, SortOrder.Ascending)],
 096                DtoOptions = dtoOptions
 097            });
 98        }
 99
 100        public IReadOnlyList<BaseItem> GetInstantMixFromItem(BaseItem item, User? user, DtoOptions dtoOptions)
 101        {
 0102            if (item is MusicGenre)
 103            {
 0104                return GetInstantMixFromGenreIds([item.Id], user, dtoOptions);
 105            }
 106
 0107            if (item is Playlist playlist)
 108            {
 0109                return GetInstantMixFromPlaylist(playlist, user, dtoOptions);
 110            }
 111
 0112            if (item is MusicAlbum album)
 113            {
 0114                return GetInstantMixFromAlbum(album, user, dtoOptions);
 115            }
 116
 0117            if (item is MusicArtist artist)
 118            {
 0119                return GetInstantMixFromArtist(artist, user, dtoOptions);
 120            }
 121
 0122            if (item is Audio song)
 123            {
 0124                return GetInstantMixFromSong(song, user, dtoOptions);
 125            }
 126
 0127            if (item is Folder folder)
 128            {
 0129                return GetInstantMixFromFolder(folder, user, dtoOptions);
 130            }
 131
 0132            return new List<BaseItem>();
 133        }
 134    }
 135}