Spaces:
Sleeping
Sleeping
# { | |
# # load packages | |
# suppressPackageStartupMessages(library(dplyr)) | |
# suppressPackageStartupMessages(library(spotifyr)) | |
# | |
# # Set up environment | |
# client_ID <- "bc0b388b3801497f8162615befb50a43" | |
# client_secret <- "512e20aa79ff4a228cc4e95ab46a45fd" | |
# | |
# Sys.setenv(SPOTIFY_CLIENT_ID = client_ID) | |
# Sys.setenv(SPOTIFY_CLIENT_SECRET = client_secret) | |
# | |
# access_token <- get_spotify_access_token() | |
# } | |
get_artists_collaborators <- function(spotify_artist_id) { | |
# related artists nodes function | |
get_Nodes <- function(artist_id) { | |
# get artists related to main artist | |
related_artists <- get_related_artists( | |
id = artist_id, | |
include_meta_info = TRUE | |
) | |
# get other artists that are related to the | |
# artists that are related to the main artist | |
other_related <- c() | |
for (i in 1:nrow(related_artists$artists)) { | |
result <- get_related_artists( | |
id = related_artists$artists[["id"]][i], | |
include_meta_info = TRUE | |
) | |
other_related <- append(other_related, result) | |
} | |
images <- c() | |
for (i in other_related) { # this loops through the list | |
for (k in 1:nrow(i)) { # this loops through each table in list | |
image_urls <- i$images[[k]]$url[2] # the third image is collected per row in each table | |
images <- append(images, image_urls) | |
} | |
} | |
genre <- c() | |
for (i in (other_related)) { # this loops through each list | |
for (j in 1:nrow(i)) { # this loops through each table in list | |
result <- i$genres[[j]][2] # this collects the 2nd item in the vector of genres | |
genre <- append(genre, result) | |
} | |
} | |
nodes <- data.frame( | |
name = tolower(c( | |
other_related[[1]]$name, | |
other_related[[2]]$name, | |
other_related[[3]]$name, | |
other_related[[4]]$name, | |
other_related[[5]]$name, | |
other_related[[6]]$name, | |
other_related[[7]]$name, | |
other_related[[8]]$name, | |
other_related[[9]]$name, | |
other_related[[10]]$name, | |
other_related[[11]]$name, | |
other_related[[12]]$name, | |
other_related[[13]]$name, | |
other_related[[14]]$name, | |
other_related[[15]]$name, | |
other_related[[16]]$name, | |
other_related[[17]]$name, | |
other_related[[18]]$name, | |
other_related[[19]]$name, | |
other_related[[20]]$name | |
)), | |
id = c(c( | |
other_related[[1]]$id, | |
other_related[[2]]$id, | |
other_related[[3]]$id, | |
other_related[[4]]$id, | |
other_related[[5]]$id, | |
other_related[[6]]$id, | |
other_related[[7]]$id, | |
other_related[[8]]$id, | |
other_related[[9]]$id, | |
other_related[[10]]$id, | |
other_related[[11]]$id, | |
other_related[[12]]$id, | |
other_related[[13]]$id, | |
other_related[[14]]$id, | |
other_related[[15]]$id, | |
other_related[[16]]$id, | |
other_related[[17]]$id, | |
other_related[[18]]$id, | |
other_related[[19]]$id, | |
other_related[[20]]$id | |
)), | |
popularity = c(c( | |
other_related[[1]]$popularity, | |
other_related[[2]]$popularity, | |
other_related[[3]]$popularity, | |
other_related[[4]]$popularity, | |
other_related[[5]]$popularity, | |
other_related[[6]]$popularity, | |
other_related[[7]]$popularity, | |
other_related[[8]]$popularity, | |
other_related[[9]]$popularity, | |
other_related[[10]]$popularity, | |
other_related[[11]]$popularity, | |
other_related[[12]]$popularity, | |
other_related[[13]]$popularity, | |
other_related[[14]]$popularity, | |
other_related[[15]]$popularity, | |
other_related[[16]]$popularity, | |
other_related[[17]]$popularity, | |
other_related[[18]]$popularity, | |
other_related[[19]]$popularity, | |
other_related[[20]]$popularity | |
)), | |
followers = c(c( | |
other_related[[1]]$followers.total, | |
other_related[[2]]$followers.total, | |
other_related[[3]]$followers.total, | |
other_related[[4]]$followers.total, | |
other_related[[5]]$followers.total, | |
other_related[[6]]$followers.total, | |
other_related[[7]]$followers.total, | |
other_related[[8]]$followers.total, | |
other_related[[9]]$followers.total, | |
other_related[[10]]$followers.total, | |
other_related[[11]]$followers.total, | |
other_related[[12]]$followers.total, | |
other_related[[13]]$followers.total, | |
other_related[[14]]$followers.total, | |
other_related[[15]]$followers.total, | |
other_related[[16]]$followers.total, | |
other_related[[17]]$followers.total, | |
other_related[[18]]$followers.total, | |
other_related[[19]]$followers.total, | |
other_related[[20]]$followers.total | |
)), | |
profile = c(c( | |
other_related[[1]]$external_urls.spotify, | |
other_related[[2]]$external_urls.spotify, | |
other_related[[3]]$external_urls.spotify, | |
other_related[[4]]$external_urls.spotify, | |
other_related[[5]]$external_urls.spotify, | |
other_related[[6]]$external_urls.spotify, | |
other_related[[7]]$external_urls.spotify, | |
other_related[[8]]$external_urls.spotify, | |
other_related[[9]]$external_urls.spotify, | |
other_related[[10]]$external_urls.spotify, | |
other_related[[11]]$external_urls.spotify, | |
other_related[[12]]$external_urls.spotify, | |
other_related[[13]]$external_urls.spotify, | |
other_related[[14]]$external_urls.spotify, | |
other_related[[15]]$external_urls.spotify, | |
other_related[[16]]$external_urls.spotify, | |
other_related[[17]]$external_urls.spotify, | |
other_related[[18]]$external_urls.spotify, | |
other_related[[19]]$external_urls.spotify, | |
other_related[[20]]$external_urls.spotify | |
)), | |
images = images, | |
genre = genre | |
) | |
## Remove duplicate nodes and labels in data frame | |
nodes_df <- distinct(nodes, name, id, popularity, profile, | |
images, genre, followers, | |
.keep_all = T | |
) | |
return(nodes_df) | |
} | |
# get related artists nodes | |
related_artists <- get_Nodes(artist_id = spotify_artist_id) | |
# get related artists data | |
artist_related_artists <- function(related_artist) { | |
related_artists_data <- list() | |
for (i in 1:nrow(related_artist)) { | |
# Get the artist ID from the second column of related_artists | |
artist_id <- related_artist[[2]][i] | |
# Retrieve the artist's albums using the artist ID | |
result <- get_artist_albums(artist_id, limit = 50) | |
# Create a data frame from the result | |
related_artists_albums <- data.frame(result) | |
# Add the data frame to the list | |
related_artists_data[[i]] <- related_artists_albums | |
} | |
return(related_artists_data) | |
} | |
related_artists_data <- artist_related_artists(related_artist = related_artists) | |
# get the artists collaborators | |
get_collaborators <- function(data, artist_name) { | |
artists <- c() # initialize empty vector | |
# outer loop loops through the length of artists list | |
for (i in 1:length(data$artists)) { | |
# inner loop loops through the length of individual | |
# "name" column in artists list | |
for (j in 1:length(data$artists[[i]][3][, ])) { | |
# scrapes the artist names | |
result <- data$artists[[i]][3][j, ] | |
# appends the names to "artists" vector | |
artists <- append(artists, result) | |
} | |
} | |
artists <- unique(artists) # removes duplicate names | |
artists <- tolower(artists) # turns to lowercase | |
# turns the search artist's name to NA | |
artists <- gsub(tolower(artist_name), NA, artists) | |
artists <- na.omit(artists) # remove NA from vector | |
return(artists) | |
} | |
# function that gets the collaborators data | |
collab_df <- function(related_artists_data, artist_data) { | |
collaborators <- c() | |
artists_list <- c() | |
for (i in 1:length(related_artists_data)) { | |
result <- get_collaborators(related_artists_data[[i]], | |
artist_name = artist_data[[1]][i] | |
) | |
collaborators <- c(collaborators, result) | |
artists_list <- c(artists_list, rep(artist_data[[1]][i], times = length(result))) | |
} | |
artists_collaborators <- data.frame(artists = artists_list, collaborators = collaborators) | |
return(artists_collaborators) | |
} | |
# application of the function | |
collabs <- collab_df( | |
related_artists_data = related_artists_data, | |
artist_data = related_artists | |
) | |
# get attribute data for each collaborator | |
attribute_data <- list() | |
for (i in 1:nrow(collabs)) { | |
attribute_data[[i]] <- search_spotify(collabs$collaborators[[i]], | |
type = "artist", | |
include_meta_info = T | |
) | |
} | |
# collect attributes of collaborators | |
{ | |
name <- c() | |
id <- c() | |
popularity <- c() | |
followers <- c() | |
profile <- c() | |
images <- c() | |
genre <- c() | |
for (i in 1:length(attribute_data)) { | |
name <- c(name, attribute_data[[i]][[1]][[2]][5][[1]][1]) | |
id <- c(id, attribute_data[[i]][[1]][[2]][3][[1]][1]) | |
popularity <- c(popularity, attribute_data[[i]][[1]][[2]][6][[1]][1]) | |
followers <- c(followers, attribute_data[[i]][[1]][[2]][11][[1]][1]) | |
profile <- c(profile, attribute_data[[i]][[1]][[2]][9][[1]][1]) | |
images <- c(images, attribute_data[[i]][[1]][[2]][4][[1]][1]) | |
genre <- c(genre, attribute_data[[i]][[1]][[2]][1][[1]][1]) | |
} | |
} | |
# loop through images list and store converted | |
# data frames in a list | |
images_df_list <- list() | |
for (i in 1:length(images)) { | |
images_df_list[[i]] <- list2DF(images[[i]]) | |
} | |
# loop through the list of data frames & extract | |
# the image urls | |
images_vec <- c() | |
for (i in 1:length(images_df_list)) { | |
images_vec <- c(images_vec, images_df_list[[i]]$url[[1]][1]) | |
} | |
len_diff_img <- name |> | |
length() - images_vec |> | |
length() | |
# add a repetition of the last 6 urls to the vector | |
# so that its length is equal to the length of other | |
# attribute vectors | |
images_vec <- c( | |
images_vec, | |
rep(images_vec[tail(length(images_vec))], times = len_diff_img) | |
) | |
# get genre data | |
genre_vec <- c() | |
for (i in 1:length(genre)) { | |
genre_vec <- c(genre_vec, genre[[i]][1]) | |
} | |
music_genres <- c() | |
for (m in 1:length(genre_vec)) { | |
music_genres <- c(music_genres, genre_vec[[m]]) | |
} | |
len_diff_gnr <- name |> | |
length() - music_genres |> | |
length() | |
music_genres <- c( | |
music_genres, | |
rep(music_genres[tail(length(music_genres))], times = len_diff_gnr) | |
) | |
# create collaborators data frame | |
collaborators_df <- data.frame( | |
name = name, | |
id = id, | |
popularity = popularity, | |
followers = followers, | |
profile = profile, | |
images = images_vec, | |
genre = music_genres | |
) | |
# filter out 2Pac | |
collaborators_df <- collaborators_df |> | |
filter(name != "2Pac") | |
# rename columns in collabs | |
colnames(collabs) <- c("Vertex1", "Vertex2") | |
# grab Vertex1 attributes | |
popularity <- c() | |
for (i in 1:nrow(collabs)) { | |
result <- filter( | |
related_artists, | |
related_artists$name == collabs$Vertex1[[i]][1] | |
)[[3]] | |
popularity <- c(popularity, result) | |
} | |
followers <- c() | |
for (i in 1:nrow(collabs)) { | |
result <- filter( | |
related_artists, | |
related_artists$name == collabs$Vertex1[[i]][1] | |
)[[4]] | |
followers <- c(followers, result) | |
} | |
profile <- c() | |
for (i in 1:nrow(collabs)) { | |
result <- filter( | |
related_artists, | |
related_artists$name == collabs$Vertex1[[i]][1] | |
)[[5]] | |
profile <- c(profile, result) | |
} | |
images <- c() | |
for (i in 1:nrow(collabs)) { | |
result <- filter( | |
related_artists, | |
related_artists$name == collabs$Vertex1[[i]][1] | |
)[[6]] | |
images <- c(images, result) | |
} | |
genre <- c() | |
for (i in 1:nrow(collabs)) { | |
result <- filter( | |
related_artists, | |
related_artists$name == collabs$Vertex1[[i]][1] | |
)[[7]] | |
genre <- c(genre, result) | |
} | |
# convert "names" in collaborators_df to lowercase | |
collaborators_df$name <- tolower(collaborators_df$name) | |
# filter out "various artists" from collabs | |
collabs <- collabs |> | |
filter(Vertex2 != "various artists") | |
# check if name in Vertex2 is an English character | |
ascii_check <- c() | |
for (i in 1:nrow(collabs)) { | |
ascii_check <- c(ascii_check, collabs$Vertex2[[i]][1] |> stringi::stri_enc_isascii()) | |
} | |
# append check result to collabs dataframe | |
collabs$ASCII <- ascii_check | |
# filter out non-English characters | |
collabs <- collabs |> | |
filter(ASCII != FALSE) | |
# delete ASCII column | |
collabs$ASCII <- NULL | |
# delete rows from Vertex1 attributes to equal | |
# collabs rows | |
popularity <- popularity[-c(1 + length(popularity):nrow(collabs))] | |
followers <- followers[-c(1 + length(followers):nrow(collabs))] | |
profile <- profile[-c(1 + length(profile):nrow(collabs))] | |
images <- images[-c(1 + length(images):nrow(collabs))] | |
genre <- genre[-c(1 + length(genre):nrow(collabs))] | |
# grab Vertex2 attributes | |
popularityB <- c() | |
for (i in 1:nrow(collabs)) { | |
result <- filter( | |
collaborators_df, | |
collaborators_df$name == collabs$Vertex2[[i]][1] | |
)[[3]] | |
popularityB <- c(popularityB, result) | |
} | |
followersB <- c() | |
for (i in 1:nrow(collabs)) { | |
result <- filter( | |
collaborators_df, | |
collaborators_df$name == collabs$Vertex2[[i]][1] | |
)[[4]] | |
followersB <- c(followersB, result) | |
} | |
profileB <- c() | |
for (i in 1:nrow(collabs)) { | |
result <- filter( | |
collaborators_df, | |
collaborators_df$name == collabs$Vertex2[[i]][1] | |
)[[5]] | |
profileB <- c(profileB, result) | |
} | |
imagesB <- c() | |
for (i in 1:nrow(collabs)) { | |
result <- filter( | |
collaborators_df, | |
collaborators_df$name == collabs$Vertex2[[i]][1] | |
)[[6]] | |
imagesB <- c(imagesB, result) | |
} | |
genreB <- c() | |
for (i in 1:nrow(collabs)) { | |
result <- filter( | |
collaborators_df, | |
collaborators_df$name == collabs$Vertex2[[i]][1] | |
)[[7]] | |
genreB <- c(genreB, result) | |
} | |
# delete rows from Vertex2 attributes to equal | |
# collabs rows | |
popularityB <- popularityB[-c(1 + length(popularityB):nrow(collabs))] | |
followersB <- followersB[-c(1 + length(followersB):nrow(collabs))] | |
profileB <- profileB[-c(1 + length(profileB):nrow(collabs))] | |
imagesB <- imagesB[-c(1 + length(imagesB):nrow(collabs))] | |
genreB <- genreB[-c(1 + length(genreB):nrow(collabs))] | |
# create flat file of collaborators | |
{ | |
collabs$`Vertex1 popularity` <- popularity | |
collabs$`Vertex1 followers` <- followers | |
collabs$`Vertex1 profile` <- profile | |
collabs$`Vertex1 images` <- images | |
collabs$`Vertex1 genre` <- genre | |
collabs$`Vertex2 popularity` <- popularityB | |
collabs$`Vertex2 followers` <- followersB | |
collabs$`Vertex2 profile` <- profileB | |
collabs$`Vertex2 images` <- imagesB | |
collabs$`Vertex2 genre` <- genreB | |
} | |
return(collabs) | |
} | |
# test | |
# tictoc::tic() | |
# steve_wonder_collab_network <- get_artists_collaborators(spotify_artist_id = "7guDJrEfX3qb6FEbdPA5qi") | |
# tictoc::toc() | |
# | |
# | |
# steve_wonder_collab_network |> View() | |
# | |
# tictoc::tic() | |
# billie_eilish_collab_network <- get_artists_collaborators(spotify_artist_id = "6qqNVTkY8uBg9cP3Jd7DAH") | |
# tictoc::toc() | |
# | |
# billie_eilish_collab_network |> View() | |
# write.csv(billie_eilish_collab_network,file = "billie_eilish_collab_network.csv") | |
# | |
# tictoc::tic() | |
# madonna_collab_network <- get_artists_collaborators(spotify_artist_id = "6tbjWDEIzxoDsBA1FuhfPW") | |
# tictoc::toc() | |
# | |
# madonna_collab_network |> View() | |
# | |
# tictoc::tic() | |
# diana_ross_collab_network <- get_artists_collaborators(spotify_artist_id = "3MdG05syQeRYPPcClLaUGl") | |
# tictoc::toc() | |
# | |