[Linux] Amarok + Lyrics ID3 + libgpod を使って iPod に歌詞を転送
iPod とのやりとりを行うフリーなライブラリに libgpod があります.私が使用しているフリーの音楽プレイヤー Amarok はこれを使用して iPod にデータを転送しています.
さて,Apple の説明にもある通り,第 5 世代の iPod と iPod nano には歌詞を表示する機能があります.これは,ID3v2.3 タグに記録された歌詞データ用のフレーム (USLT) に記録された歌詞を表示する,というものです.CVS スナップショット版の libgpod では既に利用可能のようです.
そして,Amarok を使って ID3 タグに歌詞データを埋め込むための Amarok スクリプトもあります.このスクリプトは,Amarok の歌詞スクリプトで取り込んだ歌詞 (もしくは手入力した歌詞) を MP3 ファイルの ID3v2.3 タグに直接書き込んでいく,というものです.
これで土台は整いました.というわけで,iPod で歌詞を表示するために以下のような手順を試してみました.
- libgpod をインストールする.
- libgpod サポートを有効にした Amarok をインストールする.
- Lyrics ID3 スクリプトをインストールし,歌詞スクリプトを使用して別途取り込んだ歌詞を MP3 ファイルに書き込む.
- Amarok の「メディアデバイス」機能を使用して,Amarok から iPod に MP3 データを転送する.
- (上に書いた歌詞表示要件を満たす) iPod で転送した曲を再生し,歌詞が表示できるかを確認する.
Amarok-1.4.2_beta1 と 2006 年 8 月 29 日 17 時 18 分現在のスナップショットによる libgpod で試したところ... 歌詞が表示されませんでした.あれ?
libgpod 側は問題ないと仮定して,Amarok のソースコードを眺めてみると... 歌詞の有無を iPod 側に通知するためのフラグ変数 (lyrics_flag) には触れていなかったので,これが原因とみて,試しに簡易パッチを作成しました.以下に,Amarok-1.4.2_beta1 に対するパッチを載せておきます.ライセンスは GPL とします (従って無保証です).
diff -urN amarok-1.4.2-beta1-orig/amarok/src/mediadevice/ipod/ipodmediadevice.cpp amarok-1.4.2-beta1-modified/amarok/src/mediadevice/ipod/ipodmediadevice.cpp --- amarok-1.4.2-beta1-orig/amarok/src/mediadevice/ipod/ipodmediadevice.cpp 2006-08-20 17:15:33.000000000 +0900 +++ amarok-1.4.2-beta1-modified/amarok/src/mediadevice/ipod/ipodmediadevice.cpp 2006-08-20 17:35:42.000000000 +0900 @@ -47,6 +47,9 @@ #include <cstdlib> #include <unistd.h> +#include <mpegfile.h> +#include <id3v2tag.h> +#include <id3v2frame.h> // disable if it takes too long for you #define CHECK_FOR_INTEGRITY 1 @@ -198,6 +201,7 @@ m_playlistItem = 0; m_supportsArtwork = false; m_supportsVideo = false; + m_supportsLyrics = false; m_isShuffle = true; m_requireMount = true; @@ -433,6 +437,23 @@ } } + if( m_supportsLyrics && type == "mp3" ) + { + // set lyrics_flag to non-zero when 'USLT' ID3v2 tag field is available. + TagLib::MPEG::File f( QFile::encodeName( bundle.url().path() ) ); + TagLib::ID3v2::Tag *id3v2tag = f.ID3v2Tag( false ); + if ( id3v2tag != 0 ) + { + const TagLib::ID3v2::FrameList frameList = + id3v2tag->frameListMap()["USLT"]; + if ( !frameList.isEmpty() ) + { + // found USLT tag field + track->lyrics_flag = 1; + } + } + } + return addTrackToView( track, item ); } @@ -878,6 +899,7 @@ m_isShuffle = true; m_supportsArtwork = false; m_supportsVideo = false; + m_supportsLyrics = false; m_dbChanged = false; m_files.clear(); @@ -1014,6 +1036,14 @@ default: break; } + + if( ipodInfo->ipod_generation + || ipodInfo->ipod_model == ITDB_IPOD_MODEL_NANO_WHITE + || ipodInfo->ipod_model == ITDB_IPOD_MODEL_NANO_BLACK ) + { + m_supportsLyrics = true; + debug() << "detected lyrics-displayable iPod" << endl; + } } if( modelString ) diff -urN amarok-1.4.2-beta1-orig/amarok/src/mediadevice/ipod/ipodmediadevice.h amarok-1.4.2-beta1-modified/amarok/src/mediadevice/ipod/ipodmediadevice.h --- amarok-1.4.2-beta1-orig/amarok/src/mediadevice/ipod/ipodmediadevice.h 2006-08-20 17:15:33.000000000 +0900 +++ amarok-1.4.2-beta1-modified/amarok/src/mediadevice/ipod/ipodmediadevice.h 2006-08-20 17:15:42.000000000 +0900 @@ -115,6 +115,7 @@ bool m_isShuffle; bool m_supportsArtwork; bool m_supportsVideo; + bool m_supportsLyrics; IpodMediaItem *getArtist( const QString &artist ); IpodMediaItem *getAlbum( const QString &artist, const QString &album );
パッチの中身は概ね次の通りです.
- 接続された iPod の種類を確認し,歌詞表示機能を持ったものかどうかをチェックする.
- 歌詞表示機能を有する iPod であった場合,転送する MP3 ファイルの ID3v2.3 タグに USLT フレームの有無を調べ,あればフラグ変数 (lyrics_flag) をセットする.
このパッチを適用した Amarok を使用し,曲データの転送を行ったところ,無事に歌詞を転送することができました.というわけで,めでたしめでたし.
本家 Amarok 側でもっとより良い修正が加えられるまでのつなぎとして使ってみます.
トラックバック
トラックバック URI: https://www.pakunet.jp/hoge/trackback/2006082901
トラックバックはありません.