[gnome-music] view: Group songs into albums if source doesn't support queries



commit ce89c1ce7642d74a24172a4e3cd52ffe402dcac1
Author: Arnel Borja <arnelborja src gnome org>
Date:   Fri May 9 02:57:47 2014 +0800

    view: Group songs into albums if source doesn't support queries

 gnomemusic/grilo.py   |   11 +++++++++--
 gnomemusic/view.py    |   37 ++++++++++++++++++++++++++++++++-----
 gnomemusic/widgets.py |    4 ++--
 3 files changed, 43 insertions(+), 9 deletions(-)
---
diff --git a/gnomemusic/grilo.py b/gnomemusic/grilo.py
index 679765f..ddc7338 100644
--- a/gnomemusic/grilo.py
+++ b/gnomemusic/grilo.py
@@ -163,8 +163,15 @@ class Grilo(GObject.GObject):
         self.populate_items(Query.all_songs(), offset, callback, count)
 
     @log
-    def populate_album_songs(self, album_id, callback, count=-1):
-        self.populate_items(Query.album_songs(album_id), 0, callback, count)
+    def populate_album_songs(self, album, callback, count=-1):
+        if album.get_source() == 'grl-tracker-source':
+            self.populate_items(Query.album_songs(album.get_id()), 0, callback, count)
+        else:
+            source = self.sources[album.get_source()]
+            length = len(album.tracks)
+            for i, track in enumerate(album.tracks):
+                callback(source, None, track, length-(i+1), None)
+            callback(source, None, None, 0, None)
 
     @log
     def populate_custom_query(self, query, callback, count=-1, data=None):
diff --git a/gnomemusic/view.py b/gnomemusic/view.py
index cc8e8ea..3fe3598 100644
--- a/gnomemusic/view.py
+++ b/gnomemusic/view.py
@@ -404,7 +404,7 @@ class Albums(ViewContainer):
     @log
     def _get_selected_album_songs(self):
         grilo.populate_album_songs(
-            self.albums_selected[self.albums_index].get_id(),
+            self.albums_selected[self.albums_index],
             self._add_selected_item)
         self.albums_index += 1
 
@@ -759,7 +759,7 @@ class Artists (ViewContainer):
     @log
     def _get_selected_album_songs(self):
         grilo.populate_album_songs(
-            self.albums_selected[self.albums_index].get_id(),
+            self.albums_selected[self.albums_index],
             self._add_selected_item)
         self.albums_index += 1
 
@@ -1181,6 +1181,7 @@ class Search(ViewContainer):
         self.songs_model = self._model
 
         self.albums_selected = []
+        self._albums = {}
         self._albumWidget = Widgets.AlbumWidget(player)
         self._albumWidget.view.connect('selection-mode-request', self._on_selection_mode_request)
         self.add(self._albumWidget)
@@ -1242,6 +1243,31 @@ class Search(ViewContainer):
         if self.get_visible_child() == self._artistAlbumsWidget:
             self._artistAlbumsWidget.set_selection_mode(self.header_bar._selectionMode)
 
+    @log
+    def _add_search_item(self, source, param, item, remaining=0, data=None):
+        if not item or data != self._model:
+            return
+
+        artist = item.get_string(Grl.METADATA_KEY_ARTIST) \
+            or item.get_author() \
+            or _("Unknown Artist")
+        album = item.get_string(Grl.METADATA_KEY_ALBUM) \
+            or _("Unknown Album")
+
+        key = '%s-%s' % (artist, album)
+        if not key in self._albums:
+            self._albums[key] = Grl.MediaBox()
+            self._albums[key].set_title(album)
+            self._albums[key].add_author(artist)
+            self._albums[key].set_source(source.get_id())
+            self._albums[key].tracks = []
+            self._add_item(source, None, self._albums[key], 0, [self._model, 'album'])
+            self._add_item(source, None, self._albums[key], 0, [self._model, 'artist'])
+
+        self._albums[key].tracks.append(item)
+        self._add_item(source, None, item, 0, [self._model, 'song'])
+
+    @log
     def _add_item(self, source, param, item, remaining=0, data=None):
         if data is None:
             return
@@ -1359,7 +1385,7 @@ class Search(ViewContainer):
     @log
     def _get_selected_albums_songs(self):
         grilo.populate_album_songs(
-            self.albums_selected[self.albums_index].get_id(),
+            self.albums_selected[self.albums_index],
             self._add_selected_albums_songs)
         self.albums_index += 1
 
@@ -1393,7 +1419,7 @@ class Search(ViewContainer):
     @log
     def _get_selected_artists_albums_songs(self):
         grilo.populate_album_songs(
-            self.artists_albums_selected[self.artists_albums_index].get_id(),
+            self.artists_albums_selected[self.artists_albums_index],
             self._add_selected_artists_albums_songs)
         self.artists_albums_index += 1
 
@@ -1460,6 +1486,7 @@ class Search(ViewContainer):
         self.filter_model.set_visible_func(self._filter_visible_func)
         self.view.set_model(self.filter_model)
 
+        self._albums = {}
         self._artists = {}
 
         if search_term == "":
@@ -1482,4 +1509,4 @@ class Search(ViewContainer):
         if not grilo.search_source or \
            grilo.search_source.get_id() != 'grl-tracker-source':
             # nope, can't do - reverting to Search
-            grilo.search(search_term, self._add_item, [self._model, 'song'])
+            grilo.search(search_term, self._add_search_item, self._model)
diff --git a/gnomemusic/widgets.py b/gnomemusic/widgets.py
index 092f5b6..0b64a29 100644
--- a/gnomemusic/widgets.py
+++ b/gnomemusic/widgets.py
@@ -192,7 +192,7 @@ class AlbumWidget(Gtk.EventBox):
         else:
             self.duration = 0
             self._create_model()
-            GLib.idle_add(grilo.populate_album_songs, item.get_id(), self.add_item)
+            GLib.idle_add(grilo.populate_album_songs, item, self.add_item)
         header_bar._select_button.connect(
             'toggled', self._on_header_select_button_toggled)
         header_bar._cancel_button.connect(
@@ -494,7 +494,7 @@ class ArtistAlbumWidget(Gtk.HBox):
                 str(album.get_creation_date().get_year())
             )
         self.tracks = []
-        GLib.idle_add(grilo.populate_album_songs, album.get_id(), self.add_item)
+        GLib.idle_add(grilo.populate_album_songs, album, self.add_item)
         self.pack_start(self.ui.get_object('ArtistAlbumWidget'), True, True, 0)
         self.show_all()
 


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