[tracker-miners/sam/examples: 1/2] examples: Add Flatpak example




commit 3c7dcdee412b39529132bf4b3c684e1e66c4daed
Author: Sam Thursfield <sam afuera me uk>
Date:   Mon Nov 23 20:51:54 2020 +0100

    examples: Add Flatpak example
    
    This is an updated version of the one from tracker.git.
    
    Related: https://gitlab.gnome.org/GNOME/tracker/-/merge_requests/341

 examples/flatpak/README.md                         |  27 +++++
 examples/flatpak/example-app.py                    | 129 +++++++++++++++++++++
 examples/flatpak/org.example.TrackerSearchApp.json |  49 ++++++++
 3 files changed, 205 insertions(+)
---
diff --git a/examples/flatpak/README.md b/examples/flatpak/README.md
new file mode 100644
index 000000000..0acc2dcf3
--- /dev/null
+++ b/examples/flatpak/README.md
@@ -0,0 +1,27 @@
+# Example search app
+
+This is a simple example of building an app that searches user data using Tracker.
+
+## Running on the host
+
+You can run it on your host as follows:
+
+    $ python3 ./example-app.py TEST
+
+This will return all files indexed by Tracker Miner FS which match the word "TEST".
+
+## Building a Flatpak
+
+The provided Flatpak manifest will produce a self-contained Flatpak app, which
+works on systems even where Tracker Miner FS isn't installed.
+
+You can build and install the app as follows:
+
+    $ flatpak-builder --install --user ./build ./org.example.TrackerSearchApp.json
+
+You may need to install the nightly GNOME SDK first, or you can modify the
+manifest to use a stable version of the GNOME SDK.
+
+You can then run the app:
+
+    $ flatpak org.example.TrackerSearchApp TEST
diff --git a/examples/flatpak/example-app.py b/examples/flatpak/example-app.py
new file mode 100644
index 000000000..ec6e1d871
--- /dev/null
+++ b/examples/flatpak/example-app.py
@@ -0,0 +1,129 @@
+#!/usr/bin/env python3
+
+"""A simple search app that works inside Flatpak."""
+
+import gi
+gi.require_version('Tracker', '3.0')
+from gi.repository import Gio, GLib, GObject, Tracker
+
+import argparse
+import logging
+import os
+import sys
+
+log = logging.getLogger("app")
+
+APPLICATION_ID = "com.example.TrackerSearchApp"
+
+
+def argument_parser():
+    parser = argparse.ArgumentParser(description="Tracker Search App example")
+    parser.add_argument('--debug', dest='debug', action='store_true',
+                        help="Enable detailed logging to stderr")
+    parser.add_argument('query',
+                        help="Search query")
+    return parser
+
+
+class TrackerWrapper(GObject.GObject):
+    def __init__(self):
+        super(TrackerWrapper, self).__init__()
+        self._miner_fs_busname = None
+        self._miner_fs = None
+        self._ready = False
+
+    def start(self):
+        self._setup_host_miner_fs()
+
+    @staticmethod
+    def _in_flatpak():
+        """Indicates if app is running as flatpak"""
+        return os.path.exists("/.flatpak-info")
+
+    def _setup_host_miner_fs(self):
+        self._miner_fs_busname = "org.freedesktop.Tracker3.Miner.Files"
+
+        log.debug("Connecting to session-wide Tracker indexer at {}".format(self._miner_fs_busname))
+
+        try:
+            self._miner_fs = Tracker.SparqlConnection.bus_new(self._miner_fs_busname, None, None)
+            log.info("Using session-wide tracker-miner-fs-3")
+            self._ready = True
+            self.notify('ready')
+        except GLib.Error as error:
+            log.warning("Could not connect to host Tracker miner-fs at {}: 
{}".format(self._miner_fs_busname, error))
+            if self._in_flatpak():
+                self._setup_local_miner_fs()
+            else:
+                self._ready = None
+                self.notify('ready')
+
+    def _setup_local_miner_fs(self):
+        self._miner_fs_busname = APPLICATION_ID + ".Tracker3.Miner.Files"
+        log.debug("Connecting to bundled Tracker indexer at {}".format(
+                  self._miner_fs_busname))
+
+        Gio.bus_get(Gio.BusType.SESSION, None, self._setup_local_bus_connection_cb)
+
+    def _setup_local_bus_connection_cb(self, klass, result):
+        bus = Gio.bus_get_finish(result)
+
+        miner_fs_startup_timeout_msec = 30 * 1000
+        miner_fs_object_path = "/org/freedesktop/Tracker3/Miner/Files"
+
+        bus.call(
+            self._miner_fs_busname, miner_fs_object_path,
+            "org.freedesktop.DBus.Peer", "Ping", None, None,
+            Gio.DBusCallFlags.NONE, miner_fs_startup_timeout_msec, None,
+            self._setup_local_miner_fs_ping_cb)
+
+    def _setup_local_miner_fs_ping_cb(self, klass, result):
+        try:
+            klass.call_finish(result)
+            self._log.info("Using bundled tracker-miner-fs-3")
+            self._miner_fs = Tracker.SparqlConnection.bus_new(self._miner_fs_busname, None, None)
+            self.ready = True
+            self.notify("tracker-available")
+        except GLib.Error as error:
+            self._log.warning(
+                "Could not start local Tracker miner-fs at {}: {}".format(
+                    self._miner_fs_busname, error))
+            self._miner_fs_busname = None
+            self.notify("tracker-available")
+
+    @GObject.Property(type=Tracker.SparqlConnection, flags=GObject.ParamFlags.READABLE)
+    def miner_fs(self):
+        return self._miner_fs
+
+    @GObject.Property(type=str, flags=GObject.ParamFlags.READABLE)
+    def miner_fs_busname(self):
+        return self._miner_fs_busname
+
+    @GObject.Property(type=bool, default=False, flags=GObject.ParamFlags.READABLE)
+    def ready(self):
+        """True if we are ready to talk to Tracker Miner FS"""
+        return self._ready
+
+
+def main():
+    args = argument_parser().parse_args()
+
+    if args.debug:
+        logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
+
+    def run_search(wrapper, ready):
+        cursor = wrapper.miner_fs.query('SELECT nie:url(?r) { ?r a nfo:FileDataObject ; fts:match \"%s\" }' 
% args.query)
+        print("Search results for \"%s\":" % args.query)
+        while cursor.next():
+            print("  %s" % cursor.get_string(0)[0])
+
+    wrapper = TrackerWrapper()
+    wrapper.connect('notify::ready', run_search)
+    wrapper.start()
+
+
+try:
+    main()
+except RuntimeError as e:
+    sys.stderr.write("ERROR: {}\n".format(e))
+    sys.exit(1)
diff --git a/examples/flatpak/org.example.TrackerSearchApp.json 
b/examples/flatpak/org.example.TrackerSearchApp.json
new file mode 100644
index 000000000..2cda2924f
--- /dev/null
+++ b/examples/flatpak/org.example.TrackerSearchApp.json
@@ -0,0 +1,49 @@
+{
+    "app-id" : "org.example.TrackerSearchApp",
+    "runtime" : "org.gnome.Platform",
+    "runtime-version" : "master",
+    "sdk" : "org.gnome.Sdk",
+    "command" : "/app/bin/example-app",
+    "tags" : [
+        "nightly"
+    ],
+    "finish-args" : [
+        
"--add-policy=Tracker3.dbus:org.freedesktop.Tracker3.Miner.Files=tracker:Audio;tracker:Documents;tracker:FileSystem;tracker:Pictures;tracker:Music;tracker:Software;tracker:Video"
+    ],
+    "modules" : [
+        {
+            "name": "tracker-miners",
+            "cleanup": [ "/bin", "/etc" ],
+            "buildsystem": "meson",
+            "config-opts" : [
+                "-Dman=false",
+                "-Dminer_fs=true",
+                "-Dminer_rss=false",
+                "-Dsystemd_user_services=false",
+                "-Dwriteback=false",
+                "-Ddomain_prefix=org.example.TrackerSearchApp",
+                "-Dminer_fs_cache_location=$XDG_CACHE_HOME/org.example.TrackerSearchApp/miner/files"
+            ],
+            "sources": [
+                {
+                    "type": "git",
+                    "url": "https://gitlab.gnome.org/GNOME/tracker-miners.git";
+                }
+            ]
+        },
+        {
+            "name": "tracker-search-app",
+            "buildsystem": "simple",
+            "sources": [
+                {
+                    "type": "file",
+                    "path": "./example-app.py"
+                }
+            ],
+            "build-commands": [
+                "mkdir /app/bin",
+                "install -m 755 ./example-app.py /app/bin/example-app"
+            ]
+        }
+    ]
+}


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