XREA.COM Logo XREA.COM Ad

作ったもの

18l ★:2007/01/07(日) 22:49:46 ID:???
WSHからSQLiteを操作して、M3UプレイリストをHogehoge2006にインポートする

WSHからSQLiteのデータベースを読み書きするライブラリを作るついでに作った。

(new ActiveXObject("WScript.Shell")).Exec()でsqlite3.exeを実行して、標準入出力を読み書きすれば出来るはずである。
しかし、Exec()の標準出力は、プログラムが終了してからでないと読み出せない。舐めんな。
出力をファイルにリダイレクトして、読み取り専用でファイルを開けば対話的に読み書き可能だという話を聞いたことがあるが、途中にcmd.exeを挟むのは癪に障る。
sqlite3.exeの「.output」コマンドで出力ファイルを指定してやれば、似たようなことが出来るらしい。しかも、クエリの結果しか出力されないので、わざわざプロンプトを読み飛ばしたりする手間もない。
一時ファイルが出来るのは邪魔だが、他に上手い方法は無さそうなのであきらめよう。

sqlite3.exeの出力形式には、csvやhtml、SQLクエリのような形式などいくつかの形式が使える。
listなど一部の形式は、結果の文字列値に区切り文字と同じ文字が含まれると正常にパース出来ないので役に立たない。
csv形式なら、文字列が「"」で囲まれ、改行が「\n」になったりするので、1行ずつ読んで「eval("[" line "]")」としてやるだけで簡単に配列に変換できそうである。
しかし、なぜか日本語の一部のバイトが変な風にエスケープされやがる。「\ooo」のような8進数形式らしい。
エスケープ後の「\」が日本語の上位バイトとくっついてしまうと、置換などでアンエスケープするのが困難になってしまい、打つ手がない。
csvはあきらめ、html形式を使うことに。
XMLDOMにXHTMLとして読み込んで、DOMオブジェクトとして処理する。
文字列値にHTMLタグが含まれていたときなど、「<」しか実体参照に変換しないようなので正常に読み込めるか不安だったが、そのままでも意外とうまくいった。
ActiveXObjectを生成したりするので、明らかにパフォーマンスが低そうだが、他に上手い方法は無さそうなのであきらめよう。

クエリに日本語が含まれるときの処理もやっかいである。
JScriptの内部ではUTF-8になっているが、Exec()の標準入力に送り込むときにShift_JISに変換されているらしい。
SQLiteの内部にはUTF-8で格納されているので、Shift_JISに変換されてしまうと都合が悪い。
ADODB.Streamで適当に変換して流し込んでやればうまくいくかと思ったが、Shift_JISとして正しくない部分が潰れてしまうためか、正常な結果が得られなかった。
仕方ないので、クエリを一旦UTF-8のテキストファイルとして保存し、「.read」コマンドで読み込ませることに。
かなり無駄なディスクアクセスが増えたが、他に上手い方法は無さそうなのであきらめよう。
そんな感じで、色々妥協しまくったが、とりあえず一通りまともに動作するようになった。


データベースをゼロから作って動作確認をするのが面倒だったので、Hogehoge2006のデータベースを実験台にする。
ついでだから、M3U形式のプレイリストファイルをHogehoge2006のクエリに変換してしまうツールを作ってみることに。
勝手に「imported_playlist」というテーブルを作成し、プレイリスト名、並び順、ファイル名を登録する。ちなみに、「playlist」というテーブル名はHogehoge2006内部で使われているらしく、勝手に作成すると正常動作しなくなる。
あとは、本来のデータベースである「list」テーブルと「imported_playlist」を結合して指定のプレイリストに登録された音楽ファイルの情報を列挙するようなSQL文を生成し、クエリ定義ファイルとして保存するようにすればいい。
この時、「select * from list〜」としたときと同じようにフィールドが並ぶようにしないといけない。「*」の代わりに「file_name,file_title,file_ext,file_size,tagTitle,tagArtist,tagAlbum,tagGenre,tagDate,tagComment,tagTracknumber,tagAPIC,tagLyrics,statDuration,statChannels,statSamplingrate,statBitrate,statVBR,infoCodec,infoCodec_sub,infoTagtype,gain,rating,playcount,lastplayed,modify」と書けばいいはずである。糞長い。
残りの部分は「SELECT (中略) FROM imported_playlist LEFT JOIN list ON list.file_name=imported_playlist.FileName WHERE ListName='PlaylistName' ORDER BY imported_playlist.ListNo」というような感じにする。
しかし、このままでは、クエリ実行後にHogehoge2006側でソートされてしまい、プレイリストの登録順が無視されてしまう。
これは「tagTracknumber」を「imported_playlist.ListNo」にすり替えてしまうことで無理矢理解決した。この技は、他のクエリ作成でも使えそうである。


そんなわけで、Hogehoge2006でも好きなように曲を並べて作ったプレイリストを再生できるようになった気がする。
普通のプレイリストを使いたければ、普通の音楽プレイヤーを使えばいいような気がするが。

投稿ファイル名: importPlaylist.zip
http://lukewarm.s151.xrea.com/b/file/1149783578_18.zip
サイズ: 2032 bytes
28KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08