forked from charlie86/spotifyr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreadme.Rmd
146 lines (110 loc) · 6.14 KB
/
readme.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
---
output: github_document
---
<!-- README.md is generated from README.Rmd. Please edit that file -->
# spotifyr
[](https://cran.r-project.org/package=spotifyr)

```{r, echo = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
fig.path = "man/figures/README-"
)
```
## Overview
spotifyr is a wrapper for pulling track audio features and other information from Spotify's Web API in bulk. By automatically batching API requests, it allows you to enter an artist's name and retrieve their entire discography in seconds, along with Spotify's audio features and track/album popularity metrics. You can also pull song and playlist information for a given Spotify User (including yourself!).
## Installation
Development version (recommended)
```r
devtools::install_github('charlie86/spotifyr')
```
The development version now imports the `geniusR` package from [Josiah Parry](https://github.com/JosiahParry/geniusR), which you can install with:
```r
devtools::install_github('JosiahParry/geniusR')
```
(Note that this is separate from the `geniusr` package currently on CRAN)
CRAN version 1.0.0 (Note: this is somewhat outdated, as it takes extra time to submit and pass CRAN checks)
```r
install.packages('spotifyr')
```
## Authenication
First, set up a Dev account with Spotify to access their Web API [here](https://developer.spotify.com/my-applications/#!/applications). This will give you your `Client ID` and `Client Secret`. Once you have those, you can pull your access token into R with `get_spotify_access_token`.
The easiest way to authenticate is to set your credentials to the System Environment variables `SPOTIFY_CLIENT_ID` and `SPOTIFY_CLIENT_SECRET`. The default arguments to `get_spotify_access_token` (and all other functions in this package) will refer to those. Alternatively, you can set them manually and make sure to explicitly refer to your access token in each subsequent function call.
```{r, eval = FALSE}
Sys.setenv(SPOTIFY_CLIENT_ID = 'xxxxxxxxxxxxxxxxxxxxx')
Sys.setenv(SPOTIFY_CLIENT_SECRET = 'xxxxxxxxxxxxxxxxxxxxx')
access_token <- get_spotify_access_token()
```
## Usage
### What was The Beatles' favorite key?
```{r load_packages, message = F, warning = F}
library(spotifyr)
```
```{r, message = FALSE, warning = FALSE}
beatles <- get_artist_audio_features('the beatles')
library(tidyverse)
count(beatles, key_mode, sort = T)
```
### What's the most joyful Joy Division song?
My favorite audio feature has to be "valence," a measure of musical positivity.
```{r}
joy <- get_artist_audio_features('joy division')
joy %>%
arrange(-valence) %>%
select(track_name, valence) %>%
head(10)
```
Now if only there was some way to plot joy...
### Joyplot of the emotional rollercoasters that are Joy Division's albums
```{r}
library(ggjoy)
ggplot(joy, aes(x = valence, y = album_name)) +
geom_joy() +
theme_joy() +
ggtitle("Joyplot of Joy Division's joy distributions", subtitle = paste0("Based on valence pulled from Spotify's Web API with spotifyr"))
```
### Danceability of Thom Yorke
```{r, message = FALSE}
library(magick)
library(lubridate)
tots <- map_df(c('radiohead', 'thom yorke', 'atoms for peace'), get_artist_audio_features)
non_studio_albums <- c('OK Computer OKNOTOK 1997 2017', 'TKOL RMX 1234567', 'In Rainbows Disk 2',
'Com Lag: 2+2=5', 'I Might Be Wrong', 'The Eraser Rmxs')
tots <- filter(tots, !album_name %in% non_studio_albums)
album_names_label <- tots %>%
arrange(album_release_date) %>%
mutate(label = str_glue('{album_name} ({year(album_release_year)})')) %>%
pull(label) %>%
unique
plot_df <- tots %>%
select(track_name, album_name, danceability, album_release_date) %>%
gather(metric, value, -c(track_name, album_name, album_release_date))
p <- ggplot(plot_df, aes(x = value, y = album_release_date)) +
geom_density_ridges(size = .1) +
theme_ridges(center_axis_labels = TRUE, grid = FALSE, font_size = 6) +
theme(plot.title = element_text(face = 'bold', size = 14, hjust = 1.25),
plot.subtitle = element_text(size = 10, hjust = 1.1)) +
ggtitle('Have we reached peak Thom Yorke danceability?', 'Song danceability by album - Radiohead, Thom Yorke, and Atoms for Peace') +
labs(x = 'Song danceability', y = '') +
scale_x_continuous(breaks = c(0,.25,.5,.75,1)) +
scale_y_discrete(labels = album_names_label)
ggsave(p, filename = 'img/danceplot.png', width = 5, height = 3)
background <- image_read('img/danceplot.png')
logo_raw <- image_read('img/thom_dance.gif')
frames <- lapply(1:length(logo_raw), function(frame) {
hjust <- 200+(100*frame)
image_composite(background, logo_raw[frame], offset = str_glue('+{hjust}+400'))
})
image_animate(image_join(frames), fps = 5, loop = 0)
```
## Sentify: A Shiny app
This [app](http://rcharlie.net/sentify/), powered by spotifyr, allows you to visualize the energy and valence (musical positivity) of all of Spotify's artists and playlists.
## Dope stuff other people have done with spotifyr
The coolest thing about making this package has definitely been seeing all the awesome stuff other people have done with it. Here are a few examples:
[Sentiment analysis of musical taste: a cross-European comparison](http://paulelvers.com/post/emotionsineuropeanmusic/) - Paul Elvers
[Blue Christmas: A data-driven search for the most depressing Christmas song](https://caitlinhudon.com/2017/12/22/blue-christmas/) - Caitlin Hudon
[KendRick LamaR](https://davidklaing.github.io/kendrick-lamar-data-science/) - David K. Laing
[Vilken är Kents mest deprimerande låt? (What is Kent's most depressing song?)](http://dataland.rbind.io/2017/11/07/vilken-%C3%A4r-kents-mest-deprimerande-lat/) - Filip Wästberg
[Чёрное зеркало Arcade Fire (Black Mirror Arcade Fire)](http://thesociety.ru/arcadefire) - TheSociety
[Sente-se triste quando ouve "Amar pelos dois"? Não é o único (Do you feel sad when you hear "Love for both?" You're not alone)](http://rr.sapo.pt/especial/112355/sente-se-triste-quando-ouve-amar-pelos-dois-nao-e-o-unico) - Rui Barros, Renascença