From: Rafaël Carré Date: Mon, 20 Aug 2007 20:14:08 +0000 (+0000) Subject: Factorizes code X-Git-Tag: 0.9.0-test0~6304 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=a1c8d9cf95dcb14ce09967306ef784bdbab40d8a;p=vlc Factorizes code --- diff --git a/modules/meta_engine/taglib.cpp b/modules/meta_engine/taglib.cpp index 52fc2ee299..6591fa1cf1 100644 --- a/modules/meta_engine/taglib.cpp +++ b/modules/meta_engine/taglib.cpp @@ -41,7 +41,9 @@ #include #include #include -//#include /* parse the tags without taglib helpers? */ +#if 0 /* parse the tags without taglib helpers? */ +#include +#endif static int ReadMeta ( vlc_object_t * ); static int DownloadArt ( vlc_object_t * ); @@ -96,183 +98,185 @@ static int ReadMeta( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t *)p_this; - if( !strncmp( p_demux->psz_access, "file", 4 ) ) - { - if( !p_demux->p_private ) - p_demux->p_private = (void*)vlc_meta_New(); - TagLib::FileRef f( p_demux->psz_path ); + if( strncmp( p_demux->psz_access, "file", 4 ) ) + return VLC_EGENERIC; + + TagLib::FileRef f( p_demux->psz_path ); + if( f.isNull() ) + return VLC_EGENERIC; + + if ( !f.tag() || f.tag()->isEmpty() ) + return VLC_EGENERIC; + + if( !p_demux->p_private ) + p_demux->p_private = (void*)vlc_meta_New(); + vlc_meta_t *p_meta = (vlc_meta_t *)(p_demux->p_private ); + TagLib::Tag *tag = f.tag(); - if( !f.isNull() ) + if( TagLib::MPEG::File *p_mpeg = + dynamic_cast(f.file() ) ) + { + if( p_mpeg->ID3v2Tag() ) { - if( TagLib::Ogg::Vorbis::File *p_ogg_v = - dynamic_cast(f.file() ) ) + TagLib::ID3v2::Tag *tag = p_mpeg->ID3v2Tag(); + TagLib::ID3v2::FrameList list = tag->frameListMap()["UFID"]; + TagLib::ID3v2::UniqueFileIdentifierFrame* p_ufid; + for( TagLib::ID3v2::FrameList::Iterator iter = list.begin(); + iter != list.end(); iter++ ) { - int i_ogg_v_length = p_ogg_v->audioProperties()->length(); - - input_thread_t *p_input = (input_thread_t *)vlc_object_find( p_demux, VLC_OBJECT_INPUT, FIND_PARENT ); - if( p_input ) + p_ufid = dynamic_cast(*iter); + const char *owner = p_ufid->owner().toCString(); + if (!strcmp( owner, "http://musicbrainz.org" )) { - input_item_t *p_item = input_GetItem( p_input ); - if( p_item ) - { - vlc_mutex_lock( &p_item->lock ); - p_item->i_duration = i_ogg_v_length * 1000000; - vlc_mutex_unlock( &p_item->lock ); - } - vlc_object_release( p_input ); + /* ID3v2 UFID contains up to 64 bytes binary data + * but in our case it will be a '\0' + * terminated string */ + char *psz_ufid = (char*) malloc( 64 ); + int j = 0; + while( ( j < 63 ) && + ( j < p_ufid->identifier().size() ) ) + psz_ufid[j] = p_ufid->identifier()[j++]; + psz_ufid[j] = '\0'; + vlc_meta_SetTrackID( p_meta, psz_ufid ); + free( psz_ufid ); } } -#if 0 /* at this moment, taglib is unable to detect ogg/flac files - * becauses type detection is based on file extension: - * ogg = ogg/vorbis - * flac = flac - * ø = ogg/flac - */ - else if( TagLib::Ogg::FLAC::File *p_ogg_f = - dynamic_cast(f.file() ) ) + + list = tag->frameListMap()["TXXX"]; + TagLib::ID3v2::UserTextIdentificationFrame* p_txxx; + for( TagLib::ID3v2::FrameList::Iterator iter = list.begin(); + iter != list.end(); iter++ ) { - long i_ogg_f_length = p_ogg_f->streamLength(); - input_thread_t *p_input = (input_thread_t *)vlc_object_find( p_demux, VLC_OBJECT_INPUT, FIND_PARENT ); - if( p_input ) - { - input_item_t *p_item = input_GetItem( p_input ); - if( p_item ) - { - vlc_mutex_lock( &p_item->lock ); - p_item->i_duration = i_ogg_f_length * 1000000; - vlc_mutex_unlock( &p_item->lock ); - } - vlc_object_release( p_input ); - } + p_txxx = dynamic_cast(*iter); + const char *psz_desc= p_txxx->description().toCString(); +#if 0 /* musicbrainz artist and album id: not useful (yet?) */ + if( !strncmp( psz_desc, "MusicBrainz Artist Id", 21 ) ) + vlc_meta_SetArtistID( p_meta, + p_txxx->fieldList().toString().toCString()); + if( !strncmp( psz_desc, "MusicBrainz Album Id", 20 ) ) + vlc_meta_SetAlbumID( p_meta, + p_txxx->fieldList().toString().toCString()); +#endif + vlc_meta_AddExtra( p_meta, psz_desc, + p_txxx->fieldList().toString().toCString()); + } +#if 0 + list = tag->frameListMap()["RVA2"]; + TagLib::ID3v2::RelativeVolumeFrame* p_rva2; + for( TagLib::ID3v2::FrameList::Iterator iter = list.begin(); + iter != list.end(); iter++ ) + { + p_rva2 = dynamic_cast(*iter); + /* TODO: process rva2 frames */ } #endif - else if( TagLib::FLAC::File *p_flac = - dynamic_cast(f.file() ) ) + list = tag->frameList(); + TagLib::ID3v2::Frame* p_t; + char psz_tag[4]; + for( TagLib::ID3v2::FrameList::Iterator iter = list.begin(); + iter != list.end(); iter++ ) { - long i_flac_length = p_flac->audioProperties()->length(); - input_thread_t *p_input = (input_thread_t *)vlc_object_find( p_demux, VLC_OBJECT_INPUT, FIND_PARENT ); - if( p_input ) - { - input_item_t *p_item = input_GetItem( p_input ); - if( p_item ) - { - vlc_mutex_lock( &p_item->lock ); - p_item->i_duration = i_flac_length * 1000000; - vlc_mutex_unlock( &p_item->lock ); - } - vlc_object_release( p_input ); - } + p_t = dynamic_cast (*iter); + memcpy( psz_tag, p_t->frameID().data(), 4); + +#define SET( foo, bar ) if( !strncmp( psz_tag, foo, 4 ) ) \ +vlc_meta_Set##bar( p_meta, p_t->toString().toCString(true)) + SET( "TPUB", Publisher ); + SET( "TCOP", Copyright ); + SET( "TENC", EncodedBy ); + SET( "TLAN", Language ); + //SET( "POPM", Rating ); /* rating needs special handling in id3v2 */ + //if( !strncmp( psz_tag, "RVA2", 4 ) ) + /* TODO */ +#undef SET } } + } + + else if( TagLib::Ogg::Vorbis::File *p_ogg_v = + dynamic_cast(f.file() ) ) + { + int i_ogg_v_length = p_ogg_v->audioProperties()->length(); - if( !f.isNull() && f.tag() && !f.tag()->isEmpty() ) + input_thread_t *p_input = (input_thread_t *) + vlc_object_find( p_demux,VLC_OBJECT_INPUT, FIND_PARENT ); + if( p_input ) + { + input_item_t *p_item = input_GetItem( p_input ); + if( p_item ) + { + vlc_mutex_lock( &p_item->lock ); + p_item->i_duration = i_ogg_v_length * 1000000; + vlc_mutex_unlock( &p_item->lock ); + } + vlc_object_release( p_input ); + } + + } +#if 0 /* at this moment, taglib is unable to detect ogg/flac files +* becauses type detection is based on file extension: +* ogg = ogg/vorbis +* flac = flac +* ø = ogg/flac +*/ + else if( TagLib::Ogg::FLAC::File *p_ogg_f = + dynamic_cast(f.file() ) ) + { + long i_ogg_f_length = p_ogg_f->streamLength(); + input_thread_t *p_input = (input_thread_t *) + vlc_object_find( p_demux, VLC_OBJECT_INPUT, FIND_PARENT ); + if( p_input ) + { + input_item_t *p_item = input_GetItem( p_input ); + if( p_item ) + { + vlc_mutex_lock( &p_item->lock ); + p_item->i_duration = i_ogg_f_length * 1000000; + vlc_mutex_unlock( &p_item->lock ); + } + vlc_object_release( p_input ); + } + } +#endif + else if( TagLib::FLAC::File *p_flac = + dynamic_cast(f.file() ) ) + { + long i_flac_length = p_flac->audioProperties()->length(); + input_thread_t *p_input = (input_thread_t *) + vlc_object_find( p_demux, VLC_OBJECT_INPUT, FIND_PARENT ); + if( p_input ) { - TagLib::Tag *tag = f.tag(); - vlc_meta_t *p_meta = (vlc_meta_t *)(p_demux->p_private ); + input_item_t *p_item = input_GetItem( p_input ); + if( p_item ) + { + vlc_mutex_lock( &p_item->lock ); + p_item->i_duration = i_flac_length * 1000000; + vlc_mutex_unlock( &p_item->lock ); + } + vlc_object_release( p_input ); + } + } #define SET( foo, bar ) vlc_meta_Set##foo( p_meta, tag->bar ().toCString(true)) #define SETINT( foo, bar ) { \ - char psz_tmp[10]; \ - snprintf( (char*)psz_tmp, 10, "%d", tag->bar() ); \ - vlc_meta_Set##foo( p_meta, (char*)psz_tmp ); \ - } + char psz_tmp[10]; \ + snprintf( (char*)psz_tmp, 10, "%d", tag->bar() ); \ + vlc_meta_Set##foo( p_meta, (char*)psz_tmp ); \ +} - SET( Title, title ); - SET( Artist, artist ); - SET( Album, album ); - SET( Description, comment ); - SET( Genre, genre ); - SETINT( Date, year ); - SETINT( Tracknum , track ); + SET( Title, title ); + SET( Artist, artist ); + SET( Album, album ); + SET( Description, comment ); + SET( Genre, genre ); + SETINT( Date, year ); + SETINT( Tracknum , track ); #undef SET #undef SETINT - if( TagLib::MPEG::File *p_mpeg = - dynamic_cast(f.file() ) ) - { - if( p_mpeg->ID3v2Tag() ) - { - TagLib::ID3v2::Tag *tag = p_mpeg->ID3v2Tag(); - TagLib::ID3v2::FrameList list = tag->frameListMap()["UFID"]; - TagLib::ID3v2::UniqueFileIdentifierFrame* p_ufid; - for( TagLib::ID3v2::FrameList::Iterator iter = list.begin(); - iter != list.end(); iter++ ) - { - p_ufid = dynamic_cast(*iter); - const char *owner = p_ufid->owner().toCString(); - if (!strcmp( owner, "http://musicbrainz.org" )) - { - /* ID3v2 UFID contains up to 64 bytes binary data - * but in our case it will be a '\0' - * terminated string */ - char *psz_ufid = (char*) malloc( 64 ); - int j = 0; - while( ( j < 63 ) && - ( j < p_ufid->identifier().size() ) ) - psz_ufid[j] = p_ufid->identifier()[j++]; - psz_ufid[j] = '\0'; - vlc_meta_SetTrackID( p_meta, psz_ufid ); - free( psz_ufid ); - } - } - - list = tag->frameListMap()["TXXX"]; - TagLib::ID3v2::UserTextIdentificationFrame* p_txxx; - for( TagLib::ID3v2::FrameList::Iterator iter = list.begin(); - iter != list.end(); iter++ ) - { - p_txxx = dynamic_cast(*iter); - const char *psz_desc= p_txxx->description().toCString(); -#if 0 /* musicbrainz artist and album id: not useful (yet?) */ - if( !strncmp( psz_desc, "MusicBrainz Artist Id", 21 ) ) - vlc_meta_SetArtistID( p_meta, - p_txxx->fieldList().toString().toCString()); - if( !strncmp( psz_desc, "MusicBrainz Album Id", 20 ) ) - vlc_meta_SetAlbumID( p_meta, - p_txxx->fieldList().toString().toCString()); -#endif - vlc_meta_AddExtra( p_meta, psz_desc, - p_txxx->fieldList().toString().toCString()); - } -#if 0 - list = tag->frameListMap()["RVA2"]; - TagLib::ID3v2::RelativeVolumeFrame* p_rva2; - for( TagLib::ID3v2::FrameList::Iterator iter = list.begin(); - iter != list.end(); iter++ ) - { - p_rva2 = dynamic_cast(*iter); - /* TODO: process rva2 frames */ - } -#endif - list = tag->frameList(); - TagLib::ID3v2::Frame* p_t; - char psz_tag[4]; - for( TagLib::ID3v2::FrameList::Iterator iter = list.begin(); - iter != list.end(); iter++ ) - { - p_t = dynamic_cast (*iter); - memcpy( psz_tag, p_t->frameID().data(), 4); + DetectImage( f, p_meta ); -#define SET( foo, bar ) if( !strncmp( psz_tag, foo, 4 ) ) \ - vlc_meta_Set##bar( p_meta, p_t->toString().toCString(true)) - SET( "TPUB", Publisher ); - SET( "TCOP", Copyright ); - SET( "TENC", EncodedBy ); - SET( "TLAN", Language ); - //SET( "POPM", Rating ); - //if( !strncmp( psz_tag, "RVA2", 4 ) ) - /* TODO */ -#undef SET - } - } - } - - DetectImage( f, p_meta ); - - return VLC_SUCCESS; - } - } - return VLC_EGENERIC; + return VLC_SUCCESS; } #define SET(a,b) if(b) { \