【プログラマー必見！】コマンドラインで音楽を聞く♪（Spotify）

#はじめに

　プログラマーの皆さん，いかがお過ごしでしょうか？
プログラマーは，いかに快適にコーディングするかを自然に考えるのではないでしょうか(笑)．
また，日頃ターミナルで長い時間を過ごす方に，ターミナルで音楽を操作する方法を備忘録かねて，ご紹介したいと思います．
以下のGIFのように，Terminalで格好良くSpotifyが操作できます！
![75177190-91d4ab00-572d-11ea-80bd-c5e28c7b17ad.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262828/891e84af-87a3-6370-ca43-317ec05ea9b1.gif)
GIF(https://github.com/Rigellute/spotify-tui)

日本語の記事がなかったので，なるべく細かく書きたいと思います．

#メリット
・ブラウザやアプリと比較して軽量らしい（未調査）
・Terminalから離れずに選曲ができる

メリットは，いろいろありますが，やはりプログラマーの方だと，
音楽を操作するためだけに，キーボードのホームポジションから手を離したくないと思うのではないでしょうか．
そんな方にはぴったりだと思います．

# 環境
・M1 MacBook (Big Sur version 11.4)
・Spotify プレミアムアカウント（無料プランでは試していません．）

#インストール
まずは，Homebrewでspotifydとspotify-tuiをインストールします．

```
brew install spotifyd
brew install spotify-tui
```

<b>spotifyd</b>は，音楽を再生（ストリーミング）するための根本的な機能を持っており，
<b>spotify-tui</b>は，ターミナルで操作するための機能を持っています．
つまり，<b>spotify-tui</b>を使って，<b>spotifyd</b>を操作していきます．

# spotifydの設定
spotifydで音楽を再生する設定をしていきます．
ホームディレクトリの```.config```の中に，spotifydの設定ファイルを格納するフォルダとファイルを作っていきます．

```
mkdir -p ~/.config/spotifyd
emacs -nw ~/.config/spotifyd/spotifyd.conf
```

##spotifyd.conf
spotifyd.confを以下のように編集していきます．
usenameなどの文字列は，ダブルクォーテーション(")かシングルクォーテーション(')で囲ってあげないとエラーが出ますので注意してください．（参考記事では，文字列のまま書いている場合もある．）
各設定の，詳細は[参考記事](https://spotifyd.github.io/spotifyd/config/File.html)において，細かくコメントアウトに記載されています．

```spotifyd.conf
[global]
username = "username"

use_keyring = true

backend = "portaudio"

volume_controller = "softvol" 

device_name = "MyMac"
device_type = "computer"

# The audio bitrate. 96, 160 or 320 kbit/s
bitrate = 320

cache_path = "/Users/username/.cache/spotifyd"
no_audio_cache = false

volume_normalisation = true
normalisation_pregain = -10
```

confファイルの重要なところのみを解説します．

---
###```username = "username"```
usernameはspotifyのユーザー名です．

これは，spotifyのアカウントの詳細で確認できます．
（プロフィールにあるユーザー名を記入します．）
私の場合は乱数みたいなユーザー名でした．
![id.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262828/eb401a4a-dabf-f5b8-90ce-e48155dcaaf4.jpeg)

---
###```use_keyring = true```
これは，MacのKeychainを使って，

パスワード認証を有効にするという設定です．
この設定ファイルに```password = 'pass'```というように，パスワードを書くこともできますが，ファイルに直接パスワードを書くのは危険なので，キーチェインを使い自動で認証させます．
MacのKeychainにspotifyのユーザー名とパスワードを記憶させます．

```
security add-generic-password -s spotifyd -D rust-keyring -a username -w password
```

Keychain Accessで登録されていることを確認してください．
![keychain.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262828/075067af-28e0-7e77-3f60-5341d3a1245d.jpeg)

---
###```device_name = "MyMac"```
device_nameは，spotifyで表示され，再生する機器を選択するために表示されるデバイス名です．


---
###```cache_path = "/Users/username/.cache/spotifyd"```
cache_pathはストリーミングの際のキャッシュの保存先で，
no_audio_cacheはキャッシュを保存するかどうかです．
（no_audio_cacheなので，falseでキャッシュを残してくれます．）

##spotifyd起動

<!--
ここまでで，spotifydの
設定ができたら，サービスをリスタートします．

```
brew services restart spotifyd
```
-->

動作テストを，以下のコマンドで実施します．

```
spotifyd --no-demon
```

```Authenticated as "xxx" !```出力が出たら，テスト成功です．

上記のコマンドを実行したまま，ブラウザやスマホアプリで再生可能なデバイスを確認すると，
先ほど設定した```device_name```が出てると思います．

![device.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262828/5b587401-8eb9-7c5d-a97f-036ac1542e2c.jpeg)

今回設定した，デバイスを選択して，音楽が再生されたら成功です．

###自動起動の設定
最後に，spotifyd自動起動するように設定をします．

```/Library/LaunchDaemons/rustlang.spotifyd.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>rustlang.spotifyd</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/spotifyd</string>
            <string>--config-path=/Users/user/.config/spotifyd/spotifyd.conf</string>
            <string>--no-daemon</string>
        </array>
        <key>user</key>
        <string>user</string>
        <key>KeepAlive</key>
        <true/>
        <key>ThrottleInterval</key>
        <integer>30</integer>
    </dict>
</plist>
```

設定ファイルを読み込んで，自動起動するように設定します．

```
sudo launchctl load /Library/LaunchDaemons/rustlang.spotifyd.plist
sudo launchctl start /Library/LaunchDaemons/rustlang.spotifyd.plist
```

これで，spotifydの設定は完了です．

# spotify-tuiの設定と起動
最後に，ターミナルで曲を操作する```spotify-tui```ですが，
設定は，初めての起動時に認証をするのみです．

##認証の設定
https://developer.spotify.com/dashboard/applications

まず，上記のURLにアクセスしてspotifyにログインします．
1. create an appでappを作成したのち，App nameとApp descriptionを聞かれるので，
適当に設定します．
2. 作成後，表示されているClient IDとSHOW CLIENT SECRETを押して表示されたClient Secretをメモしていきます．
3. 作成したappでedit settingの```Redirect URIs```に以下のURLを記入します．

```
http://localhost:8888/callback
```

##起動
ターミナルに戻って，インストール後，```spt```コマンドでspotify-tuiを起動できます．

```
[user@localhost ~]$ spt

   _________  ____  / /_(_) __/_  __      / /___  __(_)
  / ___/ __ \/ __ \/ __/ / /_/ / / /_____/ __/ / / / / 
 (__  ) /_/ / /_/ / /_/ / __/ /_/ /_____/ /_/ /_/ / /  
/____/ .___/\____/\__/_/_/  \__, /      \__/\__,_/_/   
    /_/                    /____/                      

Config will be saved to /Users/user/.config/spotify-tui/client.yml

How to get setup:

  1. Go to the Spotify dashboard - https://developer.spotify.com/dashboard/applications
  2. Click `Create a Client ID` and create an app
  3. Now click `Edit Settings`
  4. Add `http://localhost:8888/callback` to the Redirect URIs
  5. You are now ready to authenticate with Spotify!

Enter your Client ID: 
xxxx

Enter your Client Secret:
xxxx

Enter port of redirect uri (default 8888): 
(そのままEnter)
```

```Enter your Client ID:```と，アカウント情報が求められるので入力します．
認証しspotify-tuiのアスキーアートが出たら，成功です！

##基本的な操作
基本的な操作をするためのキーバインドは以下のようになっています

|Key  |操作  
|---|---
|?  |ヘルプの表示 (ESCで抜ける)
|q  |tuiを抜ける
|d  |デバイスの選択
|v  |イコライザーの表示
|↑  |上に移動
|↓  |下に移動
|←  |左に移動
|→  |右に移動


キーバインドの詳細は，```?(shift+'?')```で，一覧を表示することができます．
また，再生可能なデバイスは，```d```で表示でき，選択できます．
Macで再生するために，先ほど設定した，device_nameが表示されているので，選択しEnterで決定します．

# まとめ

これで，キーボードのホームポジションから手を離さなくて済むのではないでしょうか！
そして，spotify-tuiはtmuxやScreenを張っておくと，バックグラウンドで動かしておけるので便利です．

でも，たまには，モニターから手と目を話して休んでください..(笑)
それでは，良いコーディングライフを♪

#参考記事

https://github.com/Spotifyd/spotifyd

https://github.com/Rigellute/spotify-tui

https://jonathanchang.org/blog/setting-up-spotifyd-on-macos/

https://spotifyd.github.io/spotifyd/Introduction.html

https://www.youtube.com/watch?v=R5jikGfSdh4

https://www.youtube.com/watch?v=4GocPVPBYuk&t=284s

https://github.com/Rigellute/spotify-tui/issues/626

[](
<?xml version="1.0" encoding="UTF-8"?>\
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\
<plist version="1.0">\
  <dict>\
    <key>Label</key>\
    <string>homebrew.mxcl.spotifyd</string>\
    <key>KeepAlive</key>\
    <true/>\
    <key>ThrottleInterval</key>\
    <integer>30</integer>\
    <key>ProgramArguments</key>\
    <array>\
        <string>/opt/homebrew/opt/spotifyd/bin/spotifyd</string>\
        <string>--no-daemon</string>\
        <string>--backend</string>\
        <string>portaudio</string>\
    </array>\
  </dict>\
</plist>\
)