Spotify.NET/SpotifyAPI.Example/WebControl.cs
2016-07-19 21:16:03 +02:00

154 lines
4.9 KiB
C#

using SpotifyAPI.Web;
using SpotifyAPI.Web.Auth;
using SpotifyAPI.Web.Enums;
using SpotifyAPI.Web.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Forms;
using Image = System.Drawing.Image;
namespace SpotifyAPI.Example
{
public partial class WebControl : UserControl
{
private SpotifyWebAPI _spotify;
private ImplicitGrantAuth _auth;
private PrivateProfile _profile;
private List<FullTrack> _savedTracks;
private List<SimplePlaylist> _playlists;
public WebControl()
{
InitializeComponent();
_savedTracks = new List<FullTrack>();
}
private void _auth_OnResponseReceivedEvent(Token token, string state)
{
_auth.StopHttpServer();
if (state != "XSS")
{
MessageBox.Show(@"Wrong state received.", @"SpotifyWeb API Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (token.Error != null)
{
MessageBox.Show($"Error: {token.Error}", @"SpotifyWeb API Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
_spotify = new SpotifyWebAPI
{
UseAuth = true,
AccessToken = token.AccessToken,
TokenType = token.TokenType
};
}
private async void InitialSetup()
{
if (InvokeRequired)
{
Invoke(new Action(InitialSetup));
return;
}
authButton.Enabled = false;
_profile = _spotify.GetPrivateProfile();
_savedTracks = GetSavedTracks();
savedTracksCountLabel.Text = _savedTracks.Count.ToString();
_savedTracks.ForEach(track => savedTracksListView.Items.Add(new ListViewItem()
{
Text = track.Name,
SubItems = { string.Join(",", track.Artists.Select(source => source.Name)), track.Album.Name }
}));
_playlists = GetPlaylists();
playlistsCountLabel.Text = _playlists.Count.ToString();
_playlists.ForEach(playlist => playlistsListBox.Items.Add(playlist.Name));
displayNameLabel.Text = _profile.DisplayName;
countryLabel.Text = _profile.Country;
emailLabel.Text = _profile.Email;
accountLabel.Text = _profile.Product;
if (_profile.Images != null && _profile.Images.Count > 0)
{
using (WebClient wc = new WebClient())
{
byte[] imageBytes = await wc.DownloadDataTaskAsync(new Uri(_profile.Images[0].Url));
using (MemoryStream stream = new MemoryStream(imageBytes))
avatarPictureBox.Image = Image.FromStream(stream);
}
}
}
private List<FullTrack> GetSavedTracks()
{
Paging<SavedTrack> savedTracks = _spotify.GetSavedTracks();
List<FullTrack> list = savedTracks.Items.Select(track => track.Track).ToList();
while (savedTracks.Next != null)
{
savedTracks = _spotify.GetSavedTracks(20, savedTracks.Offset + savedTracks.Limit);
list.AddRange(savedTracks.Items.Select(track => track.Track));
}
return list;
}
private List<SimplePlaylist> GetPlaylists()
{
Paging<SimplePlaylist> playlists = _spotify.GetUserPlaylists(_profile.Id);
List<SimplePlaylist> list = playlists.Items.ToList();
while (playlists.Next != null)
{
playlists = _spotify.GetUserPlaylists(_profile.Id, 20, playlists.Offset + playlists.Limit);
list.AddRange(playlists.Items);
}
return list;
}
private void authButton_Click(object sender, EventArgs e)
{
Task.Run(() => RunAuthentication());
}
private async void RunAuthentication()
{
AuthenticationFactory authenticationFactory = new AuthenticationFactory(
"http://localhost",
8000,
"26d287105e31491889f3cd293d85bfea",
Scope.UserReadPrivate | Scope.UserReadEmail | Scope.PlaylistReadPrivate | Scope.UserLibraryRead |
Scope.UserReadPrivate | Scope.UserFollowRead | Scope.UserReadBirthdate | Scope.UserTopRead,
TimeSpan.FromSeconds(20));
try
{
_spotify = await authenticationFactory.GetWebApi();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
if (_spotify == null)
return;
InitialSetup();
}
}
}