駆け出しエンジニアの作業ノート

駆け出しエンジニアが作業ノート風にまとめるページ(関係無い事もしばしば)

Last.fmのデータを使って、Spotifyのプレイリストを作成するモジュールが出来た

Last.fmという音楽系のAPIがあります。オライリーの本で「Audioscrobbler」として紹介されているものです。このデータを用いてSpotifyのプレイリストを作成するモジュールが完成しました。

 

import psycopg2
import psycopg2.extras
import spotipy
import spotipy.util as util
import pprint
import re
from spotify_token import Spotify_token

host_name =
port_number =
dbname =
rolename =
passwd =

username =
# API式に切り替える時にアーティスト名から検索可能な曲名の一覧を出す

def get_artist_similar():
conn = psycopg2.connect(database=dbname, host=host_name, port=port_number, user=rolename, password=passwd)
cur = conn.cursor()
cur.execute("SELECT to_artist FROM similar_artist WHERE from_artist = %s AND match_index > 0.01 ORDER BY match_index DESC", (artist,))
'''conn.query("SELECT * FROM similar_artist")'''
similar_artist_list = cur.fetchall()
conn.close()
return similar_artist_list

def get_most_similar_song():
conn = psycopg2.connect(database=dbname, host=host_name, port=port_number, user=rolename, password=passwd)
cur = conn.cursor()
similar_artist_list = get_artist_similar()
playlist = []
playlist.append(first_input)
if similar_artist_list == []:
print("類似するアーティストが登録されていないか、打ち間違いの可能性があります。")
else:
cur.execute(
"SELECT to_artist, to_song FROM similar_track WHERE from_artist = %s AND from_song = %s AND match_index = 1.0",
first_input)
similar_tracklist = cur.fetchall()
if similar_tracklist == []:
cur.execute("SELECT from_artist, from_song FROM similar_track WHERE from_artist = ?", (artist,))
similar_tracklist = cur.fetchall()
similar_track = similar_tracklist[0]
playlist.append(similar_track)
return playlist
else:
similar_track = similar_tracklist[0]
playlist.append(similar_track)
return playlist
conn.close()

def generate_playlist():
conn = psycopg2.connect(database=dbname, host=host_name, port=port_number, user=rolename, password=passwd)
cur = conn.cursor()
similar_artist_list = get_artist_similar()
playlist = get_most_similar_song()
for i in range(len(similar_artist_list) - 1):
if len(playlist) == 10:
return playlist
else:
similar_artist = similar_artist_list[i]
search_word = (first_input[0], first_input[1], similar_artist[0])
cur.execute("SELECT to_artist, to_song FROM similar_track WHERE from_artist = %s AND from_song = %s AND to_artist = %s AND match_index > 0.01 ORDER BY match_index DESC", search_word)
similar_tracklist = cur.fetchall()
for j in range(len(similar_tracklist) - 1):
trackdata = similar_tracklist[j]
if trackdata in playlist:
continue
else:
playlist.append(trackdata)
print(playlist)
conn.close()

def playlist_print():
playlist = generate_playlist()
print(playlist)
get_empty_Spotify_playlist(playlist)
return playlist

def get_empty_Spotify_playlist(playlist):
playlist_name = artist + "の" + song + "から始まるおすすめプレイリスト"
ST = Spotify_token(username)
token = ST.set()
sp = spotipy.Spotify(auth=token)
sp.trace = False
playlistts = sp.user_playlist_create(username, playlist_name)
pprint.pprint(playlistts)
playlist_id = playlistts["id"]
print(playlist_id)
song_ids = []
for i in range(len(playlist)):
search_str = playlist[i]
s_artist = search_str[0]
s_song = search_str[1]
search_str = s_artist + " " + s_song
result = sp.search(search_str, limit=1)
print(result)
for item in result["tracks"]["items"]:
print(item["artists"][0]["name"])
print(item["name"])
print(item["id"])
api_song = item["name"]
api_song = re.sub("\t", "", api_song)
print(api_song)
song_id = item["id"]
print(song_id)
song_ids.append(song_id)
print(song_ids)
playlist_input(playlist_id, song_ids)

def playlist_input(playlist_id, song_ids):
ST = Spotify_token(username)
token = ST.set()
if token:
sp = spotipy.Spotify(auth=token)
sp.trace = False
results = sp.user_playlist_add_tracks(username, playlist_id, song_ids)
print(results)
else:
print("Can't get token for", username)

if __name__ == '__main__':
artist = input("検索したいアーティスト名を入力して下さい")
song = input("次にアーティストの楽曲名を入力して下さい")
first_input = (artist, song)
playlist_print()

 

 

なお、後半のSpotifyとの接続は以下の記事を参考にしました。

 

sakanaaas.hateblo.jp

 

現状、以下の現象を確認しています。

・DBに未収録の楽曲はプレイリストが出来ない

・入力を間違えるとエラーになる

Spotifyに配信されていない楽曲が混ざると、出来るプレイリストが想定と違う

 

なお、今後はDBでは無くAPIを直接参照するように改修します。また、アーティスト名を入れたあとに曲名を表示されるようにします。