using System;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Users;
using System.Collections.Generic;
using System.Linq;
using MediaBrowser.Model.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Library;
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