]> git.sesse.net Git - vlc/commitdiff
taglib: properly handle APE's cover art
authorAnatoliy Anischovich <lin.aaa.lin@gmail.com>
Thu, 24 Jul 2014 09:31:53 +0000 (12:31 +0300)
committerRafaël Carré <funman@videolan.org>
Thu, 24 Jul 2014 09:55:54 +0000 (11:55 +0200)
Signed-off-by: Rafaël Carré <funman@videolan.org>
modules/meta_engine/taglib.cpp

index 7d6ceb735b0e3b4a010f5c32c8b31afdde3851da..48d6f5c43579df4880930a36b72537988f78aad0 100644 (file)
@@ -138,30 +138,41 @@ static void ReadMetaFromAPE( APE::Tag* tag, demux_meta_t* p_demux_meta, vlc_meta
     APE::Item item;
 
     item = tag->itemListMap()["COVER ART (FRONT)"];
-    if( !item.isEmpty() )
+    if( !item.isEmpty() && item.type() == APE::Item::Binary)
     {
         input_attachment_t *p_attachment;
 
-        const ByteVector picture = item.value();
+        const ByteVector picture = item.binaryData();
         const char *p_data = picture.data();
         unsigned i_data = picture.size();
 
+        /* Null terminated filename followed by the image data */
         size_t desc_len = strnlen(p_data, i_data);
-        if (desc_len < i_data) {
+        if( desc_len < i_data && IsUTF8( p_data ) )
+        {
             const char *psz_name = p_data;
+            const char *psz_mime = vlc_mime_Ext2Mime( psz_name );
             p_data += desc_len + 1; /* '\0' */
             i_data -= desc_len + 1;
+
             msg_Dbg( p_demux_meta, "Found embedded art: %s (%s) is %u bytes",
-                     psz_name, "image/jpeg", i_data );
+                     psz_name, psz_mime, i_data );
 
-            p_attachment = vlc_input_attachment_New( "cover", "image/jpeg",
+            p_attachment = vlc_input_attachment_New( psz_name, psz_mime,
                                     psz_name, p_data, i_data );
             if( p_attachment )
+            {
                 TAB_APPEND_CAST( (input_attachment_t**),
                                  p_demux_meta->i_attachments, p_demux_meta->attachments,
                                  p_attachment );
 
-            vlc_meta_SetArtURL( p_meta, "attachment://cover" );
+                char *psz_url;
+                if( asprintf( &psz_url, "attachment://%s", p_attachment->psz_name ) != -1 )
+                {
+                    vlc_meta_SetArtURL( p_meta, psz_url );
+                    free( psz_url );
+                }
+            }
         }
     }
 
@@ -1098,4 +1109,3 @@ static int WriteMeta( vlc_object_t *p_this )
 
     return VLC_SUCCESS;
 }
-