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

続foobar2000 vs Last.fm

できた・・・
Playcount syncを利用してLast.fmの再生回数とfoobar2000の再生回数を同期させる格闘.
過去の記事にもあったのだけどかなり苦戦していた.
絶対に負けたくなかったので奮闘した結果,どうやらうまくいかない原因はデータベースへの書き込みがされていないということがわかった.
つまり,WSH側(JavaScriptのコード上の処理)からデータベースに書き込んでもうまく書き込まれないということ.
そこで,Custom Database側のActionからデータベースに書き込めばうまくいくことを利用して再生回数を書き込むことにした.
方法は以下の通り.
1. Last.fmから再生回数を取得・・・(a)
2. 曲のエントリ「LASTFM_PLAYCOUNT_DB」・・・(b)と比較
2-1. (a)>(b)であれば(b)-(a)回だけ以下の処理を行う
2-1-1. 「LASTFM_PLAYCOUNT_DB_OLD」を削除
2-1-2. 「LASTFM_PLAYCOUNT_DB_OLD」に「LASTFM_PLAYCOUNT_DB」+1を書き込む
(Actionで「$add(%LASTFM_PLAYCOUNT_DB,1)」する)
2-1-3. 「LASTFM_PLAUCOUNT_DB」を削除
2-1-4. 「LASTFM_PLAYCOUNT_DB」に「LASTFM_PLAYCOUNT_DB_OLD」の値を書き込む(コピー)
2-2. そうでなければ何もしない


なぜこのようなことをするのかというと, エントリに上書きすることが(なぜか)できないため,一度削除してから書き込まないといけないので,コピー(OLD)が必要になる.
ちなみに,LASTFM_PLAYCOUNT_DBエントリが存在しない曲にこの処理を行うと,再生回数分だけループが生じてデータベースに書き込む回数が再生回数の2倍になる.この処理が非常に重くて再生回数によってはソフトが見た目上フリーズしてしまう.もちろん処理が終われば元に戻る.そこで,+1ずつでは遅くなるため(i)差が1(ii)差が偶数(iii)差が奇数 の3つの場合に分けて,(i)の時は+1,(ii)の時は+2,(iii)の時は一度だけの+1から+2ずつ増加させることにした.
ちなみに2回目以降の再生ではLASTFM_PLAYCOUNT_DBに再生回数が記録されているためフリーズはほぼ起きないといってもいい.( (b)-(a)の値はわずかになると思われる)


ということで,非常に無理やりで頭の悪い処理を行なっているのだけどこれくらいしか思いつかない.
そもそも正規の方法でデータベースに書き込めないってどういうことだろう.自分の環境がおかしいとしか思えない.
それでもなんとかLast.fmと同期することができたので,たとえローカルの再生回数が消えてもクラウド上から再生回数を何度でも同期できるという強みがある.(WSHスクリプトが消えたら元も子もないが)