[tracker] tracker-extract-mp3: Prefer ID3v2 tags to ID3v1 tags



commit 2cfe3c0b820e227fbab624f4478f458d407dffb7
Author: Jürg Billeter <j bitron ch>
Date:   Thu May 7 11:29:46 2009 +0200

    tracker-extract-mp3: Prefer ID3v2 tags to ID3v1 tags
---
 src/tracker-extract/tracker-extract-mp3.c |  137 ++++++++++++++++------------
 1 files changed, 78 insertions(+), 59 deletions(-)

diff --git a/src/tracker-extract/tracker-extract-mp3.c b/src/tracker-extract/tracker-extract-mp3.c
index 9d54afb..d538a5a 100644
--- a/src/tracker-extract/tracker-extract-mp3.c
+++ b/src/tracker-extract/tracker-extract-mp3.c
@@ -80,6 +80,7 @@ typedef struct {
 	const gchar *urn;
 	const gchar *rdf_type;
 	const gchar *predicate;
+	gchar      **nullify;
 } Matches;
 
 typedef struct {
@@ -100,6 +101,8 @@ typedef struct {
 
 	unsigned char *albumartdata;
 	size_t         albumartsize;
+
+	id3tag        *id3v1_info;
 } file_data;
 
 enum {
@@ -747,26 +750,26 @@ get_id3v24_tags (const gchar *data,
 {
 	guint pos = 0;
 	Matches tmap[] = {
-		{"TCOP", NIE_PREFIX "copyright", NULL, NULL, NULL},
-		{"TDRC", NIE_PREFIX "contentCreated", NULL, NULL, NULL},
-		{"TCON", NFO_PREFIX "genre", NULL, NULL, NULL},
-		{"TIT1", NFO_PREFIX "genre", NULL, NULL, NULL},
-		{"TENC", NCO_PREFIX "publisher", "publisher", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TEXT", NIE_PREFIX "plainTextContent", FALSE},
-		{"TPE1", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TPE2", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TPE3", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
+		{"TCOP", NIE_PREFIX "copyright", NULL, NULL, NULL, NULL},
+		{"TDRC", NIE_PREFIX "contentCreated", NULL, NULL, NULL, &filedata->id3v1_info->year},
+		{"TCON", NFO_PREFIX "genre", NULL, NULL, NULL, &filedata->id3v1_info->genre},
+		{"TIT1", NFO_PREFIX "genre", NULL, NULL, NULL, &filedata->id3v1_info->genre},
+		{"TENC", NCO_PREFIX "publisher", "publisher", NMM_PREFIX "Artist", NMM_PREFIX "artistName", NULL},
+		{"TEXT", NIE_PREFIX "plainTextContent", NULL, NULL, NULL, NULL},
+		{"TPE1", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TPE2", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TPE3", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
 		/*	{"TOPE", NID3_LEAD_ARTIST}, We dont' want the original artist for now */
-		{"TPUB", NCO_PREFIX "publisher", "publisher", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TOAL", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle"},
-		{"TALB", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle"},
-		{"TLAN", NIE_PREFIX "language", NULL, NULL, NULL},
-		{"TIT2", NIE_PREFIX "title", NULL, NULL, NULL},
-		{"TIT3", NIE_PREFIX "comment", NULL, NULL, NULL},
-		{"TDRL", NIE_PREFIX "contentCreated", NULL, NULL, NULL},
-		{"TRCK", NMM_PREFIX "trackNumber", NULL, NULL, NULL},
+		{"TPUB", NCO_PREFIX "publisher", "publisher", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TOAL", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle", &filedata->id3v1_info->album},
+		{"TALB", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle", &filedata->id3v1_info->album},
+		{"TLAN", NIE_PREFIX "language", NULL, NULL, NULL, NULL},
+		{"TIT2", NIE_PREFIX "title", NULL, NULL, NULL, &filedata->id3v1_info->title},
+		{"TIT3", NIE_PREFIX "comment", NULL, NULL, NULL, &filedata->id3v1_info->comment},
+		{"TDRL", NIE_PREFIX "contentCreated", NULL, NULL, NULL, &filedata->id3v1_info->year},
+		{"TRCK", NMM_PREFIX "trackNumber", NULL, NULL, NULL, &filedata->id3v1_info->trackno},
 		/* TODO Nepomukify {"PCNT", "Audio:PlayCount"}, */
-		{"TLEN", NMM_PREFIX "length", NULL, NULL, NULL},
+		{"TLEN", NMM_PREFIX "length", NULL, NULL, NULL, NULL},
 		{NULL, 0, NULL, NULL, NULL},
 	};
 
@@ -886,6 +889,11 @@ get_id3v24_tags (const gchar *data,
 						filedata->duration = duration/1000;
 					}
 
+					if (tmap[i].nullify) {
+						/* prefer ID3v2 tag over ID3v1 tag */
+						g_free (*tmap[i].nullify);
+						*tmap[i].nullify = NULL;
+					}
 					if (tmap[i].urn) {
 						gchar *canonical_uri = tmap[i].urn[0]!=':'?tracker_uri_printf_escaped ("urn:%s:%s", tmap[i].urn, word):g_strdup(tmap[i].urn);
 						tracker_statement_list_insert (metadata, canonical_uri, RDF_TYPE, tmap[i].rdf_type);
@@ -1012,25 +1020,25 @@ get_id3v23_tags (const gchar *data,
 {
 	guint	pos = 0;
 	Matches tmap[] = {
-		{"TCOP", NIE_PREFIX "copyright", NULL, NULL, NULL},
-		{"TDAT", NIE_PREFIX "contentCreated", NULL, NULL, NULL},
-		{"TCON", NFO_PREFIX "genre", NULL, NULL, NULL},
-		{"TIT1", NFO_PREFIX "genre", NULL, NULL, NULL},
-		{"TENC", NCO_PREFIX "publisher", "publisher", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TEXT", NIE_PREFIX "plainTextContent", NULL, NULL, NULL},
-		{"TPE1", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TPE2", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TPE3", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
+		{"TCOP", NIE_PREFIX "copyright", NULL, NULL, NULL, NULL},
+		{"TDAT", NIE_PREFIX "contentCreated", NULL, NULL, NULL, &filedata->id3v1_info->year},
+		{"TCON", NFO_PREFIX "genre", NULL, NULL, NULL, &filedata->id3v1_info->genre},
+		{"TIT1", NFO_PREFIX "genre", NULL, NULL, NULL, &filedata->id3v1_info->genre},
+		{"TENC", NCO_PREFIX "publisher", "publisher", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TEXT", NIE_PREFIX "plainTextContent", NULL, NULL, NULL, NULL},
+		{"TPE1", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TPE2", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TPE3", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
 		/*	{"TOPE", NID3_LEAD_ARTIST}, We don't want the original artist for now */
-		{"TPUB", NCO_PREFIX "publisher", "publisher", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TOAL", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle"},
-		{"TALB", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle"},
-		{"TLAN", NIE_PREFIX "language", NULL, NULL, NULL},
-		{"TIT2", NIE_PREFIX "title", NULL, NULL, NULL},
-		{"TYER", NIE_PREFIX "contentCreated", NULL, NULL, NULL},
-		{"TRCK", NMM_PREFIX "trackNumber", NULL, NULL, NULL},
+		{"TPUB", NCO_PREFIX "publisher", "publisher", NMM_PREFIX "Artist", NMM_PREFIX "artistName", NULL},
+		{"TOAL", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle", &filedata->id3v1_info->album},
+		{"TALB", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle", &filedata->id3v1_info->album},
+		{"TLAN", NIE_PREFIX "language", NULL, NULL, NULL, NULL},
+		{"TIT2", NIE_PREFIX "title", NULL, NULL, NULL, &filedata->id3v1_info->title},
+		{"TYER", NIE_PREFIX "contentCreated", NULL, NULL, NULL, &filedata->id3v1_info->year},
+		{"TRCK", NMM_PREFIX "trackNumber", NULL, NULL, NULL, &filedata->id3v1_info->trackno},
 		/* TODO Nepomukify {"PCNT", "Audio:PlayCount"}, */
-		{"TLEN", NMM_PREFIX "duration", NULL, NULL, NULL},
+		{"TLEN", NMM_PREFIX "duration", NULL, NULL, NULL, NULL},
 		{NULL, 0, NULL, NULL, NULL},
 	};
 
@@ -1141,6 +1149,11 @@ get_id3v23_tags (const gchar *data,
 						filedata->duration = duration/1000;
 					}
 
+					if (tmap[i].nullify) {
+						/* prefer ID3v2 tag over ID3v1 tag */
+						g_free (*tmap[i].nullify);
+						*tmap[i].nullify = NULL;
+					}
 					if (tmap[i].urn) {
 						gchar *canonical_uri = tmap[i].urn[0]!=':'?tracker_uri_printf_escaped ("urn:%s:%s", tmap[i].urn, word):g_strdup(tmap[i].urn);
 						tracker_statement_list_insert (metadata, canonical_uri, RDF_TYPE, tmap[i].rdf_type);
@@ -1257,31 +1270,31 @@ get_id3v20_tags (const gchar *data,
 {
 	guint	pos = 0;
 	Matches tmap[] = {
-		{"TAL", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle"},
-		{"TT1", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TT2", NIE_PREFIX "title", NULL, NULL, NULL},
-		{"TT3", NIE_PREFIX "title", NULL, NULL, NULL},
-		{"TXT", NIE_PREFIX "comment", NULL, NULL, NULL},
-		{"TPB", NCO_PREFIX "publisher", "publisher", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
+		{"TAL", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle", &filedata->id3v1_info->album},
+		{"TT1", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TT2", NIE_PREFIX "title", NULL, NULL, NULL, &filedata->id3v1_info->title},
+		{"TT3", NIE_PREFIX "title", NULL, NULL, NULL, &filedata->id3v1_info->title},
+		{"TXT", NIE_PREFIX "comment", NULL, NULL, NULL, &filedata->id3v1_info->comment},
+		{"TPB", NCO_PREFIX "publisher", "publisher", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
 		/* TODO {"WAF", "DC:Location", NULL, NULL, NULL},
 		   TODO {"WAR", "DC:Location", NULL, NULL, NULL},
 		   TODO {"WAS", "DC:Location", NULL, NULL, NULL},
 		   TODO {"WAF", "DC:Location", NULL, NULL, NULL}, */
-		{"WCM", NIE_PREFIX "license", NULL, NULL, NULL},
-		{"TYE", NIE_PREFIX "contentCreated"},
-		{"TLA", NIE_PREFIX "language", NULL, NULL, NULL},
-		{"TP1", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TP2", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TP3", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TEN", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TCO", NMM_PREFIX "genre", NULL, NULL, NULL},
-		{"TCR", NIE_PREFIX "copyright", NULL, NULL, NULL},
-		{"SLT", NIE_PREFIX "plainTextContent"}, /* Lyrics */
-		{"TOA", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"TOT", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle"},
-		{"TOL", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName"},
-		{"COM", NIE_PREFIX "comment", NULL, NULL, NULL},
-		{"TLE", NMM_PREFIX "duration", NULL, NULL, NULL},
+		{"WCM", NIE_PREFIX "license", NULL, NULL, NULL, NULL},
+		{"TYE", NIE_PREFIX "contentCreated", NULL, NULL, NULL, &filedata->id3v1_info->year},
+		{"TLA", NIE_PREFIX "language", NULL, NULL, NULL, NULL},
+		{"TP1", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TP2", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TP3", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TEN", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TCO", NMM_PREFIX "genre", NULL, NULL, NULL, &filedata->id3v1_info->genre},
+		{"TCR", NIE_PREFIX "copyright", NULL, NULL, NULL, NULL},
+		{"SLT", NIE_PREFIX "plainTextContent", NULL, NULL, NULL, NULL}, /* Lyrics */
+		{"TOA", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"TOT", NIE_PREFIX "musicAlbum", "album", NMM_PREFIX "MusicAlbum", NMM_PREFIX "albumTitle", &filedata->id3v1_info->album},
+		{"TOL", NMM_PREFIX "performer", "artist", NMM_PREFIX "Artist", NMM_PREFIX "artistName", &filedata->id3v1_info->artist},
+		{"COM", NIE_PREFIX "comment", NULL, NULL, NULL, &filedata->id3v1_info->comment},
+		{"TLE", NMM_PREFIX "duration", NULL, NULL, NULL, NULL},
 		{ NULL, 0, NULL, NULL, NULL},
 	};
 
@@ -1376,6 +1389,11 @@ get_id3v20_tags (const gchar *data,
 						filedata->duration = duration/1000;
 					}
 
+					if (tmap[i].nullify) {
+						/* prefer ID3v2 tag over ID3v1 tag */
+						g_free (*tmap[i].nullify);
+						*tmap[i].nullify = NULL;
+					}
 					if (tmap[i].urn) {
 						gchar *canonical_uri = tmap[i].urn[0]!=':'?tracker_uri_printf_escaped ("urn:%s:%s", tmap[i].urn, word):g_strdup(tmap[i].urn);
 						tracker_statement_list_insert (metadata, canonical_uri, RDF_TYPE, tmap[i].rdf_type);
@@ -1660,6 +1678,7 @@ extract_mp3 (const gchar *uri,
 	filedata.duration = 0;
 	filedata.albumartdata = NULL;
 	filedata.albumartsize = 0;
+	filedata.id3v1_info = &info;
 
 	filename = g_filename_from_uri (uri, NULL, NULL);
 
@@ -1722,6 +1741,9 @@ extract_mp3 (const gchar *uri,
 	                          RDF_TYPE, 
 	                          NMM_PREFIX "MusicPiece");
 
+	/* Get other embedded tags */
+	audio_offset = parse_id3v2 (buffer, buffer_size, uri, metadata, &filedata);
+
 	if (!tracker_is_empty_string (info.title)) {
 		tracker_statement_list_insert (metadata, uri,
 				     NIE_PREFIX "title",
@@ -1776,9 +1798,6 @@ extract_mp3 (const gchar *uri,
 	g_free (info.trackno);
 	g_free (info.genre);
 
-	/* Get other embedded tags */
-	audio_offset = parse_id3v2 (buffer, buffer_size, uri, metadata, &filedata);
-
 	/* Get mp3 stream info */
 	mp3_parse (buffer, buffer_size, audio_offset, uri, metadata, &filedata);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]