spotifyd で曲送りを通知する (アルバムアート付き)
Spotify 公式クライアントの MPRIS の実装に不満があった (具体的には複数アーティストが存在する曲で先頭の 1 つしか渡されないこと) ので spotifyd に移行したが,公式クライアントにあった曲送り時の通知が標準では存在しない。
spotifyd ではイベントをフックにスクリプトを呼び出すことができ,ドキュメントにもそれを用いた通知のサンプルが掲載されている。ただ,サンプルのようにわざわざ Spotify API を呼ぶまでもないような気がするし,アルバムアートを通知に含めたかったのでちょっとしたスクリプトを書いた。
#!/bin/sh
if [ "$PLAYER_EVENT" = "change" ];
then
curl -Lo ~/.cache/spotifyd/cover $(playerctl --player=spotifyd metadata --format "{{mpris:artUrl}}")
notify-send --hint string:image-path:"~/.cache/spotifyd/cover" "$(playerctl --player=spotifyd metadata --format="{{title}}")" "$(playerctl --player=spotifyd metadata --format="{{artist}} - {{album}}")"
fi
曲が変わった時に,MPRIS で提供されるアルバムアートの画像 URL を playerctl で取得,curl で保存して notify-send に渡している。注意が必要なのが,所定の場所以外に保存された画像ファイルを表示させたい時には --icon ではなく --hint string:image-path: を使う必要がある点。検索力 (ぢから) が足りずこれを見つけるのにだいぶ時間がかかった。
再生・停止の際などにも何か通知したいなら "$PLAYER_EVENT" = "start" || "stop" をそれぞれ掴んでやればいい。具体的なイベントの一覧はソースコードを見るのが良いだろう。
あとは spotifyd のコンフィグで on_song_change_hook = "/path/to/script" を指定するか起動時に --onevent /path/to/script を渡してやればいい。

このようにきちんとアルバムアートも表示される。curl でアルバムアートを取得する都合上少し通知が遅延するかと思ったが,特に気にならなかった。プリフェッチしておくのがベストだと思うが,面倒そう……
ついでに,公式クライアントの時は Spicetify で実現していた「ワンクリックで #NowPlaying 用の定型文をコピペする」機能も waybar からの右クリックでできるようにした。playerctl でアーティスト名,曲名,trackId を取得した上で trackId を sed で URL に変換し,wl-copy に渡している。
{
...
"custom/playerctl": {
...
"on-click-right": "wl-copy \"$(playerctl --player=spotifyd metadata --format \"#NowPlaying: {{artist}} - {{title}}\")\n$(playerctl --player=spotifyd metadata --format \"{{mpris:trackid}}\" | sed s@'/spotify/track'@'https://open.spotify.com/intl-ja/track'@ | xargs)\" && notify-send \"Copied #NowPlaying to clipboard!\""
}
}
うまいことやれば playerctl を 2 回呼び出さずに済むと思うが,別に大したオーバーヘッドもないと思うのでこのまま。
#NowPlaying: 初星学園, SHOW, Mitsu.J, 花海咲季, 月村手毬, 藤田ことね - がむしゃらに行こう! - 花海咲季・月村手毬・藤田ことね ver.
https://open.spotify.com/intl-ja/track/7zsSPRgnqYgtfwAwmeeMZe
このようなテキストがクリップボードにコピーされる。便利。