def root(self): items = [] # Search list_item = xbmcgui.ListItem( label=self.addon.getLocalizedString(30101)) url = self.addon_base + PATH_SEARCH items.append((url, list_item, True)) # Charts list_item = xbmcgui.ListItem( label=self.addon.getLocalizedString(30102)) url = self.addon_base + PATH_FEATURED items.append((url, list_item, True)) # Trending list_item = xbmcgui.ListItem( label=self.addon.getLocalizedString(30103)) url = self.addon_base + PATH_TRENDING items.append((url, list_item, True)) # Categories list_item = xbmcgui.ListItem( label=self.addon.getLocalizedString(30104)) url = self.addon_base + PATH_CATEGORIES items.append((url, list_item, True)) # Log in/out user = self._get_authenticated_user() if isinstance(user, dict): user_model = User(id=user["resource_key"], label=self.addon.getLocalizedString(30105)) user_model.data = user items.append(user_model.to_list_item(self.addon, self.addon_base)) list_item = xbmcgui.ListItem( label=self.addon.getLocalizedString(30110)) url = self.addon_base + PATH_AUTH_LOGOUT items.append((url, list_item, False)) else: list_item = xbmcgui.ListItem( label=self.addon.getLocalizedString(30109)) url = self.addon_base + PATH_AUTH_LOGIN items.append((url, list_item, False)) # Settings list_item = xbmcgui.ListItem( label=self.addon.getLocalizedString(30108)) url = self.addon_base + "/?action=settings" items.append((url, list_item, False)) return items
def _map_json_to_collection(self, json_obj): collection = ApiCollection() collection.items = [ ] # Reset list in order to resolve problems in unit tests. collection.load = [] collection.next_href = json_obj.get("next_href", None) if "kind" in json_obj and json_obj["kind"] == "track": # If we are dealing with a single track, pack it into a dict json_obj = {"collection": [json_obj]} if "collection" in json_obj: for item in json_obj["collection"]: kind = item.get("kind", None) if kind == "track": if "title" not in item: # Track not fully returned by API collection.load.append(item["id"]) continue track = self._build_track(item) collection.items.append(track) elif kind == "user": user = User(id=item["id"], label=item["username"]) user.label2 = item.get("full_name", "") user.thumb = self._get_thumbnail(item, self.thumbnail_size) user.info = {"artist": item.get("description", None)} collection.items.append(user) elif kind == "playlist": playlist = Playlist(id=item["id"], label=item.get("title")) playlist.is_album = item.get("is_album", False) playlist.label2 = item.get("label_name", "") playlist.thumb = self._get_thumbnail( item, self.thumbnail_size) playlist.info = {"artist": item["user"]["username"]} collection.items.append(playlist) elif kind == "system-playlist": # System playlists only appear inside selections playlist = Selection(id=item["id"], label=item.get("title")) playlist.thumb = self._get_thumbnail( item, self.thumbnail_size) collection.items.append(playlist) elif kind == "selection": selection = Selection(id=item["id"], label=item.get("title")) selection.label2 = item.get("description", "") collection.items.append(selection) else: xbmc.log( "plugin.audio.soundcloud::ApiV2() " "Could not convert JSON kind to model...", xbmc.LOGWARNING) elif "tracks" in json_obj: for item in json_obj["tracks"]: if "title" not in item: # Track not fully returned by API collection.load.append(item["id"]) continue track = self._build_track(item) track.label2 = json_obj["title"] collection.items.append(track) else: raise RuntimeError("ApiV2 JSON seems to be invalid") # Load unresolved tracks if collection.load: # The API only supports a max of 50 track IDs per request: for chunk in self._chunks(collection.load, self.api_limit_tracks): track_ids = ",".join(str(x) for x in chunk) loaded_tracks = self._do_request("/tracks", {"ids": track_ids}) # Because returned tracks are not sorted, we have to manually match them for track_id in chunk: loaded_track = [ lt for lt in loaded_tracks if lt["id"] == track_id ] if len(loaded_track ): # Sometimes a track cannot be resolved track = self._build_track(loaded_track[0]) collection.items.append(track) return collection
def _map_json_to_collection(self, json_obj): collection = ApiCollection() collection.items = [ ] # Reset list in order to resolve problems in unit tests collection.next_href = json_obj.get("paging", {"next": None})["next"] if self._request_was_bad(json_obj) == 2223: raise PasswordRequiredException() if self._request_was_bad(json_obj) == 2222: raise WrongPasswordException() if "type" in json_obj and json_obj["type"] in ("video", "live"): # If we are dealing with a single video, pack it into a dict json_obj = {"data": [json_obj]} if "data" in json_obj: for item in json_obj["data"]: if "play" in item and item.get("play").get( "status", "") == "unavailable": # Don't show unavailable items (like scheduled live streams) continue kind = item.get("type", None) is_video = kind == "video" is_live = kind == "live" is_category = "/categories/" in item.get("uri", "") is_channel = "/channels/" in item.get("uri", "") is_group = "/groups/" in item.get("uri", "") is_user = item.get("account", False) # On-demand videos don't contain playable video links: purchase_required = item.get("play", {}).get("status", "") == "purchase_required" if is_video or is_live: if purchase_required: video_url = item["metadata"]["connections"]["trailer"][ "uri"] else: video_url = item["uri"] video = Video(id=item["resource_key"], label=item["name"]) video.thumb = self._get_picture(item["pictures"]) video.uri = video_url video.hasSubtitles = item["metadata"]["connections"][ "texttracks"]["total"] > 0 video.info = { "date": item["release_time"], "description": item["description"], "duration": item["duration"], "picture": self._get_picture(item["pictures"], 4), "user": item["user"]["name"], "userThumb": self._get_picture(item["user"]["pictures"], 3), "onDemand": purchase_required, "live": is_live, } collection.items.append(video) elif is_category: category = Category(id=item["resource_key"], label=item["name"]) category.thumb = self._get_picture(item["pictures"], 3) category.uri = item["metadata"]["connections"]["videos"][ "uri"] collection.items.append(category) elif is_channel: channel = Channel(id=item["resource_key"], label=item["name"]) channel.thumb = self._get_picture(item["pictures"], 3) channel.uri = item["metadata"]["connections"]["videos"][ "uri"] channel.info = { "date": item["created_time"], "description": item.get("description", ""), } collection.items.append(channel) elif is_group: group = Group(id=item["resource_key"], label=item["name"]) group.thumb = self._get_picture(item["pictures"], 3) group.uri = item["metadata"]["connections"]["videos"][ "uri"] group.info = { "date": item["created_time"], "description": item.get("description", ""), } collection.items.append(group) elif is_user: user = User(id=item["resource_key"], label=item["name"]) user.data = item collection.items.append(user) else: raise RuntimeError( "Could not convert JSON kind to model...") else: raise RuntimeError("Api JSON seems to be invalid") return collection