[tracker-miners/sam/musicbrainz-urls] Use the actual IDs for Musicbrainz resources
- From: Sam Thursfield <sthursfield src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker-miners/sam/musicbrainz-urls] Use the actual IDs for Musicbrainz resources
- Date: Mon, 9 Dec 2019 20:11:40 +0000 (UTC)
commit 5aa3671914bc4d247017a01d66094a89f3e0b949
Author: Sam Thursfield <sam afuera me uk>
Date: Mon Dec 9 21:06:52 2019 +0100
Use the actual IDs for Musicbrainz resources
We were generating internal unique IDs for Musicbrainz resources,
which looked like this:
urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FArtist:76b2e842-5e85-4c97-ab62-d5bc315595b5
The actual Musicbrainz URL is already guaranteed to uniquely represent
the resource, so let's use that to identify the resource inside Tracker.
This means the URL is shorter, more readable, and can be browsed. The
above example becomes this:
https://musicbrainz.org/artist/76b2e842-5e85-4c97-ab62-d5bc315595b5
This shouldn't be backported to the stable branch.
src/libtracker-extract/tracker-resource-helpers.c | 25 ++++++--
src/libtracker-extract/tracker-resource-helpers.h | 2 +-
src/tracker-extract/tracker-extract-mp3.c | 49 +++++++++-------
src/tracker-extract/tracker-extract-vorbis.c | 68 +++++++++++++---------
.../audio/mp3-id3v2.4-1.expected.json | 10 ++--
.../audio/mp3-id3v2.4-2.expected.json | 10 ++--
.../audio/vorbis.expected.json | 10 ++--
7 files changed, 107 insertions(+), 67 deletions(-)
---
diff --git a/src/libtracker-extract/tracker-resource-helpers.c
b/src/libtracker-extract/tracker-resource-helpers.c
index 56f8f1307..36525a5e1 100644
--- a/src/libtracker-extract/tracker-resource-helpers.c
+++ b/src/libtracker-extract/tracker-resource-helpers.c
@@ -144,32 +144,47 @@ tracker_extract_new_equipment (const char *make,
* tracker_extract_new_external_reference:
* @source_uri: the source uri of the external reference
* @identifier: the identifier of the external reference
+ * @uri: (allow-none): URI of the resource (leave blank to generate one).
*
* Create a new tracker:ExternalReference resource and set its source and its
* identifier. Both @source and @identifer must be non-%NULL.
*
+ * External references link local data to online resources where apps can fetch
+ * more metadata. One example is MusicBrainz, an open database of music releases.
+ * Here is an example of creating a tracker:ExternalResource that could be used
+ * to link the music artist 'Pulp' to the corresponding Musicbrainz data:
+ *
+ * <example>
+ * <programlisting>
+ * TrackerResource *mb_artist = tracker_extract_new_external_reference (
+ * "https://musicbrainz.org/doc/Artist", "76b2e842-5e85-4c97-ab62-d5bc315595b5",
+ * "https://musicbrainz.org/artist/76b2e842-5e85-4c97-ab62-d5bc315595b5");
+ * </programlisting>
+ * </example>
+ *
* Returns: a newly allocated #TrackerResource instance, of type tracker:ExternalReference
*
* Since: 2.3.0
*/
TrackerResource *
tracker_extract_new_external_reference (const char *source_uri,
- const char *identifier)
+ const char *identifier,
+ const char *uri)
{
TrackerResource *external_reference;
- gchar *uri;
+ g_autofree gchar *generated_uri = NULL;
g_return_val_if_fail (source_uri != NULL && identifier != NULL, NULL);
- uri = tracker_sparql_escape_uri_printf ("urn:ExternalReference:%s:%s", source_uri, identifier);
+ if (uri == NULL) {
+ uri = generated_uri = tracker_sparql_escape_uri_printf ("urn:ExternalReference:%s:%s",
source_uri, identifier);
+ }
external_reference = tracker_resource_new (uri);
tracker_resource_set_uri (external_reference, "rdf:type", "tracker:ExternalReference");
tracker_resource_set_uri (external_reference, "tracker:referenceSource", source_uri);
tracker_resource_set_string (external_reference, "tracker:referenceIdentifier", identifier);
- g_free(uri);
-
return external_reference;
}
diff --git a/src/libtracker-extract/tracker-resource-helpers.h
b/src/libtracker-extract/tracker-resource-helpers.h
index be067a516..25d5023ca 100644
--- a/src/libtracker-extract/tracker-resource-helpers.h
+++ b/src/libtracker-extract/tracker-resource-helpers.h
@@ -32,7 +32,7 @@ G_BEGIN_DECLS
TrackerResource *tracker_extract_new_artist (const char *name);
TrackerResource *tracker_extract_new_contact (const char *fullname);
TrackerResource *tracker_extract_new_equipment (const char *make, const char *model);
-TrackerResource *tracker_extract_new_external_reference (const char *source_uri, const char *identifier);
+TrackerResource *tracker_extract_new_external_reference (const char *source_uri, const char *identifier,
const char *uri);
TrackerResource *tracker_extract_new_location (const char *address, const char *state, const char *city,
const char *country, const char *gps_altitude, const char *gps_latitude, const char *gps_longitude);
TrackerResource *tracker_extract_new_music_album_disc (const char *album_title, TrackerResource
*album_artist, int disc_number, const char *date);
TrackerResource *tracker_extract_new_tag (const char *label);
diff --git a/src/tracker-extract/tracker-extract-mp3.c b/src/tracker-extract/tracker-extract-mp3.c
index 0a88e2d98..bdbeee9e5 100644
--- a/src/tracker-extract/tracker-extract-mp3.c
+++ b/src/tracker-extract/tracker-extract-mp3.c
@@ -2764,7 +2764,7 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
if (md.album_name) {
TrackerResource *album_disc = NULL, *album_artist = NULL;
- TrackerResource *mb_release_id = NULL, *mb_release_group_id = NULL;
+ TrackerResource *mb_release = NULL, *mb_release_group = NULL;
if (md.album_artist_name)
album_artist = tracker_extract_new_artist (md.album_artist_name);
@@ -2779,17 +2779,21 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
tracker_resource_set_take_relation (main_resource, "nmm:musicAlbumDisc", album_disc);
if (md.mb_release_id) {
- mb_release_id =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Release",
- md.mb_release_id);
+ g_autofree char *mb_release_uri =
g_strdup_printf("https://musicbrainz.org/release/%s", md.mb_release_id);
+ mb_release =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Release",
+ md.mb_release_id,
+ mb_release_uri);
- tracker_resource_set_take_relation (md.album, "tracker:hasExternalReference",
mb_release_id);
+ tracker_resource_set_take_relation (md.album, "tracker:hasExternalReference",
mb_release);
}
if (md.mb_release_group_id) {
- mb_release_group_id =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Release_Group",
- md.mb_release_group_id);
+ g_autofree char *mb_release_group_uri =
g_strdup_printf("https://musicbrainz.org/release-group/%s", md.mb_release_group_id);
+ mb_release_group =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Release_Group",
+ md.mb_release_group_id,
+ mb_release_group_uri);
- tracker_resource_add_take_relation (md.album, "tracker:hasExternalReference",
mb_release_group_id);
+ tracker_resource_add_take_relation (md.album, "tracker:hasExternalReference",
mb_release_group);
}
if (md.track_count > 0) {
@@ -2816,11 +2820,10 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
if (md.performer) {
tracker_resource_set_relation (main_resource, "nmm:performer", md.performer);
if (md.mb_artist_id) {
- TrackerResource *mb_artist_id =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Artist",
-
md.mb_artist_id);
-
- tracker_resource_add_relation (md.performer, "tracker:hasExternalReference",
mb_artist_id);
- g_object_unref (mb_artist_id);
+ g_autofree char *mb_artist_uri = g_strdup_printf("https://musicbrainz.org/artist/%s",
md.mb_artist_id);
+ g_autoptr(TrackerResource) mb_artist = tracker_extract_new_external_reference(
+ "https://musicbrainz.org/doc/Artist", md.mb_artist_id, mb_artist_uri);
+ tracker_resource_add_relation (md.performer, "tracker:hasExternalReference",
mb_artist);
}
}
@@ -2864,19 +2867,25 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
}
if (md.mb_recording_id) {
- TrackerResource *mb_recording_id =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Recording",
- md.mb_recording_id);
+ g_autofree char *mb_recording_uri;
+ g_autoptr(TrackerResource) mb_recording;
+
+ mb_recording_uri = g_strdup_printf("https://musicbrainz.org/recording/%s",
md.mb_recording_id);
+ mb_recording = tracker_extract_new_external_reference("https://musicbrainz.org/doc/Recording",
+ md.mb_recording_id, mb_recording_uri);
- tracker_resource_add_relation (main_resource, "tracker:hasExternalReference",
mb_recording_id);
- g_object_unref (mb_recording_id);
+ tracker_resource_add_relation (main_resource, "tracker:hasExternalReference", mb_recording);
}
if (md.mb_track_id) {
- TrackerResource *mb_track_id =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Track",
- md.mb_track_id);
+ g_autofree char *mb_track_uri;
+ g_autoptr(TrackerResource) mb_track;
+
+ mb_track_uri = g_strdup_printf("https://musicbrainz.org/track/%s", md.mb_track_id);
+ mb_track = tracker_extract_new_external_reference("https://musicbrainz.org/doc/Track",
+ md.mb_track_id, mb_track_uri);
- tracker_resource_add_relation (main_resource, "tracker:hasExternalReference", mb_track_id);
- g_object_unref (mb_track_id);
+ tracker_resource_add_relation (main_resource, "tracker:hasExternalReference", mb_track);
}
if (md.acoustid_fingerprint) {
diff --git a/src/tracker-extract/tracker-extract-vorbis.c b/src/tracker-extract/tracker-extract-vorbis.c
index 6a4df3bae..10e6ab506 100644
--- a/src/tracker-extract/tracker-extract-vorbis.c
+++ b/src/tracker-extract/tracker-extract-vorbis.c
@@ -171,11 +171,15 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
md.creator = tracker_extract_new_artist (md.creator_name);
if (vd.mb_artist_id) {
- TrackerResource *mb_artist_id =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Artist",
-
vd.mb_artist_id);
+ g_autofree char *mb_artist_uri;
+ TrackerResource *mb_artist;
- tracker_resource_set_relation (md.creator, "tracker:hasExternalReference",
mb_artist_id);
- g_object_unref (mb_artist_id);
+ mb_artist_uri = g_strdup_printf("https://musicbrainz.org/artist/%s", vd.mb_artist_id);
+ mb_artist = tracker_extract_new_external_reference
("https://musicbrainz.org/doc/Artist",
+ vd.mb_artist_id,
+ mb_artist_uri);
+
+ tracker_resource_set_take_relation (md.creator, "tracker:hasExternalReference",
mb_artist);
g_free (vd.mb_artist_id);
}
@@ -184,7 +188,7 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
if (vd.album) {
TrackerResource *album, *album_disc, *album_artist;
- TrackerResource *mb_release_id = NULL, *mb_release_group_id = NULL;
+ TrackerResource *mb_release = NULL, *mb_release_group = NULL;
if (vd.album_artist) {
album_artist = tracker_extract_new_artist (vd.album_artist);
@@ -215,22 +219,28 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
}
if (vd.mb_release_id) {
- mb_release_id =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Release",
- vd.mb_release_id);
+ g_autofree char *mb_release_uri;
+
+ mb_release_uri = g_strdup_printf("https://musicbrainz.org/release/%s",
vd.mb_release_id);
+ mb_release =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Release",
+ vd.mb_release_id, mb_release_uri);
- tracker_resource_set_relation (album, "tracker:hasExternalReference", mb_release_id);
+ tracker_resource_set_relation (album, "tracker:hasExternalReference", mb_release);
g_free (vd.mb_release_id);
}
if (vd.mb_release_group_id) {
- mb_release_group_id =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Release_Group",
- vd.mb_release_group_id);
+ g_autofree char *mb_release_group_uri;
+
+ mb_release_group_uri = g_strdup_printf("https://musicbrainz.org/release-group/%s",
vd.mb_release_group_id);
+ mb_release_group =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Release_Group",
+ vd.mb_release_group_id,
mb_release_group_uri);
- if (mb_release_id) {
- tracker_resource_add_relation (album, "tracker:hasExternalReference",
mb_release_group_id);
+ if (mb_release) {
+ tracker_resource_add_relation (album, "tracker:hasExternalReference",
mb_release_group);
} else
- tracker_resource_set_relation (album, "tracker:hasExternalReference",
mb_release_group_id);
+ tracker_resource_set_relation (album, "tracker:hasExternalReference",
mb_release_group);
g_free (vd.mb_release_group_id);
}
@@ -239,8 +249,8 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
tracker_resource_set_relation (metadata, "nmm:musicAlbumDisc", album_disc);
g_object_unref (album_disc);
- g_object_unref (mb_release_id);
- g_object_unref (mb_release_group_id);
+ g_object_unref (mb_release);
+ g_object_unref (mb_release_group);
}
g_free (vd.track_count);
@@ -319,28 +329,34 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
g_free (vd.acoustid_fingerprint);
}
- TrackerResource *mb_recording_id = NULL, *mb_track_id = NULL;
+ TrackerResource *mb_recording = NULL, *mb_track = NULL;
if (vd.mb_recording_id) {
- mb_recording_id =
tracker_extract_new_external_reference("https://musicbrainz.org/doc/Recording",
- vd.mb_recording_id);
+ g_autofree char *mb_recording_uri;
- tracker_resource_set_relation (metadata, "tracker:hasExternalReference", mb_recording_id);
+ mb_recording_uri = g_strdup_printf("https://musicbrainz.org/recording/%s",
vd.mb_recording_id);
+ mb_recording = tracker_extract_new_external_reference("https://musicbrainz.org/doc/Recording",
+ vd.mb_recording_id, mb_recording_uri);
+
+ tracker_resource_set_relation (metadata, "tracker:hasExternalReference", mb_recording);
g_free (vd.mb_recording_id);
}
if (vd.mb_track_id) {
- mb_track_id = tracker_extract_new_external_reference("https://musicbrainz.org/doc/Track",
- vd.mb_track_id);
+ g_autofree char *mb_track_uri;
+
+ mb_track_uri = g_strdup_printf("https://musicbrainz.org/track/%s", vd.mb_track_id);
+ mb_track = tracker_extract_new_external_reference("https://musicbrainz.org/doc/Track",
+ vd.mb_track_id, mb_track_uri);
- if (mb_recording_id) {
- tracker_resource_add_relation (metadata, "tracker:hasExternalReference", mb_track_id);
- g_object_unref (mb_recording_id);
+ if (mb_recording) {
+ tracker_resource_add_relation (metadata, "tracker:hasExternalReference", mb_track);
+ g_object_unref (mb_recording);
} else {
- tracker_resource_set_relation (metadata, "tracker:hasExternalReference", mb_track_id);
+ tracker_resource_set_relation (metadata, "tracker:hasExternalReference", mb_track);
}
- g_object_unref (mb_track_id);
+ g_object_unref (mb_track);
g_free (vd.mb_track_id);
}
diff --git a/tests/functional-tests/test-extraction-data/audio/mp3-id3v2.4-1.expected.json
b/tests/functional-tests/test-extraction-data/audio/mp3-id3v2.4-1.expected.json
index 67fef5149..c81c6e97a 100644
--- a/tests/functional-tests/test-extraction-data/audio/mp3-id3v2.4-1.expected.json
+++ b/tests/functional-tests/test-extraction-data/audio/mp3-id3v2.4-1.expected.json
@@ -21,7 +21,7 @@
"nmm:artistName": "AbBaby",
"tracker:hasExternalReference": [
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FArtist:234561",
+ "@id": "https://musicbrainz.org/artist/234561",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Artist",
"tracker:referenceIdentifier": "234561"
@@ -33,13 +33,13 @@
"nie:title": "SinCos",
"tracker:hasExternalReference": [
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FRelease:345612",
+ "@id": "https://musicbrainz.org/release/345612",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Release",
"tracker:referenceIdentifier": "345612"
},
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FRelease_Group:561234",
+ "@id": "https://musicbrainz.org/release-group/561234",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Release_Group",
"tracker:referenceIdentifier": "561234"
@@ -48,13 +48,13 @@
},
"tracker:hasExternalReference": [
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FRecording:456123",
+ "@id": "https://musicbrainz.org/recording/456123",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Recording",
"tracker:referenceIdentifier": "456123"
},
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FTrack:123456",
+ "@id": "https://musicbrainz.org/track/123456",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Track",
"tracker:referenceIdentifier": "123456"
diff --git a/tests/functional-tests/test-extraction-data/audio/mp3-id3v2.4-2.expected.json
b/tests/functional-tests/test-extraction-data/audio/mp3-id3v2.4-2.expected.json
index fc0286257..d716ceb53 100644
--- a/tests/functional-tests/test-extraction-data/audio/mp3-id3v2.4-2.expected.json
+++ b/tests/functional-tests/test-extraction-data/audio/mp3-id3v2.4-2.expected.json
@@ -19,7 +19,7 @@
"nmm:artistName": "Anna Abreu",
"tracker:hasExternalReference": [
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FArtist:234561",
+ "@id": "https://musicbrainz.org/artist/234561",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Artist",
"tracker:referenceIdentifier": "234561"
@@ -30,13 +30,13 @@
"@type": "nmm:MusicAlbum",
"tracker:hasExternalReference": [
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FRelease:345612",
+ "@id": "https://musicbrainz.org/release/345612",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Release",
"tracker:referenceIdentifier": "345612"
},
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FRelease_Group:561234",
+ "@id": "https://musicbrainz.org/release-group/561234",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Release_Group",
"tracker:referenceIdentifier": "561234"
@@ -45,13 +45,13 @@
},
"tracker:hasExternalReference": [
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FRecording:456123",
+ "@id": "https://musicbrainz.org/recording/456123",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Recording",
"tracker:referenceIdentifier": "456123"
},
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FTrack:123456",
+ "@id": "https://musicbrainz.org/track/123456",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Track",
"tracker:referenceIdentifier": "123456"
diff --git a/tests/functional-tests/test-extraction-data/audio/vorbis.expected.json
b/tests/functional-tests/test-extraction-data/audio/vorbis.expected.json
index 61fae33ca..3707d5cfb 100644
--- a/tests/functional-tests/test-extraction-data/audio/vorbis.expected.json
+++ b/tests/functional-tests/test-extraction-data/audio/vorbis.expected.json
@@ -16,7 +16,7 @@
"@type": "nmm:Artist",
"nmm:artistName": "AbBaby",
"tracker:hasExternalReference": {
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FArtist:234561",
+ "@id": "https://musicbrainz.org/artist/234561",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Artist",
"tracker:referenceIdentifier": "234561"
@@ -27,13 +27,13 @@
"nie:title": "SinCos",
"tracker:hasExternalReference": [
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FRelease:345612",
+ "@id": "https://musicbrainz.org/release/345612",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Release",
"tracker:referenceIdentifier": "345612"
},
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FRelease_Group:561234",
+ "@id": "https://musicbrainz.org/release-group/561234",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Release_Group",
"tracker:referenceIdentifier": "561234"
@@ -42,13 +42,13 @@
},
"tracker:hasExternalReference": [
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FRecording:456123",
+ "@id": "https://musicbrainz.org/recording/456123",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Recording",
"tracker:referenceIdentifier": "456123"
},
{
- "@id": "urn:ExternalReference:https:%2F%2Fmusicbrainz.org%2Fdoc%2FTrack:123456",
+ "@id": "https://musicbrainz.org/track/123456",
"@type": "tracker:ExternalReference",
"tracker:referenceSource": "https://musicbrainz.org/doc/Track",
"tracker:referenceIdentifier": "123456"
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]