start_time = time.time() # データ取得時間を計測
# 全albumのデータを取得
results = spotify.artist_albums(id, limit=50) # album_type指定を省略
album_datas = results['items']
while results['next']:
results = spotify.next(results)
album_datas.extend(results[('items')])
print('全album数:', len(album_datas))
# 対象artistの名前
target_artist_name = spotify.artist(id)['name']
# 楽曲名をkeyにして、album_idと人気度を格納するdict
trackname_datas_dic = {} #{'track_name': '...',[{'popularity':..., 'album_id:', '....'},{}...]}
# album_dataを、album_idをkeyにして格納するためのdict
albumid_data_dic = {}
for a_data in album_datas:
album_id = a_data['id']
# albumデータを格納
albumid_data_dic[album_id] = a_data
tracks_data = spotify.album_tracks(album_id)
# 各track情報を取得
for t_item in tracks_data['items']:
# 各trackのartist_idを全て取る
artist_ids = []
for artist in t_item['artists']:
artist_ids.append(artist['id'])
# 対象artistのidがなければスキップ
if id not in artist_ids:
continue
# 楽曲名
track_name = t_item['name']
# 複数名義の場合は、artist名を取得し、楽曲名に付加
if len(artist_ids) > 1:
artist_names = []
for a_id in artist_ids:
if a_id == id:
artist_names.append(target_artist_name)
else:
artist_names.append(spotify.artist(a_id)['name'])
track_name += str(artist_names)
# trackデータから人気度を取得
track_id = t_item['id']
t_data = spotify.track(track_id)
popularity = t_data['popularity']
# 楽曲名のalbumごとデータを作成
data_dict = {'popularity': popularity, 'album_id': album_id }
if track_name in trackname_datas_dic:
trackname_datas_dic[track_name].append(data_dict)
else:
trackname_datas_dic[track_name] = [data_dict]
print('全楽曲数:', len(trackname_datas_dic))
# 楽曲の人気順にソート
# まず楽曲の収録盤ごとデータのlistを楽曲人気順に並び替え
for v in trackname_datas_dic.values():
if len(v) > 1:
v.sort(key=lambda x:x['popularity'], reverse=True)
# 楽曲名データを最大人気順にソート
trackname_datas_dic = dict(sorted(trackname_datas_dic.items(),
key=lambda x:x[1][0]['popularity'],
reverse=True))
# csv出力用のデータ格納
output_diclist = []
for k, v in trackname_datas_dic.items():
track_name = k
popularity = v[0]['popularity']
output_dic = {}
output_dic['track_name'] = track_name
output_dic['popularity'] = popularity
album_names = [] # trackの収録盤名を格納するlist
for datas in v:
album_id = datas['album_id']
album_data = albumid_data_dic[album_id]
# 各アルバムの種類を取得し、付加文字列を作成
a_group = album_data['album_group']
a_type = album_data['album_type']
a_grouptype_str = ''
if a_group == 'appears_on':
a_grouptype_str = '参加'
elif a_group == 'compilation':
a_gt_a_grouptype_strstr = 'コンピ'
if a_type == 'single':
a_grouptype_str += 'シングル'
elif a_type == 'album':
a_grouptype_str += 'アルバム'
elif a_type == 'compilation':
if a_group == 'compilation':
a_grouptype_str = 'コンピレーション'
else:
a_grouptype_str += 'コンピ'
# アルバムタイトル
album_name = album_data['name']
# csv出力用のアルバム文字列(例:参加コンピ「Spring Songs」)
album_str = a_grouptype_str + '「' + album_name + '」'
album_names.append(album_str)
# アルバムタイトル情報を改行付き文字列に変換
album_titles_str = '\n'.join(album_names)
# 出力用dictにアルバムタイトル情報を付加
output_dic['album_titles'] = album_titles_str
output_diclist.append(output_dic)
# csv出力
filename = '3E5NLQpQbd0eJ18XO9zC0h_all_track.csv'
with open(filename, 'w', encoding='utf8', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['track_name', 'popularity', 'album_titles'],
quoting=csv.QUOTE_NONNUMERIC)
writer.writerow({'track_name': '曲名', 'popularity': '人気', 'album_titles': '収録盤'})
writer.writerows(output_diclist)
print('elapsed sec:', time.time() - start_time, '秒')