I have created a Client ID and Secret Key in Spotify's developer app section. I am referencing this document and want to extend this by choosing multiple artists.
https://www.r-bloggers.com/the-eurovision-2016-song-contest-in-an-r-shiny-app/
In this example, they are only choosing 1 artist ID but there are some holes to this,
1) How do you obtain the artist name rather than the artist ID because I can't find a glossary key anywhere for the artist ID?
2) How do you choose multiple artists rather than just one.
So for example, how do I choose Frank Sinatra and Elvis Presley?
Code is below:
library(httr)
clientID = '#############################'
secret = '########################'
response = POST(
'https://accounts.spotify.com/api/token',
accept_json(),
authenticate(clientID, secret),
body = list(grant_type = 'client_credentials'),
encode = 'form',
verbose()
)
mytoken = content(response)$access_token
## Frank Sinatra spotify artist ID
artistID = '1Mxqyy3pSjf8kZZL4QVxS0'
HeaderValue = paste0('Bearer ', mytoken)
URI = paste0('https://api.spotify.com/v1/artists/', artistID)
response2 = GET(url = URI, add_headers(Authorization = HeaderValue))
Artist = content(response2)
Artist
My goal here is to get all of the attributes about each of the artists songs such as danceability, etc.
Any help would be great, thanks!
If you're asking how get get the artist name from the response object you created in your question, you can do so like this:
> Artist$name
"Frank Sinatra"
If you're asking how to query the API by artist name, the relevant endpoint is the artist search by name, which will allow you do find the ID (as the API is based on ID other than the search feature, so you'll need that):
/v1/search?type=artist
The endpoint to get several artists is:
/v1/artists?ids={ids}
They actually provide a nice jsFiddle example of a (single) artist search based on name:
http://jsfiddle.net/JMPerez/0u0v7e1b/
This search documentation page shows how they build the search URI:
https://developer.spotify.com/web-api/search-item/
Putting it all together
Here's a fully working example of searching based on artist name in R. Let's say we want to search for YTCracker, the nerd rap king:
artistName = 'ytcracker'
HeaderValue = paste0('Bearer ', mytoken)
URI = paste0('https://api.spotify.com/v1/search?query=', artistName,'&offset=0&limit=20&type=artist')
response2 = GET(url = URI, add_headers(Authorization = HeaderValue))
Artist = content(response2)
Artist
The Artist
object has the ID, URI, genre, number of followers, and other information sufficient to explore the rest of the Spotify API for this artist, their albums, and related artists, etc, etc:
$artists
$artists$href
[1] "https://api.spotify.com/v1/search?query=ytcracker&offset=0&limit=20&type=artist"
$artists$items
$artists$items[[1]]
$artists$items[[1]]$external_urls
$artists$items[[1]]$external_urls$spotify
[1] "https://open.spotify.com/artist/1x82Mu3wakMkldMW5kEiP4"
$artists$items[[1]]$followers
$artists$items[[1]]$followers$href
NULL
$artists$items[[1]]$followers$total
[1] 2386
$artists$items[[1]]$genres
$artists$items[[1]]$genres[[1]]
[1] "nerdcore"
$artists$items[[1]]$href
[1] "https://api.spotify.com/v1/artists/1x82Mu3wakMkldMW5kEiP4"
$artists$items[[1]]$id
[1] "1x82Mu3wakMkldMW5kEiP4"
$artists$items[[1]]$images
$artists$items[[1]]$images[[1]]
$artists$items[[1]]$images[[1]]$height
[1] 640
$artists$items[[1]]$images[[1]]$url
[1] "https://i.scdn.co/image/da66c87cfb6f7e400979b53f12c0b0cb029424a8"
$artists$items[[1]]$images[[1]]$width
[1] 640
$artists$items[[1]]$images[[2]]
$artists$items[[1]]$images[[2]]$height
[1] 300
$artists$items[[1]]$images[[2]]$url
[1] "https://i.scdn.co/image/4055cb39744f85c94838841eecc74563b94a00d1"
$artists$items[[1]]$images[[2]]$width
[1] 300
$artists$items[[1]]$images[[3]]
$artists$items[[1]]$images[[3]]$height
[1] 64
$artists$items[[1]]$images[[3]]$url
[1] "https://i.scdn.co/image/d46121137f358701b55dcdd03ba9a632ea7e4879"
$artists$items[[1]]$images[[3]]$width
[1] 64
$artists$items[[1]]$name
[1] "YTCracker"
$artists$items[[1]]$popularity
[1] 31
$artists$items[[1]]$type
[1] "artist"
$artists$items[[1]]$uri
[1] "spotify:artist:1x82Mu3wakMkldMW5kEiP4"
$artists$items[[2]]
$artists$items[[2]]$external_urls
$artists$items[[2]]$external_urls$spotify
[1] "https://open.spotify.com/artist/2RnAr4QItmKW4vFKip3m8v"
$artists$items[[2]]$followers
$artists$items[[2]]$followers$href
NULL
$artists$items[[2]]$followers$total
[1] 36
$artists$items[[2]]$genres
list()
$artists$items[[2]]$href
[1] "https://api.spotify.com/v1/artists/2RnAr4QItmKW4vFKip3m8v"
$artists$items[[2]]$id
[1] "2RnAr4QItmKW4vFKip3m8v"
$artists$items[[2]]$images
list()
$artists$items[[2]]$name
[1] "YTCracker & Hairetsu"
$artists$items[[2]]$popularity
[1] 9
$artists$items[[2]]$type
[1] "artist"
$artists$items[[2]]$uri
[1] "spotify:artist:2RnAr4QItmKW4vFKip3m8v"
$artists$limit
[1] 20
$artists$`next`
NULL
$artists$offset
[1] 0
$artists$previous
NULL
$artists$total
[1] 2
Note that I set an optional limit on the size of the search results. Also note that you can use the same search results to query things like album art images, as in the jsFiddle example, if so inclined.
Multiple Arists
OK, so now I have the ID for YTCracker based on my search and the ID for Sinatra from your question, and I want to simultaneously query the API for both artists. I can do that as follows. As long as you have the ID's you can to this for more than 2 artists, as well.
URI = paste0('https://api.spotify.com/v1/artists?ids=', Artist$artists$items[[2]]$id,",", '1Mxqyy3pSjf8kZZL4QVxS0')
response2 = GET(url = URI, add_headers(Authorization = HeaderValue))
Artists = content(response2)
$artists
$artists[[1]]
$artists[[1]]$external_urls
$artists[[1]]$external_urls$spotify
[1] "https://open.spotify.com/artist/2RnAr4QItmKW4vFKip3m8v"
$artists[[1]]$followers
$artists[[1]]$followers$href
NULL
$artists[[1]]$followers$total
[1] 36
$artists[[1]]$genres
list()
$artists[[1]]$href
[1] "https://api.spotify.com/v1/artists/2RnAr4QItmKW4vFKip3m8v"
$artists[[1]]$id
[1] "2RnAr4QItmKW4vFKip3m8v"
$artists[[1]]$images
list()
$artists[[1]]$name
[1] "YTCracker & Hairetsu"
$artists[[1]]$popularity
[1] 9
$artists[[1]]$type
[1] "artist"
$artists[[1]]$uri
[1] "spotify:artist:2RnAr4QItmKW4vFKip3m8v"
$artists[[2]]
$artists[[2]]$external_urls
$artists[[2]]$external_urls$spotify
[1] "https://open.spotify.com/artist/1Mxqyy3pSjf8kZZL4QVxS0"
$artists[[2]]$followers
$artists[[2]]$followers$href
NULL
$artists[[2]]$followers$total
[1] 1204440
$artists[[2]]$genres
$artists[[2]]$genres[[1]]
[1] "adult standards"
$artists[[2]]$genres[[2]]
[1] "brill building pop"
$artists[[2]]$genres[[3]]
[1] "christmas"
$artists[[2]]$genres[[4]]
[1] "easy listening"
$artists[[2]]$genres[[5]]
[1] "jazz christmas"
$artists[[2]]$genres[[6]]
[1] "lounge"
$artists[[2]]$genres[[7]]
[1] "mellow gold"
$artists[[2]]$genres[[8]]
[1] "soft rock"
$artists[[2]]$genres[[9]]
[1] "soul"
$artists[[2]]$genres[[10]]
[1] "swing"
$artists[[2]]$genres[[11]]
[1] "vocal jazz"
$artists[[2]]$href
[1] "https://api.spotify.com/v1/artists/1Mxqyy3pSjf8kZZL4QVxS0"
$artists[[2]]$id
[1] "1Mxqyy3pSjf8kZZL4QVxS0"
$artists[[2]]$images
$artists[[2]]$images[[1]]
$artists[[2]]$images[[1]]$height
[1] 650
$artists[[2]]$images[[1]]$url
[1] "https://i.scdn.co/image/fc4e0f474fb4c4cb83617aa884dc9fd9822d4411"
$artists[[2]]$images[[1]]$width
[1] 999
$artists[[2]]$images[[2]]
$artists[[2]]$images[[2]]$height
[1] 416
$artists[[2]]$images[[2]]$url
[1] "https://i.scdn.co/image/883de3e492364891543bc0313ffe516626778a16"
$artists[[2]]$images[[2]]$width
[1] 640
$artists[[2]]$images[[3]]
$artists[[2]]$images[[3]]$height
[1] 130
$artists[[2]]$images[[3]]$url
[1] "https://i.scdn.co/image/810f29651e05c9eae5a31f8151c2e05dc46390f9"
$artists[[2]]$images[[3]]$width
[1] 200
$artists[[2]]$images[[4]]
$artists[[2]]$images[[4]]$height
[1] 42
$artists[[2]]$images[[4]]$url
[1] "https://i.scdn.co/image/a283ecdc6252ae305c53d283846cae2e8b22e94c"
$artists[[2]]$images[[4]]$width
[1] 64
$artists[[2]]$name
[1] "Frank Sinatra"
$artists[[2]]$popularity
[1] 77
$artists[[2]]$type
[1] "artist"
$artists[[2]]$uri
[1] "spotify:artist:1Mxqyy3pSjf8kZZL4QVxS0"
I built the spotifyr
package to do just this!
install.packages('spotifyr')
library(spotifyr)
library(tidyverse)
Sys.setenv(SPOTIFY_CLIENT_ID = '[YOUR_SPOTIFY_CLIENT_ID]')
Sys.setenv(SPOTIFY_CLIENT_SECRET = '[YOUR_SPOTIFY_CLIENT_SECRET]')
artist_names <- c('Frank Sinatra', 'Elvis Presley')
artist_audio_features <- map_df(artist_names, function(artist) {
get_artist_audio_features(artist) %>%
mutate(artist_name = artist)
})
If you have any further questions/issues, feel free to reach out on github: https://github.com/charlie86/spotifyr