using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using SpotifyAPI.SpotifyWebAPI; using SpotifyAPI.SpotifyWebAPI.Models; using Newtonsoft.Json; using System.Collections.Specialized; using System.IO; namespace SpotifyAPI.SpotifyWebAPI { public class SpotifyWebAPIClass { public String TokenType { get; set; } public String AccessToken { get; set; } /// /// Set to false, if you want anonymous calls without auth /// public Boolean UseAuth { get; set; } WebClient webclient; JsonSerializerSettings settings; public SpotifyWebAPIClass() { UseAuth = true; webclient = new WebClient(); webclient.Proxy = null; settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; } public PrivateProfile GetPrivateProfile() { return DownloadString("https://api.spotify.com/v1/me"); } public PublicProfile GetPublicProfile(String userId = "") { if(userId.Length == 0) return DownloadString("https://api.spotify.com/v1/me"); else return DownloadString("https://api.spotify.com/v1/users/" + userId); } public Paging GetUserPlaylists(String userId) { return DownloadString>("https://api.spotify.com/v1/users/" + userId + "/playlists"); } public FullPlaylist GetPlaylist(String userId,String playlistId) { return DownloadString("https://api.spotify.com/v1/users/" + userId + "/playlists/" + playlistId); } public Paging GetPlaylistTracks(String userId,String playlistId) { return DownloadString>("https://api.spotify.com/v1/users/" + userId + "/playlists/" + playlistId + "/tracks"); } public FullPlaylist CreatePlaylist(String userId,String playlistName,Boolean isPublic = true) { CreatePlaylistArgs args = new CreatePlaylistArgs() { Name = playlistName, Public = isPublic }; return UploadData("https://api.spotify.com/v1/users/" + userId + "/playlists",JsonConvert.SerializeObject(args)); } public Error AddTracks(String userId,String playlistId,List uris,int position = int.MaxValue) { if(position == int.MaxValue) return UploadData("https://api.spotify.com/v1/users/" + userId + "/playlists/" + playlistId + "/tracks", JsonConvert.SerializeObject(uris)); else { String tracks = string.Join(",", uris); return UploadData("https://api.spotify.com/v1/users/" + userId + "/playlists/" + playlistId + "/tracks?position=" + position + "&ids=" + tracks , JsonConvert.SerializeObject(uris)); } } public SearchItem SearchItems(String q,SearchType type,int limit = 20,int offset = 0) { limit = Math.Min(50, limit); StringBuilder builder = new StringBuilder("https://api.spotify.com/v1/search"); builder.Append("?q=" + q); builder.Append("&type=" + type.GetSearchValue(",")); builder.Append("&limit=" + limit); builder.Append("&offset=" + offset); return DownloadString(builder.ToString()); } public SeveralTracks GetSeveralTracks(List ids) { return DownloadString("https://api.spotify.com/v1/tracks?ids=" + string.Join(",",ids)); } public SeveralAlbums GetSeveralAlbums(List ids) { return DownloadString("https://api.spotify.com/v1/albums?ids=" + string.Join(",", ids)); } public SeveralArtists GetSeveralArtists(List ids) { return DownloadString("https://api.spotify.com/v1/artists?ids=" + string.Join(",", ids)); } public FullTrack GetTrack(String id) { return DownloadString("https://api.spotify.com/v1/tracks/" + id); } public SeveralArtists GetRelatedArtists(String id) { return DownloadString("https://api.spotify.com/v1/artists/" + id + "/related-artists"); } public SeveralTracks GetArtistsTopTracks(String id, String country) { return DownloadString("https://api.spotify.com/v1/artists/" + id + "/top-tracks?country=" + country); } public Paging GetArtistsAlbums(String id,AlbumType type = AlbumType.ALL,String country = "",int limit = 20,int offset = 0) { limit = Math.Min(50, limit); StringBuilder builder = new StringBuilder("https://api.spotify.com/v1/artists/" + id + "/albums"); builder.Append("?type=" + type.GetAlbumValue(",")); builder.Append("&limit=" + limit); builder.Append("&offset=" + offset); return DownloadString>(builder.ToString()); } public FullArtist GetArtist(String id) { return DownloadString("https://api.spotify.com/v1/artists/" + id); } public Paging GetAlbumTracks(String id,int limit = 20,int offset = 0) { limit = Math.Min(50, limit); StringBuilder builder = new StringBuilder("https://api.spotify.com/v1/albums/" + id + "/tracks"); builder.Append("?limit=" + limit); builder.Append("&offset=" + offset); return DownloadString>(builder.ToString()); } public FullAlbum GetAlbum(String id ) { return DownloadString("https://api.spotify.com/v1/albums/" + id); } public T UploadData(String url,String uploadData) { if (!UseAuth) throw new Exception("UseAuth required for 'UploadData'"); webclient.Headers.Add("Authorization", TokenType + " " + AccessToken); webclient.Headers.Add("Content-Type","application/json"); String response = ""; try { byte[] data = webclient.UploadData(url,Encoding.UTF8.GetBytes(uploadData)); response = Encoding.UTF8.GetString(data); } catch (WebException e) { response = new StreamReader(e.Response.GetResponseStream()).ReadToEnd(); } return JsonConvert.DeserializeObject(response, settings); } public T DownloadString(String url) { if(UseAuth) webclient.Headers.Add("Authorization", TokenType + " " + AccessToken); String response = ""; try { byte [] data = webclient.DownloadData(url); response = Encoding.UTF8.GetString(data); }catch(WebException e) { response = new StreamReader(e.Response.GetResponseStream()).ReadToEnd(); } return JsonConvert.DeserializeObject(response, settings); } public void Dispose() { webclient.Dispose(); } } }