⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 taglib.cpp

📁 VLC Player Source Code
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    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 + -