北海道に住みたいと言っているだけのブログ

Playcount sync

需要はないと思うけど、一応メモ。
去年からずっと苦しんでいた、foobar2000 + Playcount Syncが上手くいかない問題。
HOW TO: synchronise your last.fm playback stats with foobar - Hydrogenaudio Forums
Playcount Syncは、foobar2000のライブラリにLast.fmの再生回数やLove情報を同期させてくれるスクリプト
この方式の良い点は、携帯プレイヤーなどで再生した回数もPC上に同期できるという点(もちろん携帯プレイヤー上にLast.fmに情報を送信できるプラグインを入れる必要がある)。


問題は、いつごろだったか、Foobarの環境を少し変えたら全く情報が反映されなくなったこと。
Foobarのコンソールを見てみると「Database error.」の文字。
Foobarやプラグインをアンインストール→インストールしてみたが、状況は変わらず。
フォーラムを見ても報告されていなかったようなので、お手上げ状態でずっと放置していたが、今日ようやく解決できた。


まず、「Database error」の真意を調べないといけない。
C:/Users/・・・/AppData/Roaming/foobar2000/marc2003 にある「lastfm_sql.cmd」の12行目(%1 %2 <%3 の直後の行)に

pause > NUL

を追加。
修正前だと、エラーメッセージが出てもすぐウィンドウが消えてしまい出力が確認できないが「pause」によりキーボード入力があるまで処理を中断してくれる。
このあと、Playcount syncのハートを右クリック→「Library import」→「Loved tracks only」。これでlastfm_sql.cmdが実行される。
出てきたエラーメッセージは

unable to update "C:/Users/.../foobar2000/customdb_sqlite.db(みたいなニュアンスのやつ)

なるほどDBファイルに書き込めないとは。
こういうのは大抵読み取り専用になっていることが多いけど、特にチェックは入っていなかった。
原因を突き止めるべく調べてみたら、衝撃の事実が判明。
どうも、SQLiteのバージョンによってはマルチバイト文字を含むパスのファイル名は取り扱えない模様。要するに、Windowsのユーザー名に日本語を使う愚か者(自分)はplaycount syncを使う資格がないということ(汗)。
試しに、dbファイルをD:/とかにコピーして「C:/Users/・・・/AppData/Roaming/foobar2000/marc2003/common7.js」(スクリプトの心臓部)にある

fb.ProfilePath + "customdb_sqlite.db"

"D:/customdb_sqlite.db"

に置換(2箇所)、これでlibrary importをするとエラーなく実行できた。


ということで、ユーザー名に日本語などのマルチバイト文字を含んでいる人は以下の処理を行うと良いです:

  • 「C:/Users/ユーザー名/AppData/Roaming/foobar2000/customdb_sqlite.db」を任意のフォルダに移動させる。ただし以下を満たすフォルダとする:
    • マルチバイト文字を含まない
    • 書き換えに管理者権限の必要ないフォルダ
    • Cドライブ内(後述のハードリンクによる制約のため)
  • 「C:/Users/ユーザー名/AppData/Roaming/foobar2000/marc2003/common7.js」を開いて「fb.ProfilePath + "customdb_sqlite.db"」を「"移動させたフォルダの絶対パス/customdb_sqlite.db"」に置換。
  • customdb_sqlite.dbを置いたフォルダに移動し、管理者権限でコマンドプロンプトを起動し以下のコマンドを入力:

fsutil hardlink create C:/Users/ユーザー名/AppData/Roaming/foobar2000/customdb_sqlite.db customdb_sqlite.db

上記コマンドはハードリンクを作成するもの。Custom Database上でも移動先のDBを読ませるため。


これらがすべてうまく行けば、エラーなくplaycount syncが動くようになる。