この記事は 910productionアドカレ2025 7日目6日目の記事です
結論
これをGoogle Colabで動かしたらできます。
はじめに
こんにちは。4回生のゆうこくです。来年も4回生です。不思議なこともあったもんですね。ちなみにアイドルマスターはミリとシャニと学が少しわかります。ASとMとデレはちょっとだけわかります。
12月のアドカレは3年前、1回生のときに書いたぶりですね。記事はコレ。
受験。から始まってて非常にキモいですね~。数年前の自分の文章なんてもんは見るに堪えません。ただFrom Teacher To Future!について書いていて偉いですね。お前は報われるぞ。

この記事にもSpotifyのリンクとプレイリストを貼っているように、僕は音楽サブスクリプションではSpotifyを使っています。音楽サブスクリプション、便利ですね~。ちょうど3年前のこの時期にアイドルマスターの楽曲も多くがサブスクで聴けるようになりました。個人的にはミリシャニMの曲をよく聴くので、これらのブランドはサブスクを解禁しており助かっています。
Spotifyにはお気に入り楽曲という機能があり、再生画面からワンタップで追加することができます。
お気に入りに入れた楽曲はマイライブラリの「お気に入り楽曲」プレイリストに追加され、まとめて再生することができます。とっても便利。
ところで、Spotifyのプレイリストは「他のプレイリストに追加」という機能を用いてプレイリストの中身全てを他のプレイリストの中にコピーすることができます。これまた便利。

というわけで、例えばレンタカーで遠出するときに複数人で公開のプレイリストを作るなどする際、自分のお気に入り楽曲を全部まとめて入れてやるぞ~とすると......できません。なんで???厳密にはお気に入りはプレイリストではないらしいです。というわけで手動で......なんて文明人のすることではありません。そもそも何百曲もあるわけで、めんどくさいったらありゃしない。そこで、なんとか自動でやれるようにしましょう。一回作っておけばずっと手間を省けますからね。
Spotify API
APIってなんぞや、というところがありますが、自分もよく分かっていません。今回においては、なんらかの別の場所からSpotifyの機能を呼び出す方法があるとだけ理解しておけばいいです。それを使ってSpotifyの機能を呼び出してプレイリストだとかの操作を行うということなのですが、このAPI自体を皆さん大好きPythonで扱うことができるライブラリが公開されているので、これを今回は使っていきます。
今回の記事で行いたい内容はプログラミングとかそういうのは出来なくても実行できるようにします。というかそもそもこれくらいの操作は今どきChatGPTとかそういうのに聞けばすぐできるのですが。
Spotify API を Python で使うことのできるライブラリ、名前は Spotipy を見ていきましょう。正直名前が面白くてこれを書くことに決めたとこがある。
コードの実行はGoogle Colabolatoryで行いましょう。これが一番楽です。ローカルに環境構築できてる人はそっちでやってもらってもいいですが、そんな人間はこんなの読まなくても勝手にやれるでしょう。*1
押したらNew Notebookってボタンを押しましょう。そしたらUntitled.ipynbみたいな名前のファイルが開き、こんな感じの表示がされます。「コーディングを開始する」のところにコードをコピペ打ち込み、左側の三角ボタンを押すことでコードが実行されます。超便利!

話をSpotipyの方に戻したいところですが、その前に色々な設定を済ませておきましょう。まずはcolabの「コーディングを開始する」のところに !pip install spotipy と打ち込んで三角ボタンを押してみましょう。ビックリマークを忘れずに。

なんか色々出てきたらOKです。次に、 Spotify for Developers にログインして右上の自分のアイコンを押し、Dashboard > Create App と進みます。そうすると色々入力する画面が出てきますが、適当に埋めておきます。App name, App description には test とでも書いておきましょう。Redirect URIs には何らかのアクセスできるリンクを入れる必要がありますが、適当で良いです。今回は自分のnoteのページでも適当に貼っておきました。必要事項を埋めたら Save を押します。すると Client ID およびボタンを押すことで Client Secret というものを見ることができます。これを以下に当てはめます。' を消さないように注意。ローカル環境で行う場合、 !export で設定しても良いです。一度それでやってみたのですが、google colabでは export で設定した環境変数を次のセルに引き継いでくれないらしいためこのような方法を取っています。
import os os.environ['SPOTIPY_CLIENT_ID'] = 'ここにClient ID' os.environ['SPOTIPY_CLIENT_SECRET'] = 'ここにClient Secret' os.environ['SPOTIPY_REDIRECT_URI'] = 'ここに設定したURL'
そうしたらまずはページ上方の「+コード」を押して、新たにコードを打てる場所を作ります。これらのコードをさっきの要領で「コーディングを開始する」のところにコピペし三角ボタンを押します。
初回の認証を行うついでにテストとして、以下のコードをさっきの要領でコピペして実行します。
import spotipy from spotipy.oauth2 import SpotifyOAuth scope = "user-library-read" sp = spotipy.Spotify(auth_manager=SpotifyOAuth(scope=scope, open_browser=False)) results = sp.current_user_saved_tracks() for idx, item in enumerate(results['items']): track = item['track'] print(idx, track['artists'][0]['name'], " – ", track['name'])
すると、まず一行目に青色文字のリンク、二行目に「Enter the URL you were redirected to:」という文字とテキストボックスが表示されると思います。

まずは一行目のリンクをクリック。するとSpotifyの認証画面が出てくるのでこれを許可。すると先ほど自分で設定したウェブサイトに飛ぶと思います。ここでそのウェブサイトのリンクをそのままコピーして、先ほどのテキストボックスにコピペしてEnter。*2すると......

最近自分がお気に入りに追加した楽曲が表示されます。*3ここまでできていれば設定はOKです。
それでは、実際にプレイリストを作成したりそこに曲を入れたりとしていく部分に取り掛かりましょう。早く目的だけ済まさせろという人はしばらく飛ばしてください。
流れとしては
- 「お気に入りの曲」プレイリスト自体の確認・作成
- 「お気に入りの曲」の取得
- 現在の「お気に入りの曲」と「お気に入りの曲」プレイリストの重複の回避(追加する楽曲の選定)
- 楽曲の追加
という順序です。
まずは「お気に入りの曲」というプレイリストがマイライブラリにあるならその情報を取得、無いなら作る部分です。Spotipyのリファレンスを見ると current_user_playlists() でユーザのプレイリストを取得できそうなのですが、返り値に関する記述が無いのでSpotify API自体のリファレンスを見に行きます。どうやら取得する情報は辞書形式で、 items の中にプレイリストの情報がありそう。 items の中身はリストで、リストの要素が各プレイリストに関する情報っぽい。各要素中の name に名前があるっぽいので、これを順に取得していきます。
持っているプレイリストをまとめてすべて取得したいところなのですが、取得は50が上限です。なので50ずつ取得していくわけになるのですが、paged result つまり取得結果の次を取得する next とかいう便利機能があるっぽいです。リファレンスの例を見ると
playlists = sp.user_playlists('spotify') while playlists: for i, playlist in enumerate(playlists['items']): print(f"{i + 1 + playlists['offset']:4d} {playlist['uri']} {playlist['name']}") if playlists['next']: playlists = sp.next(playlists) else: playlists = None
これでまだ取得してないプレイリストがあるなら取得し、無いならwhileループをbreakできるわけですね。この機能を使わないのなら、引数に指定できる offset をいじらなきゃいけません。これに従って書いていきます。
# ユーザのプレイリストを確認する my_playlist = sp.current_user_playlists(limit = 50) playlist_id = None while my_playlist: for playlist in my_playlist['items']: # お気に入りの曲 という名前のプレイリストを探す if playlist['name'] == 'お気に入りの曲': playlist_id = playlist['id'] break if my_playlist['next']: my_playlist = sp.next(my_playlist) else: my_playlist = None
お気に入りの曲、という名前のプレイリストが無い場合、作るようにします。 user_playlist_create() とかいうのでやりましょう。引数には user ID とプレイリストの名前があればよさそうです。IDは current_user() で取得した中からさっき同様、 id で取得できそうです。
# お気に入りの曲 という名前のプレイリストが無い場合、作る if playlist_id is None: new_playlist = sp.user_playlist_create(user = sp.current_user()['id'], name = 'お気に入りの曲') playlist_id = new_playlist['id']
これでユーザのプレイリスト一覧の中には「お気に入りの曲」プレイリストがあり、そのプレイリストのIDが playlist_id に保存されている状態になりました。それではこのプレイリストに自分のお気に入りの曲を追加していきましょう。プレイリストの取得と同様にwhileループで上限を超えて取得をしていきます。Spotify APIのGet User's Saved Tracksのところを見ると、お気に入りの曲のidは items の中の track の中の id で取得できるそうなので、取得してリストに保存していきましょう。
# お気に入りの曲を取得する favorite_songs = sp.current_user_saved_tracks(limit = 50) while favorite_songs: for song in favorite_songs['items']: # お気に入りの曲のidを保存する favorite_songs_id.append(song['track']['id']) # 次がある場合 if favorite_songs['next']: favorite_songs = sp.next(favorite_songs) else: favorite_songs = None
これで追加したい曲のIDを全部保存できました。次は現在の「お気に入りの曲」プレイリストとの重複を外していきます。お気に入りの曲の取得はこれまた100曲ずつなので同じようにループを組みましょう。各お気に入りの曲についてidが追加楽曲リストにあればそれを削除していきます。
# 追加する曲の選定 added_songs = sp.playlist_tracks(playlist_id, limit = 100) while added_songs: for song in added_songs['items']: # もう追加されてたら追加リストから消す if song['track']['id'] in favorite_songs_id: favorite_songs_id.remove(song['track']['id']) if added_songs['next']: added_songs = sp.next(added_songs) else: added_songs = None
これであとは楽曲を追加していくだけです。追加したい曲のIDは favorite_songs_id に保存したので、追加していきます。 playlist_add_items() はプレイリストのIDと追加楽曲IDのリストを引数に取ります。一度のリクエストで100曲までしか追加できないそうなので、100曲ずつ追加していきましょう。
# 追加する曲があるなら追加 if len(favorite_songs_id) > 0: # インデックスを100ずつ進める for i in range(0, len(favorite_songs_id), 100): sp.playlist_add_items(playlist_id, favorite_songs_id[i:i+100])
プログラムの詳細がどうでもいい人はここまで飛ばしましょう!!!!!!!!
これでプレイリストの作成が完了です。細かな例外への対処とかをしてないですが、とりあえず動きました。コード全体としては以下のようになります。これをいつもの要領でコピペし、実行すればプレイリストの作成ができます。
このコードを定期的に動かすことで、お気に入りの曲をちゃんとしたプレイリストの形で保存しておくことができます!
import spotipy from spotipy.oauth2 import SpotifyOAuth scope = "user-library-read playlist-modify-public playlist-modify-private" sp = spotipy.Spotify(auth_manager = SpotifyOAuth(scope = scope, open_browser = False)) # ユーザのプレイリストを確認する my_playlist = sp.current_user_playlists(limit = 50) playlist_id = None while my_playlist: for playlist in my_playlist['items']: # お気に入りの曲 という名前のプレイリストを探す if playlist['name'] == 'お気に入りの曲': playlist_id = playlist['id'] break if my_playlist['next']: my_playlist = sp.next(my_playlist) else: my_playlist = None # お気に入りの曲 という名前のプレイリストが無い場合、作る if playlist_id is None: new_playlist = sp.user_playlist_create(user = sp.current_user()['id'], name = 'お気に入りの曲') playlist_id = new_playlist['id'] # お気に入りの曲を保存するリスト favorite_songs_id = [] # お気に入りの曲を取得する favorite_songs = sp.current_user_saved_tracks(limit = 50) while favorite_songs: for song in favorite_songs['items']: # お気に入りの曲のidを保存する favorite_songs_id.append(song['track']['id']) # 次がある場合 if favorite_songs['next']: favorite_songs = sp.next(favorite_songs) else: favorite_songs = None # 追加する曲の選定 added_songs = sp.playlist_tracks(playlist_id, limit = 100) while added_songs: for song in added_songs['items']: # もう追加されてたら追加リストから消す if song['track']['id'] in favorite_songs_id: favorite_songs_id.remove(song['track']['id']) if added_songs['next']: added_songs = sp.next(added_songs) else: added_songs = None # 追加する曲があるなら追加 if len(favorite_songs_id) > 0: # インデックスを100ずつ進める for i in range(0, len(favorite_songs_id), 100): sp.playlist_add_items(playlist_id, favorite_songs_id[i:i+100])
できました!Google Colabのipynbファイルを共有しておくので、このファイルをダウンロードし、自分の認証情報だけ入力して上から順に実行すれば使うことができます。
動作も確認でき、ひと段落。ということで......
このコードをGeminiに見せて修正してもらいましょう。
実際、これくらいの操作をしたいだけならLLMに頼めば一瞬でコードを書いてくれます。動かし方もわからなかったらそれも懇切丁寧に説明してくれます。そのせいで久しぶりにPythonのコードを自分で書きました。めちゃくちゃセミコロンを書いてはいらねぇんだった......になりました。
https://gemini.google.com/share/779909a57c9e
提示されたコードは、基本的には動作しますが、曲数が多い場合に非常に処理が遅くなる(計算量が多い)点や、ローカルファイルや削除された曲が含まれているとエラーになる可能性がある点など、いくつか改善すべき箇所があります。
以下に、パフォーマンスと安全性を向上させた修正版コードを作成しました。
AIに全部任せちゃおう!!!!!!!!!!!!!!!!!!!!!!!*4
最後に今回作った自分のお気に入りの曲プレイリストを貼っておきます。
*1:ここからの最も良い使い方は、まずGeminiかなんかを開いてこの記事のリンクを貼り、ここからの作業を行うことを伝え、詰まったら質問を全部Geminiかなんかに投げることです。大まかな道筋をGeminiかなんかが分かってくれるのでスムーズに説明してくれると思います。
*2:本来の自分が設定したURLの後ろに色々くっついたURLになっています。その部分を削らずにそのままコピペしましょう
*4:自分で書いたコードの方はプレイリストへの追加順を気にしていないので、追加順を気にするなら ipynb ファイルの後ろの方にあるGeminiのコードの方が良いです。こっちは古い順に上から並び、次回追加した場合も後ろに追加されていきます。