X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmeta_engine%2Ftaglib.cpp;h=11bcfdf87c964a04bbb03d6954c4cdbea2b4040c;hb=4f4d1a58241dd254b5d8555a4c094e5b6c3b907e;hp=2d01ce90a54592ba03293302c2c05a3414abacd1;hpb=6041d1db33ee429f113ecddb729c8840a025ec02;p=vlc diff --git a/modules/meta_engine/taglib.cpp b/modules/meta_engine/taglib.cpp index 2d01ce90a5..11bcfdf87c 100644 --- a/modules/meta_engine/taglib.cpp +++ b/modules/meta_engine/taglib.cpp @@ -29,12 +29,13 @@ #include #include -#include #include #include #include #include #include +#include +#include /* for attachment_new */ #ifdef WIN32 # include @@ -63,6 +64,10 @@ # include #endif +#ifdef TAGLIB_WITH_MP4 +# include +#endif + #include #include #include @@ -89,7 +94,7 @@ using namespace TagLib; /** - * Read meta informations from APE tags + * Read meta information from APE tags * @param tag: the APE tag * @param p_demux; the demux object * @param p_demux_meta: the demuxer meta @@ -151,7 +156,7 @@ static void ReadMetaFromId3v2( ID3v2::Tag* tag, demux_t* p_demux, demux_meta_t* p_txxx->fieldList().toString().toCString( true ) ); } - // Get some more informations + // Get some more information #define SET( tagName, metaName ) \ list = tag->frameListMap()[tagName]; \ if( !list.isEmpty() ) \ @@ -266,7 +271,7 @@ static void ReadMetaFromId3v2( ID3v2::Tag* tag, demux_t* p_demux, demux_meta_t* /** - * Read the meta informations from XiphComments + * Read the meta information from XiphComments * @param tag: the Xiph Comment * @param p_demux; the demux object * @param p_demux_meta: the demuxer meta @@ -317,7 +322,28 @@ static void ReadMetaFromXiph( Ogg::XiphComment* tag, demux_t* p_demux, demux_met vlc_meta_SetArtURL( p_meta, "attachment://cover" ); } - +#if defined(TAGLIB_WITH_MP4) && defined(HAVE_TAGLIB_MP4COVERART_H) +static void ReadMetaFromMP4( MP4::Tag* tag, demux_t *p_demux, demux_meta_t *p_demux_meta, vlc_meta_t* p_meta ) +{ + if( tag->itemListMap().contains("covr") ) + { + MP4::CoverArtList list = tag->itemListMap()["covr"].toCoverArtList(); + const char *psz_format = list[0].format() == MP4::CoverArt::PNG ? "image/png" : "image/jpeg"; + + msg_Dbg( p_demux_meta, "Found embedded art (%s) is %i bytes", + psz_format, list[0].data().size() ); + + TAB_INIT( p_demux_meta->i_attachments, p_demux_meta->attachments ); + input_attachment_t *p_attachment = + vlc_input_attachment_New( "cover", psz_format, "cover", + list[0].data().data(), list[0].data().size() ); + TAB_APPEND_CAST( (input_attachment_t**), + p_demux_meta->i_attachments, p_demux_meta->attachments, + p_attachment ); + vlc_meta_SetArtURL( p_meta, "attachment://cover" ); + } +} +#endif /** * Get the tags from the file using TagLib @@ -332,21 +358,33 @@ static int ReadMeta( vlc_object_t* p_this) FileRef f; p_demux_meta->p_meta = NULL; + if( strcmp( p_demux->psz_access, "file" ) ) + return VLC_EGENERIC; + char *psz_path = strdup( p_demux->psz_file ); + if( !psz_path ) + return VLC_ENOMEM; #if defined(WIN32) || defined (UNDER_CE) wchar_t wpath[MAX_PATH + 1]; - if( !MultiByteToWideChar( CP_UTF8, 0, p_demux->psz_path, -1, wpath, MAX_PATH) ) + if( !MultiByteToWideChar( CP_UTF8, 0, psz_path, -1, wpath, MAX_PATH) ) + { + free( psz_path ); return VLC_EGENERIC; + } wpath[MAX_PATH] = L'\0'; f = FileRef( wpath ); #else - const char* local_name = ToLocale( p_demux->psz_path ); + const char* local_name = ToLocale( psz_path ); if( !local_name ) + { + free( psz_path ); return VLC_EGENERIC; + } f = FileRef( local_name ); LocaleFree( local_name ); #endif + free( psz_path ); if( f.isNull() ) return VLC_EGENERIC; @@ -392,6 +430,13 @@ static int ReadMeta( vlc_object_t* p_this) else if( flac->xiphComment() ) ReadMetaFromXiph( flac->xiphComment(), p_demux, p_demux_meta, p_meta ); } +#if defined(TAGLIB_WITH_MP4) && defined(HAVE_TAGLIB_MP4COVERART_H) + else if( MP4::File *mp4 = dynamic_cast(f.file()) ) + { + if( mp4->tag() ) + ReadMetaFromMP4( mp4->tag(), p_demux, p_demux_meta, p_meta ); + } +#endif else if( MPC::File* mpc = dynamic_cast(f.file()) ) { if( mpc->APETag() ) @@ -439,7 +484,7 @@ static int ReadMeta( vlc_object_t* p_this) /** - * Write meta informations to APE tags + * Write meta information to APE tags * @param tag: the APE tag * @param p_item: the input item */ @@ -497,7 +542,7 @@ static void WriteMetaToId3v2( ID3v2::Tag* tag, input_item_t* p_item ) /** - * Write the meta informations to XiphComments + * Write the meta information to XiphComments * @param tag: the Xiph Comment * @param p_input: the input item */ @@ -539,26 +584,16 @@ static int WriteMeta( vlc_object_t *p_this ) return VLC_EGENERIC; } - char *export_file = strdup(p_export->psz_file); - if( decode_URI( export_file ) == NULL ) - { - free( export_file ); - return VLC_EGENERIC; - } - #if defined(WIN32) || defined (UNDER_CE) wchar_t wpath[MAX_PATH + 1]; - if( !MultiByteToWideChar( CP_UTF8, 0, export_file , -1, wpath, MAX_PATH) ) + if( !MultiByteToWideChar( CP_UTF8, 0, p_export->psz_file, -1, wpath, MAX_PATH) ) return VLC_EGENERIC; wpath[MAX_PATH] = L'\0'; f = FileRef( wpath ); #else - const char* local_name = ToLocale( export_file ); + const char* local_name = ToLocale( p_export->psz_file ); if( !local_name ) - { - free( export_file ); return VLC_EGENERIC; - } f = FileRef( local_name ); LocaleFree( local_name ); #endif @@ -566,13 +601,11 @@ static int WriteMeta( vlc_object_t *p_this ) if( f.isNull() || !f.tag() || f.file()->readOnly() ) { msg_Err( p_this, "File %s can't be opened for tag writing", - export_file ); - free( export_file ); + p_export->psz_file ); return VLC_EGENERIC; } - msg_Dbg( p_this, "Writing metadata for %s", export_file ); - free( export_file ); + msg_Dbg( p_this, "Writing metadata for %s", p_export->psz_file ); Tag *p_tag = f.tag(); @@ -582,9 +615,8 @@ static int WriteMeta( vlc_object_t *p_this ) psz_meta = input_item_Get ## a( p_item ); \ if( psz_meta ) \ { \ - String* psz_tmp = new String( psz_meta, String::UTF8 ); \ - p_tag->set##b( *psz_tmp ); \ - delete psz_tmp; \ + String tmp( psz_meta, String::UTF8 ); \ + p_tag->set##b( tmp ); \ } \ free( psz_meta );