예제 #1
0
        private async Task LoadRecentlyPlayedAsync(CancellationToken ct)
        {
            var recentlyPlayed = await _client.GetRecentlyPlayedAsync(RecentlyPlayedQuery.Default, ct);

            var playedByContext = recentlyPlayed.Items.GroupBy(i => i.Context?.Uri);

            foreach (var playedItems in playedByContext)
            {
                var playedResult = playedItems
                                   .Select(played => new PlayableAlbumResult
                {
                    Title           = $"'{played.Track.Name}' by {played.Track.Artists.FirstOrDefault()?.Name}",
                    Description     = $"Last played {played.PlayedAt}",
                    ResourceUris    = new[] { played.Track.Uri },
                    ContextUri      = played.Context?.Uri,
                    PreviewUri      = PreviewUri.Track,
                    ArtistName      = played.Track.Artists.FirstOrDefault()?.Name,
                    ActiveTrackName = played.Track.Name
                })
                                   .ToList();

                Available(playedResult);

                var sharedContext = playedItems.FirstOrDefault().Context;
                if (sharedContext == null)
                {
                    continue;
                }

                if (sharedContext.IsAlbum())
                {
                    // Bug reported at https://github.com/spotify/web-api/issues/836
                    if (sharedContext.Href.PathAndQuery.EndsWith("/null"))
                    {
                        var albumId = sharedContext.Uri.Split(':').LastOrDefault();
                        sharedContext.Href = new Uri($"{sharedContext.Href.Scheme}://{sharedContext.Href.Host}{sharedContext.Href.PathAndQuery.Replace("/null", $"/{albumId}")}");
                    }

                    var album = await _client.GetAsync <Album>(sharedContext.Href.ToString(), ct);

                    foreach (var result in playedResult)
                    {
                        result.AlbumName = album.Name;
                        result.CoverArt  = album.Images.FirstOrDefault(i => i.Width == 300)?.Url ??
                                           album.Images.LastOrDefault()?.Url;
                        result.ReleaseDate = album.ReleaseDate;
                        Updated(result);
                    }
                }
                else if (sharedContext.IsPlaylist())
                {
                    var playlist = await _client.GetAsync <Playlist>(sharedContext.Href.ToString(), ct);

                    foreach (var result in playedResult)
                    {
                        result.AlbumName   = playlist.Name;
                        result.CoverArt    = playlist.Images.FirstOrDefault()?.Url;
                        result.ReleaseDate = playlist.Owner.Id;
                        Updated(result);
                    }
                }
            }
        }