Switch to side-by-side view

--- a/src/mediaserver/cdplugins/qobuz/session.py
+++ b/src/mediaserver/cdplugins/qobuz/session.py
@@ -32,7 +32,7 @@
         url = self.api.track_getFileUrl(intent="stream",
                                         track_id = trackid,
                                         format_id = format_id)
-        print("get_media_url got: %s" % url, file=sys.stderr)
+        uplog("get_media_url got: %s" % url)
         return url['url'] if url and 'url' in url else None
 
     def get_album_tracks(self, albid):
@@ -42,7 +42,7 @@
 
     def get_playlist_tracks(self, plid):
         data = self.api.playlist_get(playlist_id = plid, extra = 'tracks')
-        #print("PLAYLIST: %s" % json.dumps(data, indent=4), file=sys.stderr)
+        #uplog("PLAYLIST: %s" % json.dumps(data, indent=4))
         return [_parse_track(t) for t in data['tracks']['items']]
 
     def get_artist_albums(self, artid):
@@ -87,10 +87,10 @@
     # error). album_getFeatured() accepts type, but it's not clear
     # what it does.
     def get_featured_items(self, content_type, type=''):
-        uplog("FEATURED TYPES: %s" % self.api.catalog_getFeaturedTypes())
+        #uplog("FEATURED TYPES: %s" % self.api.catalog_getFeaturedTypes())
         limit = '100'
         data = self.api.catalog_getFeatured(limit=limit)
-        #print("Featured: %s" % json.dumps(data,indent=4), file=sys.stderr)
+        #uplog("Featured: %s" % json.dumps(data,indent=4)))
         if content_type == 'artists':
             if 'artists' in data:
                 return [_parse_artist(i) for i in data['artists']['items']]
@@ -98,7 +98,6 @@
             if 'playlists' in data:
                 return [_parse_playlist(pl) for pl in data['playlists']['items']]
         elif content_type == 'albums':
-            uplog("content_type: albums")
             if 'albums' in data:
                 return [_parse_album(alb) for alb in data['albums']['items']]
         return []
@@ -107,27 +106,66 @@
         data = self.api.genre_list(parent_id=parent)
         return [_parse_genre(g) for g in data['genres']['items']]
 
+    def _search1(self, query, tp):
+        limit = 200
+        slice = 100
+        if tp == 'artists':
+            limit = 20
+            slice = 20
+        elif tp == 'albums' or tp == 'playlists':
+            # I think that qobuz actually imposes a limit of
+            # 20 for album searches.
+            limit = 50
+            slice = 20
+        offset = 0
+        ar = []
+        al = []
+        pl = []
+        tr = []
+        while offset < limit:
+            data = self.api.catalog_search(query=query, type=tp,
+                                           offset=offset, limit=slice)
+            try:
+                ar_ = [_parse_artist(i) for i in data['artists']['items']]
+            except:
+                ar_ = []
+            try:
+                al_ = [_parse_album(i) for i in data['albums']['items']]
+                al_ = [alb for alb in al_ if alb.available]
+            except:
+                al_ = []
+            try:
+                pl_ = [_parse_playlist(i) for i in data['playlists']['items']]
+            except:
+                pl_ = []
+            try:
+                tr_ = [_parse_track(i) for i in data['tracks']['items']]
+            except:
+                tr_ = []
+            ar.extend(ar_)
+            al.extend(al_)
+            pl.extend(pl_)
+            tr.extend(tr_)
+            offset += slice
+        
+        uplog("_search1: got %d artists %d albs %d tracks %d pl" %
+              (len(ar), len(al), len(tr), len(pl)))
+        return SearchResult(artists=ar, albums=al, playlists=pl, tracks=tr)
+
     def search(self, query, tp):
-        data = self.api.catalog_search(query=query, type=tp)
-        try:
-            ar = [_parse_artist(i) for i in data['artists']['items']]
-        except:
-            ar = []
-        try:
-            al = [_parse_album(i) for i in data['albums']['items']]
-            al = [alb for alb in al if alb.available]
-        except:
-            al = []
-        try:
-            pl = [_parse_playlist(i) for i in data['playlists']['items']]
-        except:
-            pl = []
-        try:
-            tr = [_parse_track(i) for i in data['tracks']['items']]
-        except:
-            tr = []
-        return SearchResult(artists=ar, albums=al, playlists=pl, tracks=tr)
-
+        if tp:
+            return self._search1(query, tp)
+        else:
+            cplt = SearchResult()
+            res = self._search1(query, 'artists')
+            cplt.artists = res.artists
+            res = self._search1(query, 'albums')
+            cplt.albums = res.albums
+            res = self._search1(query, 'tracks')
+            cplt.tracks = res.tracks
+            res = self._search1(query, 'playlists')
+            cplt.playlists = res.playlists
+            return cplt
 
 def _parse_artist(json_obj):
     artist = Artist(id=json_obj['id'], name=json_obj['name'])
@@ -142,6 +180,8 @@
     #if artists is None:
     #    artists = _parse_artists(json_obj['artists'])
     available = json_obj['streamable'] if 'streamable' in json_obj else false
+    #if not available:
+    #    uplog("Album not streamable: %s " % json_obj['title'])
     kwargs = {
         'id': json_obj['id'],
         'name': json_obj['title'],
@@ -172,7 +212,6 @@
     return Playlist(**kwargs)
 
 def _parse_track(json_obj, albumarg = None):
-        
     artist = Artist()
     if 'performer' in json_obj:
         artist = _parse_artist(json_obj['performer'])
@@ -188,6 +227,8 @@
         album = albumarg
 
     available = json_obj['streamable'] if 'streamable' in json_obj else false
+    #if not available:
+    #uplog("Track no not streamable: %s " % json_obj['title'])
 
     #artists = _parse_artists(json_obj['artists'])
     kwargs = {
@@ -215,14 +256,14 @@
         r = self.session.api.favorite_getUserFavorites(
             user_id = self.session.user.id,
             type = 'artists')
-        #print("%s" % r, file=sys.stderr)
+        #uplog("%s" % r)
         return [_parse_artist(item) for item in r['artists']['items']]
 
     def albums(self):
         r = self.session.api.favorite_getUserFavorites(
             user_id = self.session.user.id,
             type = 'albums')
-        #print("%s" % r, file=sys.stderr)
+        #uplog("%s" % r)
         albums = [_parse_album(item) for item in r['albums']['items']]
         return [alb for alb in albums if alb.available]
 
@@ -234,7 +275,7 @@
         r = self.session.api.favorite_getUserFavorites(
             user_id = self.session.user.id,
             type = 'tracks')
-        #print("%s" % r, file=sys.stderr)
+        #uplog("%s" % r)
         return [_parse_track(item) for item in r['tracks']['items']]