Spotify APIの仕様についてまとめ

# はじめに
Spotify APIはドキュメントで明文化されていない仕様があったり、アプリで存在する機能がAPIでは提供されてないといったことがよくあります。
そこで、Spotify APIの仕様についてメモしてみました。

[Web API Reference](https://developer.spotify.com/documentation/web-api/reference/)(公式APIリファレンス)に記載されているエンドポイントごとに下記にまとめていきます。

2022年12月現在の情報のため、更新があれば修正します。
(誤りなどありましたら編集リクエスト、コメントなどいただけるとありがたいです。)

## Follow
### プレイリストのアンフォロー
https://developer.spotify.com/documentation/web-api/reference/follow/unfollow-playlist/
#### プレイリスト自体のデータは削除できない
上記エンドポイントは自分で作成したプレイリストのアンフォローもできますが、プレイリストのデータそのものを削除することはできません。
例えば、自分で作成したプレイリストのフォロワーが自分のアカウントのみの場合（Spotifyの仕様上プレイリスト作成時点で自動的に作成したプレイリストのフォロワーになります）にアンフォローのエンドポイントからリクエストをすると、自分のアカウントも含めアプリ上からアクセスができなくなります。(ただし、プレイリストのURLから直接アクセスすることはできます。)

## Player
https://developer.spotify.com/documentation/web-api/reference/player/

### ユーザーの再生状態の取得
https://developer.spotify.com/documentation/web-api/reference/#/operations/get-information-about-the-users-current-playback

#### 停止状態から10分経過すると情報が取得できなくなる
ユーザーのプレイヤーが停止してから10分間何も操作しない状態が続くとステータスが `200`から`204`に変わり、プレイヤーの情報が取得できなくなります。

### ユーザーの再生の開始、停止
https://developer.spotify.com/documentation/web-api/reference/#/operations/start-a-users-playback

#### Spotifyアプリを起動（再生）している状態でないと機能しない
仕様というより[バグ](https://github.com/spotify/web-api/issues/747)？
デスクトップアプリの場合、アプリを起動した状態であればAPIは機能する。
スマホアプリの場合、アプリを起動し、かつ何らかの楽曲を再生している状態でないと500エラーとなる。


## Playlists
https://developer.spotify.com/documentation/web-api/reference/playlists/

### プレイリスト情報の更新（プレイリスト名、公開状態、説明文）
https://developer.spotify.com/documentation/web-api/reference/playlists/change-playlist-details/

#### 説明文(description)を削除できない
プレイリストに説明文をつけることができるのですが、削除はできません。
リクエスト時にdescriptionを空で送ると`Attribute description is empty`とエラーが出てしまいます。

```Request_body.json
{
  "description": ""
}
```
##### 対処法
全角スペースを入れることで一応文字が入らない状態を再現することができます。
半角スペースだとできません。

```Request_body.json
{
  "description": "　"
}
```

### プレイリスト画像の取得
https://developer.spotify.com/documentation/web-api/reference/playlists/get-playlist-cover/

#### プレイリスト画像の種類
プレイリスト画像には以下の種類があり、それぞれでドメインが異なります。
- 自動生成の画像（ジャケット画像1枚） `https://i.scdn.co`
- 自動生成の画像（ジャケット画像が４枚組になった画像）　`https://mosaic.scdn.co`
- ユーザーが登録したプレイリスト画像 `https://pl.scdn.co`
- チャート系（バイラル、トップチャート） `https://charts-images.scdn.co`
- This is系 `https://thisis-images.scdn.co`
*一部例外あり

### プレイリスト画像のアップロード
https://developer.spotify.com/documentation/web-api/reference/playlists/upload-custom-playlist-cover/

#### 画像削除のAPIが存在しない
現状上記エンドポイントは以下の二点しかできません。
1. プレイリスト画像が登録されていない（デフォルト）状態からプレイリスト画像を設定する
2. プレイリスト画像が登録されている状態から別の画像に変更する
従って、プレイリスト画像をデフォルトの状態に戻す（削除）を行う操作は用意されていません。


## Search
https://developer.spotify.com/documentation/web-api/reference/search/search/

#### 日本語で結果が返ってこない
例えば`水曜日のカンパネラ`のような日本語で書かれているアーティストを検索した際、`Wednesday Campanella`と変換されて結果が返ってきてしまいます。
##### 対処法
その場合、[Accept-Language](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Accept-Language)ヘッダーをリクエスト時に付与することで日本語で結果が返ってきます。（公式ドキュメントに書いてほしい）
詳しくは[こちら](https://qiita.com/yumayamada1029/items/8bdb2e1d176c7e72db72)で書いてます。

#### ポッドキャストを検索する
ポッドキャストを検索する場合、`type`を`show`または`episode`を指定します。（両方指定することもできます）

```
https://api.spotify.com/v1/search?q=dan%20carlin&type=episode

https://api.spotify.com/v1/search?q=dan%20carlin&type=show

https://api.spotify.com/v1/search?q=dan%20carlin&type=episode,show
```


## Tracks
### トラック情報の取得
https://developer.spotify.com/documentation/web-api/reference/tracks/get-track/

#### 一部のトラックはプレビュー用のmp3が取得できない
試聴用に30秒のトラックのmp3が用意されていますが、権利関係などで一部のトラックは試聴用のmp3が取得できません。
取得できない場合、トラックオブジェクトの`preview_url`が`null`で返されます。