Accessing Spotify API for Multiple Artists in R

99封情书 提交于 2019-12-04 19:20:33

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!