def create(self, name=None): friendpl = api.get('/playlist/getUserPlaylists', username=name, type='last-created') if not friendpl: return False data = api.get('/user/login', username=user.username, password=user.password) if not data: return False if data['user']['login'] == name: return False friends = data['user']['player_settings'] if 'friends' not in friends: friends = [] else: friends = friends['friends'] if name in friends: return False friends.append(name) newdata = {'friends': friends} if not api.user_update(player_settings=json.dumps(newdata)): return False self.delete_cache() executeBuiltin(containerRefresh()) return True
def fetch(self, Dir, lvl, whiteFlag, blackFlag): limit = getSetting('pagination_limit', asInt=True) self.data = None query = self.query if not query: from gui.util import Keyboard k = Keyboard('', 'My %s' % self.search_type) k.doModal() if not k.isConfirmed(): return False query = k.getText() query.strip() info(self, 'search_type: %s, query: %s' % (self.search_type, query)) source = self.source kwargs = {'query': query, 'limit': limit, } if source is not None: kwargs['source'] = source data = None if self.search_type == 'albums': data = api.get('/collection/getAlbums', **kwargs) elif self.search_type == 'artists': data = api.get('/collection/getArtists', **kwargs) elif self.search_type == 'tracks': data = api.get('/collection/getTracks', **kwargs) if data is None: return False self.data = data return True
def fetch(self, options=None): if self.nid is None: return api.get('/genre/list', offset=self.offset, limit=self.limit) return api.get('/genre/list', parent_id=self.nid, offset=self.offset, limit=self.limit)
def route_nfo_artist(album_id=None): album = api.get('/album/get', album_id=album_id) response = None if album is not None: response = api.get('/artist/get', artist_id=album['artist']['id']) if response is None: return http_error(404) if 'biography' in response: response['biography']['content'] = converter.strip_html( response['biography']['content'], default='') response['image_default_size'] = qobuzApp.registry.get( 'image_default_size') return render_template('artist.nfo.j2', **response)
def fetch(self, options=None): if self.search_type is None: return {} if self.search_type != 'all': return api.get('/favorite/getUserFavorites', user_id=user.get_id(), type=self.search_type, limit=self.limit, offset=self.offset) return api.get('/favorite/getUserFavorites', user_id=user.get_id(), limit=self.limit, offset=self.offset)
def gui_remove(self, playlist_id=None): playlist_id = self._get_playlist_id(playlist_id=playlist_id) if not playlist_id: notify_error(dialogHeading, 'Invalid playlist %s' % (str(playlist_id))) return False data = api.get('/playlist/get', playlist_id=playlist_id, limit=self.limit, offset=self.offset) if data is None: logger.error('Cannot get playlist with id %s', playlist_id) return False name = '' if 'name' in data: name = data['name'] ok = xbmcgui.Dialog().yesno( lang(30166), lang(30054), color('FFFF0000', name)) if not ok: return False if data['owner']['name'] == user.username: res = api.playlist_delete(playlist_id=playlist_id) else: res = api.playlist_unsubscribe(playlist_id=playlist_id) if not res: logger.warn('Cannot delete playlist with id ' + str(playlist_id)) notify_error(lang(30183), lang(30186) + name) return False self.delete_cache(playlist_id) executeBuiltin(containerRefresh()) notify_log(lang(30183), (lang(30184) + ' %s ' + lang(30185)) % name) return True
def fetch(self, options=None): if self.search_type is None: return {} return api.get('/purchase/getUserPurchases', limit=self.limit, offset=self.offset, user_id=user.get_id())
def get_user_data(cls): data = api.get('/user/login', username=current_user.username, password=current_user.password) if not data: return None return data['user']
def fetch(self, Dir, lvl, whiteFlag, blackFlag): data = api.get('/album/get', album_id=self.nid) if not data: warn(self, "Cannot fetch product data") return False self.data = data return True
def gui_rename(self, playlist_id=None): if not playlist_id: playlist_id = self.nid if not playlist_id: warn(self, "Can't rename playlist without id") return False from qobuz.gui.util import Keyboard data = api.get('/playlist/get', playlist_id=playlist_id) if not data: warn(self, "Something went wrong while renaming playlist") return False self.data = data currentname = self.get_name() k = Keyboard(currentname, lang(30080)) k.doModal() if not k.isConfirmed(): return False newname = k.getText() newname = newname.strip() if not newname: notify_error(dialogHeading, "Don't u call ure child something?") return False if newname == currentname: return True res = api.playlist_update(playlist_id=playlist_id, name=newname) if not res: warn(self, "Cannot rename playlist with name %s" % (newname)) return False self.delete_cache(playlist_id) notify_log(lang(30080), (u"%s: %s") % (lang(30165), currentname)) executeBuiltin(containerRefresh()) return True
def fetch(self, Dir, lvl, whiteFlag, blackFlag): limit = getSetting('pagination_limit') data = api.get('/artist/getSimilarArtists', artist_id=self.nid, offset=self.offset, limit=limit) if not data: return False self.data = data return len(data['artists']['items'])
def fetch(self, options=None): if self.genre_type is None or self.genre_id is None: return {} return api.get('/album/getFeatured', type=RECOS_TYPE_IDS[int(self.genre_type)], genre_id=self.genre_id, limit=self.limit, offset=self.offset)
def fetch(self, Dir, lvl, whiteFlag, blackFlag): if blackFlag & Flag.STOPBUILD == Flag.STOPBUILD: return False data = api.get('/track/get', track_id=self.nid) if not data: return False self.data = data return True
def fetch(self, Dir, lvl, whiteFlag, blackFlag): limit = getSetting('pagination_limit') data = api.get('/purchase/getUserPurchases', limit=limit, offset=self.offset, user_id=api.user_id) if not data: warn(self, "Cannot fetch purchases data") return False self.data = data return True
def fetch(self, Dir, lvl, whiteFlag, blackFlag): limit = getSetting('pagination_limit') data = api.get('/artist/getSimilarArtist', artist_id=self.nid, limit=limit, offset=self.offset, extra='albums') if not data: warn(self, "Cannot fetch albums for artist: " + self.get_label()) return False self.data = data return True
def fetch(self, Dir, lvl, whiteFlag, blackFlag): limit = getSetting('pagination_limit') data = api.get('/artist/get', artist_id=self.nid, limit=limit, offset=self.offset, extra='albums') if not data: warn(self, "Build-down: Cannot fetch artist data") return False self.data = data return True
def fetch(self, Dir, lvl, whiteFlag, blackFlag): limit = getSetting('pagination_limit') data = None if self.search_type != 'all': data = api.get('/favorite/getUserFavorites', user_id=api.user_id, type=self.search_type, limit=limit, offset=self.offset) else: data = api.get('/favorite/getUserFavorites', user_id=api.user_id, limit=limit, offset=self.offset) if not data: warn(self, "Build-down: Cannot fetch favorites data") return False self.data = data return True
def fetch(self, Dir, lvl, whiteFlag, blackFlag): limit = getSetting('pagination_limit', asInt=True) data = api.get('/playlist/get', playlist_id=self.nid, offset=self.offset, limit=limit, extra='tracks') if not data: warn(self, "Build-down: Cannot fetch playlist data") return False self.data = data self.get_image() # Buld thumbnail if neeeded return True
def populate(self, options=None): user_data = api.get('/user/login', username=user.username, password=user.password) if 'user' not in user_data: return False friend_data = user_data['user']['player_settings']['friends'] if self.name is not None: data = api.get('/playlist/getUserPlaylists', username=self.name, limit=self.limit, offset=self.offset, type='last-created') else: data = api.get('/playlist/getUserPlaylists', user_id=user.get_id(), limit=self.limit, offset=self.offset, type='last-created') if data is None: logger.warn('No friend data') return False friend_list = {} def add_name(name): if name in friend_list: return None if name == user_data['user']['login']: return None if name == self.name: return None friend_list[name] = 1 node = getNode(Flag.FRIEND, {'query': str(name)}) node.label = 'Friend / %s' % node.label self.add_child(node) return node for item in data['playlists']['items']: add_name(item['owner']['name']) for name in friend_data: add_name(name) return True
def populate(self, xbmc_directory, lvl, whiteFlag, blackFlag): username = api.username password = api.password user_id = api.user_id user_data = api.get('/user/login', username=username, password=password) if not 'user' in user_data: return False friend_data = user_data['user']['player_settings']['friends'] info(self, "Build-down friends list " + repr(self.name)) if self.name: data = api.get('/playlist/getUserPlaylists', username=self.name, limit=0) else: data = api.get('/playlist/getUserPlaylists', user_id=user_id, limit=0) if not data: warn(self, "No friend data") return False # extract all owner names from the list friend_list = [] for item in data['playlists']['items']: if item['owner']['name'] == user_data['user']['login']: continue friend_list.append(item['owner']['name']) # add previously stored if (not self.name): for name in friend_data: friend_list.append(str(name)) # remove duplicates keys = {} for e in friend_list: keys[e] = 1 friend_list = keys.keys() # and add them to the directory for name in friend_list: node = getNode(Flag.FRIEND, {'query': str(name)}) if name == self.name: continue if name in friend_data: node.label = 'Friend / %s' % (node.label) self.add_child(node)
def fetch(self, Dir, lvl, whiteFlag, blackFlag): limit = getSetting("pagination_limit") data = api.get("/playlist/getPublicPlaylists", offset=self.offset, limit=limit, type="last-created") if not data: return False # @bug: we use pagination_limit as limit for the search so we don't # need offset... (Fixed if qobuz fix it :p) if not "total" in data["playlists"]: data["playlists"]["total"] = data["playlists"]["limit"] self.data = data return True
def fetch(self, Dir, lvl, whiteFlag, blackFlag): limit = getSetting('pagination_limit') data = api.get('/playlist/getUserPlaylists', limit=limit, offset=self.offset, user_id=api.user_id) if data is None: warn(self, "Build-down: Cannot fetch user playlists data") return False self.data = data return True
def route_album(album_id=None, track_id=None): response = api.get('/album/get', album_id=album_id) if response is None: response = api.get('/track/get', track_id=track_id) if response is None: return http_error(404) response['album_id'] = album_id if request.method == 'HEAD': return '', 200 if 'description' in response: response['description'] = converter.strip_html( response['description'], default='') if 'catchline' in response: response['catchline'] = converter.strip_html( response['catchline'], default='') response['image_default_size'] = qobuzApp.registry.get( 'image_default_size') if 'duration' in response: response['duration'] = round(response['duration']) return render_template('dir.j2', **response)
def isFreeAccount(): """Check if account if it's a Qobuz paid account """ from qobuz.api import api data = api.get('/user/login', username=api.username, password=api.password) if not data: return True if not data['user']['credential']['id']: return True return False
def route_album(album_id=None, track_id=None): response = api.get('/album/get', album_id=album_id) if response is None: response = api.get('/track/get', track_id=track_id) if response is None: return http_error(404) response['album_id'] = album_id if request.method == 'HEAD': return '', 200 if 'description' in response: response['description'] = converter.strip_html(response['description'], default='') if 'catchline' in response: response['catchline'] = converter.strip_html(response['catchline'], default='') response['image_default_size'] = qobuzApp.registry.get( 'image_default_size') if 'duration' in response: response['duration'] = round(response['duration']) return render_template('dir.j2', **response)
def fetch(self, Dir, lvl, whiteFlag, blackFlag): limit = getSetting('pagination_limit') data = api.get('/genre/list', parent_id=self.nid, offset=self.offset, limit=limit) if not data: self.data = None return True # Nothing returned trigger reco build in build_down self.data = data genres = self.data['genres'] if 'parent' in genres and int(genres['parent']['level']) > 1: self.populate_reco(Dir, lvl, whiteFlag, blackFlag, genres['parent']['id']) return True
def __getFileUrl(self): if self._intent is None: self._intent = user.stream_format(track=self) format_id, intent, _description = self._intent data = api.get('/track/getFileUrl', format_id=format_id, track_id=self.nid, user_id=user.get_id(), intent=intent) if not data: logger.warn('Cannot get stream type for track (network problem?)') return None return data
def populate(self, Dir, lvl, whiteFlag, blackFlag): data = api.get('/playlist/getUserPlaylists', username=self.name) if not data: warn(self, "No friend data") return False if lvl != -1: self.add_child(getNode(Flag.FRIENDS, self.parameters)) for pl in data['playlists']['items']: node = getNode(Flag.PLAYLIST) node.data = pl if node.get_owner() == self.label: self.nid = node.get_owner_id() self.add_child(node) return True
def __getFileUrl(self): hires = getSetting('hires_enabled', asBool=True) format_id = 6 if getSetting('streamtype') == 'flac' else 5 if hires and self.get_hires(): format_id = 27 if self.get_property('purchased') or self.get_parameter('purchased') == '1' or self.purchased: intent = "download" else: intent = "stream" data = api.get('/track/getFileUrl', format_id=format_id, track_id=self.nid, user_id=api.user_id, intent=intent) if not data: warn(self, "Cannot get stream type for track (network problem?)") return None return data
def create(self, name=None): username = api.username password = api.password friendpl = api.get('/playlist/getUserPlaylists', username=name) if not friendpl: return False user = api.get('/user/login', username=username, password=password) if user['user']['login'] == name: return False if not user: return False friends = user['user']['player_settings'] if not 'friends' in friends: friends = [] else: friends = friends['friends'] if name in friends: return False friends.append(name) newdata = {'friends': friends} if not api.user_update(player_settings=json.dumps(newdata)): return False executeBuiltin(containerRefresh()) return True
def fetch(self, Dir, lvl, whiteFlag, blackFlag): if self.genre_type is None or self.genre_id is None: return True offset = self.offset or 0 limit = getSetting('pagination_limit') data = api.get('/album/getFeatured', type=RECOS_TYPE_IDS[int(self.genre_type)], genre_id=self.genre_id, limit=10, offset=offset) if data is None: warn(self, 'Cannot fetch data for recommendation') return False self.data = data return True
def fetch(self, options=None): if self.search_type is None: return {} query = self.get_parameter('query', to='unquote') if not query: from qobuz.gui.util import Keyboard k = Keyboard('', 'My %s' % self.search_type) k.doModal() if not k.isConfirmed(): return None query = k.getText().strip() if query == '': return None kwargs = {'query': converter.quote(query)} if self.source is not None: kwargs['source'] = self.source logger.info('SEARCH %s', kwargs) if self.search_type == 'albums': return api.get('/collection/getAlbums', **kwargs) elif self.search_type == 'artists': return api.get('/collection/getArtists', **kwargs) elif self.search_type == 'tracks': return api.get('/collection/getTracks', **kwargs) return None
def fetch(self, options=None): if self.search_type is None: return {} query = self.get_parameter('query', to='unquote') if query is None: from qobuz.gui.util import Keyboard k = Keyboard('', self.search_type) k.doModal() if not k.isConfirmed(): return None query = k.getText().strip() if query is None or query == '': return None self.set_parameter('query', query, quote=True) return api.get('/search/getResults', query=query, type=self.search_type, limit=self.limit, offset=self.offset)
def fetch(self, options=None): node = getNode(Flag.FRIEND) node.create('qobuz.com') return api.get('/playlist/getUserPlaylists', type='last-created', username=self.name)
def fetch(self, options=None): return api.get('/artist/get', artist_id=self.nid, limit=self.limit, offset=self.offset, extra='albums')
def fetch(self, _=None): method, args = self._fetch_args() return api.get(method, **args)
def fetch(self, options=None): if self.nid is None: return api.get('/label/list', limit=self.limit, offset=self.offset) return api.get('/label/get', label_id=self.nid)
def fetch(self, options=None): options = helper.get_tree_traverse_opts(options) if (options.blackFlag is not None) and ( options.blackFlag & Flag.STOPBUILD == Flag.STOPBUILD): return None return api.get('/track/get', track_id=self.nid)
def fetch(self, options=None): return api.get('/artist/get', artist_id=self.nid, extra='albums')
def fetch(self, options=None): return api.get('/playlist/getUserPlaylists', limit=self._get_limit(), offset=self.offset, user_id=user.get_id(), type='last-created')
def fetch(self, options=None): if self.nid is None: return api.get('/article/listLastArticles', offset=self.offset, limit=self.limit) return api.get('/article/get', article_id=self.nid)
def fetch(self, options=None): return api.get('/artist/getSimilarArtists', artist_id=self.nid, offset=self.offset, limit=self.limit)
def fetch(self, options=None): options = helper.get_tree_traverse_opts(options) return api.get('/album/get', album_id=self.nid, noRemote=options.noRemote)
def fetch(self, options=None): return api.get('/playlist/getFeatured', offset=self.offset, limit=self._get_limit(), type=self.type)