Spotify APIで楽曲情報やアーティスト情報を取得してみた

#はじめに
音楽定額サービスであるSpotifyをよく使っているのですが、そのSpotifyのAPIがあるということで使ってみることにしました。
また、開発環境は無料で使えるGoogle Colaboratoryを使用しました。
Googleのアカウントさえあれば無料で使えてブラウザ上で動くのと、すぐに結果が表示されるのでわかりやすかったです。
他の方のコードを参考に色々といじってみたので、その備忘録として残します。

#APIキーの取得
Spotify APIを使うにはSpotifyのアカウントが必要なので、持っていない方は取得しておきましょう。
[こちら](https://www.spotify.com/jp/)から登録できます。

SpotifyのAPIキーは[Spotify for Developers](https://developer.spotify.com/)から発行できます。
Spotifyのアカウントでログインして「DASHBOARD」に進むと「CREATE A CLIENT ID」というボタンがあるのでクリック。必要な情報を入力すれば、OAuth2認証に必要な**Client ID**と**Client Secret**が入手できると思います。
<img width="921" alt="スクリーンショット 2019-07-14 16.33.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55699/f48e4e23-ede2-3c8e-55ac-e1257bf7edb6.png">
OAuth2がわからなかったので、以下の記事で勉強しました。
> [一番分かりやすい OAuth の説明](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be)

#楽曲の情報取得
Spotifyの楽曲情報には色々な情報があるようなので、まずは楽曲情報を取得しました。
今回はサカナクションの「忘れられないの」のIDを設定しました。
曲のIDの取り方はSpotifyの曲の「・・・」のボタンから「曲のリンクをコピー」で曲のURLがコピーされるので、そのIDを使いました。
<img width="776" alt="スクリーンショット 2019-07-15 12.29.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55699/52527f64-abdb-565d-0d23-e0b4050d9518.png">


まずはSpotifyのAPIを扱うためのライブラリである「spotipy」をインストール。
ドキュメントは[こちら](https://spotipy.readthedocs.io/en/latest/)にあるみたいです。

```python
!pip install spotipy
```

また、リストや辞書を整形して出力する「pprint」もインストールしました。
> [Pythonのpprintの使い方（リストや辞書を整形して出力）](https://note.nkmk.me/python-pprint-pretty-print/)

発行したCLIANT IDと発行したCLIANT SECRETを設定し、Spotifyの**「audio_feature」**というもので、曲の情報を取得しています。

```python
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import pprint

client_id = '発行したCLIANT ID'
client_secret = '発行したCLIANT SECRET'
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

# 曲のidを設定
result = spotify.audio_features('7a3LbQFgp7NCuNcGlTgSsN')
pprint.pprint(result)
```
実行するとこんな感じに色々と情報が返ってきました。

```
[{'acousticness': 0.35,
  'analysis_url': 'https://api.spotify.com/v1/audio-analysis/7a3LbQFgp7NCuNcGlTgSsN',
  'danceability': 0.642,
  'duration_ms': 238000,
  'energy': 0.645,
  'id': '7a3LbQFgp7NCuNcGlTgSsN',
  'instrumentalness': 0.00349,
  'key': 6,
  'liveness': 0.191,
  'loudness': -7.358,
  'mode': 0,
  'speechiness': 0.0375,
  'tempo': 172.1,
  'time_signature': 4,
  'track_href': 'https://api.spotify.com/v1/tracks/7a3LbQFgp7NCuNcGlTgSsN',
  'type': 'audio_features',
  'uri': 'spotify:track:7a3LbQFgp7NCuNcGlTgSsN',
  'valence': 0.917}]
```
アコースティック感や踊れる曲なのかという情報などが色々と設定されてるみたいです。
以下の記事で「audio_features」についてわかりやすく解説されています。
[Spotifyでトップチャートの曲(と自分の曲)の分析](https://qiita.com/kazuya-n/items/fbee07ef778e166cb6dd)

#アーティスト情報取得
次にアーティストの情報を取得していきたいと思います。

```python
name = 'sakanaction'
result = spotify.search(q='artist:' + name, type='artist')
pprint.pprint(result['artists'])
```
実行結果がこちら

```
[{'external_urls': {'spotify': 'https://open.spotify.com/artist/0hCWVMGGQnRVfDgmhwLIxq'},
  'followers': {'href': None, 'total': 331802},
  'genres': ['j-pop', 'j-rock', 'japanese r&b'],
  'href': 'https://api.spotify.com/v1/artists/0hCWVMGGQnRVfDgmhwLIxq',
  'id': '0hCWVMGGQnRVfDgmhwLIxq',
  'images': [{'height': 640,
              'url': 'https://i.scdn.co/image/094163b308bdcd3f5668977c20d41c8455b9705e',
              'width': 640},
             {'height': 320,
              'url': 'https://i.scdn.co/image/a4213b3f5446bdebe55d0f203a396fc2a66cefd4',
              'width': 320},
             {'height': 160,
              'url': 'https://i.scdn.co/image/9722d7a67e4be3656cbc14fc58fb60b7ca2a5ddd',
              'width': 160}],
  'name': 'Sakanaction',
  'popularity': 67,
  'type': 'artist',
  'uri': 'spotify:artist:0hCWVMGGQnRVfDgmhwLIxq'}]
```
フォロワー数やジャンル、画像、人気度などアーティストに関する様々な情報を取得することができました。
#類似アーティストの取得
次は似ているアーティストを取得し、そのアーティストの人気やジャンルも表示していきます。
各アーティストには固有のidが振られており、そのidを使って類似のアーティストを取得することができます。
固有idはSpotifyのアーティストのURLに記載されています。
例えばサカナクションの場合
[https://open.spotify.com/artist/0hCWVMGGQnRVfDgmhwLIxq](https://open.spotify.com/artist/0hCWVMGGQnRVfDgmhwLIxq)
このURLの`0hCWVMGGQnRVfDgmhwLIxq`の部分が固有のidになります。

また、pythonのformat関数を使い、文字列を出力しました。
[【Python入門】format関数で文字列の書き方](https://qiita.com/Morio/items/b79ead5f881e6551d9e1)

```python
# アーティスの固有idから類似アーティストを取得
result = spotify.artist_related_artists('アーティストの固有id')
for artist in result['artists']:
    artist_name = artist['name']
    popularity = artist['popularity']
    genres = artist['genres']
    info = 'アーティスト名： {0} - 人気: {1} ジャンル: {2}'.format(artist_name, popularity, genres)
    print(info)
```
実行結果がこちら

```python
アーティスト名： The Sharehappi from J Soul Brothers III from EXILE TRIBE - 人気: 31 ジャンル: ['j-pop']
アーティスト名： Awesome City Club - 人気: 48 ジャンル: ['j-pop', 'j-rock', 'japanese city pop', 'japanese r&b']
アーティスト名： King Gnu - 人気: 66 ジャンル: ['j-pop', 'j-rock', 'japanese alternative rock', 'japanese r&b']
アーティスト名： Sambomaster - 人気: 52 ジャンル: ['anime', 'j-pop', 'j-rock']
アーティスト名： never young beach - 人気: 50 ジャンル: ['j-indie', 'j-rock', 'japanese alternative rock', 'japanese city pop', 'japanese r&b']
アーティスト名： Base Ball Bear - 人気: 48 ジャンル: ['anime', 'j-indie', 'j-pop', 'j-pop girl group', 'j-poprock', 'j-rock', 'japanese alternative rock']
アーティスト名： cero - 人気: 45 ジャンル: ['j-rap', 'j-rock', 'japanese alternative rock', 'japanese city pop', 'shibuya-kei']
アーティスト名： Soutaiseiriron - 人気: 45 ジャンル: ['j-indie', 'j-pop girl group', 'j-rock', 'japanese alternative rock', 'shibuya-kei']
アーティスト名： Chatmonchy - 人気: 50 ジャンル: ['anime', 'j-indie', 'j-pop', 'j-rock', 'japanese alternative rock']
アーティスト名： Yogee New Waves - 人気: 46 ジャンル: ['j-indie', 'japanese alternative rock', 'japanese city pop', 'japanese r&b']
アーティスト名： tofubeats - 人気: 53 ジャンル: ['j-rap', 'japanese alternative rock', 'japanese city pop', 'japanese r&b']
アーティスト名： Suchmos - 人気: 54 ジャンル: ['j-pop', 'j-rock', 'japanese alternative rock', 'japanese city pop', 'japanese r&b']
アーティスト名： Fujifabric - 人気: 51 ジャンル: ['anime', 'j-indie', 'j-pop', 'j-rock', 'japanese alternative rock']
アーティスト名： Quruli - 人気: 54 ジャンル: ['j-pop', 'j-rock', 'japanese alternative rock', 'japanese city pop', 'japanese jazz', 'japanese r&b']
アーティスト名： Ohashi Trio - 人気: 52 ジャンル: ['j-acoustic', 'j-pop', 'japanese city pop', 'japanese jazz', 'japanese r&b']
アーティスト名： BUMP OF CHICKEN - 人気: 63 ジャンル: ['anime', 'anime score', 'j-pop', 'j-rock', 'japanese alternative rock']
アーティスト名： Nulbarich - 人気: 56 ジャンル: ['j-pop', 'japanese alternative rock', 'japanese city pop', 'japanese r&b']
アーティスト名： Tokyo Incidents - 人気: 54 ジャンル: ['j-pop', 'j-rock']
アーティスト名： Gesu No Kiwami Otome - 人気: 56 ジャンル: ['j-pop', 'j-rock']
アーティスト名： Supercar - 人気: 39 ジャンル: ['j-indie', 'j-pop', 'j-rock', 'japanese alternative rock', 'japanese city pop', 'japanese shoegaze', 'shibuya-kei']
```
類似のアーティスト名と人気、ジャンルを取得することができました。
#まとめ
今回はSpotify APIでできる楽曲の情報やアーティスト情報など色々取得することができました。
楽曲情報にはアコースティック感や踊れる曲、曲の過激さなどかなりの情報が含まれていて、この情報が高機能なサービスに繋がっているんだな〜と感じました。
また、アーティスト情報や類似のアーティストの情報も僕的にはかなり参考になるので、使ってみてよかったです！
また、Spotify APIを使って何かやってみようと思います。
#参考
以下の記事を参考にさせていただきました。ありがとうございました。
[Spotifyでトップチャートの曲(と自分の曲)の分析](https://qiita.com/kazuya-n/items/fbee07ef778e166cb6dd)
[Spotify APIで遊んでみる](https://qiita.com/musiccoffeetea/items/69a58d6d66e42b3c113f)