Ink

Contents related to tech, hobby, etc

Qutebrowserでのダウンロード先ディレクトリをrofiで選べるようにしてみた

|

Qutebrowserでのダウンロード先ディレクトリをrofiで選べるようにしてみた

Qutebrowserでは、ファイルをダウンロードする際に保存先を選ぶポップアップ?が出てくる。 しかし、これは前回使用したパスしかないし、タブキーでの補完もあまり上手く動かない(補完しようとすると 一つ上の階層を選択したりする)しで使い勝手があまりよくなかった。

私は、保存先がいくつかあってそれを使い分けるタイプなので、いっそのこと最初に表示する保存先の候補を リストから選択できるようにしよう、と思い立った。 Qutebrowserでも絞り込みとかはできるが、なんか挙動がいまいちに感じていたので、それならrofiを使ってやろう と思い立ったのがきっかけ。

どう動くのか

ゆーちゅーぶってヤツにデモ動画を上げてみたのでそちらを参照してほしい。 主には、今迄通りダウンロードをしようとするとrofiが(dmenuモードで)立ち上がり、 一つ選択したらそれが・選択されなかった場合は元のqutebrowserのアルゴリズムで選ばれたパスが ダウンロード先として表示される。

技術的詳解

詳解ってほどでもないけど...

qutebrowserのブラウザに関連する処理は qutebrowser/browser に集められている。 その中でもダウンロードに関係するのは qutebrowser/browser/downloads.py である。 一目瞭然なので。 ここのうち、パスを割り出すのに使っている部分が download_dir なので ここに処理を挟み込んだ。

Rofiを呼び出す際の注意点

  • 標準入力に渡すファイルオブジェクトは 必ず seek(0) すること

    • これを怠ると、読み込みのポインタがファイルの最後にあるので何も読めない

  • tempfile.TemporaryFile には mode="w+" オプション引数を付けてあげる

    • そうじゃないとバイナリを期待される。まぁどちらでも良いのかもだけどバイナリではないので。

  • rofi -dmenu の標準出力を CompletedProcess.stdout から取得すると、末尾に改行文字( \n )を含む

    • 外してあげないと表示がうまくいかない。空白があるように見えた。

Qutebrowserに新しい設定を組込む

この実装では downloads.location.favorite_paths という新しい設定項目を 追加している。 これは、 qutebrowser/config/configdata.yml というYAMLファイルをいじるだけで良い (少なくともそれで動いている、公式の情報を元にしていないため何かしら足りない可能性はある)