📄 taglib.cpp
字号:
f = FileRef( local_name ); LocaleFree( local_name );#endif if( f.isNull() ) return VLC_EGENERIC; if ( !f.tag() || f.tag()->isEmpty() ) return VLC_EGENERIC; p_demux_meta->p_meta = p_meta = vlc_meta_New(); Tag *p_tag = f.tag(); if( MPEG::File *p_mpeg = dynamic_cast<MPEG::File *>(f.file() ) ) { if( p_mpeg->ID3v2Tag() ) { ID3v2::Tag *p_tag = p_mpeg->ID3v2Tag(); ID3v2::FrameList list = p_tag->frameListMap()["UFID"]; ID3v2::UniqueFileIdentifierFrame* p_ufid; for( ID3v2::FrameList::Iterator iter = list.begin(); iter != list.end(); iter++ ) { p_ufid = dynamic_cast<ID3v2::UniqueFileIdentifierFrame*>(*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; if( psz_ufid ) { 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 = p_tag->frameListMap()["TXXX"]; ID3v2::UserTextIdentificationFrame* p_txxx; for( ID3v2::FrameList::Iterator iter = list.begin(); iter != list.end(); iter++ ) { p_txxx = dynamic_cast<ID3v2::UserTextIdentificationFrame*>(*iter); const char *psz_desc= p_txxx->description().toCString(); vlc_meta_AddExtra( p_meta, psz_desc, p_txxx->fieldList().toString().toCString()); }#if 0 list = p_tag->frameListMap()["RVA2"]; ID3v2::RelativeVolumeFrame* p_rva2; for( ID3v2::FrameList::Iterator iter = list.begin(); iter != list.end(); iter++ ) { p_rva2 = dynamic_cast<ID3v2::RelativeVolumeFrame*>(*iter); /* TODO: process rva2 frames */ }#endif list = p_tag->frameList(); ID3v2::Frame* p_t; char psz_tag[4]; for( ID3v2::FrameList::Iterator iter = list.begin(); iter != list.end(); iter++ ) { p_t = dynamic_cast<ID3v2::Frame*> (*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( Ogg::Vorbis::File *p_ogg_v = dynamic_cast<Ogg::Vorbis::File *>(f.file() ) ) { 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 ) { input_item_t *p_item = input_GetItem( p_input ); if( p_item ) input_item_SetDuration( p_item, (mtime_t) i_ogg_v_length * 1000000 ); 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( Ogg::FLAC::File *p_ogg_f = dynamic_cast<Ogg::FLAC::File *>(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 ) input_item_SetDuration( p_item, (mtime_t) i_ogg_f_length * 1000000 ); vlc_object_release( p_input ); } }#endif else if( FLAC::File *p_flac = dynamic_cast<FLAC::File *>(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 ) { input_item_t *p_item = input_GetItem( p_input ); if( p_item ) input_item_SetDuration( p_item, (mtime_t) i_flac_length * 1000000 ); vlc_object_release( p_input ); } }#define SET( foo, bar ) vlc_meta_Set##foo( p_meta, p_tag->bar ().toCString(true))#define SETINT( foo, bar ) { \ char psz_tmp[10]; \ snprintf( (char*)psz_tmp, 10, "%d", p_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 );#undef SET#undef SETINT DetectImage( f, p_demux ); return VLC_SUCCESS;}static int WriteMeta( vlc_object_t *p_this ){ playlist_t *p_playlist = (playlist_t *)p_this; meta_export_t *p_export = (meta_export_t *)p_playlist->p_private; input_item_t *p_item = p_export->p_item; if( p_item == NULL ) { msg_Err( p_this, "Can't save meta data of an empty input" ); return VLC_EGENERIC; } FileRef f( p_export->psz_file ); if( f.isNull() || !f.tag() || f.file()->readOnly() ) { msg_Err( p_this, "File %s can't be opened for tag writing\n", p_export->psz_file ); return VLC_EGENERIC; } msg_Dbg( p_this, "Writing metadata for %s", p_export->psz_file ); Tag *p_tag = f.tag(); char *psz_meta;#define SET(a,b) \ if(b) { \ String *psz_##a = new String( b, \ String::UTF8 ); \ p_tag->set##a( *psz_##a ); \ delete psz_##a; \ } psz_meta = input_item_GetArtist( p_item ); SET( Artist, psz_meta ); free( psz_meta ); psz_meta = input_item_GetTitle( p_item ); if( !psz_meta ) psz_meta = input_item_GetName( p_item ); String *psz_title = new String( psz_meta, String::UTF8 ); p_tag->setTitle( *psz_title ); delete psz_title; free( psz_meta ); psz_meta = input_item_GetAlbum( p_item ); SET( Album, psz_meta ); free( psz_meta ); psz_meta = input_item_GetGenre( p_item ); SET( Genre, psz_meta ); free( psz_meta );#undef SET psz_meta = input_item_GetDate( p_item ); if( psz_meta ) p_tag->setYear( atoi( psz_meta ) ); free( psz_meta ); psz_meta = input_item_GetTrackNum( p_item ); if( psz_meta ) p_tag->setTrack( atoi( psz_meta ) ); free( psz_meta ); if( ID3v2::Tag *p_id3tag = dynamic_cast<ID3v2::Tag *>(p_tag) ) {#define WRITE( foo, bar ) \ psz_meta = input_item_Get##foo( p_item ); \ if( psz_meta ) \ { \ ByteVector p_byte( bar, 4 ); \ ID3v2::TextIdentificationFrame p_frame( p_byte ); \ p_frame.setText( psz_meta ); \ p_id3tag->addFrame( &p_frame ); \ free( psz_meta ); \ } \ WRITE( Publisher, "TPUB" ); WRITE( Copyright, "TCOP" ); WRITE( EncodedBy, "TENC" ); WRITE( Language, "TLAN" );#undef WRITE } f.save(); return VLC_SUCCESS;}static int DownloadArt( vlc_object_t *p_this ){ /* We need to be passed the file name * Fetch the thing from the file, save it to the cache folder */ return VLC_EGENERIC;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -