14
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spotify APIで今週リリースの新譜プレイリストを作る

Last updated at Posted at 2023-12-23

この記事はWano Group Advent Calendar 2023の24日目の記事となります。

1つ前の記事は@nijigen_plotさんの
「Lambda コンテナイメージを使ってSlackのグラフ貼り付けBOTを作る」です。
また、私の所属するグループ会社のEDOCODEのAdvent Calendarもありますので、
よろしければそちらもどうぞ。

はじめに

2023年11月にWanoにジョインいたしました@tutti618と申します。
昔から好きだった音楽と新卒から続けているエンジニアの仕事がマリアージュする!
と意気揚々でしたが

3年半の温室フルリモートワークですっかりもやしっ子になっていたため
入社5日目早々にインフルでダウン🤧

入社早々2日連続、退勤後にライブではしゃいだせいかもしれませんが

そこでインフル罹患のため参加できなかった開発合宿で実装予定だった
Spotify API利用の個人開発について記事にしました。

きっかけ

クイズ

突然ですが、水曜日と金曜日は何の日でしょうか?






正解は…






とても楽しみな 新譜の発売日 です!

水曜日は主に邦楽のアルバムが、
金曜日は主に洋楽のアルバムが発売されます。

新譜チェックの仕方

その筋の有識者の𝕏(旧Twitter)や
ブログに掲載されている、新譜を発売するArtistリストをコピペ

コピペしたArtistをサブスクサービスで検索

ヒットしたAlbumのうち、発売日が最新のAlbumをクリック

Track1を再生

という手作業をArtistの数分繰り返しています。これは面倒…😔

ということでArtistリストから今週リリースAlbumの
Track1だけを集めたPlayListを作ります。

実装

事前準備

Spotify Premium会員になる

無料会員でもAPI操作が可能かは試していません。

Pyhton環境

手元の環境は

  • Mac Ventura 13.6.1
  • Python 3.12.0
  • pip 23.2.1

Spotipy(Spotify API)インストール

Spotify APIをPythonから利用するためのライブラリです。


pip install spotipy

Spotify Developer

Spotifyにログイン後、Spotify DeveloperからCreate appします。

今回はローカルで動かすのみですので
Redirect URIはhttp://localhost:8888/callbackで問題ありません。

Spotifyアカウント情報

下記コードのXXX部分にはSpotifyアカウント情報を記載します。
そのままコード公開するとセキュリティNGのため、実際は環境変数にしておくとよいですね。

create_playlist.py

#Spotify APIの認証部分 username, my_id, my_secret は人によって異なる
username = 'XXX' 
my_id ='XXX' 
my_secret = 'XXX' 
redirect_uri = 'http://localhost:8888/callback' 
scope = 'user-library-read user-read-playback-state playlist-read-private user-read-recently-played playlist-read-collaborative playlist-modify-public playlist-modify-private'
token = util.prompt_for_user_token(username, scope, my_id, my_secret, redirect_uri)
spotify = spotipy.Spotify(auth = token)

トークンとシークレットは先程のSpotify Developerからコピーできます。
Screenshot at Dec 09 10-18-02.png

ユーザー名はSpotifyのアカウントページより
Spotifyアカウント.png

「プロフィールを編集」の「ユーザー名」を確認
Spotifyユーザー名.png

「プロフィール」の下に表示されているユーザIDは、今回は使用しません。
Spotifyプロフィール.png

フォローさせていただいている方の𝕏(旧Twitter)ポストからArtistリストをコピーし、

テキストファイルにペースト、「Artistリスト」としてディレクトリ直下に配置します。
2023/06/02はフジロックで圧巻のライブだったフーファイと、
先日も来日してくれたギャラガ兄の新譜が同時発売ということでアツいです。
個人的には超人Louis Cole率いるKNOWERもオススメです。

230602.txt

Foo Fighters
Noel Gallagher's High Flying Birds
Bob Dylan
Beach Fossils

KNOWER
Speakers Corner Quartet
WITCH

Anthony Naples
MUN SING(Giant Swan)
Juan Wauters

Bully
Ans M
Metro Boomin(OST)

作成処理

空のプレイリストを作成

create_playlist.py

def main():

    playlists = spotify.user_playlist_create(username, '230603New')

Artistリストを1行ずつ読み取り

create_playlist.py

    f = open('230603.txt', 'r')
    datalist = f.readlines()

    for name in datalist:
        if name == '\n':
            continue
        #括弧より前までをArtist名とする
        idx = name.find('(')
        name = name[:idx]

Search for ItemでArtist名からArtistのIDを取得

create_playlist.py

        search_result = spotify.search(q=name, limit=10, offset=0, type='artist', market=None)
        artist_Id = search_result['artists']['items'][0]['id']

Get Artist's AlbumsでArtistのIDからAlbumリストを取得

🍙Spotify APIでは残念ながらparameterでsortを指定することができません。
そのため取得したAlbumリストをrelease_date降順に自力で並べ替えます。

create_playlist.py

        # artist_idからalbumデータを取得
        album_results = spotify.artist_albums(artist_Id, limit=50, album_type='album')
        album_datas = album_results['items']
        while album_results['next']:
            album_results = spotify.next(album_results)
            album_datas.extend(album_results['items'])
        
        # 発売日の降順にソート
        album_sorted = sorted(album_datas, key=lambda x:x['release_date'], reverse=True)

並べ替えたAlbumリストの1番目(最新のAlbum)のSpotify IDを取得し
Get Album TracksでTrackリストを取得

create_playlist.py

        # album_idからalbumのtrackデータを取得
        tracks = []
        album_tracks = spotify.album_tracks(album_sorted[0]['id'])

        for track in album_tracks['items']:
            tracks.append(track['id'])

取得したTrackリストの1番目のSpotify IDを取得し
先程作成したプレイリストに追加

1曲目だけで判断するなんて最近の若者は😠の場合は、お好みで曲数を増減しましょう。
ライブラリspotipyでは3つ目のparameterは配列の必要があります。

create_playlist.py

        # trackデータの1曲目をプレイリストに追加
        results = spotify.user_playlist_add_tracks(username, playlists['id'], [tracks[0]])

以上をArtistリストの行数分繰り返し、python create_playlist.pyを実行
無事今週リリースの新譜プレイリストが作成できました。

20230603New.png

問題点

  • 同名Artistの別情報を引っ張ってきてしまうことがある
    →必要に応じてGet ArtistのReturnであるgenresなどをチェックすると良さそうです。

  • アルバムを発売日の降順でソートするため、発売日にすぐ動かす必要がある
    ボブ・ディランは多作で企画盤も多いため、
    例では6/3発売のアルバムではなく
    11/17に発売されたライブ盤の1曲目になってしまっています。
    →必要に応じてrelease_dateをチェックすると良さそうです。

  • 実はApple Music ユーザー
    🍎のAPIはSpotifyほど公開されていないため同じことをするのは難しそうです。。

今後

下記のようなアレンジができるとさらに使いやすいですね。

  • 作成したPlaylist内のお気に入りArtistのみを逆にテキストとしてExportする(SNS投稿用)
  • 各音楽メディアのレビューを集めたAOTYなどのサイトからスクレイピングしてArtistリストを自動で作成する

まとめ

Spotify APIはrate limitや商用利用制約があるものの、個人利用としては気軽に使えました。
こちらのツールを使って2024年も良い音楽との出会いを楽しみにしています🎼

参考文献

今回参考にさせていただいた記事はこちらです。

人材募集

現在、Wanoグループ / TuneCore Japan では人材募集をしています。興味のある方は下記を参照してください。
Wano | Wano Group JOBS
TuneCore Japan | TuneCore Japan JOBS

コード全体

create_playlist.py

import spotipy
import spotipy.util as util
import json

#Spotify APIの認証部分 username, my_id, my_secret は人によって異なる
username = 'XXX' 
my_id ='XXX' 
my_secret = 'XXX' 
redirect_uri = 'http://localhost:8888/callback' 
scope = 'user-library-read user-read-playback-state playlist-read-private user-read-recently-played playlist-read-collaborative playlist-modify-public playlist-modify-private'
token = util.prompt_for_user_token(username, scope, my_id, my_secret, redirect_uri)
spotify = spotipy.Spotify(auth = token)

def main():

    playlists = spotify.user_playlist_create(username, '230603New')

    f = open('230603.txt', 'r')
    datalist = f.readlines()

    for name in datalist:
        if name == '\n':
            continue
        # 括弧より前までをArtist名とする
        idx = name.find('(')
        name = name[:idx]

        search_result = spotify.search(q=name, limit=10, offset=0, type='artist', market=None)
        artist_Id = search_result['artists']['items'][0]['id']
        
        # artist_idからalbumデータを取得
        album_results = spotify.artist_albums(artist_Id, limit=50, album_type='album')
        album_datas = album_results['items']
        while album_results['next']:
            album_results = spotify.next(album_results)
            album_datas.extend(album_results['items'])
        
        # 発売日の降順にソート
        album_sorted = sorted(album_datas, key=lambda x:x['release_date'], reverse=True)

        # album_idからalbumのtrackデータを取得
        tracks = []
        album_tracks = spotify.album_tracks(album_sorted[0]['id'])

        for track in album_tracks['items']:
            tracks.append(track['id'])

        # trackデータの1曲目をプレイリストに追加
        results = spotify.user_playlist_add_tracks(username, playlists['id'], [tracks[0]])

    f.close()

if __name__ == "__main__":
    main()


14
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?