| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | #pragma warning disable CS1591using System;using System.Collections.Generic;using System.Linq;using Jellyfin.Data.Entities;using Jellyfin.Data.Enums;using Jellyfin.Extensions;using MediaBrowser.Controller.Dto;using MediaBrowser.Controller.Entities;using MediaBrowser.Controller.Entities.Audio;using MediaBrowser.Controller.Library;using MediaBrowser.Controller.Playlists;using MusicAlbum = MediaBrowser.Controller.Entities.Audio.MusicAlbum;namespace Emby.Server.Implementations.Library{    public class MusicManager : IMusicManager    {        private readonly ILibraryManager _libraryManager;        public MusicManager(ILibraryManager libraryManager)        {            _libraryManager = libraryManager;        }        public List<BaseItem> GetInstantMixFromSong(Audio item, User? user, DtoOptions dtoOptions)        {            var list = new List<BaseItem>            {                item            };            list.AddRange(GetInstantMixFromGenres(item.Genres, user, dtoOptions));            return list;        }        /// <inheritdoc />        public List<BaseItem> GetInstantMixFromArtist(MusicArtist artist, User? user, DtoOptions dtoOptions)        {            return GetInstantMixFromGenres(artist.Genres, user, dtoOptions);        }        public List<BaseItem> GetInstantMixFromAlbum(MusicAlbum item, User? user, DtoOptions dtoOptions)        {            return GetInstantMixFromGenres(item.Genres, user, dtoOptions);        }        public List<BaseItem> GetInstantMixFromFolder(Folder item, User? user, DtoOptions dtoOptions)        {            var genres = item               .GetRecursiveChildren(user, new InternalItemsQuery(user)               {                   IncludeItemTypes = [BaseItemKind.Audio],                   DtoOptions = dtoOptions               })               .Cast<Audio>()               .SelectMany(i => i.Genres)               .Concat(item.Genres)               .DistinctNames();            return GetInstantMixFromGenres(genres, user, dtoOptions);        }        public List<BaseItem> GetInstantMixFromPlaylist(Playlist item, User? user, DtoOptions dtoOptions)        {            return GetInstantMixFromGenres(item.Genres, user, dtoOptions);        }        public List<BaseItem> GetInstantMixFromGenres(IEnumerable<string> genres, User? user, DtoOptions dtoOptions)        {            var genreIds = genres.DistinctNames().Select(i =>            {                try                {                    return _libraryManager.GetMusicGenre(i).Id;                }                catch                {                    return Guid.Empty;                }            }).Where(i => !i.IsEmpty()).ToArray();            return GetInstantMixFromGenreIds(genreIds, user, dtoOptions);        }        public List<BaseItem> GetInstantMixFromGenreIds(Guid[] genreIds, User? user, DtoOptions dtoOptions)        {            return _libraryManager.GetItemList(new InternalItemsQuery(user)            {                IncludeItemTypes = [BaseItemKind.Audio],                GenreIds = genreIds,                Limit = 200,                OrderBy = [(ItemSortBy.Random, SortOrder.Ascending)],                DtoOptions = dtoOptions            });        }        public List<BaseItem> GetInstantMixFromItem(BaseItem item, User? user, DtoOptions dtoOptions)        {            if (item is MusicGenre)            {                return GetInstantMixFromGenreIds([item.Id], user, dtoOptions);            }            if (item is Playlist playlist)            {                return GetInstantMixFromPlaylist(playlist, user, dtoOptions);            }            if (item is MusicAlbum album)            {                return GetInstantMixFromAlbum(album, user, dtoOptions);            }            if (item is MusicArtist artist)            {                return GetInstantMixFromArtist(artist, user, dtoOptions);            }            if (item is Audio song)            {                return GetInstantMixFromSong(song, user, dtoOptions);            }            if (item is Folder folder)            {                return GetInstantMixFromFolder(folder, user, dtoOptions);            }            return new List<BaseItem>();        }    }}
 |