VimからSpotifyを使おう
はじめに
この記事は Vim Advent Calendar 10 日目の記事になります.
Vim で Spotify
Vim で Spotify を操作したい.
これは全人類の夢だと思います.
今回はそんな夢を叶えていきたいと思います.
Spotify のアプリを作成する
まず Spotify のアプリを作成します.
以下の Spotify for Developers にアクセスし, ログインを行ってください.
次に DASHBOARDD にアクセスし, CREATE AN APP をクリックします.
その後, 必要事項を記入し, 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