[gnome-music/wip/mschraal/core] grltrackerwrapper: Cleanup



commit 9eb1a4d70781441356f44809b9260936ee89a53d
Author: Marinus Schraal <mschraal gnome org>
Date:   Sun Jul 14 14:07:59 2019 +0200

    grltrackerwrapper: Cleanup

 gnomemusic/coregrilo.py                       |   4 -
 gnomemusic/grilowrappers/grldleynawrapper.py  |   3 -
 gnomemusic/grilowrappers/grltrackerwrapper.py | 388 +++++++++++++-------------
 3 files changed, 192 insertions(+), 203 deletions(-)
---
diff --git a/gnomemusic/coregrilo.py b/gnomemusic/coregrilo.py
index cd0ab67b..62684156 100644
--- a/gnomemusic/coregrilo.py
+++ b/gnomemusic/coregrilo.py
@@ -111,10 +111,6 @@ class CoreGrilo(GObject.GObject):
         for wrapper in self._wrappers.values():
             wrapper.populate_album_disc_songs(media, discnr, callback)
 
-    def populate_album_songs(self, media, callback):
-        for wrapper in self._wrappers.values():
-            wrapper.populate_album_songs(media, callback)
-
     def _store_metadata(self, source, media, key):
         """Convenience function to store metadata
 
diff --git a/gnomemusic/grilowrappers/grldleynawrapper.py b/gnomemusic/grilowrappers/grldleynawrapper.py
index 5b199806..af58efa2 100644
--- a/gnomemusic/grilowrappers/grldleynawrapper.py
+++ b/gnomemusic/grilowrappers/grldleynawrapper.py
@@ -93,8 +93,5 @@ class GrlDLeynaWrapper(GObject.GObject):
     def populate_album_disc_songs(self, media, discnr, callback):
         pass
 
-    def populate_album_songs(self, media, callback):
-        pass
-
     def search(self, text):
         pass
diff --git a/gnomemusic/grilowrappers/grltrackerwrapper.py b/gnomemusic/grilowrappers/grltrackerwrapper.py
index 6c0d835b..5fc7395a 100644
--- a/gnomemusic/grilowrappers/grltrackerwrapper.py
+++ b/gnomemusic/grilowrappers/grltrackerwrapper.py
@@ -10,6 +10,8 @@ from gnomemusic.grilowrappers.grltrackerplaylists import GrlTrackerPlaylists
 
 
 class GrlTrackerWrapper(GObject.GObject):
+    """Wrapper for the Grilo Tracker source.
+    """
 
     METADATA_KEYS = [
         Grl.METADATA_KEY_ALBUM,
@@ -37,6 +39,15 @@ class GrlTrackerWrapper(GObject.GObject):
         return "<GrlTrackerWrapper>"
 
     def __init__(self, source, coremodel, coreselection, grilo):
+        """Initialize the Tracker wrapper
+
+        :param Grl.TrackerSource source: The Tracker source to wrap
+        :param CoreModel coremodel: CoreModel instance to use models
+        from
+        :param CoreSelection coreselection: CoreSelection instance to
+        use
+        :param CoreGrilo grilo: The CoreGrilo instance
+        """
         super().__init__()
 
         self._coremodel = coremodel
@@ -61,7 +72,7 @@ class GrlTrackerWrapper(GObject.GObject):
         self._fast_options.set_resolution_flags(
             Grl.ResolutionFlags.FAST_ONLY | Grl.ResolutionFlags.IDLE_RELAY)
 
-        self._initial_fill(self._source)
+        self._initial_songs_fill(self._source)
         self._initial_albums_fill(self._source)
         self._initial_artists_fill(self._source)
 
@@ -85,7 +96,7 @@ class GrlTrackerWrapper(GObject.GObject):
                 self._check_artist_change(media)
             elif change_type == Grl.SourceChangeType.CHANGED:
                 print("CHANGED", media.get_id())
-                self._requery_media(media.get_id(), True)
+                self._changed_media(media)
             elif change_type == Grl.SourceChangeType.REMOVED:
                 print("REMOVED", media.get_id())
                 self._remove_media(media)
@@ -104,7 +115,7 @@ class GrlTrackerWrapper(GObject.GObject):
             ?album_artist AS ?album_artist
             nmm:artistName(?performer) AS ?artist
             YEAR(MAX(nie:contentCreated(?song))) AS ?creation_date
-        {
+        WHERE {
             ?album a nmm:MusicAlbum .
             ?song a nmm:MusicPiece ;
                     nmm:musicAlbum ?album ;
@@ -152,7 +163,7 @@ class GrlTrackerWrapper(GObject.GObject):
             rdf:type(?artist_class)
             tracker:id(?artist_class) AS ?id
             nmm:artistName(?artist_class) AS ?artist
-        {
+        WHERE {
             ?artist_class a nmm:Artist .
             ?song a nmm:MusicPiece;
                     nmm:musicAlbum ?album;
@@ -194,6 +205,7 @@ class GrlTrackerWrapper(GObject.GObject):
         try:
             coresong = self._hash.pop(media.get_id())
         except KeyError:
+            print("Removal KeyError")
             return
 
         for idx, coresong_model in enumerate(self._model):
@@ -204,124 +216,139 @@ class GrlTrackerWrapper(GObject.GObject):
                 self._model.remove(idx)
                 break
 
-    def _requery_media(self, grilo_id, only_update=False):
+    @staticmethod
+    def _song_media_query(media_id):
         query = """
-            SELECT DISTINCT
-                rdf:type(?song)
-                ?song AS ?tracker_urn
-                nie:title(?song) AS ?title
-                tracker:id(?song) AS ?id
-                ?song
-                nie:url(?song) AS ?url
-                nie:title(?song) AS ?title
-                nmm:artistName(nmm:performer(?song)) AS ?artist
-                nie:title(nmm:musicAlbum(?song)) AS ?album
-                nfo:duration(?song) AS ?duration
-                nie:usageCounter(?song) AS ?play_count
-                nmm:trackNumber(?song) AS ?track_number
-                nmm:setNumber(nmm:musicAlbumDisc(?song)) AS ?album_disc_number
-                ?tag AS ?favourite
-            WHERE {
-                ?song a nmm:MusicPiece .
-                OPTIONAL {
-                    ?song nao:hasTag ?tag .
-                    FILTER (?tag = nao:predefined-tag-favorite)
-                }
-                FILTER ( tracker:id(?song) = %(grilo_id)s )
+        SELECT DISTINCT
+            rdf:type(?song)
+            ?song AS ?tracker_urn
+            nie:title(?song) AS ?title
+            tracker:id(?song) AS ?id
+            ?song
+            nie:url(?song) AS ?url
+            nie:title(?song) AS ?title
+            nmm:artistName(nmm:performer(?song)) AS ?artist
+            nie:title(nmm:musicAlbum(?song)) AS ?album
+            nfo:duration(?song) AS ?duration
+            nie:usageCounter(?song) AS ?play_count
+            nmm:trackNumber(?song) AS ?track_number
+            nmm:setNumber(nmm:musicAlbumDisc(?song)) AS ?album_disc_number
+            ?tag AS ?favourite
+        WHERE {
+            ?song a nmm:MusicPiece .
+            OPTIONAL {
+                ?song nao:hasTag ?tag .
+                FILTER (?tag = nao:predefined-tag-favorite)
             }
+            FILTER ( tracker:id(?song) = %(media_id)s )
+        }
         """.replace('\n', ' ').strip() % {
-            'grilo_id': grilo_id
+            'media_id': media_id
         }
 
-        options = self._fast_options.copy()
-
-        if only_update:
-            self._source.query(
-                query, self.METADATA_KEYS, options, self._only_update_media)
-        else:
-            self._source.query(
-                query, self.METADATA_KEYS, options, self._update_media)
+        return query
 
     def _add_media(self, media):
-        self._requery_media(media.get_id())
 
-    def _only_update_media(self, source, op_id, media, user_data, error):
-        if error:
-            print("ERROR", error)
-            return
+        def _add_media(source, op_id, media, user_data, error):
+            if error:
+                print("ERROR", error)
+                return
 
-        if not media:
-            return
+            if not media:
+                return
 
-        print("ONLY UPDATE")
-        self._hash[media.get_id()].update(media)
-        print("UPDATE ID", media.get_id(), media.get_title())
+            # FIXME: Figure out why we get double additions.
+            if media.get_id() in self._hash.keys():
+                print("ALREADY ADDED")
+                return
 
-    def _update_media(self, source, op_id, media, user_data, error):
-        if error:
-            print("ERROR", error)
-            return
+            song = CoreSong(media, self._coreselection, self._grilo)
+            self._model.append(song)
+            self._hash[media.get_id()] = song
 
-        if not media:
-            return
+            print("UPDATE ID", media.get_id(), media.get_title())
 
-        # FIXME: Figure out why we get double additions.
-        if media.get_id() in self._hash.keys():
-            print("ALREADY ADDED")
-            return
+        options = self._fast_options.copy()
 
-        song = CoreSong(media, self._coreselection, self._grilo)
-        self._model.append(song)
-        self._hash[media.get_id()] = song
+        self._source.query(
+            self._song_media_query(media.get_id()), self.METADATA_KEYS,
+            options, _add_media)
+
+    def _changed_media(self, media):
+
+        def _update_changed_media(source, op_id, media, user_data, error):
+            if error:
+                print("ERROR", error)
+                return
 
-        print("UPDATE ID", media.get_id(), media.get_title())
+            if not media:
+                return
 
-    def _on_source_removed(self, registry, source):
-        print("removed", source.props.source_id)
+            self._hash[media.get_id()].update(media)
 
-    def _initial_fill(self, source):
         options = self._fast_options.copy()
+
+        self._source.query(
+            self._song_media_query(media.get_id()), self.METADATA_KEYS,
+            options, _update_changed_media)
+
+    def _initial_songs_fill(self, source):
+
+        def _add_to_model(source, op_id, media, user_data, error):
+            if error:
+                print("ERROR", error)
+                return
+
+            if not media:
+                return
+
+            song = CoreSong(media, self._coreselection, self._grilo)
+            self._model.append(song)
+            self._hash[media.get_id()] = song
+
         query = """
-            SELECT
-                rdf:type(?song)
-                ?song AS ?tracker_urn
-                nie:title(?song) AS ?title
-                tracker:id(?song) AS ?id
-                ?song
-                nie:url(?song) AS ?url
-                nie:title(?song) AS ?title
-                nmm:artistName(nmm:performer(?song)) AS ?artist
-                nie:title(nmm:musicAlbum(?song)) AS ?album
-                nfo:duration(?song) AS ?duration
-                nie:usageCounter(?song) AS ?play_count
-                nmm:trackNumber(?song) AS ?track_number
-                nmm:setNumber(nmm:musicAlbumDisc(?song)) AS ?album_disc_number
-                ?tag AS ?favourite
-            WHERE {
-                ?song a nmm:MusicPiece .
-                OPTIONAL {
-                    ?song nao:hasTag ?tag .
-                    FILTER (?tag = nao:predefined-tag-favorite)
-                }
+        SELECT
+            rdf:type(?song)
+            ?song AS ?tracker_urn
+            nie:title(?song) AS ?title
+            tracker:id(?song) AS ?id
+            ?song
+            nie:url(?song) AS ?url
+            nie:title(?song) AS ?title
+            nmm:artistName(nmm:performer(?song)) AS ?artist
+            nie:title(nmm:musicAlbum(?song)) AS ?album
+            nfo:duration(?song) AS ?duration
+            nie:usageCounter(?song) AS ?play_count
+            nmm:trackNumber(?song) AS ?track_number
+            nmm:setNumber(nmm:musicAlbumDisc(?song)) AS ?album_disc_number
+            ?tag AS ?favourite
+        WHERE {
+            ?song a nmm:MusicPiece .
+            OPTIONAL {
+                ?song nao:hasTag ?tag .
+                FILTER (?tag = nao:predefined-tag-favorite)
             }
+        }
         """.replace('\n', ' ').strip()
 
-        self._source.query(
-            query, self.METADATA_KEYS, options, self._add_to_model)
+        options = self._fast_options.copy()
+        self._source.query(query, self.METADATA_KEYS, options, _add_to_model)
 
-    def _add_to_model(self, source, op_id, media, user_data, error):
-        if error:
-            print("ERROR", error)
-            return
+    def _initial_albums_fill(self, source):
 
-        if not media:
-            return
+        def _add_to_albums_model(source, op_id, media, user_data, error):
+            if error:
+                print("ERROR", error)
+                return
+
+            if not media:
+                return
 
-        song = CoreSong(media, self._coreselection, self._grilo)
-        self._model.append(song)
-        self._hash[media.get_id()] = song
+            album = CoreAlbum(media, self._coremodel)
+            self._albums_model.append(album)
+            self._album_ids[media.get_id()] = album
 
-    def _initial_albums_fill(self, source):
         query = """
         SELECT
             rdf:type(?album)
@@ -331,6 +358,7 @@ class GrlTrackerWrapper(GObject.GObject):
             ?album_artist AS ?album_artist
             nmm:artistName(?performer) AS ?artist
             YEAR(MAX(nie:contentCreated(?song))) AS ?creation_date
+        WHERE
         {
             ?album a nmm:MusicAlbum .
             ?song a nmm:MusicPiece ;
@@ -343,56 +371,47 @@ class GrlTrackerWrapper(GObject.GObject):
 
         options = self._fast_options.copy()
 
-        source.query(
-            query, self.METADATA_KEYS, options, self._add_to_albums_model)
+        source.query(query, self.METADATA_KEYS, options, _add_to_albums_model)
 
-    def _add_to_albums_model(self, source, op_id, media, user_data, error):
-        if error:
-            print("ERROR", error)
-            return
+    def _initial_artists_fill(self, source):
 
-        if not media:
-            print("NO MEDIA", source, op_id, media, error)
-            return
+        def _add_to_artists_model(source, op_id, media, user_data, error):
+            if error:
+                print("ERROR", error)
+                return
 
-        album = CoreAlbum(media, self._coremodel)
-        self._albums_model.append(album)
-        self._album_ids[media.get_id()] = album
+            if not media:
+                self._coremodel.emit("artists-loaded")
+                return
+
+            artist = CoreArtist(media, self._coremodel)
+            self._artists_model.append(artist)
+            self._artist_ids[media.get_id()] = artist
 
-    def _initial_artists_fill(self, source):
         query = """
         SELECT
-            rdf:type(?artist_class)
-            tracker:id(?artist_class) AS ?id
-            nmm:artistName(?artist_class) AS ?artist
-        {
-            ?artist_class a nmm:Artist .
+            rdf:type(?artist)
+            tracker:id(?artist) AS ?id
+            nmm:artistName(?artist) AS ?artist
+        WHERE {
+            ?artist a nmm:Artist .
             ?song a nmm:MusicPiece;
                     nmm:musicAlbum ?album;
-                    nmm:performer ?artist_class .
-        } GROUP BY ?artist_class
+                    nmm:performer ?artist .
+        } GROUP BY ?artist
         """.replace('\n', ' ').strip()
 
         options = self._fast_options.copy()
 
         source.query(
-            query, self.METADATA_KEYS, options, self._add_to_artists_model)
-
-    def _add_to_artists_model(self, source, op_id, media, user_data, error):
-        if error:
-            print("ERROR", error)
-            return
-
-        if not media:
-            print("NO MEDIA", source, op_id, media, error)
-            self._coremodel.emit("artists-loaded")
-            return
-
-        artist = CoreArtist(media, self._coremodel)
-        self._artists_model.append(artist)
-        self._artist_ids[media.get_id()] = artist
+            query, [Grl.METADATA_KEY_ARTIST], options, _add_to_artists_model)
 
     def get_artist_albums(self, media, model):
+        """Get all albums by an artist
+
+        :param Grl.Media media: The media with the artist id
+        :param Dazzle.ListModelFilter model: The model to fill
+        """
         artist_id = media.get_id()
 
         query = """
@@ -400,8 +419,7 @@ class GrlTrackerWrapper(GObject.GObject):
             rdf:type(?album)
             tracker:id(?album) AS ?id
             nie:title(?album) AS ?title
-        WHERE
-        {
+        WHERE {
             ?album a nmm:MusicAlbum .
             OPTIONAL { ?album  nmm:albumArtist ?album_artist . }
             ?song a nmm:MusicPiece;
@@ -414,8 +432,6 @@ class GrlTrackerWrapper(GObject.GObject):
             'artist_id': int(artist_id)
         }
 
-        options = self._fast_options.copy()
-
         albums = []
 
         def query_cb(source, op_id, media, user_data, error):
@@ -436,30 +452,24 @@ class GrlTrackerWrapper(GObject.GObject):
 
             return False
 
-        self._source.query(query, self.METADATA_KEYS, options, query_cb)
+        options = self._fast_options.copy()
+        self._source.query(
+            query, [Grl.METADATA_KEY_TITLE], options, query_cb)
 
     def get_album_discs(self, media, disc_model):
-        album_id = media.get_id()
-
-        def _disc_nr_cb(source, op_id, media, user_data, error):
-            if error:
-                print("ERROR", error)
-                return
+        """Get all discs of an album
 
-            if not media:
-                return
-
-            disc_nr = media.get_album_disc_number()
-            coredisc = CoreDisc(media, disc_nr, self._coremodel)
-            disc_model.append(coredisc)
+        :param Grl.Media media: The media with the album id
+        :param Gfm.SortListModel disc_model: The model to fill
+        """
+        album_id = media.get_id()
 
         query = """
         SELECT DISTINCT
             rdf:type(?song)
             tracker:id(?album) AS ?id
             nmm:setNumber(nmm:musicAlbumDisc(?song)) as ?album_disc_number
-        WHERE
-        {
+        WHERE {
             ?song a nmm:MusicPiece;
                     nmm:musicAlbum ?album .
             FILTER ( tracker:id(?album) = %(album_id)s )
@@ -468,47 +478,32 @@ class GrlTrackerWrapper(GObject.GObject):
             'album_id': int(album_id)
         }
 
-        options = self._fast_options.copy()
-
-        self._source.query(query, self.METADATA_KEYS, options, _disc_nr_cb)
+        def _disc_nr_cb(source, op_id, media, user_data, error):
+            if error:
+                print("ERROR", error)
+                return
 
-    def populate_album_disc_songs(self, media, disc_nr, _callback):
-        album_id = media.get_id()
+            if not media:
+                return
 
-        query = """
-        SELECT DISTINCT
-            rdf:type(?song)
-            ?song AS ?tracker_urn
-            tracker:id(?song) AS ?id
-            nie:url(?song) AS ?url
-            nie:title(?song) AS ?title
-            nmm:artistName(nmm:performer(?song)) AS ?artist
-            nie:title(nmm:musicAlbum(?song)) AS ?album
-            nfo:duration(?song) AS ?duration
-            nmm:trackNumber(?song) AS ?track_number
-            nmm:setNumber(nmm:musicAlbumDisc(?song)) AS ?album_disc_number
-            ?tag AS ?favourite
-            nie:usageCounter(?song) AS ?play_count
-        WHERE
-        {
-            ?song a nmm:MusicPiece ;
-                    nmm:musicAlbum ?album .
-            OPTIONAL { ?song nao:hasTag ?tag .
-                       FILTER (?tag = nao:predefined-tag-favorite) } .
-            FILTER ( tracker:id(?album) = %(album_id)s
-                     && nmm:setNumber(nmm:musicAlbumDisc(?song)) = %(disc_nr)s
-                   )
-        }
-        """.replace('\n', ' ').strip() % {
-            'album_id': album_id,
-            'disc_nr': disc_nr,
-        }
+            disc_nr = media.get_album_disc_number()
+            coredisc = CoreDisc(media, disc_nr, self._coremodel)
+            disc_model.append(coredisc)
 
         options = self._fast_options.copy()
+        self._source.query(
+            query, [Grl.METADATA_KEY_ALBUM_DISC_NUMBER], options, _disc_nr_cb)
 
-        self._source.query(query, self.METADATA_KEYS, options, _callback)
+    def populate_album_disc_songs(self, media, disc_nr, callback):
+        # FIXME: Pass a model and fill it.
+        # FIXME: The query is similar to the other song queries, reuse
+        # if possible.
+        """Get all songs of an album disc
 
-    def populate_album_songs(self, media, _callback):
+        :param Grl.Media media: The media with the album id
+        :param int disc_nr: The disc number
+        :param callback: The callback to call for every song added
+        """
         album_id = media.get_id()
 
         query = """
@@ -525,21 +520,22 @@ class GrlTrackerWrapper(GObject.GObject):
             nmm:setNumber(nmm:musicAlbumDisc(?song)) AS ?album_disc_number
             ?tag AS ?favourite
             nie:usageCounter(?song) AS ?play_count
-        WHERE
-        {
+        WHERE {
             ?song a nmm:MusicPiece ;
                     nmm:musicAlbum ?album .
             OPTIONAL { ?song nao:hasTag ?tag .
                        FILTER (?tag = nao:predefined-tag-favorite) } .
-            FILTER ( tracker:id(?album) = %(album_id)s )
+            FILTER ( tracker:id(?album) = %(album_id)s
+                     && nmm:setNumber(nmm:musicAlbumDisc(?song)) = %(disc_nr)s
+            )
         }
         """.replace('\n', ' ').strip() % {
             'album_id': album_id,
+            'disc_nr': disc_nr,
         }
 
         options = self._fast_options.copy()
-
-        self._source.query(query, self.METADATA_KEYS, options, _callback)
+        self._source.query(query, self.METADATA_KEYS, options, callback)
 
     def search(self, text):
         term = Tracker.sparql_escape_string(
@@ -582,7 +578,7 @@ class GrlTrackerWrapper(GObject.GObject):
         def songs_filter(coresong):
             return coresong.media.get_id() in filter_ids
 
-        def search_cb(source, op_id, media, data, error):
+        def songs_search_cb(source, op_id, media, data, error):
             if error:
                 print("ERROR", error)
                 return
@@ -595,7 +591,7 @@ class GrlTrackerWrapper(GObject.GObject):
 
         options = self._fast_options.copy()
 
-        self._source.query(query, self.METADATA_KEYS, options, search_cb)
+        self._source.query(query, self.METADATA_KEYS, options, songs_search_cb)
 
         # Album search
 
@@ -603,7 +599,7 @@ class GrlTrackerWrapper(GObject.GObject):
         SELECT DISTINCT
             rdf:type(nmm:musicAlbum(?song))
             tracker:id(nmm:musicAlbum(?song)) AS ?id
-        {
+        WHERE {
             ?song a nmm:MusicPiece .
             BIND(tracker:normalize(
                 nie:title(nmm:musicAlbum(?song)), 'nfkd') AS ?match1) .
@@ -645,7 +641,6 @@ class GrlTrackerWrapper(GObject.GObject):
             album_filter_ids.append(media.get_id())
 
         options = self._fast_options.copy()
-
         self._source.query(
             query, self.METADATA_KEYS, options, albums_search_cb)
 
@@ -655,7 +650,7 @@ class GrlTrackerWrapper(GObject.GObject):
         SELECT DISTINCT
             rdf:type(?artist)
             tracker:id(?artist) AS ?id
-        {
+        WHERE {
             ?song a nmm:MusicPiece ;
                     nmm:musicAlbum ?album ;
                     nmm:performer ?artist .
@@ -699,11 +694,12 @@ class GrlTrackerWrapper(GObject.GObject):
             artist_filter_ids.append(media.get_id())
 
         options = self._fast_options.copy()
-
         self._source.query(
             query, self.METADATA_KEYS, options, artist_search_cb)
 
     def get_album_art_for_item(self, coresong, callback):
+        """Placeholder until we got a better solution
+        """
         item_id = coresong.props.media.get_id()
 
         if coresong.props.media.is_audio():


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