[tracker] tracker-extract: MP3 extractor code clean up
- From: Martyn James Russell <mr src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker] tracker-extract: MP3 extractor code clean up
- Date: Thu, 5 Nov 2009 13:24:20 +0000 (UTC)
commit a0836c6e47ef0cb583f79441ce5162a7d3b6f3e6
Author: Martyn Russell <martyn lanedo com>
Date: Thu Nov 5 13:24:07 2009 +0000
tracker-extract: MP3 extractor code clean up
src/tracker-extract/tracker-extract-mp3.c | 835 ++++++++++++++---------------
1 files changed, 407 insertions(+), 428 deletions(-)
---
diff --git a/src/tracker-extract/tracker-extract-mp3.c b/src/tracker-extract/tracker-extract-mp3.c
index 66b8b4e..f626635 100644
--- a/src/tracker-extract/tracker-extract-mp3.c
+++ b/src/tracker-extract/tracker-extract-mp3.c
@@ -1,7 +1,7 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
- * Copyright (C) 2008, Nokia
+ * Copyright (C) 2008-2009, Nokia
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
@@ -54,14 +54,16 @@
#include "tracker-main.h"
#include "tracker-dbus.h"
-/* We mmap the beginning of the file and read separately the last 128 bytes
- for id3v1 tags. While these are probably cornercases the rationale is that
- we don't want to fault a whole page for the last 128 bytes and on the other
- we don't want to mmap the whole file with unlimited size (might need to create
- private copy in some special cases, finding continuous space etc). We now take
- 5 first MB of the file and assume that this is enough. In theory there is no
- maximum size as someone could embed 50 gigabytes of albumart there.
-*/
+/* We mmap the beginning of the file and read separately the last 128
+ * bytes for id3v1 tags. While these are probably cornercases the
+ * rationale is that we don't want to fault a whole page for the last
+ * 128 bytes and on the other we don't want to mmap the whole file
+ * with unlimited size (might need to create private copy in some
+ * special cases, finding continuous space etc). We now take 5 first
+ * MB of the file and assume that this is enough. In theory there is
+ * no maximum size as someone could embed 50 gigabytes of albumart
+ * there.
+ */
#define MAX_FILE_READ 1024 * 1024 * 5
#define MAX_MP3_SCAN_DEEP 16768
@@ -71,20 +73,6 @@
#define ID3V1_SIZE 128
-#define NMM_PREFIX TRACKER_NMM_PREFIX
-#define NFO_PREFIX TRACKER_NFO_PREFIX
-#define NIE_PREFIX TRACKER_NIE_PREFIX
-#define DC_PREFIX TRACKER_DC_PREFIX
-#define NCO_PREFIX TRACKER_NCO_PREFIX
-
-#define RDF_PREFIX TRACKER_RDF_PREFIX
-#define RDF_TYPE RDF_PREFIX "type"
-
-typedef struct {
- const gchar *text;
- gchar **field;
-} Matches;
-
typedef struct {
gchar *title;
gchar *artist;
@@ -114,49 +102,23 @@ typedef struct {
gint track_number;
} id3v2tag;
-typedef struct {
- size_t size;
- size_t id3v2_size;
-
- guint32 duration;
-
- gchar *title;
- gchar *performer;
- gchar *performer_uri;
- gchar *album;
- gchar *album_uri;
- gchar *genre;
- gchar *text;
- gchar *recording_time;
- gchar *copyright;
- gchar *publisher;
- gchar *comment;
-
- gint track_number;
-
- unsigned char *albumartdata;
- size_t albumartsize;
- gchar *albumartmime;
-
- id3tag id3v1_info;
- id3v2tag id3v22_info;
- id3v2tag id3v23_info;
- id3v2tag id3v24_info;
-} file_data;
-
-enum {
- MPEG_ERR,
- MPEG_V1,
- MPEG_V2,
- MPEG_V25
-};
-
-enum {
- LAYER_ERR,
- LAYER_1,
- LAYER_2,
- LAYER_3
-};
+typedef enum {
+ ID3V2_UNKNOWN,
+ ID3V2_COM,
+ ID3V2_PIC,
+ ID3V2_TAL,
+ ID3V2_TCO,
+ ID3V2_TCR,
+ ID3V2_TLE,
+ ID3V2_TPB,
+ ID3V2_TP1,
+ ID3V2_TP2,
+ ID3V2_TT1,
+ ID3V2_TT2,
+ ID3V2_TT3,
+ ID3V2_TXT,
+ ID3V2_TYE,
+} id3v2frame;
typedef enum {
ID3V24_UNKNOWN,
@@ -179,8 +141,58 @@ typedef enum {
ID3V24_TYER,
} id3v24frame;
+typedef struct {
+ size_t size;
+ size_t id3v2_size;
+
+ guint32 duration;
+
+ gchar *title;
+ gchar *performer;
+ gchar *performer_uri;
+ gchar *album;
+ gchar *album_uri;
+ gchar *genre;
+ gchar *text;
+ gchar *recording_time;
+ gchar *copyright;
+ gchar *publisher;
+ gchar *comment;
+
+ gint track_number;
+
+ unsigned char *albumart_data;
+ size_t albumart_size;
+ gchar *albumart_mime;
+
+ id3tag id3v1;
+ id3v2tag id3v22;
+ id3v2tag id3v23;
+ id3v2tag id3v24;
+} MP3Data;
+
+static void extract_mp3 (const gchar *filename,
+ TrackerSparqlBuilder *metadata);
+
+enum {
+ MPEG_ERR,
+ MPEG_V1,
+ MPEG_V2,
+ MPEG_V25
+};
+
+enum {
+ LAYER_ERR,
+ LAYER_1,
+ LAYER_2,
+ LAYER_3
+};
+
/* sorted array */
-static const struct { const char *name; id3v24frame frame; } id3v24_frames[] = {
+static const struct {
+ const char *name;
+ id3v24frame frame;
+} id3v24_frames[] = {
{ "APIC", ID3V24_APIC },
{ "COMM", ID3V24_COMM },
{ "TALB", ID3V24_TALB },
@@ -200,26 +212,11 @@ static const struct { const char *name; id3v24frame frame; } id3v24_frames[] = {
{ "TYER", ID3V24_TYER },
};
-typedef enum {
- ID3V2_UNKNOWN,
- ID3V2_COM,
- ID3V2_PIC,
- ID3V2_TAL,
- ID3V2_TCO,
- ID3V2_TCR,
- ID3V2_TLE,
- ID3V2_TPB,
- ID3V2_TP1,
- ID3V2_TP2,
- ID3V2_TT1,
- ID3V2_TT2,
- ID3V2_TT3,
- ID3V2_TXT,
- ID3V2_TYE,
-} id3v2frame;
-
/* sorted array */
-static const struct { const char *name; id3v2frame frame; } id3v2_frames[] = {
+static const struct {
+ const char *name;
+ id3v2frame frame;
+} id3v2_frames[] = {
{ "COM", ID3V2_COM },
{ "PIC", ID3V2_PIC },
{ "TAL", ID3V2_TAL },
@@ -236,9 +233,6 @@ static const struct { const char *name; id3v2frame frame; } id3v2_frames[] = {
{ "TYE", ID3V2_TYE },
};
-static void extract_mp3 (const gchar *filename,
- TrackerSparqlBuilder *metadata);
-
static const char *const genre_names[] = {
"Blues",
"Classic Rock",
@@ -418,12 +412,14 @@ static guint bitrate_table[16][6] = {
};
static gint freq_table[4][3] = {
- {44100, 22050, 11025},
- {48000, 24000, 12000},
- {32000, 16000, 8000}
+ { 44100, 22050, 11025 },
+ { 48000, 24000, 12000 },
+ { 32000, 16000, 8000 }
};
-static gint spf_table[6] = { 48, 144, 144, 48, 144, 72 };
+static gint spf_table[6] = {
+ 48, 144, 144, 48, 144, 72
+};
static TrackerExtractData extract_data[] = {
{ "audio/mpeg", extract_mp3 },
@@ -432,17 +428,18 @@ static TrackerExtractData extract_data[] = {
};
static char *
-read_id3v1_buffer (int fd, goffset size)
+read_id3v1_buffer (int fd,
+ goffset size)
{
char *buffer;
guint bytes_read;
guint rc;
- if (size<128) {
+ if (size < 128) {
return NULL;
}
- if (lseek (fd, size-ID3V1_SIZE, SEEK_SET) < 0) {
+ if (lseek (fd, size - ID3V1_SIZE, SEEK_SET) < 0) {
return NULL;
}
@@ -455,19 +452,19 @@ read_id3v1_buffer (int fd, goffset size)
bytes_read = 0;
while (bytes_read < ID3V1_SIZE) {
- rc = read(fd,
- buffer + bytes_read,
- ID3V1_SIZE - bytes_read);
+ rc = read (fd,
+ buffer + bytes_read,
+ ID3V1_SIZE - bytes_read);
if (rc == -1) {
if (errno != EINTR) {
g_free (buffer);
return NULL;
}
- }
- else if (rc == 0)
+ } else if (rc == 0) {
break;
- else
+ } else {
bytes_read += rc;
+ }
}
return buffer;
@@ -512,11 +509,13 @@ get_genre_number (const char *str, guint *genre)
GMatchInfo *info = NULL;
gchar *result = NULL;
- if (!regex1)
+ if (!regex1) {
regex1 = g_regex_new ("\\(([0-9]+)\\)", 0, 0, NULL);
+ }
- if (!regex2)
+ if (!regex2) {
regex2 = g_regex_new ("([0-9]+)\\z", 0, 0, NULL);
+ }
if (g_regex_match (regex1, str, 0, &info)) {
result = g_match_info_fetch (info, 1);
@@ -561,10 +560,11 @@ un_unsync (const unsigned char *source,
unsigned char **destination,
size_t *dest_size)
{
- size_t offset = 0;
- gchar *dest;
- size_t new_size;
+ size_t offset;
+ gchar *dest;
+ size_t new_size;
+ offset = 0;
*destination = g_malloc0 (size);
dest = *destination;
new_size = size;
@@ -600,7 +600,6 @@ get_encoding (const char *data,
}
#ifdef HAVE_ENCA
-
langs = enca_get_languages (&s);
for (i = 0; i < s && !encoding; i++) {
@@ -632,14 +631,14 @@ get_encoding (const char *data,
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)
+static gchar *
+convert_to_encoding (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;
@@ -704,9 +703,10 @@ get_id3 (const gchar *data,
/* 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. */
-
+ /* We don't use our magic convert_to_encoding 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_len (pos, 30);
@@ -769,12 +769,12 @@ get_id3 (const gchar *data,
static gboolean
-mp3_parse_header (const gchar *data,
- size_t size,
- size_t seek_pos,
- const gchar *uri,
- TrackerSparqlBuilder *metadata,
- file_data *filedata)
+mp3_parse_header (const gchar *data,
+ size_t size,
+ size_t seek_pos,
+ const gchar *uri,
+ TrackerSparqlBuilder *metadata,
+ MP3Data *filedata)
{
guint header;
gchar mpeg_ver = 0;
@@ -874,7 +874,8 @@ mp3_parse_header (const gchar *data,
memcpy(&header, &data[pos], sizeof (header));
} while ((header & sync_mask) == sync_mask);
- if (frames < 2) { /* At least 2 frames to check the right position */
+ /* At least 2 frames to check the right position */
+ if (frames < 2) {
/* No valid frames */
return FALSE;
}
@@ -912,12 +913,12 @@ mp3_parse_header (const gchar *data,
}
static void
-mp3_parse (const gchar *data,
- size_t size,
- size_t offset,
- const gchar *uri,
- TrackerSparqlBuilder *metadata,
- file_data *filedata)
+mp3_parse (const gchar *data,
+ size_t size,
+ size_t offset,
+ const gchar *uri,
+ TrackerSparqlBuilder *metadata,
+ MP3Data *filedata)
{
guint header;
guint counter = 0;
@@ -944,7 +945,9 @@ mp3_parse (const gchar *data,
}
static gchar *
-id3v24_text_to_utf8 (gchar encoding, const gchar *text, gssize len)
+id3v24_text_to_utf8 (const gchar encoding,
+ const gchar *text,
+ gssize len)
{
/* This byte describes the encoding
* try to convert strings to UTF-8
@@ -953,23 +956,23 @@ id3v24_text_to_utf8 (gchar encoding, const gchar *text, gssize len)
switch (encoding) {
case 0x00:
- return t_convert (text,
- len,
- "UTF-8",
- "ISO-8859-1",
- NULL, NULL, NULL);
+ return convert_to_encoding (text,
+ len,
+ "UTF-8",
+ "ISO-8859-1",
+ NULL, NULL, NULL);
case 0x01 :
- return t_convert (text,
- len,
- "UTF-8",
- "UTF-16",
- NULL, NULL, NULL);
+ return convert_to_encoding (text,
+ len,
+ "UTF-8",
+ "UTF-16",
+ NULL, NULL, NULL);
case 0x02 :
- return t_convert (text,
- len,
- "UTF-8",
- "UTF-16BE",
- NULL, NULL, NULL);
+ return convert_to_encoding (text,
+ len,
+ "UTF-8",
+ "UTF-16BE",
+ NULL, NULL, NULL);
case 0x03 :
return strndup (text, len);
@@ -978,16 +981,18 @@ id3v24_text_to_utf8 (gchar encoding, const gchar *text, gssize len)
* try to convert from
* iso-8859-1
*/
- return t_convert (text,
- len,
- "UTF-8",
- "ISO-8859-1",
- NULL, NULL, NULL);
+ return convert_to_encoding (text,
+ len,
+ "UTF-8",
+ "ISO-8859-1",
+ NULL, NULL, NULL);
}
}
static gchar *
-id3v2_text_to_utf8 (gchar encoding, const gchar *text, gssize len)
+id3v2_text_to_utf8 (const gchar encoding,
+ const gchar *text,
+ gssize len)
{
/* This byte describes the encoding
* try to convert strings to UTF-8
@@ -996,37 +1001,36 @@ id3v2_text_to_utf8 (gchar encoding, const gchar *text, gssize len)
switch (encoding) {
case 0x00:
- return t_convert (text,
- len,
- "UTF-8",
- "ISO-8859-1",
- NULL, NULL, NULL);
+ return convert_to_encoding (text,
+ len,
+ "UTF-8",
+ "ISO-8859-1",
+ NULL, NULL, NULL);
case 0x01 :
/* return g_convert (text, */
/* len, */
/* "UTF-8", */
/* "UCS-2", */
/* NULL, NULL, NULL); */
- return ucs2_to_utf8 (text,
- len);
+ return ucs2_to_utf8 (text, len);
default:
/* Bad encoding byte,
* try to convert from
* iso-8859-1
*/
- return t_convert (text,
- len,
- "UTF-8",
- "ISO-8859-1",
- NULL, NULL, NULL);
+ return convert_to_encoding (text,
+ len,
+ "UTF-8",
+ "ISO-8859-1",
+ NULL, NULL, NULL);
}
}
static id3v24frame
id3v24_get_frame (const gchar *name)
{
- int l, r, m;
+ gint l, r, m;
/* use binary search */
@@ -1044,6 +1048,7 @@ id3v24_get_frame (const gchar *name)
l = m + 1;
}
} while (l <= r && strncmp (id3v24_frames[m].name, name, 4) != 0);
+
if (strncmp (id3v24_frames[m].name, name, 4) == 0) {
return id3v24_frames[m].frame;
} else {
@@ -1054,7 +1059,7 @@ id3v24_get_frame (const gchar *name)
static id3v2frame
id3v2_get_frame (const gchar *name)
{
- int l, r, m;
+ gint l, r, m;
/* use binary search */
@@ -1072,6 +1077,7 @@ id3v2_get_frame (const gchar *name)
l = m + 1;
}
} while (l <= r && strncmp (id3v2_frames[m].name, name, 4) != 0);
+
if (strncmp (id3v2_frames[m].name, name, 4) == 0) {
return id3v2_frames[m].frame;
} else {
@@ -1080,14 +1086,14 @@ id3v2_get_frame (const gchar *name)
}
static void
-get_id3v24_tags (const gchar *data,
- size_t size,
- id3tag *info,
- const gchar *uri,
- TrackerSparqlBuilder *metadata,
- file_data *filedata)
+get_id3v24_tags (const gchar *data,
+ size_t size,
+ id3tag *info,
+ const gchar *uri,
+ TrackerSparqlBuilder *metadata,
+ MP3Data *filedata)
{
- id3v2tag *tag = &filedata->id3v24_info;
+ id3v2tag *tag = &filedata->id3v24;
guint pos = 0;
while (pos < size) {
@@ -1136,15 +1142,14 @@ get_id3v24_tags (const gchar *data,
}
switch (frame) {
- case ID3V24_APIC:
- {
+ case ID3V24_APIC: {
/* embedded image */
- gchar text_type;
+ gchar text_type;
const gchar *mime;
- gchar pic_type;
+ gchar pic_type;
const gchar *desc;
- guint offset;
- gint mime_len;
+ guint offset;
+ gint mime_len;
text_type = data[pos + 0];
mime = &data[pos + 1];
@@ -1152,25 +1157,25 @@ get_id3v24_tags (const gchar *data,
pic_type = data[pos + 1 + mime_len + 1];
desc = &data[pos + 1 + mime_len + 1 + 1];
- if (pic_type == 3 || (pic_type == 0 && filedata->albumartsize == 0)) {
+ if (pic_type == 3 || (pic_type == 0 && filedata->albumart_size == 0)) {
offset = pos + 1 + mime_len + 2 + strlen (desc) + 1;
- filedata->albumartdata = g_malloc0 (csize);
- filedata->albumartmime = g_strdup (mime);
- memcpy (filedata->albumartdata, &data[offset], csize);
- filedata->albumartsize = csize;
+ filedata->albumart_data = g_malloc0 (csize);
+ filedata->albumart_mime = g_strdup (mime);
+ memcpy (filedata->albumart_data, &data[offset], csize);
+ filedata->albumart_size = csize;
}
break;
}
- case ID3V24_COMM:
- {
- gchar *word;
- gchar text_encode;
+
+ case ID3V24_COMM: {
+ gchar *word;
+ gchar text_encode;
const gchar *text_language;
const gchar *text_desc;
const gchar *text;
- guint offset;
- gint text_desc_len;
+ guint offset;
+ gint text_desc_len;
text_encode = data[pos + 0]; /* $xx */
text_language = &data[pos + 1]; /* $xx xx xx */
@@ -1191,9 +1196,9 @@ get_id3v24_tags (const gchar *data,
}
break;
}
- default:
- {
- gchar *word;
+
+ default: {
+ gchar *word;
/* text frames */
word = id3v24_text_to_utf8 (data[pos], &data[pos + 1], csize - 1);
@@ -1205,8 +1210,7 @@ get_id3v24_tags (const gchar *data,
case ID3V24_TALB:
tag->album = word;
break;
- case ID3V24_TCON:
- {
+ case ID3V24_TCON: {
gint genre;
if (get_genre_number (word, &genre)) {
@@ -1255,8 +1259,7 @@ get_id3v24_tags (const gchar *data,
case ID3V24_TPUB:
tag->publisher = word;
break;
- case ID3V24_TRCK:
- {
+ case ID3V24_TRCK: {
gchar **parts;
parts = g_strsplit (word, "/", 2);
@@ -1286,15 +1289,15 @@ get_id3v24_tags (const gchar *data,
}
static void
-get_id3v23_tags (const gchar *data,
- size_t size,
- id3tag *info,
- const gchar *uri,
- TrackerSparqlBuilder *metadata,
- file_data *filedata)
+get_id3v23_tags (const gchar *data,
+ size_t size,
+ id3tag *info,
+ const gchar *uri,
+ TrackerSparqlBuilder *metadata,
+ MP3Data *filedata)
{
- id3v2tag *tag = &filedata->id3v23_info;
- guint pos = 0;
+ id3v2tag *tag = &filedata->id3v23;
+ guint pos = 0;
while (pos < size) {
id3v24frame frame;
@@ -1341,15 +1344,14 @@ get_id3v23_tags (const gchar *data,
}
switch (frame) {
- case ID3V24_APIC:
- {
+ case ID3V24_APIC: {
/* embedded image */
- gchar text_type;
+ gchar text_type;
const gchar *mime;
- gchar pic_type;
+ gchar pic_type;
const gchar *desc;
- guint offset;
- gint mime_len;
+ guint offset;
+ gint mime_len;
text_type = data[pos + 0];
mime = &data[pos + 1];
@@ -1357,25 +1359,25 @@ get_id3v23_tags (const gchar *data,
pic_type = data[pos + 1 + mime_len + 1];
desc = &data[pos + 1 + mime_len + 1 + 1];
- if (pic_type == 3 || (pic_type == 0 && filedata->albumartsize == 0)) {
+ if (pic_type == 3 || (pic_type == 0 && filedata->albumart_size == 0)) {
offset = pos + 1 + mime_len + 2 + strlen (desc) + 1;
- filedata->albumartdata = g_malloc0 (csize);
- filedata->albumartmime = g_strdup (mime);
- memcpy (filedata->albumartdata, &data[offset], csize);
- filedata->albumartsize = csize;
+ filedata->albumart_data = g_malloc0 (csize);
+ filedata->albumart_mime = g_strdup (mime);
+ memcpy (filedata->albumart_data, &data[offset], csize);
+ filedata->albumart_size = csize;
}
break;
}
- case ID3V24_COMM:
- {
- gchar *word;
- gchar text_encode;
+
+ case ID3V24_COMM: {
+ gchar *word;
+ gchar text_encode;
const gchar *text_language;
const gchar *text_desc;
const gchar *text;
- guint offset;
- gint text_desc_len;
+ guint offset;
+ gint text_desc_len;
text_encode = data[pos + 0]; /* $xx */
text_language = &data[pos + 1]; /* $xx xx xx */
@@ -1397,9 +1399,9 @@ get_id3v23_tags (const gchar *data,
break;
}
- default:
- {
- gchar *word;
+
+ default: {
+ gchar *word;
/* text frames */
word = id3v2_text_to_utf8 (data[pos], &data[pos + 1], csize - 1);
@@ -1411,8 +1413,7 @@ get_id3v23_tags (const gchar *data,
case ID3V24_TALB:
tag->album = word;
break;
- case ID3V24_TCON:
- {
+ case ID3V24_TCON: {
gint genre;
if (get_genre_number (word, &genre)) {
@@ -1454,8 +1455,7 @@ get_id3v23_tags (const gchar *data,
case ID3V24_TPUB:
tag->publisher = word;
break;
- case ID3V24_TRCK:
- {
+ case ID3V24_TRCK: {
gchar **parts;
parts = g_strsplit (word, "/", 2);
@@ -1485,15 +1485,15 @@ get_id3v23_tags (const gchar *data,
}
static void
-get_id3v20_tags (const gchar *data,
- size_t size,
- id3tag *info,
- const gchar *uri,
- TrackerSparqlBuilder *metadata,
- file_data *filedata)
+get_id3v20_tags (const gchar *data,
+ size_t size,
+ id3tag *info,
+ const gchar *uri,
+ TrackerSparqlBuilder *metadata,
+ MP3Data *filedata)
{
- id3v2tag *tag = &filedata->id3v22_info;
- guint pos = 0;
+ id3v2tag *tag = &filedata->id3v22;
+ guint pos = 0;
while (pos < size) {
id3v2frame frame;
@@ -1534,13 +1534,13 @@ get_id3v20_tags (const gchar *data,
pic_type = data[pos + 3 + 1 + 3];
desc = &data[pos + 3 + 1 + 3 + 1];
- if (pic_type == 3 || (pic_type == 0 && filedata->albumartsize == 0)) {
+ if (pic_type == 3 || (pic_type == 0 && filedata->albumart_size == 0)) {
offset = pos + 3 + 1 + 3 + 1 + strlen (desc) + 1;
- filedata->albumartmime = g_strdup (mime);
- filedata->albumartdata = g_malloc0 (csize);
- memcpy (filedata->albumartdata, &data[offset], csize);
- filedata->albumartsize = csize;
+ filedata->albumart_mime = g_strdup (mime);
+ filedata->albumart_data = g_malloc0 (csize);
+ memcpy (filedata->albumart_data, &data[offset], csize);
+ filedata->albumart_size = csize;
}
} else {
/* text frames */
@@ -1558,8 +1558,7 @@ get_id3v20_tags (const gchar *data,
case ID3V2_TAL:
tag->album = word;
break;
- case ID3V2_TCO:
- {
+ case ID3V2_TCO: {
gint genre;
if (get_genre_number (word, &genre)) {
@@ -1620,22 +1619,22 @@ get_id3v20_tags (const gchar *data,
}
static void
-parse_id3v24 (const gchar *data,
- size_t size,
- id3tag *info,
- const gchar *uri,
+parse_id3v24 (const gchar *data,
+ size_t size,
+ id3tag *info,
+ const gchar *uri,
TrackerSparqlBuilder *metadata,
- file_data *filedata,
- size_t *offset_delta)
+ MP3Data *filedata,
+ size_t *offset_delta)
{
- gint unsync;
- gint extendedHdr;
- gint experimental;
- gint footer;
- guint tsize;
- guint pos;
- guint ehdrSize;
- guint padding;
+ gint unsync;
+ gint ext_header;
+ gint experimental;
+ gint footer;
+ guint tsize;
+ guint pos;
+ guint ext_header_size;
+ guint padding;
if ((size < 16) ||
(data[0] != 0x49) ||
@@ -1647,7 +1646,7 @@ parse_id3v24 (const gchar *data,
}
unsync = (data[5] & 0x80) > 0;
- extendedHdr = (data[5] & 0x40) > 0;
+ ext_header = (data[5] & 0x40) > 0;
experimental = (data[5] & 0x20) > 0;
footer = (data[5] & 0x10) > 0;
tsize = (((data[6] & 0x7F) << 21) |
@@ -1662,12 +1661,12 @@ parse_id3v24 (const gchar *data,
pos = 10;
padding = 0;
- if (extendedHdr) {
- ehdrSize = (((data[10] & 0x7F) << 21) |
- ((data[11] & 0x7F) << 14) |
- ((data[12] & 0x7F) << 7) |
- ((data[13] & 0x7F) << 0));
- pos += ehdrSize;
+ if (ext_header) {
+ ext_header_size = (((data[10] & 0x7F) << 21) |
+ ((data[11] & 0x7F) << 14) |
+ ((data[12] & 0x7F) << 7) |
+ ((data[13] & 0x7F) << 0));
+ pos += ext_header_size;
if (pos + tsize > size) {
/* invalid size: extended header longer than tag */
@@ -1676,10 +1675,10 @@ parse_id3v24 (const gchar *data,
}
if (unsync) {
- size_t unsync_size;
- gchar *body;
+ size_t unsync_size;
+ gchar *body;
- un_unsync (&data[pos], tsize, (unsigned char **)&body, &unsync_size);
+ un_unsync (&data[pos], tsize, (unsigned char **) &body, &unsync_size);
get_id3v24_tags (body, unsync_size, info, uri, metadata, filedata);
g_free (body);
} else {
@@ -1690,21 +1689,21 @@ parse_id3v24 (const gchar *data,
}
static void
-parse_id3v23 (const gchar *data,
- size_t size,
- id3tag *info,
- const gchar *uri,
- TrackerSparqlBuilder *metadata,
- file_data *filedata,
- size_t *offset_delta)
+parse_id3v23 (const gchar *data,
+ size_t size,
+ id3tag *info,
+ const gchar *uri,
+ TrackerSparqlBuilder *metadata,
+ MP3Data *filedata,
+ size_t *offset_delta)
{
- gint unsync;
- gint extendedHdr;
- gint experimental;
- guint tsize;
- guint pos;
- guint ehdrSize;
- guint padding;
+ gint unsync;
+ gint ext_header;
+ gint experimental;
+ guint tsize;
+ guint pos;
+ guint ext_header_size;
+ guint padding;
if ((size < 16) ||
(data[0] != 0x49) ||
@@ -1716,7 +1715,7 @@ parse_id3v23 (const gchar *data,
}
unsync = (data[5] & 0x80) > 0;
- extendedHdr = (data[5] & 0x40) > 0;
+ ext_header = (data[5] & 0x40) > 0;
experimental = (data[5] & 0x20) > 0;
tsize = (((data[6] & 0x7F) << 21) |
((data[7] & 0x7F) << 14) |
@@ -1730,18 +1729,18 @@ parse_id3v23 (const gchar *data,
pos = 10;
padding = 0;
- if (extendedHdr) {
- ehdrSize = (((unsigned char)(data[10]) << 24) |
- ((unsigned char)(data[11]) << 16) |
- ((unsigned char)(data[12]) << 8) |
- ((unsigned char)(data[12]) << 0));
+ if (ext_header) {
+ ext_header_size = (((unsigned char)(data[10]) << 24) |
+ ((unsigned char)(data[11]) << 16) |
+ ((unsigned char)(data[12]) << 8) |
+ ((unsigned char)(data[12]) << 0));
padding = (((unsigned char)(data[15]) << 24) |
((unsigned char)(data[16]) << 16) |
((unsigned char)(data[17]) << 8) |
((unsigned char)(data[18]) << 0));
- pos += 4 + ehdrSize;
+ pos += 4 + ext_header_size;
if (padding < tsize)
tsize -= padding;
@@ -1756,10 +1755,10 @@ parse_id3v23 (const gchar *data,
}
if (unsync) {
- size_t unsync_size;
- gchar *body;
+ size_t unsync_size;
+ gchar *body;
- un_unsync (&data[pos], tsize, (unsigned char **)&body, &unsync_size);
+ un_unsync (&data[pos], tsize, (unsigned char **) &body, &unsync_size);
get_id3v23_tags (body, unsync_size, info, uri, metadata, filedata);
g_free (body);
} else {
@@ -1770,17 +1769,17 @@ parse_id3v23 (const gchar *data,
}
static void
-parse_id3v20 (const gchar *data,
- size_t size,
- id3tag *info,
- const gchar *uri,
- TrackerSparqlBuilder *metadata,
- file_data *filedata,
- size_t *offset_delta)
+parse_id3v20 (const gchar *data,
+ size_t size,
+ id3tag *info,
+ const gchar *uri,
+ TrackerSparqlBuilder *metadata,
+ MP3Data *filedata,
+ size_t *offset_delta)
{
- gint unsync;
- guint tsize;
- guint pos;
+ gint unsync;
+ guint tsize;
+ guint pos;
if ((size < 16) ||
(data[0] != 0x49) ||
@@ -1806,7 +1805,7 @@ parse_id3v20 (const gchar *data,
size_t unsync_size;
gchar *body;
- un_unsync (&data[pos], tsize, (unsigned char **)&body, &unsync_size);
+ un_unsync (&data[pos], tsize, (unsigned char **) &body, &unsync_size);
get_id3v20_tags (body, unsync_size, info, uri, metadata, filedata);
g_free (body);
} else {
@@ -1817,21 +1816,21 @@ parse_id3v20 (const gchar *data,
}
static goffset
-parse_id3v2 (const gchar *data,
- size_t size,
- id3tag *info,
- const gchar *uri,
- TrackerSparqlBuilder *metadata,
- file_data *filedata)
+parse_id3v2 (const gchar *data,
+ size_t size,
+ id3tag *info,
+ const gchar *uri,
+ TrackerSparqlBuilder *metadata,
+ MP3Data *filedata)
{
gboolean done = FALSE;
- size_t offset = 0;
+ size_t offset = 0;
do {
size_t offset_delta = 0;
- parse_id3v24 (data+offset, size-offset, info, uri, metadata, filedata, &offset_delta);
- parse_id3v23 (data+offset, size-offset, info, uri, metadata, filedata, &offset_delta);
- parse_id3v20 (data+offset, size-offset, info, uri, metadata, filedata, &offset_delta);
+ parse_id3v24 (data + offset, size - offset, info, uri, metadata, filedata, &offset_delta);
+ parse_id3v23 (data + offset, size - offset, info, uri, metadata, filedata, &offset_delta);
+ parse_id3v20 (data + offset, size - offset, info, uri, metadata, filedata, &offset_delta);
if (offset_delta == 0) {
done = TRUE;
@@ -1846,8 +1845,8 @@ parse_id3v2 (const gchar *data,
}
static void
-extract_mp3 (const gchar *uri,
- TrackerSparqlBuilder *metadata)
+extract_mp3 (const gchar *uri,
+ TrackerSparqlBuilder *metadata)
{
gchar *filename;
int fd;
@@ -1856,9 +1855,9 @@ extract_mp3 (const gchar *uri,
goffset size;
goffset buffer_size;
goffset audio_offset;
- file_data filedata;
+ MP3Data md;
- memset (&filedata, 0, sizeof (file_data));
+ memset (&md, 0, sizeof (MP3Data));
filename = g_filename_from_uri (uri, NULL, NULL);
@@ -1869,7 +1868,7 @@ extract_mp3 (const gchar *uri,
return;
}
- filedata.size = size;
+ md.size = size;
buffer_size = MIN (size, MAX_FILE_READ);
#if defined(__linux__)
@@ -1911,187 +1910,167 @@ extract_mp3 (const gchar *uri,
return;
}
- if (!get_id3 (id3v1_buffer, ID3V1_SIZE, &filedata.id3v1_info)) {
+ if (!get_id3 (id3v1_buffer, ID3V1_SIZE, &md.id3v1)) {
/* Do nothing? */
}
g_free (id3v1_buffer);
/* Get other embedded tags */
- audio_offset = parse_id3v2 (buffer, buffer_size, &filedata.id3v1_info, uri, metadata, &filedata);
+ audio_offset = parse_id3v2 (buffer, buffer_size, &md.id3v1, uri, metadata, &md);
- filedata.title = tracker_coalesce (4, filedata.id3v24_info.title2,
- filedata.id3v23_info.title2,
- filedata.id3v22_info.title2,
- filedata.id3v1_info.title);
- if (!filedata.title) {
+ md.title = tracker_coalesce (4, md.id3v24.title2, md.id3v23.title2, md.id3v22.title2, md.id3v1.title);
+ if (!md.title) {
gchar *p;
/* use filename */
- filedata.title = g_filename_display_basename (filename);
+ md.title = g_filename_display_basename (filename);
- p = strrchr (filedata.title, '.');
+ p = strrchr (md.title, '.');
if (p) {
*p = '\0';
}
}
- filedata.performer = tracker_coalesce (7, filedata.id3v24_info.performer1,
- filedata.id3v24_info.performer2,
- filedata.id3v23_info.performer1,
- filedata.id3v23_info.performer2,
- filedata.id3v22_info.performer1,
- filedata.id3v22_info.performer2,
- filedata.id3v1_info.artist);
- filedata.album = tracker_coalesce (4, filedata.id3v24_info.album,
- filedata.id3v23_info.album,
- filedata.id3v22_info.album,
- filedata.id3v1_info.album);
- filedata.genre = tracker_coalesce (7, filedata.id3v24_info.content_type,
- filedata.id3v24_info.title1,
- filedata.id3v23_info.content_type,
- filedata.id3v23_info.title1,
- filedata.id3v22_info.content_type,
- filedata.id3v22_info.title1,
- filedata.id3v1_info.genre);
- filedata.recording_time = tracker_coalesce (7, filedata.id3v24_info.recording_time,
- filedata.id3v24_info.release_time,
- filedata.id3v23_info.recording_time,
- filedata.id3v23_info.release_time,
- filedata.id3v22_info.recording_time,
- filedata.id3v22_info.release_time,
- filedata.id3v1_info.recording_time);
- filedata.publisher = tracker_coalesce (3, filedata.id3v24_info.publisher,
- filedata.id3v23_info.publisher,
- filedata.id3v22_info.publisher);
- filedata.text = tracker_coalesce (3, filedata.id3v24_info.text,
- filedata.id3v23_info.text,
- filedata.id3v22_info.text);
- filedata.copyright = tracker_coalesce (3, filedata.id3v24_info.copyright,
- filedata.id3v23_info.copyright,
- filedata.id3v22_info.copyright);
- filedata.comment = tracker_coalesce (7, filedata.id3v24_info.title3,
- filedata.id3v24_info.comment,
- filedata.id3v23_info.title3,
- filedata.id3v23_info.comment,
- filedata.id3v22_info.title3,
- filedata.id3v22_info.comment,
- filedata.id3v1_info.comment);
-
- if (filedata.id3v24_info.track_number != 0) {
- filedata.track_number = filedata.id3v24_info.track_number;
- } else if (filedata.id3v23_info.track_number != 0) {
- filedata.track_number = filedata.id3v23_info.track_number;
- } else if (filedata.id3v22_info.track_number != 0) {
- filedata.track_number = filedata.id3v22_info.track_number;
- } else if (filedata.id3v1_info.track_number != 0) {
- filedata.track_number = filedata.id3v1_info.track_number;
- }
-
- if (!tracker_is_blank_string (filedata.performer)) {
- filedata.performer_uri = tracker_uri_printf_escaped ("urn:artist:%s", filedata.performer);
- tracker_sparql_builder_subject_iri (metadata, filedata.performer_uri);
+ md.performer = tracker_coalesce (7,
+ md.id3v24.performer1, md.id3v24.performer2,
+ md.id3v23.performer1, md.id3v23.performer2,
+ md.id3v22.performer1, md.id3v22.performer2,
+ md.id3v1.artist);
+ md.album = tracker_coalesce (4, md.id3v24.album, md.id3v23.album, md.id3v22.album, md.id3v1.album);
+ md.genre = tracker_coalesce (7,
+ md.id3v24.content_type, md.id3v24.title1,
+ md.id3v23.content_type, md.id3v23.title1,
+ md.id3v22.content_type, md.id3v22.title1,
+ md.id3v1.genre);
+ md.recording_time = tracker_coalesce (7,
+ md.id3v24.recording_time, md.id3v24.release_time,
+ md.id3v23.recording_time, md.id3v23.release_time,
+ md.id3v22.recording_time, md.id3v22.release_time,
+ md.id3v1.recording_time);
+ md.publisher = tracker_coalesce (3, md.id3v24.publisher, md.id3v23.publisher, md.id3v22.publisher);
+ md.text = tracker_coalesce (3, md.id3v24.text, md.id3v23.text, md.id3v22.text);
+ md.copyright = tracker_coalesce (3, md.id3v24.copyright, md.id3v23.copyright, md.id3v22.copyright);
+ md.comment = tracker_coalesce (7,
+ md.id3v24.title3, md.id3v24.comment,
+ md.id3v23.title3, md.id3v23.comment,
+ md.id3v22.title3, md.id3v22.comment,
+ md.id3v1.comment);
+
+ if (md.id3v24.track_number != 0) {
+ md.track_number = md.id3v24.track_number;
+ } else if (md.id3v23.track_number != 0) {
+ md.track_number = md.id3v23.track_number;
+ } else if (md.id3v22.track_number != 0) {
+ md.track_number = md.id3v22.track_number;
+ } else if (md.id3v1.track_number != 0) {
+ md.track_number = md.id3v1.track_number;
+ }
+
+ if (md.performer) {
+ md.performer_uri = tracker_uri_printf_escaped ("urn:artist:%s", md.performer);
+ tracker_sparql_builder_subject_iri (metadata, md.performer_uri);
tracker_sparql_builder_predicate (metadata, "a");
tracker_sparql_builder_object (metadata, "nmm:Artist");
tracker_sparql_builder_predicate (metadata, "nmm:artistName");
- tracker_sparql_builder_object_unvalidated (metadata, filedata.performer);
+ tracker_sparql_builder_object_unvalidated (metadata, md.performer);
+ g_free (md.performer);
}
- g_free (filedata.performer);
- if (!tracker_is_blank_string (filedata.album)) {
- filedata.album_uri = tracker_uri_printf_escaped ("urn:album:%s", filedata.album);
- tracker_sparql_builder_subject_iri (metadata, filedata.album_uri);
+ if (md.album) {
+ md.album_uri = tracker_uri_printf_escaped ("urn:album:%s", md.album);
+ tracker_sparql_builder_subject_iri (metadata, md.album_uri);
tracker_sparql_builder_predicate (metadata, "a");
tracker_sparql_builder_object (metadata, "nmm:MusicAlbum");
tracker_sparql_builder_predicate (metadata, "nmm:albumTitle");
- tracker_sparql_builder_object_unvalidated (metadata, filedata.album);
+ tracker_sparql_builder_object_unvalidated (metadata, md.album);
+ g_free (md.album);
}
- g_free (filedata.album);
tracker_sparql_builder_subject_iri (metadata, uri);
tracker_sparql_builder_predicate (metadata, "a");
tracker_sparql_builder_object (metadata, "nmm:MusicPiece");
tracker_sparql_builder_object (metadata, "nfo:Audio");
- if (!tracker_is_blank_string (filedata.title)) {
+ if (md.title) {
tracker_sparql_builder_predicate (metadata, "nie:title");
- tracker_sparql_builder_object_unvalidated (metadata, filedata.title);
+ tracker_sparql_builder_object_unvalidated (metadata, md.title);
/* do not delete title, needed by albumart */
}
- if (filedata.performer_uri) {
+ if (md.performer_uri) {
tracker_sparql_builder_predicate (metadata, "nmm:performer");
- tracker_sparql_builder_object_iri (metadata, filedata.performer_uri);
- g_free (filedata.performer_uri);
+ tracker_sparql_builder_object_iri (metadata, md.performer_uri);
+ g_free (md.performer_uri);
}
- if (filedata.album_uri) {
+ if (md.album_uri) {
tracker_sparql_builder_predicate (metadata, "nmm:musicAlbum");
- tracker_sparql_builder_object_iri (metadata, filedata.album_uri);
- g_free (filedata.album_uri);
+ tracker_sparql_builder_object_iri (metadata, md.album_uri);
+ g_free (md.album_uri);
}
- if (!tracker_is_blank_string (filedata.recording_time)) {
+ if (md.recording_time) {
tracker_sparql_builder_predicate (metadata, "nie:contentCreated");
- tracker_sparql_builder_object_unvalidated (metadata, filedata.recording_time);
+ tracker_sparql_builder_object_unvalidated (metadata, md.recording_time);
+ g_free (md.recording_time);
}
- g_free (filedata.recording_time);
- if (!tracker_is_blank_string (filedata.text)) {
+ if (md.text) {
tracker_sparql_builder_predicate (metadata, "nie:plainTextContent");
- tracker_sparql_builder_object_unvalidated (metadata, filedata.text);
+ tracker_sparql_builder_object_unvalidated (metadata, md.text);
+ g_free (md.text);
}
- g_free (filedata.text);
- if (!tracker_is_blank_string (filedata.genre)) {
+ if (md.genre) {
tracker_sparql_builder_predicate (metadata, "nfo:genre");
- tracker_sparql_builder_object_unvalidated (metadata, filedata.genre);
+ tracker_sparql_builder_object_unvalidated (metadata, md.genre);
+ g_free (md.genre);
}
- g_free (filedata.genre);
- if (!tracker_is_blank_string (filedata.copyright)) {
+ if (md.copyright) {
tracker_sparql_builder_predicate (metadata, "nie:copyright");
- tracker_sparql_builder_object_unvalidated (metadata, filedata.copyright);
+ tracker_sparql_builder_object_unvalidated (metadata, md.copyright);
+ g_free (md.copyright);
}
- g_free (filedata.copyright);
- if (!tracker_is_blank_string (filedata.comment)) {
+ if (md.comment) {
tracker_sparql_builder_predicate (metadata, "nie:comment");
- tracker_sparql_builder_object_unvalidated (metadata, filedata.comment);
+ tracker_sparql_builder_object_unvalidated (metadata, md.comment);
+ g_free (md.comment);
}
- g_free (filedata.comment);
- if (!tracker_is_blank_string (filedata.publisher)) {
+ if (md.publisher) {
tracker_sparql_builder_predicate (metadata, "nco:publisher");
tracker_sparql_builder_object_blank_open (metadata);
tracker_sparql_builder_predicate (metadata, "a");
tracker_sparql_builder_object (metadata, "nco:Contact");
tracker_sparql_builder_predicate (metadata, "nco:fullname");
- tracker_sparql_builder_object_unvalidated (metadata, filedata.publisher);
+ tracker_sparql_builder_object_unvalidated (metadata, md.publisher);
tracker_sparql_builder_object_blank_close (metadata);
+ g_free (md.publisher);
}
- g_free (filedata.publisher);
- if (filedata.track_number > 0) {
+ if (md.track_number > 0) {
tracker_sparql_builder_predicate (metadata, "nmm:trackNumber");
- tracker_sparql_builder_object_int64 (metadata, filedata.track_number);
+ tracker_sparql_builder_object_int64 (metadata, md.track_number);
}
/* Get mp3 stream info */
- mp3_parse (buffer, buffer_size, audio_offset, uri, metadata, &filedata);
+ mp3_parse (buffer, buffer_size, audio_offset, uri, metadata, &md);
- tracker_albumart_process (filedata.albumartdata,
- filedata.albumartsize,
- filedata.albumartmime,
+ tracker_albumart_process (md.albumart_data,
+ md.albumart_size,
+ md.albumart_mime,
NULL,
- filedata.title,
+ md.title,
filename);
- g_free (filedata.title);
- g_free (filedata.albumartdata);
- g_free (filedata.albumartmime);
+ g_free (md.title);
+ g_free (md.albumart_data);
+ g_free (md.albumart_mime);
- g_free (filedata.id3v1_info.encoding);
+ g_free (md.id3v1.encoding);
#ifndef G_OS_WIN32
munmap (buffer, buffer_size);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]