俺はこれまでは audacious というオーディオプレーヤーを使っていたけど、新しい環境を KDE で構築したのでちと見た目がちぐはぐになるのがアレだと思い、試しに juk という奴を試してみた。別に俺はこの手のプレーヤーに多くの機能を欲していないので、まあなんていうか何でもいいんだけどな。
ところが juk を使ってみると、コレクション機能がアバウト極まりないことに気がついた。スクリーンショットを見ればわかるかもしれんけど、 juk でのコレクションは基本的に「ジャンル」「アーティスト」「アルバム」といった区分で、「アーティスト + アルバム」という区分ができず、同名のアルバムがあるとちょっと困ったことになる。ってか、 Paradise Lost のセルフタイトルのアルバムと Symphony X の Paradise Lost が被って困ってるんだよ!
幸いユーザが新規で独自のプレイリストを作成できるのでこの点はどうにでもなるが、わざわざ手動でやるのは心の底からバカらしい。そんな作業は機械にやらせろ、機械に。
そして非常に都合のいいことに、 KDE には DCOP というアプリケーション制御のためのインターフェイスが存在している。例えば juk の場合、コマンドラインから以下のように打ち込むことで、プレイリスト一覧を取得できる(事前に juk を起動しておくこと)。
chikara ~ $ dcop juk Collection playlists
コレクションリスト
履歴
Black Sabbath - Black Sabbath
Black Sabbath - Master Of Reality
Black Sabbath - Paranoid
:
:
他にもプレイリストの切り替えや作成も可能で、これを使えばどうにかなりそうである。この DCOP は Python や Perl へのバインディングが存在するので(ってかさっきの例は DCOP のシェルバインディングだし)、それを使って以下のようなスクリプトを作成した。
#!/usr/bin/python
# coding=utf-8
from glob import glob
import os
import pydcop
def create_all(juk, basedir):
col = juk.Collection
pl = col.playlists()
artists = glob(basedir + '/*')
albums = [(j, os.path.basename(i) + ' - ' + os.path.basename(j))
for i in artists for j in glob(i + '/*')]
for a in albums:
if a[1] not in pl:
create(col, a)
def create(collection, album):
collection.createPlaylist(album[1])
files = glob(album[0] + '/*')
collection.openFile(album[1], files)
def main(basedir):
if 'juk' not in pydcop.apps():
print '先に juk 起動させとけよ'
return -1
juk = pydcop.anyAppCalled('juk')
create_all(juk, basedir.rstrip('/'))
return 0
if __name__ == '__main__':
import sys
sys.exit(main(sys.argv[1]))
これでプレイリストを一発で更新できるようになった(こんな感じ)。使い方とか注意点は以下のとおり。
あとは適当にパネルにコマンドを追加しとけば、ワンクリックでプレイリストの更新ができるようになる。本当は juk の「再読み込み」にフックを引っ掛けられればいいんだけど、それはどうもできなさそうだからこの辺で妥協しとこう。
何か腹の調子がおかしい。やっぱあれか、昼間食ったタイ料理がまずかったか。というかパクチーがまずかったか。いやこれはもうパクチーが悪かったということにしておこう。
冗談でも何でもなく、未だに昼間に食ったパクチーの味が口の中に残ってる気がしているが、さすがにそれはないと思うのでこれはあれか、何かメンタル的なあれか、そうなのか、そうなんだな、畜生、俺はもう一生パクチー食わねえ。
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。