X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmeta_engine%2Ftaglib.cpp;h=c5740aa068f066e6ade7b2e980c810f2384f4ef3;hb=d2e7edbdb2edf1afde6e67bef8161025dcbcad4a;hp=bab3414d5130db9c703b53d6cc3d0ec3b1bc52c3;hpb=a02b83a7477ed76d26451b14bc4ecc50ea9e21b0;p=vlc diff --git a/modules/meta_engine/taglib.cpp b/modules/meta_engine/taglib.cpp index bab3414d51..c5740aa068 100644 --- a/modules/meta_engine/taglib.cpp +++ b/modules/meta_engine/taglib.cpp @@ -1,7 +1,7 @@ /***************************************************************************** * taglib.cpp: Taglib tag parser/writer ***************************************************************************** - * Copyright (C) 2003-2008 the VideoLAN team + * Copyright (C) 2003-2009 the VideoLAN team * $Id$ * * Authors: Clément Stenac @@ -68,15 +68,11 @@ // Local functions static int ReadMeta ( vlc_object_t * ); -static int DownloadArt ( vlc_object_t * ); static int WriteMeta ( vlc_object_t * ); vlc_module_begin () set_capability( "meta reader", 1000 ) set_callbacks( ReadMeta, NULL ) - add_submodule () - set_capability( "art downloader", 50 ) - set_callbacks( DownloadArt, NULL ) add_submodule () set_capability( "meta writer", 50 ) set_callbacks( WriteMeta, NULL ) @@ -132,7 +128,7 @@ static void ReadMetaFromId3v2( ID3v2::Tag* tag, demux_t* p_demux, demux_meta_t* * terminated string */ char psz_ufid[64]; int max_size = __MIN( p_ufid->identifier().size(), 63); - strncmp( psz_ufid, p_ufid->identifier().data(), max_size ); + strncpy( psz_ufid, p_ufid->identifier().data(), max_size ); psz_ufid[max_size] = '\0'; vlc_meta_SetTrackID( p_meta, psz_ufid ); } @@ -194,19 +190,31 @@ static void ReadMetaFromId3v2( ID3v2::Tag* tag, demux_t* p_demux, demux_meta_t* list = tag->frameListMap()[ "APIC" ]; if( list.isEmpty() ) return; + TAB_INIT( p_demux_meta->i_attachments, p_demux_meta->attachments ); - for( ID3v2::FrameList::Iterator iter = list.begin(); - iter != list.end(); iter++ ) + for( iter = list.begin(); iter != list.end(); iter++ ) { ID3v2::AttachedPictureFrame* p_apic = dynamic_cast(*iter); input_attachment_t *p_attachment; - const char *psz_name, *psz_mime, *psz_description; - const char *p_data; int i_data; + const char *psz_mime; + char *psz_name, *psz_description; + // Get the mime and description of the image. + // If the description is empty, take the type as a description psz_mime = p_apic->mimeType().toCString( true ); - psz_description = psz_name = p_apic->description().toCString( true ); + if( p_apic->description().size() > 0 ) + psz_description = strdup( p_apic->description().toCString( true ) ); + else + { + if( asprintf( &psz_description, "%i", p_apic->type() ) == -1 ) + psz_description = NULL; + } + + if( !psz_description ) + continue; + psz_name = psz_description; /* some old iTunes version not only sets incorrectly the mime type * or the description of the image, @@ -216,20 +224,24 @@ static void ReadMetaFromId3v2( ID3v2::Tag* tag, demux_t* p_demux, demux_meta_t* !strncmp( psz_name, "\xC2\x89PNG", 5 ) ) { msg_Warn( p_demux, "Invalid picture embedded by broken iTunes version" ); - break; + free( psz_description ); + continue; } - p_data = p_apic->picture().data(); - i_data = p_apic->picture().size(); + const ByteVector picture = p_apic->picture(); + const char *p_data = picture.data(); + const unsigned i_data = picture.size(); - msg_Dbg( p_demux, "Found embedded art: %s (%s) is %i bytes", + msg_Dbg( p_demux, "Found embedded art: %s (%s) is %u bytes", psz_name, psz_mime, i_data ); p_attachment = vlc_input_attachment_New( psz_name, psz_mime, psz_description, p_data, i_data ); - TAB_APPEND_CAST( (input_attachment_t**), - p_demux_meta->i_attachments, p_demux_meta->attachments, - p_attachment ); + if( p_attachment ) + TAB_APPEND_CAST( (input_attachment_t**), + p_demux_meta->i_attachments, p_demux_meta->attachments, + p_attachment ); + free( psz_description ); if( pi_cover_score[p_apic->type()] > i_score ) { @@ -237,7 +249,7 @@ static void ReadMetaFromId3v2( ID3v2::Tag* tag, demux_t* p_demux, demux_meta_t* char *psz_url; if( asprintf( &psz_url, "attachment://%s", p_attachment->psz_name ) == -1 ) - break; + continue; vlc_meta_SetArtURL( p_meta, psz_url ); free( psz_url ); } @@ -310,14 +322,29 @@ static int ReadMeta( vlc_object_t* p_this) demux_t* p_demux = (demux_t*)p_this; demux_meta_t* p_demux_meta = (demux_meta_t*)p_demux->p_private; vlc_meta_t* p_meta; - TagLib::FileRef f; + FileRef f; p_demux_meta->p_meta = NULL; + + +#if defined(WIN32) || defined (UNDER_CE) + if(GetVersion() < 0x80000000) + { + wchar_t wpath[MAX_PATH + 1]; + if( !MultiByteToWideChar( CP_UTF8, 0, p_demux->psz_path, -1, wpath, MAX_PATH) ) + return VLC_EGENERIC; + wpath[MAX_PATH] = L'\0'; + f = FileRef( wpath ); + } + else + return VLC_EGENERIC; +#else const char* local_name = ToLocale( p_demux->psz_path ); if( !local_name ) return VLC_EGENERIC; f = FileRef( local_name ); LocaleFree( local_name ); +#endif if( f.isNull() ) return VLC_EGENERIC; @@ -349,7 +376,7 @@ static int ReadMeta( vlc_object_t* p_this) SET( comment, Description ); SET( genre, Genre ); SETINT( year, Date ); - SETINT( track, Tracknum ); + SETINT( track, TrackNum ); #undef SETINT #undef SET @@ -494,6 +521,7 @@ 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; + FileRef f; if( !p_item ) { @@ -501,10 +529,28 @@ static int WriteMeta( vlc_object_t *p_this ) return VLC_EGENERIC; } - FileRef f( p_export->psz_file ); +#if defined(WIN32) || defined (UNDER_CE) + if(GetVersion() < 0x80000000) + { + wchar_t wpath[MAX_PATH + 1]; + 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 + return VLC_EGENERIC; +#else + const char* local_name = ToLocale( p_export->psz_file ); + if( !local_name ) + return VLC_EGENERIC; + f = FileRef( local_name ); + LocaleFree( local_name ); +#endif + if( f.isNull() || !f.tag() || f.file()->readOnly() ) { - msg_Err( p_this, "File %s can't be opened for tag writing\n", + msg_Err( p_this, "File %s can't be opened for tag writing", p_export->psz_file ); return VLC_EGENERIC; } @@ -603,13 +649,3 @@ static int WriteMeta( vlc_object_t *p_this ) 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; -} -