[tracker-miners/wip/jfelder/tracker-extract-musicbrainz-external-resources: 2/2] extract-mp3: Use ExtractReference to store musicbrainz tags



commit 90b4f053908b5a31c9ff9318bffc46bb72fdb2ac
Author: Jean Felder <jean felder estimages com>
Date:   Mon Jul 15 17:40:30 2019 +0200

    extract-mp3: Use ExtractReference to store musicbrainz tags
    
    Store MusicBrainz IDs as ExternalResources instead of a list of
    properties. This approach is more generic.
    
    Extraction of MusicBrainz IDs is done based on tags used by Picard.
    Tags Mapping: https://picard.musicbrainz.org/docs/mappings/

 src/libtracker-extract/tracker-resource-helpers.c  | 29 ++++++++++++++++
 src/libtracker-extract/tracker-resource-helpers.h  |  1 +
 src/tracker-extract/tracker-extract-mp3.c          | 40 ++++++++++++++++++----
 .../audio/audio-test-1.expected.json               | 34 +++++++++++++++---
 .../audio/audio-test-2.expected.json               | 34 +++++++++++++++---
 5 files changed, 122 insertions(+), 16 deletions(-)
---
diff --git a/src/libtracker-extract/tracker-resource-helpers.c 
b/src/libtracker-extract/tracker-resource-helpers.c
index bc80a4942..58a44beb6 100644
--- a/src/libtracker-extract/tracker-resource-helpers.c
+++ b/src/libtracker-extract/tracker-resource-helpers.c
@@ -140,6 +140,35 @@ tracker_extract_new_equipment (const char *make,
        return equipment;
 }
 
+/**
+ * tracker_extract_new_external_resource:
+ * @source: the source of the external reference
+ * @identifier: the identifier of the external reference
+ *
+ * Create a new tracker:ExternalReference resource and set its source and its
+ * identifier. Both @source and @identifer must be non-%NULL.
+ *
+ * Returns: a newly allocated #TrackerResource instance, of type tracker:ExternalReference
+ *
+ * Since: 2.3.0
+ */
+TrackerResource *
+tracker_extract_new_external_resource (const char *source,
+                                      const char *identifier)
+{
+       TrackerResource *external_resource;
+
+       g_return_val_if_fail (source != NULL && identifier != NULL, NULL);
+
+       external_resource = tracker_resource_new (NULL);
+       tracker_resource_set_uri (external_resource, "rdf:type", "tracker:ExternalReference");
+
+       tracker_resource_set_string (external_resource, "tracker:referenceSource", source);
+       tracker_resource_set_string (external_resource, "tracker:referenceIdentifier", identifier);
+
+       return external_resource;
+}
+
 /**
  * tracker_extract_new_location:
  * @street_address: (allow none): main part of postal address, or %NULL
diff --git a/src/libtracker-extract/tracker-resource-helpers.h 
b/src/libtracker-extract/tracker-resource-helpers.h
index dc5b0dc33..7b0ba65d3 100644
--- a/src/libtracker-extract/tracker-resource-helpers.h
+++ b/src/libtracker-extract/tracker-resource-helpers.h
@@ -32,6 +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_resource (const char *source, const char *identifier);
 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 98a29e119..770a34d42 100644
--- a/src/tracker-extract/tracker-extract-mp3.c
+++ b/src/tracker-extract/tracker-extract-mp3.c
@@ -2729,12 +2729,24 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
                tracker_resource_set_relation (main_resource, "nmm:musicAlbumDisc", album_disc);
 
                if (md.mb_release_id) {
-                       tracker_resource_set_string (md.album, "nmm:mbReleaseID", md.mb_release_id);
+                       TrackerResource *mb_release_id = tracker_extract_new_external_resource("MusicBrainz 
Release Id",
+                                                                                              
md.mb_release_id);
+
+                       tracker_resource_set_relation (md.album, "nfo:hasExternalReference", mb_release_id);
+                       g_object_unref (mb_release_id);
+
                }
 
                if (md.mb_release_group_id) {
-                       tracker_resource_set_string (md.album, "nmm:mbReleaseGroupID",
-                                                                                md.mb_release_group_id);
+                       TrackerResource *mb_release_group_id = 
tracker_extract_new_external_resource("MusicBrainz Release Group Id",
+                                                                                                    
md.mb_release_group_id);
+
+                       if (md.mb_release_id) {
+                               tracker_resource_add_relation (md.album, "nfo:hasExternalReference", 
mb_release_group_id);
+                       } else
+                               tracker_resource_set_relation (md.album, "nfo:hasExternalReference", 
mb_release_group_id);
+
+                       g_object_unref (mb_release_group_id);
                }
 
                if (md.track_count > 0) {
@@ -2762,7 +2774,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) {
-                       tracker_resource_set_string (md.performer, "nmm:mbArtistID", md.mb_artist_id);
+                       TrackerResource *mb_artist_id = tracker_extract_new_external_resource("MusicBrainz 
Artist Id", md.mb_artist_id);
+
+                       tracker_resource_set_relation (md.performer, "nfo:hasExternalReference", 
mb_artist_id);
+                       g_object_unref (mb_artist_id);
                }
        }
 
@@ -2806,11 +2821,24 @@ tracker_extract_get_metadata (TrackerExtractInfo *info)
        }
 
        if (md.mb_recording_id) {
-               tracker_resource_set_string (main_resource, "nmm:mbRecordingID", md.mb_recording_id);
+                       TrackerResource *mb_recording_id = tracker_extract_new_external_resource("MusicBrainz 
Recording Id",
+                                                                                                
md.mb_recording_id);
+
+                       tracker_resource_set_relation (main_resource, "nfo:hasExternalReference", 
mb_recording_id);
+                       g_object_unref (mb_recording_id);
        }
 
        if (md.mb_track_id) {
-               tracker_resource_set_string (main_resource, "nmm:mbTrackID", md.mb_track_id);
+                       TrackerResource *mb_track_id = tracker_extract_new_external_resource("MusicBrainz 
Track Id",
+                                                                                            md.mb_track_id);
+
+                       if (md.mb_recording_id) {
+                               tracker_resource_add_relation (main_resource, "nfo:hasExternalReference", 
mb_track_id);
+                       } else {
+                               tracker_resource_set_relation (main_resource, "nfo:hasExternalReference", 
mb_track_id);
+                       }
+
+                       g_object_unref (mb_track_id);
        }
 
        if (md.acoustid_fingerprint) {
diff --git a/tests/functional-tests/test-extraction-data/audio/audio-test-1.expected.json 
b/tests/functional-tests/test-extraction-data/audio/audio-test-1.expected.json
index a1e72a2b8..a73b0bdac 100644
--- a/tests/functional-tests/test-extraction-data/audio/audio-test-1.expected.json
+++ b/tests/functional-tests/test-extraction-data/audio/audio-test-1.expected.json
@@ -16,19 +16,43 @@
         "nfo:duration": "15",
         "nfo:sampleRate": "22050",
         "nfo:averageBitrate": "32000",
-        "nmm:mbTrackID": "123456",
-        "nmm:mbRecordingID": "456123",
         "nmm:performer": {
             "@type": "nmm:Artist",
             "nmm:artistName": "AbBaby",
-            "nmm:mbArtistID": "234561"
+            "nfo:hasExternalReference": {
+                "@type": "tracker:ExternalReference",
+                "tracker:referenceSource": "MusicBrainz Artist Id",
+                "tracker:referenceIdentifier": "234561"
+            }
         },
         "nmm:musicAlbum": {
             "@type": "nmm:MusicAlbum",
             "nie:title": "SinCos",
-            "nmm:mbReleaseGroupID": "561234",
-            "nmm:mbReleaseID": "345612"
+            "nfo:hasExternalReference": [
+                {
+                    "@type": "tracker:ExternalReference",
+                    "tracker:referenceSource": "MusicBrainz Release Id",
+                    "tracker:referenceIdentifier": "345612"
+                },
+                {
+                    "@type": "tracker:ExternalReference",
+                    "tracker:referenceSource": "MusicBrainz Release Group Id",
+                    "tracker:referenceIdentifier": "561234"
+                }
+            ]
         },
+        "nfo:hasExternalReference": [
+            {
+                "@type": "tracker:ExternalReference",
+                "tracker:referenceSource": "MusicBrainz Recording Id",
+                "tracker:referenceIdentifier": "456123"
+            },
+            {
+                "@type": "tracker:ExternalReference",
+                "tracker:referenceSource": "MusicBrainz Track Id",
+                "tracker:referenceIdentifier": "123456"
+            }
+        ],
         "nfo:hasHash": {
             "@type": "nfo:hasHash",
             "nfo:hashAlgorithm": "chromaprint",
diff --git a/tests/functional-tests/test-extraction-data/audio/audio-test-2.expected.json 
b/tests/functional-tests/test-extraction-data/audio/audio-test-2.expected.json
index d4dd0089e..c9fd3c5bd 100644
--- a/tests/functional-tests/test-extraction-data/audio/audio-test-2.expected.json
+++ b/tests/functional-tests/test-extraction-data/audio/audio-test-2.expected.json
@@ -14,18 +14,42 @@
         "nfo:channels": "2",
         "nfo:sampleRate": "44100",
         "nfo:averageBitrate": "256000",
-        "nmm:mbTrackID": "123456",
-        "nmm:mbRecordingID": "456123",
         "nmm:performer": {
             "@type": "nmm:Artist",
             "nmm:artistName": "Anna Abreu",
-            "nmm:mbArtistID": "234561"
+            "nfo:hasExternalReference": {
+                "@type": "tracker:ExternalReference",
+                "tracker:referenceSource": "MusicBrainz Artist Id",
+                "tracker:referenceIdentifier": "234561"
+                }
         },
         "nmm:musicAlbum": {
             "@type": "nmm:MusicAlbum",
-            "nmm:mbReleaseGroupID": "561234",
-            "nmm:mbReleaseID": "345612"
+            "nfo:hasExternalReference": [
+                {
+                    "@type": "tracker:ExternalReference",
+                    "tracker:referenceSource": "MusicBrainz Release Id",
+                    "tracker:referenceIdentifier": "345612"
+                },
+                {
+                    "@type": "tracker:ExternalReference",
+                    "tracker:referenceSource": "MusicBrainz Release Group Id",
+                    "tracker:referenceIdentifier": "561234"
+                }
+            ]
         },
+        "nfo:hasExternalReference": [
+            {
+                "@type": "tracker:ExternalReference",
+                "tracker:referenceSource": "MusicBrainz Recording Id",
+                "tracker:referenceIdentifier": "456123"
+            },
+            {
+                "@type": "tracker:ExternalReference",
+                "tracker:referenceSource": "MusicBrainz Track Id",
+                "tracker:referenceIdentifier": "123456"
+            }
+        ],
         "nfo:hasHash": {
             "@type": "nfo:hasHash",
             "nfo:hashAlgorithm": "chromaprint",


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