Spotify API から楽曲の解析情報を取るpart3

# はじめに 
ID取得とかSpotify APIを使うのに必要なことは既に理解している前提で話していきます。
まだの方は[Spotify API をPythonでちょっと遊ぶ](https://qiita.com/supertower/items/2f6da271cf16389d6e58)からどうぞ
あとはノート代わりと自分のモチベ維持のために書いてるのでそんなことわかってるよ！っていう場所もあると思います。
ではスタート 
# 今回の目標 
前回は標準入力でアーティスト名と曲名を入力したら解析情報がゲットできるように実装しましたが、今回は別角度からのアプローチで同じことをしようと思います。 
前回はアーティスト名->曲名の順で検索したのですが、今回は逆の曲名->アーティスト名で検索しようと思います。 
# つまずいた点
今回つまずいた箇所として、`sp.search()`関数はアーティスト名をデフォルトだと英語で返します。例えば、ポルノグラフィティ->PornoGraffittiのようにです。戻り値を日本語のままにするためには`spotipy.Spotify()`でlanguage='jp'と指定する必要があります。 
# コード
ソースコードです。 
```python:search_tra_fea2.py
from curses.ascii import isalpha
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import pprint
import spotify_id as si
import re

def is_japanese(str):
    return 'ja' if re.search(r'[ぁ-んァ-ン]', str) else 'en'

flag = True
cnt = 0
print('アーティスト名を入力')
art_name = input()
print('曲名を入力')
tra_name = input()
lang = is_japanese(art_name)

client_id = si.id()
client_secret = si.secret()
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)

sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager,language=lang)

while flag:
    tracks = sp.search(tra_name,type='track',offset=cnt*10)['tracks']['items']
    #print(type(tracks[0]['artists']))
    tra_id_name=[]
    for track in tracks:
        print(track['artists'][0]['name'])
        dict = {'name':track["name"],'artist':track['artists'][0]['name'],'id':track["id"]}
        if art_name in track['artists'][0]['name'] and flag:
            result = sp.audio_features(track['id'])
            pprint.pprint('name   : ' +track['name'])
            pprint.pprint('artist : ' +track['artists'][0]['name'])
            pprint.pprint(result)
            flag = False
        tra_id_name.append(dict)
    cnt += 1
```  
# 手順 
### 1.自作関数の定義 
つまずいた点で述べましたが、入力したアーティスト名を日本語かそれ以外か判断する必要がありました。今回は自作関数`is_japanese(str)`を定義して解決しました。 
```python:
def is_japanese(str):
    return 'ja' if re.search(r'[ぁ-んァ-ン]', str) else 'en'
```
### 2.各変数の宣言と入力 
この辺は見ていただいたらわかると思いますので、説明は割愛します。
```python:
flag = True
cnt = 0
print('アーティスト名を入力')
art_name = input()
print('曲名を入力')
tra_name = input()
lang = is_japanese(art_name)
``` 
### 3.Spotify APIの認証 
Spotify APIを使用するには認証が必要になります。細かい話は勉強不足ゆえ説明できませんが、[Spotify API をPythonでちょっと遊ぶ](https://qiita.com/supertower/items/2f6da271cf16389d6e58)で多少解説していますので、気になる方はこちらへどうぞ 
```python:
client_id = si.id()
client_secret = si.secret()
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)

sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager,language=lang)
```
### 4.検索部分 
今回の心臓部分となる検索するところです。 
`sp.search(q,type=,offset=)`で曲名を検索して類似する楽曲の情報を得ます。今回は3つの引数を使用しました。q以外は省略可能です。詳しいことはリファレンスにあるので大まかに解説します。
q:検索するid
type:表示するtype(trackなど)
offset:検索結果を最初から何個飛ばすか 

検索結果の中からアーティスト名が同じものを表示するのですが、最初の10個じゃないこともあるので10個ずつ検索して、見つかったら`flag = False`でループを抜けるようになってます。
```python:
while flag:
    tracks = sp.search(tra_name,type='track',offset=cnt*10)['tracks']['items']
    #print(type(tracks[0]['artists']))
    tra_id_name=[]
    for track in tracks:
        print(track['artists'][0]['name'])
        dict = {'name':track["name"],'artist':track['artists'][0]['name'],'id':track["id"]}
        if art_name in track['artists'][0]['name'] and flag:
            result = sp.audio_features(track['id'])
            pprint.pprint('name   : ' +track['name'])
            pprint.pprint('artist : ' +track['artists'][0]['name'])
            pprint.pprint(result)
            flag = False
        tra_id_name.append(dict)
    cnt += 1
```
# 改善点 
改善点としてはGoogleの検索エンジンみたいに予測変換が曲名、アーティスト名を入力するときに使えるといいなと思ってますが、レコメンド機能についていよいよ手を出そうと思っているのでしばらくはやらないかなー
あとは、APIの取得データが辞書型とリストが混合して渡されるので`type()`でどっちなのかを判断してるのですがいい方法ないですかね。勉強不足なもので...
# 最後に 
拙い文でしたが読んでいただきありがとうございました。詳しい説明や気になる箇所ありましたらコメントください。喜んで答えさせていただきます。
# 参考 
[Spotify API 公式リファレンス](https://developer.spotify.com/documentation/web-api/reference/#/)
[Spotipy 公式リファレンス](https://spotipy.readthedocs.io/en/latest/)
[Pythonで文の日本語判定を行う](https://qiita.com/MichiHosokawa/items/83da0ad58905c79c867d)