aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs')
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs272
1 files changed, 272 insertions, 0 deletions
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
new file mode 100644
index 000000000..48b5c64b2
--- /dev/null
+++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
@@ -0,0 +1,272 @@
+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
+{
+ /// <summary>
+ /// Class MusicAlbum
+ /// </summary>
+ public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasLookupInfo<AlbumInfo>, IMetadataContainer
+ {
+ public string[] AlbumArtists { get; set; }
+ public string[] Artists { get; set; }
+
+ public MusicAlbum()
+ {
+ Artists = new string[] {};
+ AlbumArtists = new string[] {};
+ }
+
+ [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; }
+ }
+
+ /// <summary>
+ /// Gets the tracks.
+ /// </summary>
+ /// <value>The tracks.</value>
+ [IgnoreDataMember]
+ public IEnumerable<BaseItem> Tracks
+ {
+ get
+ {
+ return GetRecursiveChildren(i => i is Audio);
+ }
+ }
+
+ protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user)
+ {
+ return Tracks;
+ }
+
+ public override double GetDefaultPrimaryImageAspectRatio()
+ {
+ return 1;
+ }
+
+ public override List<string> 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<AlbumInfo>();
+
+ id.AlbumArtists = AlbumArtists;
+
+ var artist = GetMusicArtist(new DtoOptions(false));
+
+ if (artist != null)
+ {
+ id.ArtistProviderIds = artist.ProviderIds;
+ }
+
+ id.SongInfos = GetRecursiveChildren(i => i is Audio)
+ .Cast<Audio>()
+ .Select(i => i.GetLookupInfo())
+ .ToList();
+
+ var album = id.SongInfos
+ .Select(i => i.Album)
+ .FirstOrDefault(i => !string.IsNullOrEmpty(i));
+
+ if (!string.IsNullOrEmpty(album))
+ {
+ id.Name = album;
+ }
+
+ return id;
+ }
+
+ public async Task RefreshAllMetadata(MetadataRefreshOptions refreshOptions, IProgress<double> progress, CancellationToken cancellationToken)
+ {
+ var items = GetRecursiveChildren();
+
+ var totalItems = items.Count;
+ var numComplete = 0;
+
+ var childUpdateType = ItemUpdateType.None;
+
+ // Refresh songs
+ foreach (var item in items)
+ {
+ cancellationToken.ThrowIfCancellationRequested();
+
+ var updateType = await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+ childUpdateType = childUpdateType | updateType;
+
+ numComplete++;
+ double percent = numComplete;
+ percent /= totalItems;
+ progress.Report(percent * 95);
+ }
+
+ var parentRefreshOptions = refreshOptions;
+ if (childUpdateType > ItemUpdateType.None)
+ {
+ parentRefreshOptions = new MetadataRefreshOptions(refreshOptions);
+ parentRefreshOptions.MetadataRefreshMode = MetadataRefreshMode.FullRefresh;
+ }
+
+ // Refresh current item
+ await RefreshMetadata(parentRefreshOptions, cancellationToken).ConfigureAwait(false);
+
+ if (!refreshOptions.IsAutomated)
+ {
+ await RefreshArtists(refreshOptions, cancellationToken).ConfigureAwait(false);
+ }
+ }
+
+ private async Task RefreshArtists(MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken)
+ {
+ var all = AllArtists;
+ foreach (var i in all)
+ {
+ // This should not be necessary but we're seeing some cases of it
+ if (string.IsNullOrEmpty(i))
+ {
+ continue;
+ }
+
+ var artist = LibraryManager.GetArtist(i);
+
+ if (!artist.IsAccessedByName)
+ {
+ continue;
+ }
+
+ await artist.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+ }
+ }
+ }
+}