using Newtonsoft.Json; using SpotifyAPI.Local.Enums; using System; using System.Drawing; using System.IO; using System.Net; using System.Threading.Tasks; namespace SpotifyAPI.Local.Models { public class Track { [JsonProperty("track_resource")] public SpotifyResource TrackResource { get; set; } [JsonProperty("artist_resource")] public SpotifyResource ArtistResource { get; set; } [JsonProperty("album_resource")] public SpotifyResource AlbumResource { get; set; } [JsonProperty("length")] public int Length { get; set; } [JsonProperty("track_type")] public string TrackType { get; set; } /// /// Checks if the track is an advert /// /// true if the track is an advert, false otherwise public bool IsAd() { if (TrackType == "ad") return true; if (Length == 0) return true; return false; } /// /// Returns a URL to the album cover in the provided size /// /// AlbumArtSize (160,320,640) /// A String, which is the URL to the Albumart public string GetAlbumArtUrl(AlbumArtSize size) { if (AlbumResource.Uri == null || !AlbumResource.Uri.Contains("spotify:album:") || AlbumResource.Uri.Contains("spotify:album:0000000000000000000000")) return ""; int albumsize = 0; switch (size) { case AlbumArtSize.Size160: albumsize = 160; break; case AlbumArtSize.Size320: albumsize = 320; break; case AlbumArtSize.Size640: albumsize = 640; break; } string raw; using (WebClient wc = new WebClient()) { wc.Proxy = null; raw = wc.DownloadString("http://open.spotify.com/album/" + AlbumResource.Uri.Split(new[] { ":" }, StringSplitOptions.None)[2]); } raw = raw.Replace("\t", ""); // < meta property = "og:image" content = "http://o.scdn.co/cover/12b318ffe0e4c92f9b4e1486e4726a57e6437ca7" > // Spotify changed the response so I am now getting the substring from the first line that parses out the above tag. string[] lines = raw.Split(new[] { "\n" }, StringSplitOptions.None); string startString = ""; foreach (string line in lines) { if (line.Trim().Contains("", ""); } } return ""; } /// /// Returns a Bitmap of the album cover in the provided size asynchronous /// /// AlbumArtSize (160,320,640) /// A Bitmap, which is the albumart public async Task GetAlbumArtAsync(AlbumArtSize size) { using (WebClient wc = new WebClient()) { wc.Proxy = null; string url = GetAlbumArtUrl(size); if (url == "") return null; var data = await wc.DownloadDataTaskAsync(url).ConfigureAwait(false); using (MemoryStream ms = new MemoryStream(data)) { return (Bitmap)Image.FromStream(ms); } } } /// /// Returns a byte[] of the the album cover in the provided size asynchronous /// /// AlbumArtSize (160,320,640) /// A byte[], which is the albumart in binary data public Task GetAlbumArtAsByteArrayAsync(AlbumArtSize size) { using (WebClient wc = new WebClient()) { wc.Proxy = null; string url = GetAlbumArtUrl(size); if (url == "") return null; return wc.DownloadDataTaskAsync(url); } } /// /// Returns a Bitmap of the album cover in the provided size /// /// AlbumArtSize (160,320,640) /// A Bitmap, which is the albumart public Bitmap GetAlbumArt(AlbumArtSize size) { using (WebClient wc = new WebClient()) { wc.Proxy = null; string url = GetAlbumArtUrl(size); if (string.IsNullOrEmpty(url)) return null; var data = wc.DownloadData(url); using (MemoryStream ms = new MemoryStream(data)) { return (Bitmap)Image.FromStream(ms); } } } /// /// Returns a byte[] of the album cover in the provided size /// /// AlbumArtSize (160,320,640) /// A byte[], which is the albumart in binary data public byte[] GetAlbumArtAsByteArray(AlbumArtSize size) { using (WebClient wc = new WebClient()) { wc.Proxy = null; string url = GetAlbumArtUrl(size); if (string.IsNullOrEmpty(url)) return null; return wc.DownloadData(url); } } } }