[grilo-plugins] grl-tracker-source-api: Add more keys to writable keys list



commit 7fa5126eace8d9931643f21df6b8fd6e936f8236
Author: Sumaid Syed <sumaidsyed gmail com>
Date:   Wed Jul 17 15:23:44 2019 +0530

    grl-tracker-source-api: Add more keys to writable keys list
    
    Add Recording and Track MusicBrainz IDs, chromaprint key and basic
    tags like title, creation date and track number.
    
    GRL_METADATA_KEY_TITLE is a special case. Indeed, it can be retrieved
    from two different properties: nfo:fileName and
    nie:title (nfo:fileName is used to guess the title from the filename
    if nie:title is not set). But, only nie:title can be modified. So, a
    check is added to prevent changing nfo:fileName.
    
    https://gitlab.gnome.org/GNOME/gnome-music/issues/293

 src/tracker/grl-tracker-source-api.c | 12 ++++++++++++
 src/tracker/grl-tracker-utils.c      | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+)
---
diff --git a/src/tracker/grl-tracker-source-api.c b/src/tracker/grl-tracker-source-api.c
index 0bd8147c..382165e9 100644
--- a/src/tracker/grl-tracker-source-api.c
+++ b/src/tracker/grl-tracker-source-api.c
@@ -657,11 +657,23 @@ const GList *
 grl_tracker_source_writable_keys (GrlSource *source)
 {
   static GList *keys = NULL;
+  GrlRegistry *registry;
+  GrlKeyID grl_metadata_key_chromaprint;
+
   if (!keys) {
+    registry = grl_registry_get_default ();
+    grl_metadata_key_chromaprint = grl_registry_lookup_metadata_key (registry, "chromaprint");
+
     keys = grl_metadata_key_list_new (GRL_METADATA_KEY_PLAY_COUNT,
                                       GRL_METADATA_KEY_LAST_PLAYED,
                                       GRL_METADATA_KEY_LAST_POSITION,
                                       GRL_METADATA_KEY_FAVOURITE,
+                                      GRL_METADATA_KEY_MB_TRACK_ID,
+                                      GRL_METADATA_KEY_MB_RECORDING_ID,
+                                      GRL_METADATA_KEY_TITLE,
+                                      GRL_METADATA_KEY_TRACK_NUMBER,
+                                      GRL_METADATA_KEY_CREATION_DATE,
+                                      grl_metadata_key_chromaprint,
                                       NULL);
   }
   return keys;
diff --git a/src/tracker/grl-tracker-utils.c b/src/tracker/grl-tracker-utils.c
index 74b790dc..70341a9e 100644
--- a/src/tracker/grl-tracker-utils.c
+++ b/src/tracker/grl-tracker-utils.c
@@ -220,6 +220,7 @@ void
 grl_tracker_setup_key_mappings (void)
 {
   GrlRegistry *registry = grl_registry_get_default ();
+  GrlKeyID grl_metadata_key_chromaprint;
 
   grl_metadata_key_tracker_urn =
     grl_registry_lookup_metadata_key (registry, "tracker-urn");
@@ -227,6 +228,9 @@ grl_tracker_setup_key_mappings (void)
   grl_metadata_key_gibest_hash =
     grl_registry_lookup_metadata_key (registry, "gibest-hash");
 
+  grl_metadata_key_chromaprint =
+    grl_registry_lookup_metadata_key (registry, "chromaprint");
+
   grl_to_sparql_mapping = g_hash_table_new (g_direct_hash, g_direct_equal);
   sparql_to_grl_mapping = g_hash_table_new (g_str_hash, g_str_equal);
 
@@ -323,6 +327,12 @@ grl_tracker_setup_key_mappings (void)
                       "nmm:mbReleaseGroupID(?urn)",
                       "audio");
 
+  insert_key_mapping_with_setter (grl_metadata_key_chromaprint,
+                                  NULL,
+                                  "(select nfo:hashValue(?h) { ?urn nfo:hasHash ?h . ?h nfo:hashAlgorithm 
\"chromaprint\" })",
+                                  "audio",
+                                  set_string_metadata_keys);
+
   insert_key_mapping (GRL_METADATA_KEY_FRAMERATE,
                       "nfo:frameRate",
                       "nfo:frameRate(?urn)",
@@ -606,6 +616,14 @@ grl_tracker_tracker_get_insert_string (GrlMedia *media, const GList *keys)
       if (!grl_data_has_key (GRL_DATA (media), key_id))
         continue;
 
+      /* Special case for key title, nfo:fileName is read-only.
+       * It cannot be modified.
+       */
+      if (assoc->grl_key == GRL_METADATA_KEY_TITLE &&
+          g_strcmp0 (assoc->sparql_key_attr, "nfo:fileName") == 0) {
+        continue;
+      }
+
       if (!first)
         g_string_append (gstr, " ; ");
 
@@ -632,6 +650,15 @@ grl_tracker_get_delete_string (const GList *keys)
     while (assoc_list != NULL) {
       assoc = (tracker_grl_sparql_t *) assoc_list->data;
       if (assoc != NULL) {
+        /* Special case for key title, nfo:fileName is read-only.
+         * It cannot be modified.
+         */
+        if (assoc->grl_key == GRL_METADATA_KEY_TITLE &&
+            g_strcmp0 (assoc->sparql_key_attr, "nfo:fileName") == 0) {
+          assoc_list = assoc_list->next;
+          continue;
+        }
+
         if (first) {
           g_string_append_printf (gstr, "%s ?v%i",
                                   assoc->sparql_key_attr, var_n);
@@ -669,6 +696,15 @@ grl_tracker_get_delete_conditional_string (const gchar *urn,
     while (assoc_list != NULL) {
       assoc = (tracker_grl_sparql_t *) assoc_list->data;
       if (assoc != NULL) {
+        /* Special case for key title, nfo:fileName is read-only.
+         * It cannot be modified.
+         */
+        if (assoc->grl_key == GRL_METADATA_KEY_TITLE &&
+            g_strcmp0 (assoc->sparql_key_attr, "nfo:fileName") == 0) {
+          assoc_list = assoc_list->next;
+          continue;
+        }
+
         if (first) {
           g_string_append_printf (gstr, "OPTIONAL { <%s>  %s ?v%i }",
                                   urn,  assoc->sparql_key_attr, var_n);


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