Skip to content

Instantly share code, notes, and snippets.

@gecko655
Last active June 7, 2021 00:35
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 gecko655/f148c91d4dc3c72c7b167b3ccade3e75 to your computer and use it in GitHub Desktop.
Save gecko655/f148c91d4dc3c72c7b167b3ccade3e75 to your computer and use it in GitHub Desktop.
Spotifyの楽曲データを取得するスクリプト群
workdir=work
token=`./oauth.sh`
for file in `ls $workdir/playlist_*.json`
do
# 雑sedで出力ファイル名を作る
outfile=`echo $file | sed 's/playlist_/audio_features_/'`
ids=`cat ${file} |\
jq -r '.items[].track.id' |\
tr '\n' ',' |\
sed 's/.$//'` # delete ketsu-comma
curl -X "GET"\
"https://api.spotify.com/v1/audio-features?ids=${ids}"\
-H "Accept: application/json"\
-H "Content-Type: application/json"\
-H "Authorization: Bearer ${token}"\
> $outfile
done
workdir=work
playlist_files=`ls $workdir/playlist_*.json`
audio_features_files=`ls $workdir/audio_features_*.json`
tracks=`cat $playlist_files |\
jq -r '.items[].track | [.id,.name,.popularity,.album.name,.artists[0].name,.external_urls.spotify] | @csv'`
audio_features=`cat $audio_features_files |\
jq -r '.audio_features[] | [.id,.acousticness,.danceability,.duration_ms,.energy,.instrumentalness,.key,.liveness,.loudness,.mode,.speechiness,.tempo,.time_signature,.valence] | @csv'`
(
echo 'id,name,popularity,album_name,artists_name,spotify_url,acousticness,danceability,duration_ms,energy,instrumentalness,key,liveness,loudness,mode,speechiness,tempo,time_signature,valence'
csvjoin -c1 <(echo "$tracks") <(echo "$audio_features") |\
csvsort -c3 -r|\
tail +2
) > aikatsu_spotify_audio_features.csv
workdir=work
files=`ls $workdir/playlist_*.json`
(
echo '"曲名","popularity","アルバム名","アーティスト","URL"'
cat $files |\
jq -r '.items[].track | [.name,.popularity,.album.name,.artists[0].name,.external_urls.spotify] | @csv' |\
csvsort -c2 -H -r|\
tail +2
) > aikatsu_spotify_tracks.csv
# ↓の説明をよく読み、base64済みの認証文字列を入れる
# https://developer.spotify.com/documentation/general/guides/authorization-guide/#client-credentials-flow
api_key='xxxxxxxx='
curl -X POST \
-H "Authorization: Basic $api_key"\
-d 'grant_type=client_credentials'\
'https://accounts.spotify.com/api/token'\
| jq -r '.access_token'
playlist='76zJuaAvhgP0WetS5imJ9J'
track_num=758 # 曲数
batch_size=50 # API rate limitがあるので、playlistを1リクエストあたり50曲ずつ取得する
workdir=work
token=`./oauth.sh`
mkdir -p $workdir
for index in `seq 0 $((track_num / batch_size))`
do
offset=$((index * batch_size))
curl -X "GET" \
"https://api.spotify.com/v1/playlists/${playlist}/tracks?limit=$batch_size&offset=${offset}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${token}" \
> $workdir/playlist_${index}.json
done

これはなに

Spotifyの楽曲データ(tracks)及び音楽特徴量(audio-features)を取得するスクリプト群

https://gist.github.com/gecko655/ae50a092215de1977733cddcb90eb157 及び https://gist.github.com/gecko655/ff9efbf404d7fb4a3c40a84f0dc54c2e のデータを取得するのに使用した

1プレイリスト内に含まれるすべての曲の情報を集計できる

依存のインストール

Macなら以下で入るはず

brew install jq csvkit 

使い方

ファイル一式を同一ディレクトリに配置した上で、以下を実行する

# api_keyの設定
vi oauth.sh
# (必要があれば)playlist id及びplaylistに含まれる曲数を手入力する
vi playlist.sh
# プレイリスト情報取得(APIアクセスあり)
./playlist.sh
# 集計
./make_tracks.sh
# 音楽特徴量取得(APIアクセスあり)
./audio_features.sh
# 集計
./make_audio_features.sh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment