Created
January 6, 2019 15:45
-
-
Save a-lexwein/19e1497001e07b6cada32a3c81e30a8a to your computer and use it in GitHub Desktop.
using httr to get spotify track data
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## 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