2016年06月22日

UbuntuでBluemanがダウンロードディレクトリがないと言ってくる

Xubuntu16.04を入れていつものごとく LANG=C xdg-user-dirs-gtk-update でホームディレクトリ配下の日本語ディレクトリを英語化したところ、再起動時に下記のようなエラーが出るようになった。

Configured directory for incoming files does not exist

Please make sure that directory "/home/user/ダウンロード" exists or configure it with blueman-services

ディレクトリ名の変更で「/home/user/ダウンロード」だったのが「/home/user/Downloads」になったわけだけど、それをblueman側が認識できていないようだ。

何か設定が残っているのではないかとapt-get purgeからのinstallし直してみるも解消せず。

結論としては、下記のスクリプト(自作)を流すことで解消した。未検証のスクリプトなので利用する際は注意されたし。

#! /usr/bin/python3

from blueman.main.Config import Config
from gi.repository import GLib

dir = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD)
config = Config("org.blueman.transfer")
config.set_string('shared-path', dir)

print( config['shared-path'] )

原因としては上記のBluemanのConfigにset_stringされたものがgsettingsにキャッシュされたままになっていて、Blueman側はキャッシュを読みに行くようになっているのでホームディレクトリ配下のディレクトリ変更に追従できなかった模様。

Blueman側は最初に値をキャッシュする際は、下記のコードを使っている。

from gi.repository import GLib
GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD)
  #=>  /home/user/Downloads

この値は正しく取れる。

Configに設定されているキャッシュされた値を見ると、日本語のディレクトリ名が返ってくる。

from blueman.main.Config import Config
Config("org.blueman.transfer")["shared-path"]
  #=> '/home/user/ダウンロード'

このBluemanのConfigディレクトリ自体はGio.Settings(gsettings)を継承している。gsettingsの値はローカルファイルにキャッシュされており(うちの環境では ~/.config/dconf/user にバイナリ形式で保存されていた)、Bluemanをpurgeしてももちろん消えない。

gsettingsで設定されている値はコマンドラインでも参照できる。

$ gsettings get org.blueman.transfer shared-path

値の設定もコマンドライン上から実行可能。パスをベタで指定する際はこっち使った方が楽そう。

$ gsettings set org.blueman.transfer shared-path '/home/user/Downloads/'