[tracker/tracker-0.6] Bugfix for NB#119318, remaining v2 fields are now processed too
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Subject: [tracker/tracker-0.6] Bugfix for NB#119318, remaining v2 fields are now processed too
- Date: Wed, 17 Jun 2009 11:54:09 -0400 (EDT)
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]