2008年12月17日水曜日

libmtpの覚書

Amarokで同期できなかったので、仕方なく久方ぶりにWindowsXPを起動してWMPで同期しようとしたら、Microsoft Updateやらウィルススキャンやらが勝手に動いてまともに使えやしない。
おまけにWMPはGripでリッピングしたmp3のタグが読めないと来たもんだ。

結局Rhythmboxで転送したよ orz
アルバム分けしてくれないのが難なんだけどね。Amarokではアルバム分けしてくれるのになぁ。

少なくとも、一度GigabeatSとの接続セッションを切ると、デバイスを接続しなおさなきゃ(ソフトウェア上の操作でなく、実際にUSBケーブルを抜き差しする)再接続できないみたい。
同じlibmtpを使っていても、接続セッションを保ちつづけるソフトなら使えるが、一度何かを実行する度セッションを切ってしまうような物は少なくとも私のGigabeatSでは使えないだろう。mtp-toolsも結局一つ一つ別々のコマンドだから、シェルスクリプトで扱うにも駄目だろう。

GigabeatSでは、楽曲ファイル転送時に一緒に送るタグ情報のアルバムの項目には目もくれない。曲の転送とは別にアルバム情報のデータをGigabeatS上に作成してやらなきゃアルバム分けしてくれない。曲ファイル単体のタグの中のアルバム情報と、MTPデバイス上で扱うアルバム情報が明確に分けられている。そしてGigabeatSでは後者だけを使用する仕様みたい。

mtp-albumartコマンドでGigabeatS上の曲ファイルにアルバムアートを付加してやると、何故アルバム分けしてくれたのかというと↓

mtp-albumartコマンドのソースはこれらしい
http://libmtp.sourcearchive.com/documentation/0.3.4/albumart_8c-source.html
本来はlibmtpに付いてくるサンプルコードみたい。

このコード中では、LIBMTP_Create_New_Album関数でアルバム情報をデバイス上に作成してから、そのアルバム情報に対して、LIBMTP_Send_Representative_Sample関数でアルバムアートのデータを転送している。

アルバムアートを扱う専用の方法があるんじゃないかと思い込んでいたのだが、Send_AlbumArtみたいな関数は存在しない
Representative_Sampleというのは、アルバムを「代表するサンプル」という名前の通り、そのアルバムについてのサンプルとなる情報を設定するものだそうだ。要するに、サムネイル(アルバムアート)とか、プレビュー用に楽曲のサビの部分だとかを扱うもの。(参考:MTPの仕様書 http://www.usb.org/developers/devclass_docs/MTP_1.0.zip)
それが今回の場合はアルバムアートという訳。
LIBMTP_Send_Representative_Sample関数の説明を読むと、iRiverやCreativeのデバイスでもJPEGデータ(要するにアルバムアート/サムネイル)を扱うらしい。

ちなみにこのコードでは、既にアルバム情報が存在しているかどうかを確認せずに、必ず新たにアルバム情報を作成している。なので、コマンドを実行する度に新たなアルバムが出来る。まったく同じ内容を指定して実行すると、まったく同じ内容が作成されるだけだ。

既に存在している場合にそのアルバム情報を更新するには、LIBMTP_Get_Album_List,LIBMTP_Get_Album,LIBMTP_Update_Album,あたりの関数を使えば良いだろう。


libmtpのサイトを見ると、libmtpを使ったソフトの例が載っている。
http://libmtp.sourceforge.net/downstream.php

RhythmboxやAmarokなどのソフトや、RubyとPython向けのlibmtpのwrapperもある。

0 件のコメント: