#nullable disable #pragma warning disable CS1591 using System; using System.Collections.Generic; using System.Linq; using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; using Diacritics.Extensions; using Jellyfin.Data.Entities; using Jellyfin.Data.Enums; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using Microsoft.Extensions.Logging; using MetadataProvider = MediaBrowser.Model.Entities.MetadataProvider; namespace MediaBrowser.Controller.Entities.Audio { /// /// Class MusicArtist. /// public class MusicArtist : Folder, IItemByName, IHasMusicGenres, IHasDualAccess, IHasLookupInfo { [JsonIgnore] public bool IsAccessedByName => ParentId.Equals(default); [JsonIgnore] public override bool IsFolder => !IsAccessedByName; [JsonIgnore] public override bool SupportsInheritedParentImages => false; [JsonIgnore] public override bool SupportsCumulativeRunTimeTicks => true; [JsonIgnore] public override bool IsDisplayedAsFolder => true; [JsonIgnore] public override bool SupportsAddingToPlaylist => true; [JsonIgnore] public override bool SupportsPlayedStatus => false; /// /// Gets the folder containing the item. /// If the item is a folder, it returns the folder itself. /// /// The containing folder path. [JsonIgnore] public override string ContainingFolderPath => Path; [JsonIgnore] public override IEnumerable Children { get { if (IsAccessedByName) { return new List(); } return base.Children; } } [JsonIgnore] public override bool SupportsPeople => false; public static string GetPath(string name) { return GetPath(name, true); } public override double GetDefaultPrimaryImageAspectRatio() { return 1; } public override bool CanDelete() { return !IsAccessedByName; } public IList GetTaggedItems(InternalItemsQuery query) { if (query.IncludeItemTypes.Length == 0) { query.IncludeItemTypes = new[] { BaseItemKind.Audio, BaseItemKind.MusicVideo, BaseItemKind.MusicAlbum }; query.ArtistIds = new[] { Id }; } return LibraryManager.GetItemList(query); } public override int GetChildCount(User user) { return IsAccessedByName ? 0 : base.GetChildCount(user); } public override bool IsSaveLocalMetadataEnabled() { if (IsAccessedByName) { return true; } return base.IsSaveLocalMetadataEnabled(); } protected override Task ValidateChildrenInternal(IProgress progress, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService, CancellationToken cancellationToken) { if (IsAccessedByName) { // Should never get in here anyway return Task.CompletedTask; } return base.ValidateChildrenInternal(progress, recursive, refreshChildMetadata, refreshOptions, directoryService, cancellationToken); } public override List GetUserDataKeys() { var list = base.GetUserDataKeys(); list.InsertRange(0, GetUserDataKeys(this)); return list; } /// /// Gets the user data key. /// /// The item. /// System.String. private static List GetUserDataKeys(MusicArtist item) { var list = new List(); var id = item.GetProviderId(MetadataProvider.MusicBrainzArtist); if (!string.IsNullOrEmpty(id)) { list.Add("Artist-Musicbrainz-" + id); } list.Add("Artist-" + (item.Name ?? string.Empty).RemoveDiacritics()); return list; } public override string CreatePresentationUniqueKey() { return "Artist-" + (Name ?? string.Empty).RemoveDiacritics(); } protected override bool GetBlockUnratedValue(User user) { return user.GetPreferenceValues(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Music); } public override UnratedItem GetBlockUnratedType() { return UnratedItem.Music; } public ArtistInfo GetLookupInfo() { var info = GetItemLookupInfo(); info.SongInfos = GetRecursiveChildren(i => i is Audio) .Cast