using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Users; namespace MediaBrowser.Controller.Entities.Audio { /// /// Class MusicAlbum /// public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasLookupInfo, IMetadataContainer { public string[] AlbumArtists { get; set; } public string[] Artists { get; set; } public MusicAlbum() { Artists = Array.Empty(); AlbumArtists = Array.Empty(); } [IgnoreDataMember] public override bool SupportsAddingToPlaylist { get { return true; } } [IgnoreDataMember] public override bool SupportsInheritedParentImages { get { return true; } } [IgnoreDataMember] public MusicArtist MusicArtist { get { return GetMusicArtist(new DtoOptions(true)); } } public MusicArtist GetMusicArtist(DtoOptions options) { var parents = GetParents(); foreach (var parent in parents) { var artist = parent as MusicArtist; if (artist != null) { return artist; } } var name = AlbumArtist; if (!string.IsNullOrEmpty(name)) { return LibraryManager.GetArtist(name, options); } return null; } [IgnoreDataMember] public override bool SupportsPlayedStatus { get { return false; } } [IgnoreDataMember] public override bool SupportsCumulativeRunTimeTicks { get { return true; } } [IgnoreDataMember] public string[] AllArtists { get { var list = new string[AlbumArtists.Length + Artists.Length]; var index = 0; foreach (var artist in AlbumArtists) { list[index] = artist; index++; } foreach (var artist in Artists) { list[index] = artist; index++; } return list; } } [IgnoreDataMember] public string AlbumArtist { get { return AlbumArtists.Length == 0 ? null : AlbumArtists[0]; } } [IgnoreDataMember] public override bool SupportsPeople { get { return false; } } /// /// Gets the tracks. /// /// The tracks. [IgnoreDataMember] public IEnumerable Tracks { get { return GetRecursiveChildren(i => i is Audio); } } protected override IEnumerable GetEligibleChildrenForRecursiveChildren(User user) { return Tracks; } public override double GetDefaultPrimaryImageAspectRatio() { return 1; } public override List GetUserDataKeys() { var list = base.GetUserDataKeys(); var albumArtist = AlbumArtist; if (!string.IsNullOrEmpty(albumArtist)) { list.Insert(0, albumArtist + "-" + Name); } var id = this.GetProviderId(MetadataProviders.MusicBrainzAlbum); if (!string.IsNullOrEmpty(id)) { list.Insert(0, "MusicAlbum-Musicbrainz-" + id); } id = this.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup); if (!string.IsNullOrEmpty(id)) { list.Insert(0, "MusicAlbum-MusicBrainzReleaseGroup-" + id); } return list; } protected override bool GetBlockUnratedValue(UserPolicy config) { return config.BlockUnratedItems.Contains(UnratedItem.Music); } public override UnratedItem GetBlockUnratedType() { return UnratedItem.Music; } public AlbumInfo GetLookupInfo() { var id = GetItemLookupInfo(); id.AlbumArtists = AlbumArtists; var artist = GetMusicArtist(new DtoOptions(false)); if (artist != null) { id.ArtistProviderIds = artist.ProviderIds; } id.SongInfos = GetRecursiveChildren(i => i is Audio) .Cast