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

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

仕様変更とリファクタリングをしました

仕様を大きく変更しました。前のコードではlast.fmAPIのデータを収録したDBを経由していましたが、メンテナンスコストが負担になっていたので、DBを経由せずにAPIを直接参照するように切り替えました。

 

また、API参照の部分をべた書きすると、今度は本体部分のメンテナンスがし辛くなってしまったので、API参照の部分は別ファイルを参照する方式にしました。

 

では、まずは本体部分です。

import spotipy
import re
import get_similar_track_sandbox
from spotify_token import Spotify_token

api_key =
username =

def input_artist():
artist = input("検索したいアーティスト名を入力して下さい")
page = 1
search_song_list(artist, page)

def search_song_list(artist, page):
list = get_similar_track_sandbox.get_search_song_list(artist, api_key, page)
for i in range(len(list)):
song_list = list[i]
song = song_list["name"]
print(song)
yes_or_no = input("この中に探したい曲はありましたか?(y/n)")
#yes_or_no = "y"
if yes_or_no == "y":
search_track(artist)
elif yes_or_no == "n":
page = page + 1
search_song_list(artist, page)
else:
print("正しい入力ではありません")

def search_track(artist):
song = input("曲名を入力して下さい")
create_playlist(artist, song)

def create_playlist(artist, song):
playlist = []
first_input = (artist, song)
playlist.append(first_input)
k = 0
genarate_playlist(first_input, artist, song, playlist, k)

def genarate_playlist(first_input, artist, song, playlist, k):
track = get_similar_track_sandbox.get_similar_track(artist, song, api_key)
similar_artist_list = get_similar_track_sandbox.similar_artist_search(artist, api_key)
playlist_limit = 15
for i in range(len(similar_artist_list)):
similar_artist = similar_artist_list[i]
for j in range(len(track)):
if len(playlist) >= playlist_limit:
break
else:
song_list = track[j]
similar_song = song_list["name"]
similar_song_artist = song_list["artist"]["name"]
match = song_list["match"]
match = float(match)
result = (similar_song_artist, similar_song)
if match < 0.1:
continue
elif result in playlist:
continue
elif similar_song_artist == similar_artist:
playlist.append(result)
else:
continue
try:
if len(playlist) < playlist_limit -1:
print(playlist)
k = k + 1
search_word = playlist[k]
artist = search_word[0]
song = search_word[1]
genarate_playlist(first_input, artist, song, playlist, k)
else:
print(playlist)
get_empty_Spotify_playlist(first_input, playlist)
except IndexError:
print(playlist)
page = 1
list = get_similar_track_sandbox.get_search_song_list(artist, api_key, page)
print(list)
song_list = list[0]
song = song_list["name"]
k = 1
search_word = (artist, song)
playlist.append(search_word)
genarate_playlist(first_input, artist, song, playlist, k)

def get_empty_Spotify_playlist(first_input, playlist):
playlist_name = first_input[0] + "の" + first_input[1] + "から始まるおすすめプレイリスト"
ST = Spotify_token(username)
token = ST.set()
sp = spotipy.Spotify(auth=token)
sp.trace = False
playlistts = sp.user_playlist_create(username, playlist_name)
playlist_id = playlistts["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)
for item in result["tracks"]["items"]:
print(item["artists"][0]["name"])
print(item["name"])
print(type(item["name"]))
print(item["id"])
api_song = item["name"]
api_song = re.sub("\t", "", api_song)
if api_song == s_song:
print("OK")
song_id = item["id"]
song_ids.append(song_id)
else:
continue
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__':
input_artist()

 

次に、API参照部分です。

 

import urllib.request
import urllib.parse
import json

def get_search_song_list(artist, api_key, page):
artist = urllib.parse.quote(artist)
artist_api1 = "http://ws.audioscrobbler.com/2.0/?method=artist.gettoptracks&artist="
artist_api2 = "&autocorrect=1&page="
page = str(page)
artist_api3 = "&api_key="
artist_api4 = "&format=json"
call_api = artist_api1 + artist + artist_api2 + page + artist_api3 + api_key + artist_api4
print(call_api)
address_json = urllib.request.urlopen(call_api)
data = json.loads(address_json.read())
track = data["toptracks"]
list = track["track"]
return list

def get_similar_track(artist, song, api_key):
artist = urllib.parse.quote(artist)
song = urllib.parse.quote(song)
track_api1 = "http://ws.audioscrobbler.com/2.0/?method=track.getsimilar&artist="
track_api2 = "&track="
track_api3 = "&autocorrect=1&api_key="
track_api4 = "&format=json"
call_api = track_api1 + artist + track_api2 + song + track_api3 + api_key + track_api4
print(call_api)
address_json = urllib.request.urlopen(call_api)
data = json.loads(address_json.read())
similartracks = data["similartracks"]
track = similartracks["track"]
return track

def similar_artist_search(artist, api_key):
artist = urllib.parse.quote(artist)
artist_api1 = "http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist="
artist_api2 = "&autocorrect=1&api_key="
artist_api3 = "&format=json"
call_api = artist_api1 + artist + artist_api2 + api_key + artist_api3
print(call_api)
address_json = urllib.request.urlopen(call_api)
data = json.loads(address_json.read())
similarartists = data["similarartists"]
artist_list = similarartists["artist"]
similar_artist_list = []
artist = urllib.parse.unquote(artist)
similar_artist_list.append(artist)
for i in range(len(artist_list)):
list = artist_list[i]
similar_artist = list["name"]
match = list["match"]
match = float(match)
if match > 0.1:
similar_artist_list.append(similar_artist)
else:
break
return similar_artist_list

 

では、ここに乃木坂46の新曲「シンクロニシティ」を入れてみます。

 

シンクロニシティ

シンクロニシティ

  • provided courtesy of iTunes

 

システムに基づくプレイリストは以下の通りです。

 

[('乃木坂46', 'シンクロニシティ'), ('乃木坂46', '制服のマネキン'), ('乃木坂46', '君の名は希望'), ('乃木坂46', '命は美しい'), ('HKT48', '桜、みんなで食べた'), ('HKT48', '12秒'), ('E-Girls', 'ごめんなさいのKissing You'), ('E-Girls', 'Mr.Snowman'), ('山本彩', '夢のdead body'), ('山本彩', 'ジャングルジム'), ('高橋みなみ', 'Jane Doe'), ('高橋みなみ', '右肩'), ('E-Girls', 'E.G. Anthem -WE ARE VENUS-'), ('AKB48', '希望的リフレイン'), ('AKB48', 'overture')] 

 

では、実際に出来たSpotifyプレイリストを見てみましょう。

 

f:id:Psyduck_take_it_easy:20180426235913p:plain

 

HKT48山本彩さんの楽曲が入っていません。これは、Spotifyでは配信されていない為です。E-girlsの「E.G. Anthem -WE ARE VENUS-」が入っていませんが、Spotifyでの表記が若干異なることから入らなかったようです。ちなみに、Google Play Musicではリスト曲全て配信されています。

 

自分としては、Google Play MusicAPIが出ることを切に願っています。

 

今後は24時間以内に再生した楽曲を除去する機能を搭載し、プレイリストの自動生成を何度も用いても同じ曲が再生されないような仕組み作りを行います。