[tracker-miners/wip/jfelder/desktop-link: 2/2] tracker-extract-desktop: Add support for Link type



commit c0b4d7fc939f08da97c4c463831fe87d0d82a792
Author: Jean Felder <jfelder src gnome org>
Date:   Tue Apr 21 18:52:56 2020 +0200

    tracker-extract-desktop: Add support for Link type
    
    This adds support for desktop files that point to web locations. These
    files have the "Link" type and must at least have an "URL" key.
    
    A unit test is also added.

 src/tracker-extract/tracker-extract-desktop.c      | 43 ++++++++++++++++++++++
 tests/functional-tests/meson.build                 |  3 +-
 .../desktop/link-wikipedia-tracker.desktop         |  4 ++
 .../desktop/link-wikipedia-tracker.expected.json   | 14 +++++++
 4 files changed, 63 insertions(+), 1 deletion(-)
---
diff --git a/src/tracker-extract/tracker-extract-desktop.c b/src/tracker-extract/tracker-extract-desktop.c
index 8af503415..4ef87bfe1 100644
--- a/src/tracker-extract/tracker-extract-desktop.c
+++ b/src/tracker-extract/tracker-extract-desktop.c
@@ -30,6 +30,7 @@
 
 #define SOFTWARE_CATEGORY_URN_PREFIX "urn:software-category:"
 #define THEME_ICON_URN_PREFIX        "urn:theme-icon:"
+#define WEBSITE_URN_PREFIX           "urn:website:"
 
 static GKeyFile *
 get_desktop_key_file (GFile   *file,
@@ -161,6 +162,48 @@ process_desktop_file (TrackerResource  *resource,
        if (name && g_ascii_strcasecmp (type, "Application") == 0) {
                tracker_resource_add_uri (resource, "rdf:type", "nfo:SoftwareApplication");
                is_software = TRUE;
+       } else if (name && g_ascii_strcasecmp (type, "Link") == 0) {
+               gchar *website_url;
+
+               website_url = g_key_file_get_string (key_file, GROUP_DESKTOP_ENTRY, "URL", NULL);
+
+               if (website_url) {
+                       TrackerResource *website_resource;
+                       gchar *escaped_website_url;
+                       gchar *website_uri;
+
+                       g_strstrip (website_url);
+                       escaped_website_url = g_uri_escape_string (website_url, 
G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, FALSE);
+                       website_uri = g_strdup_printf (WEBSITE_URN_PREFIX "%s", escaped_website_url);
+
+                       website_resource = tracker_resource_new (website_uri);
+                       tracker_resource_add_uri (website_resource, "rdf:type", "nfo:Website");
+                       insert_data_from_desktop_file (website_resource,
+                                                      "nie:url",
+                                                      key_file,
+                                                      "URL",
+                                                      lang);
+                       tracker_resource_set_take_relation (resource, "nie:isStoredAs", website_resource);
+
+                       g_free (website_url);
+                       g_free (escaped_website_url);
+                       g_free (website_uri);
+               } else {
+                       /* a Link desktop entry must have an URL */
+                       gchar *uri;
+
+                       uri = g_file_get_uri (file);
+                       g_warning ("Link desktop entry '%s' does not have an url", uri);
+
+                       g_free (uri);
+                       g_free (type);
+                       g_key_file_free (key_file);
+                       g_strfreev (cats);
+                       g_free (lang);
+                       g_free (name);
+                       return FALSE;
+               }
+
        } else {
                /* Invalid type, all valid types are already listed above */
                g_warning ("Unknown desktop entry type '%s'", type);
diff --git a/tests/functional-tests/meson.build b/tests/functional-tests/meson.build
index 58e8dcab0..402423eda 100644
--- a/tests/functional-tests/meson.build
+++ b/tests/functional-tests/meson.build
@@ -35,7 +35,8 @@ extractor_tests = [
   'audio/mp3-id3v2.3-empty-artist-album',
   'audio/mp3-id3v2.4-2',
   'audio/flac',
-  'desktop/application'
+  'desktop/application',
+  'desktop/link-wikipedia-tracker'
 ]
 
 if libvorbis.found()
diff --git a/tests/functional-tests/test-extraction-data/desktop/link-wikipedia-tracker.desktop 
b/tests/functional-tests/test-extraction-data/desktop/link-wikipedia-tracker.desktop
new file mode 100644
index 000000000..17a757f2d
--- /dev/null
+++ b/tests/functional-tests/test-extraction-data/desktop/link-wikipedia-tracker.desktop
@@ -0,0 +1,4 @@
+[Desktop Entry]
+Type=Link
+Name=Wikipedia Tracker
+URL=https://en.wikipedia.org/wiki/Tracker_(search_software)
\ No newline at end of file
diff --git a/tests/functional-tests/test-extraction-data/desktop/link-wikipedia-tracker.expected.json 
b/tests/functional-tests/test-extraction-data/desktop/link-wikipedia-tracker.expected.json
new file mode 100644
index 000000000..b4d3456b0
--- /dev/null
+++ b/tests/functional-tests/test-extraction-data/desktop/link-wikipedia-tracker.expected.json
@@ -0,0 +1,14 @@
+{
+    "test": {
+        "Filename": "link-wikipedia-tracker.desktop"
+    },
+    "metadata": {
+        "nie:title" : "Wikipedia Tracker",
+        "nie:isStoredAs": {
+            "@type": [
+                "nfo:Website"
+            ],
+            "nie:url": "https://en.wikipedia.org/wiki/Tracker_(search_software)"
+        }
+    }
+}


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