はじめに
ID取得とかSpotify APIを使うのに必要なことは既に理解している前提で話していきます。
まだの方はSpotify API をPythonでちょっと遊ぶからどうぞ
あとはノート代わりと自分のモチベ維持のために書いてるのでそんなことわかってるよ!っていう場所もあると思います。
先にもう一つ注意事項としてはこの投稿の数日後にもう一つ同じ内容が投稿されると思うんですけど、そっちの方が簡単&正確なのでその点だけよろしくです
ではスタート
今回の目標
前回のSpotify API から解析情報をとるではSpotifyブラウザ版のURLからアーティストのIDを取ってきてました。それを色々して楽曲のIDをゲットしたんですけど、この方法だとアーティストの上位10位しか取れない&ブラウザ版を立ち上げるのが面倒くさいというデメリットがあったわけです。
今回はこのデメリットを解決するために標準入力でアーティスト名と曲名を入力したらその楽曲の解析情報が得られるようにしようと思います。
例
アーティスト名を入力
ゆず
曲名を入力
夏色
流れ
今回の実装に関して大まかな流れを整理しておこうと思います。
・標準入力でアーティスト名、曲名を入力
・いつも通り認証を完了させる
・sp.search(art_name,type='artist')
でアーティスト名からアーティストidを取得
・sp.artist_albums(art_id,limit=50,album_type='album')
でそのアーティストのアルバムidを最大50個取得
・sp.album_tracks(alb_id, limit=50)["items"]
でアルバムの中のtrackの名前とidを取得
・入力している曲名と同じtrackの名前のidをsp.audio_features(track['id'])
に入れて解析情報を取得する
という流れです。
コード解説
全体としてはこんな感じです。
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import pprint
import spotify_id as si
flag = True
print('アーティスト名を入力')
art_name = input()
print('曲名を入力')
tra_name = input()
client_id = si.id()
client_secret = si.secret()
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
art_search = sp.search(art_name,type='artist')
#アーティスト名でsp.search
art_id = art_search['artists']['items'][0]['id']
#辞書型で渡されるので、その中のidを参照(同名アーティストがいたらまずい)
art_alb = sp.artist_albums(art_id, limit=50,album_type='album')
#アーティストidでアルバムを検索
alb_ids = [alb['id'] for alb in art_alb['items']]
#alb_idsにアルバムのIDが最大50個格納されてる
tra_id_name = [{}]
for alb_id in alb_ids:
tracks = sp.album_tracks(alb_id, limit=50)["items"]
for track_num,track in enumerate(tracks):
dict = {'name':track["name"],'id':track["id"]}
if track["name"] == tra_name and flag:
result = sp.audio_features(track['id'])
pprint.pprint('name : ' +track['name'])
pprint.pprint(result)
flag = False
tra_id_name.append(dict)
#pprint.pprint(tra_id_name)
大体流れで解説した通りだと思いますが、tra_id_name
に各trackのidとnameを格納している感じです。どこを解説すればいいかわからない...
実行
では、実際にプログラムを動かすとどんな感じか例として最近ハマっているポルノグラフィティのIN THE DARKで試してみましょう!
入力
実行するとこんな感じでアーティスト名と曲名を入力するように促されるので各自で何か入れてみてください
アーティスト名を入力
ポルノグラフィティ
曲名を入力
IN THE DARK
結果
実行するとこんな感じで楽曲の情報が取れます。各パラメータは公式リファレンス参照!
'name : IN THE DARK'
[{'acousticness': 0.157,
'analysis_url': 'https://api.spotify.com/v1/audio-analysis/68B4qD5v8FJH1ePHVGlXfh',
'danceability': 0.703,
'duration_ms': 240067,
'energy': 0.677,
'id': '68B4qD5v8FJH1ePHVGlXfh',
'instrumentalness': 0,
'key': 9,
'liveness': 0.37,
'loudness': -6.283,
'mode': 1,
'speechiness': 0.026,
'tempo': 126.929,
'time_signature': 4,
'track_href': 'https://api.spotify.com/v1/tracks/68B4qD5v8FJH1ePHVGlXfh',
'type': 'audio_features',
'uri': 'spotify:track:68B4qD5v8FJH1ePHVGlXfh',
'valence': 0.811}]
ちなみに...
tra_id_nameにはこんな感じに各trackのidとnameが入ってます。なんかに使えそうだな...(長いので割愛してます。)
[{'id': '0ZQude8e9EUvYCqG2rFOYn', 'name': '暁'},
{'id': '0Ur3iSK9yoVGbHIDlmMAQS', 'name': 'カメレオン・レンズ'},
.
.
.
{'id': '1Z9zeVwFd1xPrnI6GwVtbm', 'name': 'メリッサ'},
{'id': '1FZOlEctd9can31RgckDxf', 'name': 'まほろば○△'}]
改善点
1.同名アーティストがいたときにうまく判別できないこと
sp.search(art_name,type='artist')
ここで違うアーティストを参照したら終わりです。
2.アルバム、trackの取得数が最大で50なのでいっぱい曲やアルバムがあると全部データを調べられない...
sp.artist_albums(art_id,limit=50,album_type='album')
sp.album_tracks(alb_id, limit=50)["items"]
3.同じ曲名でもバージョンが違うことがある
この辺が改善点なので意識しながら進めていきます。
参考
Python:Spotify Web API であるアーティストの全てのアルバムの全楽曲情報を取得する
Spotify API公式リファレンス
Spotipy リファレンス