using System; using System.Collections.Generic; using System.Linq; using System.Text; using SpotifyAPI.Web.Enums; using SpotifyAPI.Web.Models; namespace SpotifyAPI.Web { /// /// SpotifyAPI URL-Generator /// public class SpotifyWebBuilder { public const string APIBase = "https://api.spotify.com/v1"; #region Search /// /// Get Spotify catalog information about artists, albums, tracks or playlists that match a keyword string. /// /// The search query's keywords (and optional field filters and operators), for example q=roadhouse+blues. /// A list of item types to search across. /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. /// The index of the first result to return. Default: 0 /// An ISO 3166-1 alpha-2 country code or the string from_token. /// public string SearchItems(string q, SearchType type, int limit = 20, int offset = 0, string market = "") { limit = Math.Min(50, limit); StringBuilder builder = new StringBuilder(APIBase + "/search"); builder.Append("?q=" + q); builder.Append("&type=" + type.GetStringAttribute(",")); builder.Append("&limit=" + limit); builder.Append("&offset=" + offset); if (!string.IsNullOrEmpty(market)) builder.Append("&market=" + market); return builder.ToString(); } #endregion Search #region Albums /// /// Get Spotify catalog information about an album’s tracks. Optional parameters can be used to limit the number of /// tracks returned. /// /// The Spotify ID for the album. /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. /// The index of the first track to return. Default: 0 (the first object). /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// public string GetAlbumTracks(string id, int limit = 20, int offset = 0, string market = "") { limit = Math.Min(limit, 50); StringBuilder builder = new StringBuilder(APIBase + "/albums/" + id + "/tracks"); builder.Append("?limit=" + limit); builder.Append("&offset=" + offset); if (!string.IsNullOrEmpty(market)) builder.Append("&market=" + market); return builder.ToString(); } /// /// Get Spotify catalog information for a single album. /// /// The Spotify ID for the album. /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// public string GetAlbum(string id, string market = "") { if (string.IsNullOrEmpty(market)) return $"{APIBase}/albums/{id}"; return $"{APIBase}/albums/{id}?market={market}"; } /// /// Get Spotify catalog information for multiple albums identified by their Spotify IDs. /// /// A list of the Spotify IDs for the albums. Maximum: 20 IDs. /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// public string GetSeveralAlbums(List ids, string market = "") { if (string.IsNullOrEmpty(market)) return $"{APIBase}/albums?ids={string.Join(",", ids.Take(20))}"; return $"{APIBase}/albums?market={market}&ids={string.Join(",", ids.Take(20))}"; } #endregion Albums #region Artists /// /// Get Spotify catalog information for a single artist identified by their unique Spotify ID. /// /// The Spotify ID for the artist. /// public string GetArtist(string id) { return $"{APIBase}/artists/{id}"; } /// /// Get Spotify catalog information about artists similar to a given artist. Similarity is based on analysis of the /// Spotify community’s listening history. /// /// The Spotify ID for the artist. /// public string GetRelatedArtists(string id) { return $"{APIBase}/artists/{id}/related-artists"; } /// /// Get Spotify catalog information about an artist’s top tracks by country. /// /// The Spotify ID for the artist. /// The country: an ISO 3166-1 alpha-2 country code. /// public string GetArtistsTopTracks(string id, string country) { return $"{APIBase}/artists/{id}/top-tracks?country={country}"; } /// /// Get Spotify catalog information about an artist’s albums. Optional parameters can be specified in the query string /// to filter and sort the response. /// /// The Spotify ID for the artist. /// /// A list of keywords that will be used to filter the response. If not supplied, all album types will /// be returned /// /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. /// The index of the first album to return. Default: 0 /// /// An ISO 3166-1 alpha-2 country code. Supply this parameter to limit the response to one particular /// geographical market /// /// public string GetArtistsAlbums(string id, AlbumType type = AlbumType.All, int limit = 20, int offset = 0, string market = "") { limit = Math.Min(limit, 50); StringBuilder builder = new StringBuilder(APIBase + "/artists/" + id + "/albums"); builder.Append("?album_type=" + type.GetStringAttribute(",")); builder.Append("&limit=" + limit); builder.Append("&offset=" + offset); if (!string.IsNullOrEmpty(market)) builder.Append("&market=" + market); return builder.ToString(); } /// /// Get Spotify catalog information for several artists based on their Spotify IDs. /// /// A list of the Spotify IDs for the artists. Maximum: 50 IDs. /// public string GetSeveralArtists(List ids) { return $"{APIBase}/artists?ids={string.Join(",", ids.Take(50))}"; } #endregion Artists #region Browse /// /// Get a list of Spotify featured playlists (shown, for example, on a Spotify player’s “Browse” tab). /// /// /// The desired language, consisting of a lowercase ISO 639 language code and an uppercase ISO 3166-1 /// alpha-2 country code, joined by an underscore. /// /// A country: an ISO 3166-1 alpha-2 country code. /// A timestamp in ISO 8601 format /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. /// The index of the first item to return. Default: 0 /// AUTH NEEDED public string GetFeaturedPlaylists(string locale = "", string country = "", DateTime timestamp = default(DateTime), int limit = 20, int offset = 0) { limit = Math.Min(limit, 50); StringBuilder builder = new StringBuilder(APIBase + "/browse/featured-playlists"); builder.Append("?limit=" + limit); builder.Append("&offset=" + offset); if (!string.IsNullOrEmpty(locale)) builder.Append("&locale=" + locale); if (!string.IsNullOrEmpty(country)) builder.Append("&country=" + country); if (timestamp != default(DateTime)) builder.Append("×tamp=" + timestamp.ToString("yyyy-MM-ddTHH:mm:ss")); return builder.ToString(); } /// /// Get a list of new album releases featured in Spotify (shown, for example, on a Spotify player’s “Browse” tab). /// /// A country: an ISO 3166-1 alpha-2 country code. /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. /// The index of the first item to return. Default: 0 /// /// AUTH NEEDED public string GetNewAlbumReleases(string country = "", int limit = 20, int offset = 0) { limit = Math.Min(limit, 50); StringBuilder builder = new StringBuilder(APIBase + "/browse/new-releases"); builder.Append("?limit=" + limit); builder.Append("&offset=" + offset); if (!string.IsNullOrEmpty(country)) builder.Append("&country=" + country); return builder.ToString(); } /// /// Get a list of categories used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). /// /// /// A country: an ISO 3166-1 alpha-2 country code. Provide this parameter if you want to narrow the /// list of returned categories to those relevant to a particular country /// /// /// The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country /// code, joined by an underscore /// /// The maximum number of categories to return. Default: 20. Minimum: 1. Maximum: 50. /// The index of the first item to return. Default: 0 (the first object). /// /// AUTH NEEDED public string GetCategories(string country = "", string locale = "", int limit = 20, int offset = 0) { limit = Math.Min(50, limit); StringBuilder builder = new StringBuilder(APIBase + "/browse/categories"); builder.Append("?limit=" + limit); builder.Append("&offset=" + offset); if (!string.IsNullOrEmpty(country)) builder.Append("&country=" + country); if (!string.IsNullOrEmpty(locale)) builder.Append("&locale=" + locale); return builder.ToString(); } /// /// Get a single category used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). /// /// The Spotify category ID for the category. /// /// A country: an ISO 3166-1 alpha-2 country code. Provide this parameter to ensure that the category /// exists for a particular country. /// /// /// The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country /// code, joined by an underscore /// /// /// AUTH NEEDED public string GetCategory(string categoryId, string country = "", string locale = "") { StringBuilder builder = new StringBuilder(APIBase + "/browse/categories/" + categoryId); if (!string.IsNullOrEmpty(country)) builder.Append("?country=" + country); if (!string.IsNullOrEmpty(locale)) builder.Append((country == "" ? "?locale=" : "&locale=") + locale); return builder.ToString(); } /// /// Get a list of Spotify playlists tagged with a particular category. /// /// The Spotify category ID for the category. /// A country: an ISO 3166-1 alpha-2 country code. /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. /// The index of the first item to return. Default: 0 /// /// AUTH NEEDED public string GetCategoryPlaylists(string categoryId, string country = "", int limit = 20, int offset = 0) { limit = Math.Min(50, limit); StringBuilder builder = new StringBuilder(APIBase + "/browse/categories/" + categoryId + "/playlists"); builder.Append("?limit=" + limit); builder.Append("&offset=" + offset); if (!string.IsNullOrEmpty(country)) builder.Append("&country=" + country); return builder.ToString(); } /// /// Create a playlist-style listening experience based on seed artists, tracks and genres. /// /// A comma separated list of Spotify IDs for seed artists. /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. /// /// A comma separated list of any genres in the set of available genre seeds. /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. /// /// A comma separated list of Spotify IDs for a seed track. /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. /// /// Tracks with the attribute values nearest to the target values will be preferred. /// For each tunable track attribute, a hard floor on the selected track attribute’s value can be provided /// For each tunable track attribute, a hard ceiling on the selected track attribute’s value can be provided /// The target size of the list of recommended tracks. Default: 20. Minimum: 1. Maximum: 100. /// For seeds with unusually small pools or when highly restrictive filtering is applied, it may be impossible to generate the requested number of recommended tracks. /// /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// Because min_*, max_* and target_* are applied to pools before relinking, the generated results may not precisely match the filters applied. /// /// AUTH NEEDED public string GetRecommendations(List artistSeed = null, List genreSeed = null, List trackSeed = null, TuneableTrack target = null, TuneableTrack min = null, TuneableTrack max = null, int limit = 20, string market = "") { limit = Math.Min(100, limit); StringBuilder builder = new StringBuilder($"{APIBase}/recommendations"); builder.Append("?limit=" + limit); if (artistSeed?.Count > 0) builder.Append("&seed_artists=" + string.Join(",", artistSeed)); if (genreSeed?.Count > 0) builder.Append("&seed_genres=" + string.Join(",", genreSeed)); if (trackSeed?.Count > 0) builder.Append("&seed_tracks=" + string.Join(",", trackSeed)); if (target != null) builder.Append(target.BuildUrlParams("target")); if (min != null) builder.Append(min.BuildUrlParams("min")); if (max != null) builder.Append(max.BuildUrlParams("max")); if (!string.IsNullOrEmpty(market)) builder.Append("&market=" + market); return builder.ToString(); } /// /// Retrieve a list of available genres seed parameter values for recommendations. /// /// /// AUTH NEEDED public string GetRecommendationSeedsGenres() { return $"{APIBase}/recommendations/available-genre-seeds"; } #endregion Browse #region Follow /// /// Get the current user’s followed artists. /// /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. /// The last artist ID retrieved from the previous request. /// /// AUTH NEEDED public string GetFollowedArtists(int limit = 20, string after = "") { limit = Math.Min(limit, 50); const FollowType followType = FollowType.Artist; //currently only artist is supported. StringBuilder builder = new StringBuilder(APIBase + "/me/following?type=" + followType.GetStringAttribute()); builder.Append("&limit=" + limit); if (!string.IsNullOrEmpty(after)) builder.Append("&after=" + after); return builder.ToString(); } /// /// Add the current user as a follower of one or more artists or other Spotify users. /// /// The ID type: either artist or user. /// /// AUTH NEEDED public string Follow(FollowType followType) { return $"{APIBase}/me/following?type={followType.GetStringAttribute()}"; } /// /// Remove the current user as a follower of one or more artists or other Spotify users. /// /// The ID type: either artist or user. /// /// AUTH NEEDED public string Unfollow(FollowType followType) { return $"{APIBase}/me/following?type={followType.GetStringAttribute()}"; } /// /// Check to see if the current user is following one or more artists or other Spotify users. /// /// The ID type: either artist or user. /// A list of the artist or the user Spotify IDs to check /// /// AUTH NEEDED public string IsFollowing(FollowType followType, List ids) { return $"{APIBase}/me/following/contains?type={followType.GetStringAttribute()}&ids={string.Join(",", ids)}"; } /// /// Add the current user as a follower of a playlist. /// /// The Spotify user ID of the person who owns the playlist. /// /// The Spotify ID of the playlist. Any playlist can be followed, regardless of its public/private /// status, as long as you know its playlist ID. /// /// /// If true the playlist will be included in user's public playlists, if false it will remain /// private. /// /// /// AUTH NEEDED public string FollowPlaylist(string ownerId, string playlistId, bool showPublic = true) { return $"{APIBase}/users/{ownerId}/playlists/{playlistId}/followers"; } /// /// Remove the current user as a follower of a playlist. /// /// The Spotify user ID of the person who owns the playlist. /// The Spotify ID of the playlist that is to be no longer followed. /// /// AUTH NEEDED public string UnfollowPlaylist(string ownerId, string playlistId) { return $"{APIBase}/users/{ownerId}/playlists/{playlistId}/followers"; } /// /// Check to see if one or more Spotify users are following a specified playlist. /// /// The Spotify user ID of the person who owns the playlist. /// The Spotify ID of the playlist. /// A list of Spotify User IDs /// /// AUTH NEEDED public string IsFollowingPlaylist(string ownerId, string playlistId, List ids) { return $"{APIBase}/users/{ownerId}/playlists/{playlistId}/followers/contains?ids={string.Join(",", ids)}"; } #endregion Follow #region Library /// /// Save one or more tracks to the current user’s “Your Music” library. /// /// /// AUTH NEEDED public string SaveTracks() { return APIBase + "/me/tracks/"; } /// /// Get a list of the songs saved in the current Spotify user’s “Your Music” library. /// /// The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. /// The index of the first object to return. Default: 0 (i.e., the first object) /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// /// AUTH NEEDED public string GetSavedTracks(int limit = 20, int offset = 0, string market = "") { limit = Math.Min(limit, 50); StringBuilder builder = new StringBuilder(APIBase + "/me/tracks"); builder.Append("?limit=" + limit); builder.Append("&offset=" + offset); if (!string.IsNullOrEmpty(market)) builder.Append("&market=" + market); return builder.ToString(); } /// /// Remove one or more tracks from the current user’s “Your Music” library. /// /// /// AUTH NEEDED public string RemoveSavedTracks() { return APIBase + "/me/tracks/"; } /// /// Check if one or more tracks is already saved in the current Spotify user’s “Your Music” library. /// /// A list of the Spotify IDs. /// /// AUTH NEEDED public string CheckSavedTracks(List ids) { return APIBase + "/me/tracks/contains?ids=" + string.Join(",", ids); } /// /// Save one or more albums to the current user’s "Your Music" library. /// /// /// AUTH NEEDED public string SaveAlbums() { return $"{APIBase}/me/albums"; } /// /// Get a list of the albums saved in the current Spotify user’s "Your Music" library. /// /// The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. /// The index of the first object to return. Default: 0 (i.e., the first object) /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// /// AUTH NEEDED public string GetSavedAlbums(int limit = 20, int offset = 0, string market = "") { limit = Math.Min(limit, 50); StringBuilder builder = new StringBuilder(APIBase + "/me/albums"); builder.Append("?limit=" + limit); builder.Append("&offset=" + offset); if (!string.IsNullOrEmpty(market)) builder.Append("&market=" + market); return builder.ToString(); } /// /// Remove one or more albums from the current user’s "Your Music" library. /// /// /// AUTH NEEDED public string RemoveSavedAlbums() { return APIBase + "/me/albums/"; } /// /// Check if one or more albums is already saved in the current Spotify user’s "Your Music" library. /// /// A list of the Spotify IDs. /// /// AUTH NEEDED public string CheckSavedAlbums(List ids) { return APIBase + "/me/albums/contains?ids=" + string.Join(",", ids); } #endregion Library #region Personalization /// /// Get the current user’s top tracks based on calculated affinity. /// /// Over what time frame the affinities are computed. /// Valid values: long_term (calculated from several years of data and including all new data as it becomes available), /// medium_term (approximately last 6 months), short_term (approximately last 4 weeks). /// The number of entities to return. Default: 20. Minimum: 1. Maximum: 50 /// The index of the first entity to return. Default: 0 (i.e., the first track). Use with limit to get the next set of entities. /// /// AUTH NEEDED public string GetUsersTopTracks(TimeRangeType timeRange = TimeRangeType.MediumTerm, int limit = 20, int offest = 0) { limit = Math.Min(50, limit); StringBuilder builder = new StringBuilder($"{APIBase}/me/top/tracks"); builder.Append("?limit=" + limit); builder.Append("&offset=" + offest); builder.Append("&time_range=" + timeRange.GetStringAttribute()); return builder.ToString(); } /// /// Get the current user’s top artists based on calculated affinity. /// /// Over what time frame the affinities are computed. /// Valid values: long_term (calculated from several years of data and including all new data as it becomes available), /// medium_term (approximately last 6 months), short_term (approximately last 4 weeks). /// The number of entities to return. Default: 20. Minimum: 1. Maximum: 50 /// The index of the first entity to return. Default: 0 (i.e., the first track). Use with limit to get the next set of entities. /// /// AUTH NEEDED public string GetUsersTopArtists(TimeRangeType timeRange = TimeRangeType.MediumTerm, int limit = 20, int offest = 0) { limit = Math.Min(50, limit); StringBuilder builder = new StringBuilder($"{APIBase}/me/top/artists"); builder.Append("?limit=" + limit); builder.Append("&offset=" + offest); builder.Append("&time_range=" + timeRange.GetStringAttribute()); return builder.ToString(); } /// /// Get tracks from the current user’s recent play history. /// /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. /// A Unix timestamp in milliseconds. Returns all items after (but not including) this cursor position. If after is specified, before must not be specified. /// A Unix timestamp in milliseconds. Returns all items before (but not including) this cursor position. If before is specified, after must not be specified. /// /// AUTH NEEDED public string GetUsersRecentlyPlayedTracks(int limit = 20, DateTime? after = null, DateTime? before = null) { limit = Math.Min(50, limit); StringBuilder builder = new StringBuilder($"{APIBase}/me/player/recently-played"); builder.Append("?limit=" + limit); if (after.HasValue) builder.Append("&after=" + after.Value.ToUnixTimeMillisecondsPoly()); if (before.HasValue) builder.Append("&before=" + before.Value.ToUnixTimeMillisecondsPoly()); return builder.ToString(); } #endregion #region Playlists /// /// Get a list of the playlists owned or followed by a Spotify user. /// /// The user's Spotify user ID. /// The maximum number of playlists to return. Default: 20. Minimum: 1. Maximum: 50. /// The index of the first playlist to return. Default: 0 (the first object) /// /// AUTH NEEDED public string GetUserPlaylists(string userId, int limit = 20, int offset = 0) { limit = Math.Min(limit, 50); StringBuilder builder = new StringBuilder(APIBase + "/users/" + userId + "/playlists"); builder.Append("?limit=" + limit); builder.Append("&offset=" + offset); return builder.ToString(); } /// /// Get a playlist owned by a Spotify user. /// /// The user's Spotify user ID. /// The Spotify ID for the playlist. /// /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are /// returned. /// /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// /// AUTH NEEDED public string GetPlaylist(string userId, string playlistId, string fields = "", string market = "") { StringBuilder builder = new StringBuilder(APIBase + "/users/" + userId + "/playlists/" + playlistId); builder.Append("?fields=" + fields); if (!string.IsNullOrEmpty(market)) builder.Append("&market=" + market); return builder.ToString(); } /// /// Get a playlist owned by a Spotify user. /// /// The Spotify ID for the playlist. /// /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are /// returned. /// /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// /// AUTH NEEDED public string GetPlaylist(string playlistId, string fields = "", string market = "") { StringBuilder builder = new StringBuilder(APIBase + "/playlists/" + playlistId); builder.Append("?fields=" + fields); if (!string.IsNullOrEmpty(market)) builder.Append("&market=" + market); return builder.ToString(); } /// /// Get full details of the tracks of a playlist owned by a Spotify user. /// /// The user's Spotify user ID. /// The Spotify ID for the playlist. /// /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are /// returned. /// /// The maximum number of tracks to return. Default: 100. Minimum: 1. Maximum: 100. /// The index of the first object to return. Default: 0 (i.e., the first object) /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// /// AUTH NEEDED public string GetPlaylistTracks(string userId, string playlistId, string fields = "", int limit = 100, int offset = 0, string market = "") { limit = Math.Min(limit, 100); StringBuilder builder = new StringBuilder(APIBase + "/users/" + userId + "/playlists/" + playlistId + "/tracks"); builder.Append("?fields=" + fields); builder.Append("&limit=" + limit); builder.Append("&offset=" + offset); if (!string.IsNullOrEmpty(market)) builder.Append("&market=" + market); return builder.ToString(); } /// /// Get full details of the tracks of a playlist owned by a Spotify user. /// /// The Spotify ID for the playlist. /// /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are /// returned. /// /// The maximum number of tracks to return. Default: 100. Minimum: 1. Maximum: 100. /// The index of the first object to return. Default: 0 (i.e., the first object) /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// /// AUTH NEEDED public string GetPlaylistTracks(string playlistId, string fields = "", int limit = 100, int offset = 0, string market = "") { limit = Math.Min(limit, 100); StringBuilder builder = new StringBuilder(APIBase + "/playlists/" + playlistId + "/tracks"); builder.Append("?fields=" + fields); builder.Append("&limit=" + limit); builder.Append("&offset=" + offset); if (!string.IsNullOrEmpty(market)) builder.Append("&market=" + market); return builder.ToString(); } /// /// Create a playlist for a Spotify user. (The playlist will be empty until you add tracks.) /// /// The user's Spotify user ID. /// /// The name for the new playlist, for example "Your Coolest Playlist". This name does not need /// to be unique. /// /// /// default true. If true the playlist will be public, if false it will be private. To be able to /// create private playlists, the user must have granted the playlist-modify-private scope. /// /// /// AUTH NEEDED public string CreatePlaylist(string userId, string playlistName, Boolean isPublic = true) { return $"{APIBase}/users/{userId}/playlists"; } /// /// Change a playlist’s name and public/private state. (The user must, of course, own the playlist.) /// /// The user's Spotify user ID. /// The Spotify ID for the playlist. /// /// AUTH NEEDED public string UpdatePlaylist(string userId, string playlistId) { return $"{APIBase}/users/{userId}/playlists/{playlistId}"; } /// /// Change a playlist’s name and public/private state. (The user must, of course, own the playlist.) /// /// The Spotify ID for the playlist. /// /// AUTH NEEDED public string UpdatePlaylist(string playlistId) { return $"{APIBase}/playlists/{playlistId}"; } /// /// Replace all the tracks in a playlist, overwriting its existing tracks. This powerful request can be useful for /// replacing tracks, re-ordering existing tracks, or clearing the playlist. /// /// The user's Spotify user ID. /// The Spotify ID for the playlist. /// /// AUTH NEEDED public string ReplacePlaylistTracks(string userId, string playlistId) { return $"{APIBase}/users/{userId}/playlists/{playlistId}/tracks"; } /// /// Replace all the tracks in a playlist, overwriting its existing tracks. This powerful request can be useful for /// replacing tracks, re-ordering existing tracks, or clearing the playlist. /// /// The Spotify ID for the playlist. /// /// AUTH NEEDED public string ReplacePlaylistTracks(string playlistId) { return $"{APIBase}/playlists/{playlistId}/tracks"; } /// /// Remove one or more tracks from a user’s playlist. /// /// The user's Spotify user ID. /// The Spotify ID for the playlist. /// /// array of objects containing Spotify URI strings (and their position in the playlist). A maximum of /// 100 objects can be sent at once. /// /// /// AUTH NEEDED public string RemovePlaylistTracks(string userId, string playlistId, List uris) { return $"{APIBase}/users/{userId}/playlists/{playlistId}/tracks"; } /// /// Remove one or more tracks from a user’s playlist. /// /// The Spotify ID for the playlist. /// /// array of objects containing Spotify URI strings (and their position in the playlist). A maximum of /// 100 objects can be sent at once. /// /// /// AUTH NEEDED public string RemovePlaylistTracks(string playlistId, List uris) { return $"{APIBase}/playlists/{playlistId}/tracks"; } /// /// Add one or more tracks to a user’s playlist. /// /// The user's Spotify user ID. /// The Spotify ID for the playlist. /// A list of Spotify track URIs to add /// The position to insert the tracks, a zero-based index /// /// AUTH NEEDED public string AddPlaylistTracks(string userId, string playlistId, List uris, int? position = null) { if (position == null) return $"{APIBase}/users/{userId}/playlists/{playlistId}/tracks"; return $"{APIBase}/users/{userId}/playlists/{playlistId}/tracks?position={position}"; } /// /// Add one or more tracks to a user’s playlist. /// /// The Spotify ID for the playlist. /// A list of Spotify track URIs to add /// The position to insert the tracks, a zero-based index /// /// AUTH NEEDED public string AddPlaylistTracks(string playlistId, List uris, int? position = null) { if (position == null) return $"{APIBase}/playlists/{playlistId}/tracks"; return $"{APIBase}/playlists/{playlistId}/tracks?position={position}"; } /// /// Reorder a track or a group of tracks in a playlist. /// /// The user's Spotify user ID. /// The Spotify ID for the playlist. /// /// AUTH NEEDED public string ReorderPlaylist(string userId, string playlistId) { return $"{APIBase}/users/{userId}/playlists/{playlistId}/tracks"; } /// /// Reorder a track or a group of tracks in a playlist. /// /// The Spotify ID for the playlist. /// /// AUTH NEEDED public string ReorderPlaylist(string playlistId) { return $"{APIBase}/playlists/{playlistId}/tracks"; } /// /// Upload an image for a playlist. /// /// The user's Spotify user ID. /// The Spotify ID for the playlist. /// /// AUTH NEEDED public string UploadPlaylistImage(string userId, string playlistId) { return $"{APIBase}/users/{userId}/playlists/{playlistId}/images"; } /// /// Upload an image for a playlist. /// /// The Spotify ID for the playlist. /// /// AUTH NEEDED public string UploadPlaylistImage(string playlistId) { return $"{APIBase}/playlists/{playlistId}/images"; } #endregion Playlists #region Profiles /// /// Get detailed profile information about the current user (including the current user’s username). /// /// /// AUTH NEEDED public string GetPrivateProfile() { return $"{APIBase}/me"; } /// /// Get public profile information about a Spotify user. /// /// The user's Spotify user ID. /// public string GetPublicProfile(string userId) { return $"{APIBase}/users/{userId}"; } #endregion Profiles #region Tracks /// /// Get Spotify catalog information for multiple tracks based on their Spotify IDs. /// /// A list of the Spotify IDs for the tracks. Maximum: 50 IDs. /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// public string GetSeveralTracks(List ids, string market = "") { if (string.IsNullOrEmpty(market)) return $"{APIBase}/tracks?ids={string.Join(",", ids.Take(50))}"; return $"{APIBase}/tracks?market={market}&ids={string.Join(",", ids.Take(50))}"; } /// /// Get Spotify catalog information for a single track identified by its unique Spotify ID. /// /// The Spotify ID for the track. /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// public string GetTrack(string id, string market = "") { if (string.IsNullOrEmpty(market)) return $"{APIBase}/tracks/{id}"; return $"{APIBase}/tracks/{id}?market={market}"; } /// /// Get a detailed audio analysis for a single track identified by its unique Spotify ID. /// /// The Spotify ID for the track. /// /// AUTH NEEDED public string GetAudioAnalysis(string id) { return $"{APIBase}/audio-analysis/{id}"; } /// /// Get audio feature information for a single track identified by its unique Spotify ID. /// /// The Spotify ID for the track. /// /// AUTH NEEDED public string GetAudioFeatures(string id) { return $"{APIBase}/audio-features/{id}"; } /// /// Get audio features for multiple tracks based on their Spotify IDs. /// /// A list of Spotify Track-IDs. Maximum: 100 IDs. /// /// AUTH NEEDED public string GetSeveralAudioFeatures(List ids) { return $"{APIBase}/audio-features?ids={string.Join(",", ids.Take(100))}"; } #endregion Tracks #region Player /// /// Get information about a user’s available devices. /// /// public string GetDevices() { return $"{APIBase}/me/player/devices"; } /// /// Get information about the user’s current playback state, including track, track progress, and active device. /// /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// public string GetPlayback(string market = "") { if (string.IsNullOrEmpty(market)) return $"{APIBase}/me/player"; return $"{APIBase}/me/player?market={market}"; } /// /// Get the object currently being played on the user’s Spotify account. /// /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. /// public string GetPlayingTrack(string market = "") { if (string.IsNullOrEmpty(market)) return $"{APIBase}/me/player/currently-playing"; return $"{APIBase}/me/player/currently-playing?market={market}"; } /// /// Transfer playback to a new device and determine if it should start playing. /// /// public string TransferPlayback() { return $"{APIBase}/me/player"; } /// /// Start a new context or resume current playback on the user’s active device. /// /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. /// public string ResumePlayback(string deviceId = "") { if(string.IsNullOrEmpty(deviceId)) return $"{APIBase}/me/player/play"; return $"{APIBase}/me/player/play?device_id={deviceId}"; } /// /// Pause playback on the user’s account. /// /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. /// public string PausePlayback(string deviceId = "") { if (string.IsNullOrEmpty(deviceId)) return $"{APIBase}/me/player/pause"; return $"{APIBase}/me/player/pause?device_id={deviceId}"; } /// /// Skips to next track in the user’s queue. /// /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. /// public string SkipPlaybackToNext(string deviceId = "") { if (string.IsNullOrEmpty(deviceId)) return $"{APIBase}/me/player/next"; return $"{APIBase}/me/player/next?device_id={deviceId}"; } /// /// Skips to previous track in the user’s queue. /// Note that this will ALWAYS skip to the previous track, regardless of the current track’s progress. /// Returning to the start of the current track should be performed using the https://api.spotify.com/v1/me/player/seek endpoint. /// /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. /// public string SkipPlaybackToPrevious(string deviceId = "") { if (string.IsNullOrEmpty(deviceId)) return $"{APIBase}/me/player/previous"; return $"{APIBase}/me/player/previous?device_id={deviceId}"; } /// /// Seeks to the given position in the user’s currently playing track. /// /// The position in milliseconds to seek to. Must be a positive number. /// Passing in a position that is greater than the length of the track will cause the player to start playing the next song. /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. /// public string SeekPlayback(int positionMs, string deviceId = "") { if (string.IsNullOrEmpty(deviceId)) return $"{APIBase}/me/player/seek?position_ms={positionMs}"; return $"{APIBase}/me/player/seek?position_ms={positionMs}&device_id={deviceId}"; } /// /// Set the repeat mode for the user’s playback. Options are repeat-track, repeat-context, and off. /// /// track, context or off. /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. /// public string SetRepeatMode(RepeatState repeatState, string deviceId = "") { if (string.IsNullOrEmpty(deviceId)) return $"{APIBase}/me/player/repeat?state={repeatState.GetStringAttribute()}"; return $"{APIBase}/me/player/repeat?state={repeatState.GetStringAttribute()}&device_id={deviceId}"; } /// /// Set the volume for the user’s current playback device. /// /// Integer. The volume to set. Must be a value from 0 to 100 inclusive. /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. /// public string SetVolume(int volumePercent, string deviceId = "") { if (string.IsNullOrEmpty(deviceId)) return $"{APIBase}/me/player/volume?volume_percent={volumePercent}"; return $"{APIBase}/me/player/volume?volume_percent={volumePercent}&device_id={deviceId}"; } /// /// Toggle shuffle on or off for user’s playback. /// /// True of False. /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. /// public string SetShuffle(bool shuffle, string deviceId = "") { if (string.IsNullOrEmpty(deviceId)) return $"{APIBase}/me/player/shuffle?state={shuffle}"; return $"{APIBase}/me/player/shuffle?state={shuffle}&device_id={deviceId}"; } #endregion } }