[tracker-miners/sam/examples: 1/2] examples: Add Flatpak example
- From: Sam Thursfield <sthursfield src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker-miners/sam/examples: 1/2] examples: Add Flatpak example
- Date: Mon, 23 Nov 2020 19:54:53 +0000 (UTC)
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]