Beispiel #1
0
    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
Beispiel #3
0
    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