summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Van Hoof <philip@codeminded.be>2010-12-03 13:57:40 +0100
committerPhilip Van Hoof <philip@codeminded.be>2010-12-09 12:02:21 +0100
commit59deed4f2976673140b1a4a84f3330586a2676cc (patch)
tree2c92d23b69e219278ec6435a7a8758c35634b717
parent7a3894eec3721fb13df8a57d0426924a9cc4da67 (diff)
downloadtracker-59deed4f2976673140b1a4a84f3330586a2676cc.tar.gz
tracker-extract: Make multi-disc albums work in MP3 extractor
-rw-r--r--src/tracker-extract/tracker-extract-mp3.c107
1 files changed, 106 insertions, 1 deletions
diff --git a/src/tracker-extract/tracker-extract-mp3.c b/src/tracker-extract/tracker-extract-mp3.c
index f6c7f829e..00a4a249f 100644
--- a/src/tracker-extract/tracker-extract-mp3.c
+++ b/src/tracker-extract/tracker-extract-mp3.c
@@ -99,6 +99,8 @@ typedef struct {
gchar *title3;
gint track_number;
gint track_count;
+ gint set_number;
+ gint set_count;
} id3v2tag;
typedef enum {
@@ -141,6 +143,7 @@ typedef enum {
ID3V24_TPE2,
ID3V24_TPUB,
ID3V24_TRCK,
+ ID3V24_TPOS,
ID3V24_TYER,
} id3v24frame;
@@ -168,6 +171,8 @@ typedef struct {
gchar *composer_uri;
gint track_number;
gint track_count;
+ gint set_number;
+ gint set_count;
unsigned char *albumart_data;
size_t albumart_size;
@@ -219,6 +224,7 @@ static const struct {
{ "TOLY", ID3V24_TOLY },
{ "TPE1", ID3V24_TPE1 },
{ "TPE2", ID3V24_TPE2 },
+ { "TPOS", ID3V24_TPOS },
{ "TPUB", ID3V24_TPUB },
{ "TRCK", ID3V24_TRCK },
{ "TYER", ID3V24_TYER },
@@ -1338,6 +1344,21 @@ get_id3v24_tags (id3v24frame frame,
break;
}
+ case ID3V24_TPOS: {
+ gchar **parts;
+
+ parts = g_strsplit (word, "/", 2);
+ if (parts[0]) {
+ tag->set_number = atoi (parts[0]);
+ if (parts[1]) {
+ tag->set_count = atoi (parts[1]);
+ }
+ }
+ g_strfreev (parts);
+ g_free (word);
+
+ break;
+ }
case ID3V24_TYER:
if (atoi (word) > 0) {
tag->recording_time = tracker_date_guess (word);
@@ -1501,6 +1522,21 @@ get_id3v23_tags (id3v24frame frame,
break;
}
+ case ID3V24_TPOS: {
+ gchar **parts;
+
+ parts = g_strsplit (word, "/", 2);
+ if (parts[0]) {
+ tag->set_number = atoi (parts[0]);
+ if (parts[1]) {
+ tag->set_count = atoi (parts[1]);
+ }
+ }
+ g_strfreev (parts);
+ g_free (word);
+
+ break;
+ }
case ID3V24_TYER:
if (atoi (word) > 0) {
tag->recording_time = tracker_date_guess (word);
@@ -2135,6 +2171,22 @@ extract_mp3 (const gchar *uri,
md.track_count = md.id3v22.track_count;
}
+ if (md.id3v24.set_number != 0) {
+ md.set_number = md.id3v24.set_number;
+ } else if (md.id3v23.set_number != 0) {
+ md.set_number = md.id3v23.set_number;
+ } else if (md.id3v22.set_number != 0) {
+ md.set_number = md.id3v22.set_number;
+ }
+
+ if (md.id3v24.set_count != 0) {
+ md.set_count = md.id3v24.set_count;
+ } else if (md.id3v23.set_count != 0) {
+ md.set_count = md.id3v23.set_count;
+ } else if (md.id3v22.set_count != 0) {
+ md.set_count = md.id3v22.set_count;
+ }
+
if (md.performer) {
md.performer_uri = tracker_sparql_escape_uri_printf ("urn:artist:%s", md.performer);
@@ -2244,7 +2296,6 @@ extract_mp3 (const gchar *uri,
if (md.album_uri) {
tracker_sparql_builder_predicate (metadata, "nmm:musicAlbum");
tracker_sparql_builder_object_iri (metadata, md.album_uri);
- g_free (md.album_uri);
}
if (md.recording_time) {
@@ -2287,6 +2338,60 @@ extract_mp3 (const gchar *uri,
tracker_sparql_builder_object_int64 (metadata, md.track_number);
}
+ if (md.set_number > 0) {
+ gchar *album_disc_uri;
+
+ album_disc_uri = tracker_sparql_escape_uri_printf ("urn:album-disc:%s:Disc%d",
+ md.album, md.set_number);
+
+ tracker_sparql_builder_insert_open (preupdate, NULL);
+ tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
+ tracker_sparql_builder_predicate (preupdate, "a");
+ tracker_sparql_builder_object (preupdate, "nmm:MusicAlbumDisc");
+ tracker_sparql_builder_insert_close (preupdate);
+
+ tracker_sparql_builder_delete_open (preupdate, NULL);
+ tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
+ tracker_sparql_builder_predicate (preupdate, "nmm:setNumber");
+ tracker_sparql_builder_object_variable (preupdate, "unknown");
+ tracker_sparql_builder_delete_close (preupdate);
+ tracker_sparql_builder_where_open (preupdate);
+ tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
+ tracker_sparql_builder_predicate (preupdate, "nmm:setNumber");
+ tracker_sparql_builder_object_variable (preupdate, "unknown");
+ tracker_sparql_builder_where_close (preupdate);
+
+ tracker_sparql_builder_insert_open (preupdate, NULL);
+ tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
+ tracker_sparql_builder_predicate (preupdate, "nmm:setNumber");
+ tracker_sparql_builder_object_int64 (preupdate, md.set_number);
+ tracker_sparql_builder_insert_close (preupdate);
+
+ tracker_sparql_builder_delete_open (preupdate, NULL);
+ tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
+ tracker_sparql_builder_predicate (preupdate, "nmm:albumDiscAlbum");
+ tracker_sparql_builder_object_variable (preupdate, "unknown");
+ tracker_sparql_builder_delete_close (preupdate);
+ tracker_sparql_builder_where_open (preupdate);
+ tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
+ tracker_sparql_builder_predicate (preupdate, "nmm:albumDiscAlbum");
+ tracker_sparql_builder_object_variable (preupdate, "unknown");
+ tracker_sparql_builder_where_close (preupdate);
+
+ tracker_sparql_builder_insert_open (preupdate, NULL);
+ tracker_sparql_builder_subject_iri (preupdate, album_disc_uri);
+ tracker_sparql_builder_predicate (preupdate, "nmm:albumDiscAlbum");
+ tracker_sparql_builder_object_iri (preupdate, md.album_uri);
+ tracker_sparql_builder_insert_close (preupdate);
+
+ tracker_sparql_builder_predicate (metadata, "nmm:musicAlbumDisk");
+ tracker_sparql_builder_object_iri (metadata, album_disc_uri);
+
+ g_free (album_disc_uri);
+ }
+
+ g_free (md.album_uri);
+
/* FIXME We use a hardcoded value here for now. In reality there's a second option MP3X */
tracker_sparql_builder_predicate (metadata, "nmm:dlnaProfile");
tracker_sparql_builder_object_string (metadata, "MP3");