summaryrefslogtreecommitdiff
path: root/audio
diff options
context:
space:
mode:
authorwiz <wiz>2012-12-03 22:39:04 +0000
committerwiz <wiz>2012-12-03 22:39:04 +0000
commitd0ce74afc0f6ab99bbe44459413a099127bb1dac (patch)
treee7863874a11e1bba51d90f1445248cc729369569 /audio
parentd90f61c01b4d6b983e06689c54d11d7bc6ee2d66 (diff)
downloadpkgsrc-d0ce74afc0f6ab99bbe44459413a099127bb1dac.tar.gz
Add more complete id3 support by also linking against id3lib (easytag
uses two different id3 support libraries. Fix mp4 support option. It was depending on libmp4v2, but that wasn't recognized by easytag's configure any longer. Switch to mp4v2 and rename the option to match. Add patches from gentoo to fix build with latest mp4v2 version. Bump PKGREVISION.
Diffstat (limited to 'audio')
-rw-r--r--audio/easytag/Makefile5
-rw-r--r--audio/easytag/distinfo5
-rw-r--r--audio/easytag/options.mk13
-rw-r--r--audio/easytag/patches/patch-src_mp4__header.c34
-rw-r--r--audio/easytag/patches/patch-src_mp4__tag.c479
-rw-r--r--audio/easytag/patches/patch-src_picture.c33
6 files changed, 558 insertions, 11 deletions
diff --git a/audio/easytag/Makefile b/audio/easytag/Makefile
index 1804fbd86cf..f28fee6a14a 100644
--- a/audio/easytag/Makefile
+++ b/audio/easytag/Makefile
@@ -1,8 +1,8 @@
-# $NetBSD: Makefile,v 1.77 2012/10/08 23:01:09 adam Exp $
+# $NetBSD: Makefile,v 1.78 2012/12/03 22:39:04 wiz Exp $
#
DISTNAME= easytag-2.1.7
-PKGREVISION= 4
+PKGREVISION= 5
CATEGORIES= audio
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=easytag/}
EXTRACT_SUFX= .tar.bz2
@@ -24,6 +24,7 @@ BUILDLINK_API_DEPENDS.glib2+= glib2>=2.4.1
BUILDLINK_API_DEPENDS.gtk2+= gtk2+>=2.4.1
.include "../../audio/libid3tag/buildlink3.mk"
+.include "../../audio/id3lib/buildlink3.mk"
.include "../../devel/glib2/buildlink3.mk"
.include "../../x11/gtk2/buildlink3.mk"
.include "../../sysutils/desktop-file-utils/desktopdb.mk"
diff --git a/audio/easytag/distinfo b/audio/easytag/distinfo
index 3cd20fe3396..25d2aba97d3 100644
--- a/audio/easytag/distinfo
+++ b/audio/easytag/distinfo
@@ -1,5 +1,8 @@
-$NetBSD: distinfo,v 1.30 2012/03/08 09:49:26 wiz Exp $
+$NetBSD: distinfo,v 1.31 2012/12/03 22:39:04 wiz Exp $
SHA1 (easytag-2.1.7.tar.bz2) = 7b56ba18be2f1bec0171e5de4447ba763a264f92
RMD160 (easytag-2.1.7.tar.bz2) = abe8df519ed41b9424080d73cb16c4a75dcb511f
Size (easytag-2.1.7.tar.bz2) = 3303491 bytes
+SHA1 (patch-src_mp4__header.c) = 83afd4dea1a2e3d9fee6b49fd8e5eb1ff25f9548
+SHA1 (patch-src_mp4__tag.c) = db346e42adae05c3694b42a91b363077685c934f
+SHA1 (patch-src_picture.c) = 1d97cac351511163340daa945d0768081fb0145d
diff --git a/audio/easytag/options.mk b/audio/easytag/options.mk
index 7dea8ad70fe..4c67690b501 100644
--- a/audio/easytag/options.mk
+++ b/audio/easytag/options.mk
@@ -1,8 +1,8 @@
-# $NetBSD: options.mk,v 1.5 2012/03/08 09:49:26 wiz Exp $
+# $NetBSD: options.mk,v 1.6 2012/12/03 22:39:04 wiz Exp $
PKG_OPTIONS_VAR= PKG_OPTIONS.easytag
-PKG_SUPPORTED_OPTIONS= flac mpeg4ip ogg speex wavpack
-PKG_SUGGESTED_OPTIONS= flac mpeg4ip ogg speex wavpack
+PKG_SUPPORTED_OPTIONS= flac mp4v2 ogg speex wavpack
+PKG_SUGGESTED_OPTIONS= flac mp4v2 ogg speex wavpack
.include "../../mk/bsd.options.mk"
@@ -14,11 +14,8 @@ CONFIGURE_ARGS+= --enable-flac
CONFIGURE_ARGS+= --disable-flac
.endif
-.if !empty(PKG_OPTIONS:Mmpeg4ip)
-BUILDLINK_API_DEPENDS.libmp4v2+= libmp4v2>=1.6.1
-.include "../../multimedia/libmp4v2/buildlink3.mk"
-# for mpeg4ip.h
-CPPFLAGS+= -DHAVE_GTK
+.if !empty(PKG_OPTIONS:Mmp4v2)
+.include "../../multimedia/mp4v2/buildlink3.mk"
.endif
.if !empty(PKG_OPTIONS:Mogg)
diff --git a/audio/easytag/patches/patch-src_mp4__header.c b/audio/easytag/patches/patch-src_mp4__header.c
new file mode 100644
index 00000000000..3e50b2665f6
--- /dev/null
+++ b/audio/easytag/patches/patch-src_mp4__header.c
@@ -0,0 +1,34 @@
+$NetBSD: patch-src_mp4__header.c,v 1.1 2012/12/03 22:39:05 wiz Exp $
+
+Gentoo patch for mp4v2-2.0 compatibility.
+https://bugs.gentoo.org/show_bug.cgi?id=409281
+
+--- src/mp4_header.c.orig 2011-07-04 00:59:21.000000000 +0000
++++ src/mp4_header.c
+@@ -204,7 +204,7 @@ gboolean Mp4_Header_Read_File_Info (gcha
+ /* Get size of file */
+ ETFileInfo->size = Get_File_Size(filename);
+
+- if ((file = MP4Read(filename, 0)) == MP4_INVALID_FILE_HANDLE )
++ if ((file = MP4Read(filename)) == MP4_INVALID_FILE_HANDLE )
+ {
+ gchar *filename_utf8 = filename_to_display(filename);
+ //g_print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno));
+@@ -218,7 +218,7 @@ gboolean Mp4_Header_Read_File_Info (gcha
+ {
+ gchar *filename_utf8 = filename_to_display(filename);
+ Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,("Contains no audio track"));
+- MP4Close(file);
++ MP4Close(file, 0);
+ g_free(filename_utf8);
+ return FALSE;
+ }
+@@ -243,7 +243,7 @@ gboolean Mp4_Header_Read_File_Info (gcha
+ ETFileInfo->mode = MP4GetTrackAudioChannels(file, trackId);
+ ETFileInfo->duration = MP4ConvertFromTrackDuration(file, trackId, MP4GetTrackDuration(file, trackId), MP4_SECS_TIME_SCALE);
+
+- MP4Close(file);
++ MP4Close(file, 0);
+ return TRUE;
+ }
+
diff --git a/audio/easytag/patches/patch-src_mp4__tag.c b/audio/easytag/patches/patch-src_mp4__tag.c
new file mode 100644
index 00000000000..5b3195f8839
--- /dev/null
+++ b/audio/easytag/patches/patch-src_mp4__tag.c
@@ -0,0 +1,479 @@
+$NetBSD: patch-src_mp4__tag.c,v 1.1 2012/12/03 22:39:05 wiz Exp $
+
+Gentoo patch for mp4v2-2.0 compatibility.
+https://bugs.gentoo.org/show_bug.cgi?id=409281
+
+--- src/mp4_tag.c.orig 2011-07-04 00:59:21.000000000 +0000
++++ src/mp4_tag.c
+@@ -80,15 +80,9 @@ gboolean Mp4tag_Read_File_Tag (gchar *fi
+ {
+ FILE *file;
+ MP4FileHandle mp4file = NULL;
+- uint16_t track, track_total;
+- uint16_t disk, disktotal;
+- u_int8_t *coverArt;
+- u_int32_t coverSize;
+ Picture *prev_pic = NULL;
+-#ifdef NEWMP4
+ gint pic_num;
+-#endif
+-
++
+ if (!filename || !FileTag)
+ return FALSE;
+
+@@ -102,7 +96,7 @@ gboolean Mp4tag_Read_File_Tag (gchar *fi
+ fclose(file); // We close it cause mp4 opens/closes file itself
+
+ /* Get data from tag */
+- mp4file = MP4Read(filename, 0);
++ mp4file = MP4Read(filename);
+ if (mp4file == MP4_INVALID_FILE_HANDLE)
+ {
+ gchar *filename_utf8 = filename_to_display(filename);
+@@ -111,109 +105,134 @@ gboolean Mp4tag_Read_File_Tag (gchar *fi
+ return FALSE;
+ }
+
++ const MP4Tags* tags = MP4TagsAlloc();
++ MP4TagsFetch(tags, mp4file);
++
+ /* TODO Add error detection */
+
+ /*********
+ * Title *
+ *********/
+- MP4GetMetadataName(mp4file, &FileTag->title);
++ if (tags->name)
++ {
++ FileTag->title = Try_To_Validate_Utf8_String(tags->name);
++ }
+
+ /**********
+ * Artist *
+ **********/
+- MP4GetMetadataArtist(mp4file, &FileTag->artist);
++ if (tags->artist)
++ {
++ FileTag->artist = Try_To_Validate_Utf8_String(tags->artist);
++ }
++
++ /****************
++ * Album Artist *
++ ****************/
++ if (tags->albumArtist)
++ {
++ FileTag->album_artist = Try_To_Validate_Utf8_String(tags->albumArtist);
++ }
+
+ /*********
+ * Album *
+ *********/
+- MP4GetMetadataAlbum(mp4file, &FileTag->album);
++ if (tags->album)
++ {
++ FileTag->album = Try_To_Validate_Utf8_String(tags->album);
++ }
+
+ /**********************
+ * Disk / Total Disks *
+ **********************/
+- if (MP4GetMetadataDisk(mp4file, &disk, &disktotal))
++ if (tags->disk)
+ {
+- if (disk != 0 && disktotal != 0)
+- FileTag->disc_number = g_strdup_printf("%d/%d",(gint)disk,(gint)disktotal);
+- else if (disk != 0)
+- FileTag->disc_number = g_strdup_printf("%d",(gint)disk);
+- else if (disktotal != 0)
+- FileTag->disc_number = g_strdup_printf("/%d",(gint)disktotal);
+- //if (disktotal != 0)
+- // FileTag->disk_number_total = g_strdup_printf("%d",(gint)disktotal);
++ if (tags->disk->index != 0 && tags->disk->total != 0)
++ FileTag->disc_number = g_strdup_printf("%d/%d",(gint)tags->disk->index,(gint)tags->disk->total);
++ else if (tags->disk->index != 0)
++ FileTag->disc_number = g_strdup_printf("%d",(gint)tags->disk->index);
++ else if (tags->disk->total != 0)
++ FileTag->disc_number = g_strdup_printf("/%d",(gint)tags->disk->total);
+ }
+
+ /********
+ * Year *
+ ********/
+- MP4GetMetadataYear(mp4file, &FileTag->year);
++ if (tags->releaseDate)
++ {
++ FileTag->year = Try_To_Validate_Utf8_String(tags->releaseDate);
++ }
+
+ /*************************
+ * Track and Total Track *
+ *************************/
+- if (MP4GetMetadataTrack(mp4file, &track, &track_total))
++ if (tags->track)
+ {
+- if (track != 0)
+- FileTag->track = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,(gint)track); // Just to have numbers like this : '01', '05', '12', ...
+- if (track_total != 0)
+- FileTag->track_total = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,(gint)track_total); // Just to have numbers like this : '01', '05', '12', ...
++ if (tags->track->index != 0)
++ FileTag->track = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,(gint)tags->track->index); // Just to have numbers like this : '01', '05', '12', ...
++ if (tags->track->total != 0)
++ FileTag->track_total = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,(gint)tags->track->total); // Just to have numbers like this : '01', '05', '12', ...
+ }
+
+ /*********
+ * Genre *
+ *********/
+- MP4GetMetadataGenre(mp4file, &FileTag->genre);
++ if (tags->genre)
++ {
++ FileTag->genre = Try_To_Validate_Utf8_String(tags->genre);
++ }
+
+ /***********
+ * Comment *
+ ***********/
+- MP4GetMetadataComment(mp4file, &FileTag->comment);
++ if (tags->comments)
++ {
++ FileTag->comment = Try_To_Validate_Utf8_String(tags->comments);
++ }
+
+ /**********************
+ * Composer or Writer *
+ **********************/
+- MP4GetMetadataWriter(mp4file, &FileTag->composer);
++ if (tags->composer)
++ {
++ FileTag->composer = Try_To_Validate_Utf8_String(tags->composer);
++ }
+
+ /*****************
+ * Encoding Tool *
+ *****************/
+- MP4GetMetadataTool(mp4file, &FileTag->encoded_by);
+-
+- /* Unimplemented
+- Tempo / BPM
+- MP4GetMetadataTempo(file, &string)
+- */
++ if (tags->encodedBy)
++ {
++ FileTag->encoded_by = Try_To_Validate_Utf8_String(tags->encodedBy);
++ }
+
+ /***********
+ * Picture *
+ ***********/
+-#ifdef NEWMP4
+- // There version can handle multiple pictures!
+- // Version 1.6 of libmp4v2 introduces an index argument for MP4GetMetadataCoverart
+- for (pic_num = 0; (MP4GetMetadataCoverArt( mp4file, &coverArt, &coverSize,pic_num )); pic_num++)
+-#else
+- // There version handle only one picture!
+- if ( MP4GetMetadataCoverArt( mp4file, &coverArt, &coverSize ) )
+-#endif
+- {
+- Picture *pic;
+-
+- pic = Picture_Allocate();
+- if (!prev_pic)
+- FileTag->picture = pic;
+- else
+- prev_pic->next = pic;
+- prev_pic = pic;
+-
+- pic->size = coverSize;
+- pic->data = coverArt;
+- pic->type = PICTURE_TYPE_FRONT_COVER;
+- pic->description = NULL;
++ if (tags->artworkCount) {
++ const MP4TagArtwork* art = tags->artwork; /* artwork != NULL when artworkCount > 0 */
++ for (pic_num = 0; pic_num < tags->artworkCount; pic_num++, art++)
++ {
++ Picture *pic;
++
++ pic = Picture_Allocate();
++ if (!prev_pic)
++ FileTag->picture = pic;
++ else
++ prev_pic->next = pic;
++ prev_pic = pic;
++
++ pic->size = art->size;
++ pic->data = g_memdup(art->data, pic->size);
++ pic->type = PICTURE_TYPE_FRONT_COVER;
++ pic->description = NULL;
++ }
+ }
+
+
+ /* Free allocated data */
+- MP4Close(mp4file);
++ MP4TagsFree(tags);
++ MP4Close(mp4file, 0);
+
+ return TRUE;
+ }
+@@ -235,6 +254,7 @@ gboolean Mp4tag_Write_File_Tag (ET_File
+ FILE *file;
+ MP4FileHandle mp4file = NULL;
+ gint error = 0;
++ gint pic_num;
+
+ if (!ETFile || !ETFile->FileTag)
+ return FALSE;
+@@ -252,23 +272,25 @@ gboolean Mp4tag_Write_File_Tag (ET_File
+ fclose(file);
+
+ /* Open file for writing */
+- mp4file = MP4Modify(filename,0,0);
++ mp4file = MP4Modify(filename, 0);
+ if (mp4file == MP4_INVALID_FILE_HANDLE)
+ {
+ Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,_("MP4 format invalid"));
+ return FALSE;
+ }
+
++ const MP4Tags* tags = MP4TagsAlloc();
++ MP4TagsFetch(tags, mp4file);
++
+ /*********
+ * Title *
+ *********/
+ if (FileTag->title && g_utf8_strlen(FileTag->title, -1) > 0)
+ {
+- MP4SetMetadataName(mp4file, FileTag->title);
++ MP4TagsSetName(tags, FileTag->title);
+ }else
+ {
+- //MP4DeleteMetadataName(mp4file); // Not available on mpeg4ip-1.2 (only in 1.3)
+- MP4SetMetadataName(mp4file, "");
++ MP4TagsSetName(tags, "");
+ }
+
+ /**********
+@@ -276,11 +298,21 @@ gboolean Mp4tag_Write_File_Tag (ET_File
+ **********/
+ if (FileTag->artist && g_utf8_strlen(FileTag->artist, -1) > 0)
+ {
+- MP4SetMetadataArtist(mp4file, FileTag->artist);
++ MP4TagsSetArtist(tags, FileTag->artist);
++ }else
++ {
++ MP4TagsSetArtist(tags, "");
++ }
++
++ /****************
++ * Album Artist *
++ ****************/
++ if (FileTag->artist && g_utf8_strlen(FileTag->artist, -1) > 0)
++ {
++ MP4TagsSetAlbumArtist(tags, FileTag->album_artist);
+ }else
+ {
+- //MP4DeleteMetadataArtist(mp4file);
+- MP4SetMetadataArtist(mp4file, "");
++ MP4TagsSetAlbumArtist(tags, "");
+ }
+
+ /*********
+@@ -288,22 +320,19 @@ gboolean Mp4tag_Write_File_Tag (ET_File
+ *********/
+ if (FileTag->album && g_utf8_strlen(FileTag->album, -1) > 0)
+ {
+- MP4SetMetadataAlbum(mp4file, FileTag->album);
++ MP4TagsSetAlbum(tags, FileTag->album);
+ }else
+ {
+- //MP4DeleteMetadataAlbum(mp4file);
+- MP4SetMetadataAlbum(mp4file, "");
++ MP4TagsSetAlbum(tags, "");
+ }
+
+ /**********************
+ * Disk / Total Disks *
+ **********************/
++ MP4TagDisk td;
+ if (FileTag->disc_number && g_utf8_strlen(FileTag->disc_number, -1) > 0)
+ //|| FileTag->disc_number_total && g_utf8_strlen(FileTag->disc_number_total, -1) > 0)
+ {
+- uint16_t disk = 0;
+- uint16_t disktotal = 0;
+-
+ /* At the present time, we manage only disk number like '1' or '1/2', we
+ * don't use disk number total... so here we try to decompose */
+ if (FileTag->disc_number)
+@@ -314,27 +343,24 @@ gboolean Mp4tag_Write_File_Tag (ET_File
+ {
+ // A disc_number_total was entered
+ if ( (tmp+1) && atoi(tmp+1) )
+- disktotal = atoi(tmp+1);
++ td.total = atoi(tmp+1);
+
+ // Fill disc_number
+ *tmp = '\0';
+- disk = atoi(dn_tmp);
++ td.index = atoi(dn_tmp);
+ }else
+ {
+- disk = atoi(FileTag->disc_number);
++ td.index = atoi(FileTag->disc_number);
++ td.total = NULL;
+ }
+ g_free(dn_tmp);
+ }
+- /*if (FileTag->disc_number)
+- disk = atoi(FileTag->disc_number);
+- if (FileTag->disc_number_total)
+- disktotal = atoi(FileTag->disc_number_total);
+- */
+- MP4SetMetadataDisk(mp4file, disk, disktotal);
++ MP4TagsSetDisk(tags, &td);
+ }else
+ {
+- //MP4DeleteMetadataDisk(mp4file);
+- MP4SetMetadataDisk(mp4file, 0, 0);
++ td.index = NULL;
++ td.total = NULL;
++ MP4TagsSetDisk(tags, &td);
+ }
+
+ /********
+@@ -342,30 +368,29 @@ gboolean Mp4tag_Write_File_Tag (ET_File
+ ********/
+ if (FileTag->year && g_utf8_strlen(FileTag->year, -1) > 0)
+ {
+- MP4SetMetadataYear(mp4file, FileTag->year);
++ MP4TagsSetReleaseDate(tags, FileTag->year);
+ }else
+ {
+- //MP4DeleteMetadataYear(mp4file);
+- MP4SetMetadataYear(mp4file, "");
++ MP4TagsSetReleaseDate(tags, "");
+ }
+
+ /*************************
+ * Track and Total Track *
+ *************************/
++ MP4TagTrack tt;
+ if ( (FileTag->track && g_utf8_strlen(FileTag->track, -1) > 0)
+ || (FileTag->track_total && g_utf8_strlen(FileTag->track_total, -1) > 0) )
+ {
+- uint16_t track = 0;
+- uint16_t track_total = 0;
+ if (FileTag->track)
+- track = atoi(FileTag->track);
++ tt.index = atoi(FileTag->track);
+ if (FileTag->track_total)
+- track_total = atoi(FileTag->track_total);
+- MP4SetMetadataTrack(mp4file, track, track_total);
++ tt.total = atoi(FileTag->track_total);
++ MP4TagsSetTrack(tags, &tt);
+ }else
+ {
+- //MP4DeleteMetadataTrack(mp4file);
+- MP4SetMetadataTrack(mp4file, 0, 0);
++ tt.index = NULL;
++ tt.total = NULL;
++ MP4TagsSetTrack(tags, &tt);
+ }
+
+ /*********
+@@ -373,11 +398,10 @@ gboolean Mp4tag_Write_File_Tag (ET_File
+ *********/
+ if (FileTag->genre && g_utf8_strlen(FileTag->genre, -1) > 0 )
+ {
+- MP4SetMetadataGenre(mp4file, FileTag->genre);
++ MP4TagsSetGenre(tags, FileTag->genre);
+ }else
+ {
+- //MP4DeleteMetadataGenre(mp4file);
+- MP4SetMetadataGenre(mp4file, "");
++ MP4TagsSetGenre(tags, "");
+ }
+
+ /***********
+@@ -385,11 +409,10 @@ gboolean Mp4tag_Write_File_Tag (ET_File
+ ***********/
+ if (FileTag->comment && g_utf8_strlen(FileTag->comment, -1) > 0)
+ {
+- MP4SetMetadataComment(mp4file, FileTag->comment);
++ MP4TagsSetComments(tags, FileTag->comment);
+ }else
+ {
+- //MP4DeleteMetadataComment(mp4file);
+- MP4SetMetadataComment(mp4file, "");
++ MP4TagsSetComments(tags, "");
+ }
+
+ /**********************
+@@ -397,11 +420,10 @@ gboolean Mp4tag_Write_File_Tag (ET_File
+ **********************/
+ if (FileTag->composer && g_utf8_strlen(FileTag->composer, -1) > 0)
+ {
+- MP4SetMetadataWriter(mp4file, FileTag->composer);
++ MP4TagsSetComposer(tags, FileTag->composer);
+ }else
+ {
+- //MP4DeleteMetadataWriter(mp4file);
+- MP4SetMetadataWriter(mp4file, "");
++ MP4TagsSetComposer(tags, "");
+ }
+
+ /*****************
+@@ -409,33 +431,39 @@ gboolean Mp4tag_Write_File_Tag (ET_File
+ *****************/
+ if (FileTag->encoded_by && g_utf8_strlen(FileTag->encoded_by, -1) > 0)
+ {
+- MP4SetMetadataTool(mp4file, FileTag->encoded_by);
++ MP4TagsSetEncodedBy(tags, FileTag->encoded_by);
+ }else
+ {
+- //MP4DeleteMetadataTool(mp4file);
+- MP4SetMetadataTool(mp4file, "");
++ MP4TagsSetEncodedBy(tags, "");
+ }
+
+ /***********
+ * Picture *
+ ***********/
++ Picture *pic = FileTag->picture;
++ const gint artworkCount = tags->artworkCount;
++
++ for (pic_num = 0; pic_num < artworkCount; pic_num++)
+ {
+- // Can handle only one picture...
+- Picture *pic;
++ MP4TagsRemoveArtwork(tags, 0);
++ }
+
+- //MP4DeleteMetadataCoverArt(mp4file);
+- MP4SetMetadataCoverArt(mp4file, NULL, 0);
+- for( pic = FileTag->picture; pic; pic = pic->next )
++ while (pic)
++ {
++ if (pic->data)
+ {
+- if( pic->type == PICTURE_TYPE_FRONT_COVER )
+- {
+- MP4SetMetadataCoverArt(mp4file, pic->data, pic->size);
+- }
++ MP4TagArtwork art;
++ art.data = pic->data;
++ art.size = pic->size;
++ art.type = MP4_ART_UNDEFINED; // delegate typing to libmp4v2
++ MP4TagsAddArtwork(tags, &art);
+ }
++ pic = pic->next;
+ }
+
+-
+- MP4Close(mp4file);
++ MP4TagsStore(tags, mp4file);
++ MP4TagsFree(tags);
++ MP4Close(mp4file, 0);
+
+ if (error) return FALSE;
+ else return TRUE;
diff --git a/audio/easytag/patches/patch-src_picture.c b/audio/easytag/patches/patch-src_picture.c
new file mode 100644
index 00000000000..63b9261752c
--- /dev/null
+++ b/audio/easytag/patches/patch-src_picture.c
@@ -0,0 +1,33 @@
+$NetBSD: patch-src_picture.c,v 1.1 2012/12/03 22:39:05 wiz Exp $
+
+Gentoo patch for mp4v2-2.0 compatibility.
+https://bugs.gentoo.org/show_bug.cgi?id=409281
+
+--- src/picture.c.orig 2011-07-04 00:59:21.000000000 +0000
++++ src/picture.c
+@@ -326,24 +326,7 @@ void Picture_Add_Button_Clicked (GObject
+ else if (MESSAGE_BOX_POSITION_MOUSE)
+ gtk_window_set_position(GTK_WINDOW(FileSelectionWindow),GTK_WIN_POS_MOUSE);
+
+- // Behaviour following the tag type...
+- switch (ETCore->ETFileDisplayed->ETFileDescription->TagType)
+- {
+- case MP4_TAG:
+- {
+- // Only one file can be selected
+- gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(FileSelectionWindow), FALSE);
+- break;
+- }
+-
+- // Other tag types
+- default:
+- {
+- gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(FileSelectionWindow), TRUE);
+- break;
+- }
+- }
+-
++ gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(FileSelectionWindow), TRUE);
+ gtk_dialog_set_default_response(GTK_DIALOG(FileSelectionWindow), GTK_RESPONSE_OK);
+
+ // Starting directory (the same of the current file)