VimからSpotifyを使おう

2021/12/11に公開

はじめに

この記事は Vim Advent Calendar 10 日目の記事になります.

Vim で Spotify

Vim で Spotify を操作したい.
これは全人類の夢だと思います.

今回はそんな夢を叶えていきたいと思います.

Spotify のアプリを作成する

まず Spotify のアプリを作成します.
以下の Spotify for Developers にアクセスし, ログインを行ってください.

次に DASHBOARDD にアクセスし, CREATE AN APP をクリックします.
DASHBOARDの画像

その後, 必要事項を記入し, CREATE をクリックしてください.
CREATEの画像

次に App 管理画面の Client ID と Client Secret を確保しておきます.
なんか画像

ここで取得した Client ID と Client Secret は以下のように環境変数へ登録してください.

$ export SPOTIFY_CLIENTID="取得したやつ"
$ export SPOTIFY_CLIENTSECRET="取得したやつ"

次に Redirect URI の設定を行います.
以下の EDIT SETTINGS を開いてください.
画像

そこに Redirect URIs という項目があると思います.
そこに https://localhost:5000/callback/ を登録してください.
その際に記入欄の横の ADD をクリックするのを忘れないでください.
ADD を押さなければ追加されません!
※僕はそれで30分近くを失いました

token を発行する

次に token を発行します.

token の発行を行う際の OAuth に証明書が必要になります.
今回は Go の generate_cert.go を使い発行しました.

$ go env GOROOT
/hogehoge/vimvim/sdk/go1.16.12 // ここは人によって違います

$ go run /hogehoge/vimvim/sdk/go1.16.12/src/crypto/tls/generate_cert.go --host=localhost

実際にサーバーを起動し, token を発行します.
こちらに token 発行用のサーバーを用意しました.

こちらを以下の手順で実行してください.

$ git clone https://github.com/higashi000/spovimfy

$ cd spovimfy

$ cp cert.pemへのPATH ./

$ cp key.pemへのPATH ./

$ go build

$ ./spovimfy

実行後, https://localhost:5000/ へアクセスしてください.

するとブラウザに謎の文字列が表示されていると思います.
それがあなたの token になります.

コピーした上でvimrcに let g:spotify_token='コピーしたもの' という形で書き込んでください.

実際に API を叩いてみよう

token の準備まで完了したので実際に API を叩いて見ましょう.
HTTP Requests には vital.vim を使わせていただきました.

まずは使っているプラグインマネージャーで vital.vim をインストールしましょう.

call dein#add('vim-jp/vital.vim')

~~中略~~

if dein#tap('vital.vim')
    let g:vitalizer#vital_dir = dein#get('vital.vim').rtp
endif
Plug 'vim-jp/vital.vim'

次に適当なディレクトリでvitalを使えるようにします.

Vim 起動前

$ mkdir vimdespotify

$ cd vimdespotify

$ mkdir plugin

$ mkdir autoload

$ touch plugin/vimdespotify.vim

$ touch autoload/vimdespotify.vim

$ vim

Vim 起動後

:Vitalize --name=vimdespotify . Web.HTTP +Web.JSON

音楽の再生/停止

まずは音楽の再生と停止を行います.

https://api.spotify.com/v1/me/player/play に対し, header に 認証情報をつけ, PUT でリクエストを送ることで音楽の再生ができます.
上記サイトでは context_uri というオプションでアルバムを指定していますが, つけなかった場合, 現在停止されている音楽が再生されます.

先程作成した autoload/vimdespotify.vim に以下を書き込んでください.

function! vimdespotify#play() abort
    let s:V = vital#vimdespotify#new()
    let s:H = s:V.import('Web.HTTP')
    let s:J = s:V.import('Web.JSON')

    let url = 'https://api.spotify.com/v1/me/player/play'

    let res = s:H.request('PUT', url, {'headers': {'Authorization': 'Bearer '.g:spotify_token}})


    if res['status'] == 204
        return 'success'
    else
        let content = s:J.decode(res['content'])
        echo content.error.message
    endif
endfunction

次に vimrc に set runtimepath+=先程作ったディレクトリへのPATH を追記してください.

set runtimepath+=/home/higashi/vimvim/vimdespotify

追記後, Vim を再起動し, 自分のスマートフォン / PC で Spotify を起動した状態で以下のコマンドを実行しましょう.

:call vimdespotify#play()

すると Spotify を開いていた端末から音楽が再生されます!
※ 著作権の都合上デモはないです.

次に再生している音楽を停止してみましょう.

https://api.spotify.com/v1/me/player/pause に対し, header に 認証情報をつけ, PUT でリクエストを送ることで再生している音楽の停止ができます.

先程作った関数の下に新しく関数を作成しましょう

function! vimdespotify#pause() abort
    let s:V = vital#vimdespotify#new()
    let s:H = s:V.import('Web.HTTP')
    let s:J = s:V.import('Web.JSON')

    let url = 'https://api.spotify.com/v1/me/player/pause'

    let res = s:H.request('PUT', url, {'headers': {'Authorization': 'Bearer '.g:spotify_token}})


    if res['status'] == 204
        return 'success'
    else
        let content = s:J.decode(res['content'])
        echo content.error.message
    endif
endfunction

この関数を実行することで音楽が停止されます.

ありそうなトラブル

No active device found

このエラーが発生した場合, 少し面倒ではありますがスマートフォン / PC などの端末で一度 Spotify を再生してください.

最後に

今回はお試しで再生 / 停止を行ってみました.
この他にも

  • アルバムを指定し再生
  • Skip
  • 検索
  • アーティスト取得

など様々な操作ができるようです.

ぜひ他の機能も試してみてください.

参考文献

Discussion