[vlc-devel] [PATCH 2/3] Save album art to id3 tag.
Rémi Denis-Courmont
remi at remlab.net
Sat Jul 28 23:11:19 CEST 2012
Le samedi 28 juillet 2012 17:39:35 vlc-devel at szanni.org, vous avez écrit :
> ---
> modules/meta_engine/taglib.cpp | 63
> ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63
> insertions(+)
diff --git a/modules/meta_engine/taglib.cpp b/modules/meta_engine/taglib.cpp
index 148401b..3c20540 100644
--- a/modules/meta_engine/taglib.cpp
+++ b/modules/meta_engine/taglib.cpp
@@ -32,6 +32,8 @@
#include <vlc_demux.h> /* demux_meta_t */
#include <vlc_strings.h> /* vlc_b64_decode_binary */
#include <vlc_input.h> /* for attachment_new */
+#include <vlc_url.h> /* make_path */
+#include <vlc_httpd.h> /* mime content-type */
#ifdef WIN32
# include <vlc_charset.h>
@@ -40,6 +42,7 @@
# include <unistd.h>
#endif
+#include <stdio.h>
// Taglib headers
#include <taglib.h>
@@ -709,6 +712,66 @@ static void WriteMetaToId3v2( ID3v2::Tag* tag,
input_item_t* p_item )
WRITE( Publisher, "TPUB" );
#undef WRITE
+
+ //Write album art
+ char *psz_url = input_item_GetArtworkURL( p_item );
+ if( psz_url )
+ {
+ ID3v2::FrameList frames = tag->frameList( "APIC" );
+ ID3v2::AttachedPictureFrame *frame = NULL;
+ if( frames.isEmpty() )
+ {
+ frame = new TagLib::ID3v2::AttachedPictureFrame;
+ tag->addFrame( frame );
+ }
+ else
+ {
+ frame = static_cast<ID3v2::AttachedPictureFrame *>( frames.back()
);
+ }
+
+ FILE *p_file = fopen( make_path( psz_url ), "rb" );
You cannot apply make_path() like that. It will return garbage if the URL is
not that of a "file".
Also, there is a memory leak.
+ if( p_file == NULL )
+ {
+ free( psz_url );
+ return;
+ }
+
+ fseek( p_file, 0, SEEK_END );
+ long l_buffer = ftell( p_file );
+ rewind( p_file );
If you really need to know the size of a file, use fstat() please.
+
+ if( l_buffer == -1 )
+ {
+ fclose( p_file );
+ free( psz_url );
+ return;
+ }
+
+ char *p_buffer = new (std::nothrow) char[l_buffer];
+ if ( !p_buffer )
+ {
+ fclose( p_file );
+ free( psz_url );
+ return;
+ }
+
+ long l_read = fread( p_buffer, 1, l_buffer, p_file );
+ if ( l_read != l_buffer )
+ {
+ fclose( p_file );
+ free( psz_url );
+ delete[] p_buffer;
+ return;
+ }
+ fclose( p_file );
+
+ ByteVector data( p_buffer, l_buffer );
+ delete[] p_buffer;
+
+ frame->setPicture( data );
+ frame->setMimeType( httpd_MimeFromUrl( psz_url ) );
+ }
+ free ( psz_url );
}
--
Rémi Denis-Courmont
http://www.remlab.net/
http://fi.linkedin.com/in/remidenis
More information about the vlc-devel
mailing list