[tracker/tracker-0.6] Bugfix for NB#119318, remaining v2 fields are now processed too



commit 5d7a7db8c4a3b92e6115ed1c1ad65e3ae3bf564b
Author: Philip Van Hoof <philip codeminded be>
Date:   Wed Jun 17 17:54:06 2009 +0200

    Bugfix for NB#119318, remaining v2 fields are now processed too

 src/tracker-extract/tracker-extract-mp3.c |  197 ++++++++++++++++++-----------
 1 files changed, 125 insertions(+), 72 deletions(-)
---
diff --git a/src/tracker-extract/tracker-extract-mp3.c b/src/tracker-extract/tracker-extract-mp3.c
index 0ecd2d0..e225b6c 100644
--- a/src/tracker-extract/tracker-extract-mp3.c
+++ b/src/tracker-extract/tracker-extract-mp3.c
@@ -81,6 +81,7 @@ typedef struct {
 	gchar *comment;
 	gchar *trackno;
 	gchar *genre;
+	gchar *encoding;
 } id3tag;
 
 typedef struct {
@@ -456,8 +457,9 @@ un_unsync (const unsigned char *source,
 	*dest_size = new_size;
 }
 
+
 static char*
-get_encoding (const char *data, size_t size, gboolean **is_enca)
+get_encoding (const char *data, gssize size, gboolean *is_enca)
 {
 	gchar *encoding = NULL;
 
@@ -495,6 +497,46 @@ get_encoding (const char *data, size_t size, gboolean **is_enca)
 	return encoding;
 }
 
+static gchar*
+t_convert (const gchar *str,
+           gssize len,
+           const gchar *to_codeset,
+           const gchar *from_codeset,
+           gsize *bytes_read,
+           gsize *bytes_written,
+           GError **error_out)
+{
+	GError *error = NULL;
+	gchar *word;
+
+	/* g_print ("%s for %s\n", from_codeset, str); */
+
+	word = g_convert (str,
+			  len,
+			  to_codeset,
+			  from_codeset,
+			  bytes_read, bytes_written, &error);
+
+	if (error) {
+		gchar *encoding = get_encoding (str, len, NULL);
+
+		if (word) {
+			g_free (word);
+		}
+
+		word = g_convert (str,
+				  len,
+				  to_codeset,
+				  encoding,
+				  bytes_read, bytes_written, error_out);
+
+		g_free (encoding);
+		g_error_free (error);
+	}
+
+	return word;
+}
+
 static gboolean
 get_id3 (const gchar *data,
 	 size_t       size,
@@ -504,7 +546,7 @@ get_id3 (const gchar *data,
 	GString *s;
 #endif /* HAVE_ENCA */
 	const gchar *pos;
-	gchar *encoding = NULL;
+	const gchar *encoding = "ISO-8859-1", *enca;
 	gchar buf[5];
 	gboolean is_enca = FALSE;
 
@@ -522,21 +564,26 @@ get_id3 (const gchar *data,
 		return FALSE;
 	}
 
+	/* Now convert all the data separately */
+	pos += 3;
+
+	/* We don't use our magic t_convert here because we have a better way
+	 * to collect a bit more data before we let enca loose on it for v1. */
+
 #ifdef HAVE_ENCA
 	/* Get the encoding for ALL the data we are extracting here */
-	s = g_string_new ("");
-	g_string_append_len (s, pos, 30);
+	s = g_string_new_len (pos, 30);
 	g_string_append_len (s, pos + 30, 30);
 	g_string_append_len (s, pos + 60, 30);
 
-	encoding = get_encoding (s->str, 90, &is_enca);
+	enca = get_encoding (s->str, 90, &is_enca);
+	if (is_enca) {
+		id3->encoding = enca;
+		encoding = enca;
+	}
 	g_string_free (s, TRUE);
-#else  /* HAVE_ENCA */
-	encoding = get_encoding (NULL, 0, NULL);
 #endif /* HAVE_ENCA */
 
-	/* Now convert all the data separately */
-	pos += 3;
 	id3->title = g_convert (pos, 30, "UTF-8", encoding, NULL, NULL, NULL);
 
 	pos += 30;
@@ -567,9 +614,7 @@ get_id3 (const gchar *data,
 		id3->genre = g_strdup ("");
 	}
 
-	g_free (encoding);
-
-	return is_enca;
+	return TRUE;
 }
 
 static gboolean
@@ -799,6 +844,7 @@ mp3_parse (const gchar *data,
 static void
 get_id3v24_tags (const gchar *data,
 		 size_t       size,
+		 id3tag      *info,
 		 GHashTable  *metadata,
 		 file_data   *filedata)
 {
@@ -879,24 +925,24 @@ get_id3v24_tags (const gchar *data,
 
 				switch (data[pos + 10]) {
 				case 0x00:
-					word = g_convert (&data[pos + 11],
+					word = t_convert (&data[pos + 11],
 							  csize - 1,
 							  "UTF-8",
-							  "ISO-8859-1",
+							  info->encoding ? info->encoding : "ISO-8859-1",
 							  NULL, NULL, NULL);
 					break;
 				case 0x01 :
-					word = g_convert (&data[pos + 11],
+					word = t_convert (&data[pos + 11],
 							  csize - 1,
 							  "UTF-8",
-							  "UTF-16",
+							  info->encoding ? info->encoding : "UTF-16",
 							  NULL, NULL, NULL);
 					break;
 				case 0x02 :
-					word = g_convert (&data[pos + 11],
+					word = t_convert (&data[pos + 11],
 							  csize - 1,
 							  "UTF-8",
-							  "UTF-16BE",
+							  info->encoding ? info->encoding : "UTF-16BE",
 							  NULL, NULL, NULL);
 					break;
 				case 0x03 :
@@ -908,10 +954,10 @@ get_id3v24_tags (const gchar *data,
 					 * try to convert from
 					 * iso-8859-1
 					 */
-					word = g_convert (&data[pos + 11],
+					word = t_convert (&data[pos + 11],
 							  csize - 1,
 							  "UTF-8",
-							  "ISO-8859-1",
+							  info->encoding ? info->encoding : "ISO-8859-1",
 							  NULL, NULL, NULL);
 					break;
 				}
@@ -979,24 +1025,24 @@ get_id3v24_tags (const gchar *data,
 
 			switch (text_encode) {
 			case 0x00:
-				word = g_convert (text,
+				word = t_convert (text,
 						  csize - offset,
 						  "UTF-8",
-						  "ISO-8859-1",
+						  info->encoding ? info->encoding : "ISO-8859-1",
 						  NULL, NULL, NULL);
 				break;
 			case 0x01:
-				word = g_convert (text,
+				word = t_convert (text,
 						  csize - offset,
 						  "UTF-8",
-						  "UTF-16",
+						  info->encoding ? info->encoding : "UTF-16",
 						  NULL, NULL, NULL);
 				break;
 			case 0x02:
-				word = g_convert (text,
+				word = t_convert (text,
 						  csize-offset,
 						  "UTF-8",
-						  "UTF-16BE",
+						  info->encoding ? info->encoding : "UTF-16BE",
 						  NULL, NULL, NULL);
 				break;
 			case 0x03:
@@ -1008,10 +1054,10 @@ get_id3v24_tags (const gchar *data,
 				 * try to convert from
 				 * iso-8859-1
 				 */
-				word = g_convert (text,
+				word = t_convert (text,
 						  csize - offset,
 						  "UTF-8",
-						  "ISO-8859-1",
+						  info->encoding ? info->encoding : "ISO-8859-1",
 						  NULL, NULL, NULL);
 				break;
 			}
@@ -1060,6 +1106,7 @@ get_id3v24_tags (const gchar *data,
 static void
 get_id3v23_tags (const gchar *data,
 		 size_t       size,
+		 id3tag      *info,
 		 GHashTable  *metadata,
 		 file_data   *filedata)
 {
@@ -1137,10 +1184,10 @@ get_id3v23_tags (const gchar *data,
 
 				switch (data[pos + 10]) {
 				case 0x00:
-					word = g_convert (&data[pos + 11],
+					word = t_convert (&data[pos + 11],
 							  csize - 1,
 							  "UTF-8",
-							  "ISO-8859-1",
+							  info->encoding ? info->encoding : "ISO-8859-1",
 							  NULL, NULL, NULL);
 					break;
 				case 0x01 :
@@ -1157,10 +1204,10 @@ get_id3v23_tags (const gchar *data,
 					 * try to convert from
 					 * iso-8859-1
 					 */
-					word = g_convert (&data[pos + 11],
+					word = t_convert (&data[pos + 11],
 							  csize - 1,
 							  "UTF-8",
-							  "ISO-8859-1",
+							  info->encoding ? info->encoding : "ISO-8859-1",
 							  NULL, NULL, NULL);
 					break;
 				}
@@ -1228,10 +1275,10 @@ get_id3v23_tags (const gchar *data,
 
 			switch (text_encode) {
 			case 0x00:
-				word = g_convert (text,
+				word = t_convert (text,
 						  csize - offset,
 						  "UTF-8",
-						  "ISO-8859-1",
+						  info->encoding ? info->encoding : "ISO-8859-1",
 						  NULL, NULL, NULL);
 				break;
 			case 0x01 :
@@ -1248,10 +1295,10 @@ get_id3v23_tags (const gchar *data,
 				 * try to convert from
 				 * iso-8859-1
 				 */
-				word = g_convert (text,
+				word = t_convert (text,
 						  csize - offset,
 						  "UTF-8",
-						  "ISO-8859-1",
+						  info->encoding ? info->encoding : "ISO-8859-1",
 						  NULL, NULL, NULL);
 				break;
 			}
@@ -1299,6 +1346,7 @@ get_id3v23_tags (const gchar *data,
 static void
 get_id3v20_tags (const gchar *data,
 		 size_t	      size,
+		 id3tag      *info,
 		 GHashTable  *metadata,
 		 file_data   *filedata)
 {
@@ -1365,10 +1413,10 @@ get_id3v20_tags (const gchar *data,
 				 */
 				switch (data[pos + 6]) {
 				case 0x00:
-					word = g_convert (&data[pos + 7],
+					word = t_convert (&data[pos + 7],
 							  csize - 1,
 							  "UTF-8",
-							  "ISO-8859-1",
+							  info->encoding ? info->encoding : "ISO-8859-1",
 							  NULL, NULL, NULL);
 					break;
 				case 0x01 :
@@ -1385,10 +1433,10 @@ get_id3v20_tags (const gchar *data,
 					 * try to convert from
 					 * iso-8859-1
 					 */
-					word = g_convert (&data[pos + 7],
+					word = t_convert (&data[pos + 7],
 							  csize - 1,
 							  "UTF-8",
-							  "ISO-8859-1",
+							  info->encoding ? info->encoding : "ISO-8859-1",
 							  NULL, NULL, NULL);
 					break;
 				}
@@ -1466,6 +1514,7 @@ get_id3v20_tags (const gchar *data,
 static void
 parse_id3v24 (const gchar *data,
 	      size_t       size,
+	      id3tag      *info,
 	      GHashTable  *metadata,
 	      file_data   *filedata,
 	      size_t      *offset_delta)
@@ -1517,10 +1566,10 @@ parse_id3v24 (const gchar *data,
 		gchar  *body;
 
 		un_unsync (&data[pos], tsize, (unsigned char **)&body, &unsync_size);
-		get_id3v24_tags (body, unsync_size, metadata, filedata);
+		get_id3v24_tags (body, unsync_size, info, metadata, filedata);
 		g_free (body);
 	} else {
-		get_id3v24_tags (&data[pos], tsize, metadata, filedata);
+		get_id3v24_tags (&data[pos], tsize, info, metadata, filedata);
 	}
 
 	*offset_delta = tsize + 10;
@@ -1529,6 +1578,7 @@ parse_id3v24 (const gchar *data,
 static void
 parse_id3v23 (const gchar *data,
 	      size_t       size,
+	      id3tag      *info,
 	      GHashTable  *metadata,
 	      file_data   *filedata,
 	      size_t      *offset_delta)
@@ -1590,10 +1640,10 @@ parse_id3v23 (const gchar *data,
 		gchar  *body;
 
 		un_unsync (&data[pos], tsize, (unsigned char **)&body, &unsync_size);
-		get_id3v23_tags (body, unsync_size, metadata, filedata);
+		get_id3v23_tags (body, unsync_size, info, metadata, filedata);
 		g_free (body);
 	} else {
-		get_id3v23_tags (&data[pos], tsize, metadata, filedata);
+		get_id3v23_tags (&data[pos], tsize, info, metadata, filedata);
 	}
 
 	*offset_delta = tsize + 10;
@@ -1601,7 +1651,8 @@ parse_id3v23 (const gchar *data,
 
 static void
 parse_id3v20 (const gchar *data,
-	      size_t	      size,
+	      size_t	   size,
+	      id3tag      *info,
 	      GHashTable  *metadata,
 	      file_data   *filedata,
 	      size_t      *offset_delta)
@@ -1635,10 +1686,10 @@ parse_id3v20 (const gchar *data,
 		gchar  *body;
 
 		un_unsync (&data[pos], tsize, (unsigned char **)&body, &unsync_size);
-		get_id3v20_tags (body, unsync_size, metadata, filedata);
+		get_id3v20_tags (body, unsync_size, info, metadata, filedata);
 		g_free (body);
 	} else {
-		get_id3v20_tags (&data[pos], tsize, metadata, filedata);
+		get_id3v20_tags (&data[pos], tsize, info, metadata, filedata);
 	}
 
 	*offset_delta = tsize + 10;
@@ -1647,6 +1698,7 @@ parse_id3v20 (const gchar *data,
 static goffset
 parse_id3v2 (const gchar *data,
 	     size_t	  size,
+	     id3tag      *info,
 	     GHashTable  *metadata,
 	     file_data   *filedata)
 {
@@ -1655,9 +1707,9 @@ parse_id3v2 (const gchar *data,
 
 	do {
 		size_t offset_delta = 0;
-		parse_id3v24 (data+offset, size-offset, metadata, filedata, &offset_delta);
-		parse_id3v23 (data+offset, size-offset, metadata, filedata, &offset_delta);
-		parse_id3v20 (data+offset, size-offset, metadata, filedata, &offset_delta);		
+		parse_id3v24 (data+offset, size-offset, info, metadata, filedata, &offset_delta);
+		parse_id3v23 (data+offset, size-offset, info, metadata, filedata, &offset_delta);
+		parse_id3v20 (data+offset, size-offset, info, metadata, filedata, &offset_delta);
 
 		if (offset_delta == 0) {
 			done = TRUE;
@@ -1683,7 +1735,6 @@ extract_mp3 (const gchar *filename,
 	id3tag	     info;
 	goffset      audio_offset;
 	file_data    filedata;
-	gboolean     is_enca;
 
 	info.title = NULL;
 	info.artist = NULL;
@@ -1692,6 +1743,7 @@ extract_mp3 (const gchar *filename,
 	info.comment = NULL;
 	info.genre = NULL;
 	info.trackno = NULL;
+	info.encoding = NULL;
 
 	filedata.size = 0;
 	filedata.id3v2_size = 0;
@@ -1747,7 +1799,9 @@ extract_mp3 (const gchar *filename,
 		return;
 	}
 
-	is_enca = get_id3 (id3v1_buffer, ID3V1_SIZE, &info);
+	if (!get_id3 (id3v1_buffer, ID3V1_SIZE, &info)) {
+		/* Do nothing ? */
+	}
 
 	g_free (id3v1_buffer);
 
@@ -1795,6 +1849,12 @@ extract_mp3 (const gchar *filename,
 				     tracker_escape_metadata (info.trackno));		
 	}
 
+	/* Get other embedded tags */
+	audio_offset = parse_id3v2 (buffer, buffer_size, &info, metadata, &filedata);
+
+	/* Get mp3 stream info */
+	mp3_parse (buffer, buffer_size, audio_offset, metadata, &filedata);
+
 	g_free (info.title);
 	g_free (info.year);
 	g_free (info.album);
@@ -1802,32 +1862,25 @@ extract_mp3 (const gchar *filename,
 	g_free (info.comment);
 	g_free (info.trackno);
 	g_free (info.genre);
-
-	if (!is_enca) {
-		/* Get other embedded tags */
-		audio_offset = parse_id3v2 (buffer, buffer_size, metadata, &filedata);
-
-		/* Get mp3 stream info */
-		mp3_parse (buffer, buffer_size, audio_offset, metadata, &filedata);
+	g_free (info.encoding);
 
 #ifdef HAVE_GDKPIXBUF
-		tracker_process_albumart (filedata.albumartdata, filedata.albumartsize, filedata.albumartmime,
-					  /* g_hash_table_lookup (metadata, "Audio:Artist") */ NULL,
-					  g_hash_table_lookup (metadata, "Audio:Album"),
-					  g_hash_table_lookup (metadata, "Audio:AlbumTrackCount"),
-					  filename);
+	tracker_process_albumart (filedata.albumartdata, filedata.albumartsize, filedata.albumartmime,
+				  /* g_hash_table_lookup (metadata, "Audio:Artist") */ NULL,
+				  g_hash_table_lookup (metadata, "Audio:Album"),
+				  g_hash_table_lookup (metadata, "Audio:AlbumTrackCount"),
+				  filename);
 #else
-		tracker_process_albumart (NULL, 0, NULL,
-					  /* g_hash_table_lookup (metadata, "Audio:Artist") */ NULL,
-					  g_hash_table_lookup (metadata, "Audio:Album"),
-					  g_hash_table_lookup (metadata, "Audio:AlbumTrackCount"),
-					  filename);
+	tracker_process_albumart (NULL, 0, NULL,
+				  /* g_hash_table_lookup (metadata, "Audio:Artist") */ NULL,
+				  g_hash_table_lookup (metadata, "Audio:Album"),
+				  g_hash_table_lookup (metadata, "Audio:AlbumTrackCount"),
+				  filename);
 
 #endif /* HAVE_GDKPIXBUF */
 
-		g_free (filedata.albumartdata);
-		g_free (filedata.albumartmime);
-	}
+	g_free (filedata.albumartdata);
+	g_free (filedata.albumartmime);
 
 	/* Check that we have the minimum data. FIXME We should not need to do this */
 	if (!g_hash_table_lookup (metadata, "Audio:Title")) {



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