using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Users; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Extensions; namespace MediaBrowser.Controller.Entities.Audio { /// /// Class MusicArtist /// public class MusicArtist : Folder, IMetadataContainer, IItemByName, IHasMusicGenres, IHasDualAccess, IHasLookupInfo { [IgnoreDataMember] public bool IsAccessedByName { get { return ParentId == Guid.Empty; } } [IgnoreDataMember] public override bool IsFolder { get { return !IsAccessedByName; } } [IgnoreDataMember] public override bool SupportsCumulativeRunTimeTicks { get { return true; } } [IgnoreDataMember] public override bool SupportsAddingToPlaylist { get { return true; } } [IgnoreDataMember] public override bool SupportsPlayedStatus { get { return false; } } public override bool CanDelete() { return !IsAccessedByName; } public IEnumerable GetTaggedItems(InternalItemsQuery query) { if (query.IncludeItemTypes.Length == 0) { query.IncludeItemTypes = new[] { typeof(Audio).Name, typeof(MusicVideo).Name, typeof(MusicAlbum).Name }; query.ArtistNames = new[] { Name }; } return LibraryManager.GetItemList(query); } [IgnoreDataMember] protected override IEnumerable ActualChildren { get { if (IsAccessedByName) { return new List(); } return base.ActualChildren; } } public override int GetChildCount(User user) { if (IsAccessedByName) { return 0; } return base.GetChildCount(user); } public override bool IsSaveLocalMetadataEnabled() { if (IsAccessedByName) { return true; } return base.IsSaveLocalMetadataEnabled(); } private readonly Task _cachedTask = Task.FromResult(true); protected override Task ValidateChildrenInternal(IProgress progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService) { if (IsAccessedByName) { // Should never get in here anyway return _cachedTask; } return base.ValidateChildrenInternal(progress, cancellationToken, recursive, refreshChildMetadata, refreshOptions, directoryService); } public override List GetUserDataKeys() { var list = base.GetUserDataKeys(); list.InsertRange(0, GetUserDataKeys(this)); return list; } /// /// Returns the folder containing the item. /// If the item is a folder, it returns the folder itself /// /// The containing folder path. [IgnoreDataMember] public override string ContainingFolderPath { get { return Path; } } /// /// Gets a value indicating whether this instance is owned item. /// /// true if this instance is owned item; otherwise, false. [IgnoreDataMember] public override bool IsOwnedItem { get { return false; } } /// /// Gets the user data key. /// /// The item. /// System.String. private static List GetUserDataKeys(MusicArtist item) { var list = new List(); var id = item.GetProviderId(MetadataProviders.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(UserPolicy config) { return config.BlockUnratedItems.Contains(UnratedItem.Music); } public override UnratedItem GetBlockUnratedType() { return UnratedItem.Music; } public async Task RefreshAllMetadata(MetadataRefreshOptions refreshOptions, IProgress progress, CancellationToken cancellationToken) { var items = GetRecursiveChildren().ToList(); var songs = items.OfType