タイトルのとおり。
Repository: rofi-mpd-client
Rofi
rofi は i3 のようなタイル型ウィンドウマネージャーでよく用いられているランチャーです。
基本的な動作としては、選びたい項目を rofi に渡すとリストとして表示され、選択した項目(の文字列)を返すといったものです。
よく使われているのは上のようにプログラムを選択するランチャーとしてですが、上記のように入力を手動で与えることができるので、色々活用方法が考えられます。
実際に rofi の wiki ページにはユーザーが作成したスクリプトがいくつか紹介されています。(User scripts)
今回作った MPD のクライアントも 2 つ紹介されているのですが、自分がよく使う機能だったり欲しい機能だったりがなかったりしたので、作ってみることにしました。
最初は例のごとくシェルスクリプトで作ろうと思ったのですが、挫折したのでおとなしく python3 で記述しました。
MPD へアクセスするために上記のスクリプトではいずれもmpc
という CLI クライアントを利用していたのですが、いちいち subprocess モジュールで呼び出すのもなんかなあって感じだったので、Python のモジュールないか探していたらありました。
python-musicpd
というモジュールです(数年前に更新がストップしていますが使うには問題ないです)。これはクライアントというよりはラッパーのようなものなので、mpc
よりも柔軟に機能を呼び出せそうです。
Rofi-mpd-client
一番上は rofi おなじみの検索バーです。インクリメンタルサーチ可能です。
2 列目は今再生している曲を表示します。またプレイリストにおける現在の位置も最後尾に表示します。
そして選択リストでは、再生/停止コマンドと曲をプレイリストに追加します。私の環境ではアーティスト名/アルバム名/のようなフォルダ構造にしているので、MPD のインデックスにおける root の場所では追加できないようにしています。
一応アルバムを選択すると曲まで表示しますが、曲を選択してもそれに対しては未実装なので何も起きません。
これ CLI ファイラーのように見えますが、rofi なのでなにか選択する毎に一旦 rofi は終了します。そして再び立ち上がる、といった動作をするのでチカチカします。
メモ
フォルダ間を遷移させるために rofi を何回も起動させなければいけなかったので、
while 1
rofi.start()
みたいに書いていたら、rofi が終了できなくなって詰みかけました。(rofi が最前面に表示され、rofi への入力が最優先される仕様上、いかなるキーのタイプを受け付けないのが理由です)
対策として rofi から返ってくる要素がない場合 while ループから脱出するようにしました。つまり Esc キーを押せば rofi はなんの要素も選択されることなく終了するので、rofi の無限ループは起こりません。