[gnome-music/wip/jfelder/grilo-misc-cleanups: 1/7] grilo: Factor out songs_available logic to TrackerWrapper



commit 545608928905864315766c7e9d9b1f614e8e81ac
Author: Jean Felder <jfelder src gnome org>
Date:   Wed Apr 3 12:04:35 2019 -0300

    grilo: Factor out songs_available logic to TrackerWrapper
    
    This allows to move all direct tracker usage to the same class.
    
    Related: #166

 gnomemusic/grilo.py          | 36 +------------------------------
 gnomemusic/trackerwrapper.py | 51 ++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 50 insertions(+), 37 deletions(-)
---
diff --git a/gnomemusic/grilo.py b/gnomemusic/grilo.py
index 6a90dec7..a424f45d 100644
--- a/gnomemusic/grilo.py
+++ b/gnomemusic/grilo.py
@@ -129,7 +129,6 @@ class Grilo(GObject.GObject):
         self.tracker_sparql = self._tracker_wrapper.props.tracker
         self._tracker_wrapper.bind_property(
             "tracker-available", self, "tracker-available",
-            GObject.BindingFlags.BIDIRECTIONAL |
             GObject.BindingFlags.SYNC_CREATE)
 
         self._find_sources()
@@ -485,42 +484,9 @@ class Grilo(GObject.GObject):
         availability of songs.
         :param callback: Function to call on result
         """
-        def cursor_next_cb(conn, res, data):
-            try:
-                has_next = conn.next_finish(res)
-            except GLib.Error as err:
-                logger.warning("Error: {}, {}".format(err.__class__, err))
-                callback(False)
-                return
-
-            if has_next:
-                count = conn.get_integer(0)
-
-                if count > 0:
-                    callback(True)
-                    return
-
-            callback(False)
-
-        def songs_query_cb(conn, res, data):
-            try:
-                cursor = conn.query_finish(res)
-            except GLib.Error as err:
-                logger.warning("Error: {}, {}".format(err.__class__, err))
-                self.props.tracker_available = False
-                callback(False)
-                return
-
-            cursor.next_async(None, cursor_next_cb, None)
-
         # TODO: currently just checks tracker, should work with any
         # queryable supported Grilo source.
-        if not self.props.tracker_available:
-            callback(False)
-            return
-
-        self.tracker_sparql.query_async(
-            Query.all_songs_count(), None, songs_query_cb, None)
+        self._tracker_wrapper.local_songs_available(callback)
 
 
 grilo = Grilo()
diff --git a/gnomemusic/trackerwrapper.py b/gnomemusic/trackerwrapper.py
index 38a1d14c..ddc8d620 100644
--- a/gnomemusic/trackerwrapper.py
+++ b/gnomemusic/trackerwrapper.py
@@ -23,7 +23,10 @@
 
 import logging
 
-from gi.repository import GObject, Tracker
+from gi.repository import GLib, GObject, Tracker
+
+from gnomemusic import log
+from gnomemusic.query import Query
 
 logger = logging.getLogger(__name__)
 
@@ -49,7 +52,8 @@ class TrackerWrapper(GObject.GObject):
     def tracker(self):
         return self._tracker
 
-    @GObject.Property(type=bool, default=False)
+    @GObject.Property(
+        type=bool, default=False, flags=GObject.ParamFlags.READABLE)
     def tracker_available(self):
         """Get Tracker availability.
 
@@ -74,3 +78,46 @@ class TrackerWrapper(GObject.GObject):
             self._tracker_available = False
         else:
             self._tracker_available = value
+
+    @log
+    def local_songs_available(self, callback):
+        """Checks if there are any local songs available.
+
+        Calls a callback function with True or False depending on the
+        availability of songs.
+        :param callback: Function to call on result
+        """
+        def cursor_next_cb(conn, res, data):
+            try:
+                has_next = conn.next_finish(res)
+            except GLib.Error as err:
+                logger.warning("Error: {}, {}".format(err.__class__, err))
+                callback(False)
+                return
+
+            if has_next:
+                count = conn.get_integer(0)
+
+                if count > 0:
+                    callback(True)
+                    return
+
+            callback(False)
+
+        def songs_query_cb(conn, res, data):
+            try:
+                cursor = conn.query_finish(res)
+            except GLib.Error as err:
+                logger.warning("Error: {}, {}".format(err.__class__, err))
+                self.props.tracker_available = False
+                callback(False)
+                return
+
+            cursor.next_async(None, cursor_next_cb, None)
+
+        if not self.props.tracker_available:
+            callback(False)
+            return
+
+        self._tracker.query_async(
+            Query.all_songs_count(), None, songs_query_cb, None)


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