Skip to content

Instantly share code, notes, and snippets.

@a-lexwein
Created January 6, 2019 15:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save a-lexwein/19e1497001e07b6cada32a3c81e30a8a to your computer and use it in GitHub Desktop.
Save a-lexwein/19e1497001e07b6cada32a3c81e30a8a to your computer and use it in GitHub Desktop.
using httr to get spotify track data
## thanks to http://www.r-bloggers.com/the-eurovision-2016-song-contest-in-an-r-shiny-app/
library(httr)
library(dplyr)
library(purrr)
## I Created a spotify developer account and was given these.
clientID = 'XXXXXXXXX'
secret = 'XXXXXXXXXX'
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
user_id = '129342083'
user_id = 'spotify'
#user_id = 'radioedit'
HeaderValue = paste0('Bearer ', mytoken)
URI = paste0('https://api.spotify.com/v1/users/', user_id, '/playlists')
## get the total number of playlists
response2 = GET(url = URI, add_headers(Authorization = HeaderValue), query = list(offset = 0, limit = 50))
Playlists = content(response2)
num_playlists <- Playlists$total
## function to pull the playlist href from the response content.
reffer <- function(n) {
Playlists$items[[n]]$href
}
if (num_playlists >= 50) {
offsets <- seq(0, num_playlists-50, by = 50)
## builds list of hrefs for everyone of users playlist.
hrefs <- c()
for (i in offsets) {
response2 = GET(url = URI, add_headers(Authorization = HeaderValue), query = list(offset = i, limit = 50))
Playlists = content(response2)
reffer2 <- unlist(lapply(seq(1:50), FUN = reffer))
hrefs <- c(hrefs, reffer2)
}
## Gets reamining hrefs
last_bit_offset = max(offsets)+50
last_bit_iter = num_playlists-last_bit_offset
response2 = GET(url = URI, add_headers(Authorization = HeaderValue), query = list(offset = last_bit_offset, limit = 50))
Playlists = content(response2)
reffer2 <- unlist(lapply(seq(1:last_bit_iter), FUN = reffer))
hrefs <- c(hrefs, reffer2)
} else {
response2 = GET(url = URI, add_headers(Authorization = HeaderValue), query = list(offset = i, limit = 50))
Playlists = content(response2)
reffer2 <- unlist(lapply(seq(1:num_playlists), FUN = reffer))
hrefs <- reffer2
}
## pulls track info from playlist given a track number.
tracker <- function(playlist,track_index) {
i <- track_index
x <- list(playlist_track_number = i,
track_name = playlist$tracks$items[[i]]$track$name,
track_id = playlist$tracks$items[[i]]$track$id,
track_artist1 = playlist$tracks$items[[i]]$track$artists[[1]]$name,
track_artist1_id = playlist$tracks$items[[i]]$track$artists[[1]]$id,
track_artists_mess = playlist$tracks$items[[i]]$track$artists,
track_album = playlist$tracks$items[[i]]$track$album$name,
track_album_id = playlist$tracks$items[[i]]$track$album$id,
track_added_at = playlist$tracks$items[[i]]$added_at,
playlist_name = playlist$name,
playlist_id = playlist$id,
playlist_owner = playlist$owner$id
)
return(x)
}
## Gets all the tracks info from a playlist, and outputs a dataframe, currently only works on 100 tracks
playlist_tracks <- function(playlist) {
if(is.null(playlist$tracks)) {return(data.frame())}
if(playlist$tracks$total > 0) {
tracks <- seq(1,min(100,playlist$tracks$total)) %>%
map(~tracker(playlist = playlist, track_index = .))
df <- do.call(rbind, tracks)
return(df)}
}
# calls playlist_tracks on every href.
list_of_lists <- hrefs %>%
map(~playlist_tracks(content(GET(url = ., add_headers(Authorization = HeaderValue) ))))
lol <- data.frame(do.call(rbind, list_of_lists))
#Drops track_artist_mess so that it can be written to csv.
lol <- lol %>% mutate(playlist_track_number = as.integer(playlist_track_number),
track_name = as.character(track_name),
track_id = as.character(track_id),
track_artist1 = as.character(track_artist1),
track_artist1_id = as.character(track_artist1_id),
#track_artists_mess = ?
track_album = as.character(track_album),
track_album_id = as.character(track_artist1),
track_added_at = as.character(track_added_at),
playlist_name = as.character(playlist_name),
playlist_id = as.character(playlist_id),
playlist_owner = as.character(playlist_owner))
# lol %>% select(-track_artists_mess) %>% write.csv(paste0('spotifiy_', Sys.Date(),'.csv'))
lol <- lol %>% mutate(track_artist_mess = jsonlite::toJSON(.$track_artists_mess))
# lol %>% select(-track_artists_mess)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment