Exemplo n.º 1
0
def monitor_status_code(testurl, initstatus, timeout):
    """Monitor status code of target until change

    Keyword arguments:
    testurl -- the target url
    initstatus -- the initial status code or error code for the target
    timeout -- number of minutes between tests
    """
    newstatus = 0
    status_changed = False

    while not status_changed:
        print("Entering test loop with timeout of", timeout, "minutes")
        time.sleep(timeout * 60)
        print("Testing...")
        try:
            connection = urllib.request.urlopen(urllib.request.Request(
                testurl, headers={'User-Agent': USERAGENTSTRING}),
                                                timeout=60)
            print("Statuscode", connection.getcode())
            if connection.getcode() != initstatus:
                newstatus = connection.getcode()
                print("New statuscode detected", initstatus, "->", newstatus)
                status_changed = True
            connection.close()
        except urllib.error.HTTPError as error:
            print(type(error), error)
            if error.code != initstatus:
                newstatus = error.getcode()
                print("New statuscode detected", initstatus, "->", newstatus)
                status_changed = True
    return newstatus
Exemplo n.º 2
0
    def request(self, url, data=None):
        headers = {'Content-Type': 'application/json'}

        if url == self.OAUTH_TOKEN_URL:
            # Inject username and password into the request URL
            url = utils.url_add_authentication(url, settings.FLATTR_KEY,
                                               settings.FLATTR_SECRET)
        elif self.user.profile.settings.get_setting('flattr_token', ''):
            headers[
                'Authorization'] = 'Bearer ' + self.user.profile.settings.get_wksetting(
                    FLATTR_TOKEN)

        if data is not None:
            data = json.dumps(data).encode('utf-8')

        try:
            response = utils.urlopen(url, headers, data)
        except urllib.error.HTTPError as error:
            return {'_gpodder_statuscode': error.getcode()}
        except urllib.error.URLError as error:
            return {'_gpodder_no_connection': False}

        if response.getcode() == 200:
            return json.loads(response.read().decode('utf-8'))

        return {'_gpodder_statuscode': response.getcode()}
Exemplo n.º 3
0
	def liveStreamRestart(self, link):
		try:
			xbmcaddon.Addon('inputstream.adaptive')
		except RuntimeError:
			return

		try:
			response = self.__makeRequest('livestream/' + link)
			responseCode = response.getcode()
		except urllib.error.HTTPError as error:
			responseCode = error.getcode()

		if responseCode == 200:
			result = json.loads(response.read().decode('UTF-8'))

			title       = result.get('title').encode('UTF-8')
			image       = self.JSONImage(result.get('_embedded').get('image'))
			description = result.get('description')
			duration    = result.get('duration_seconds')
			date        = time.strptime(result.get('start')[0:19], '%Y-%m-%dT%H:%M:%S')

			ApiKey = '2e9f11608ede41f1826488f1e23c4a8d'
			bitmovinStreamId = result.get('_embedded').get('channel').get('restart_urls').get('default')
			if bitmovinStreamId:
				bitmovinStreamId = bitmovinStreamId.replace("https://playerapi-restarttv.ors.at/livestreams/","").replace("/sections/","")
				bitmovinStreamId = bitmovinStreamId.split("?")[0]
			response = urllib.request.urlopen('https://playerapi-restarttv.ors.at/livestreams/%s/sections/?state=active&X-Api-Key=%s' % (bitmovinStreamId, ApiKey)) # nosec
			section = json.loads(response.read().decode('UTF-8'))[0]

			streamingURL = 'https://playerapi-restarttv.ors.at/livestreams/%s/sections/%s/manifests/hls/?startTime=%s&X-Api-Key=%s' % (bitmovinStreamId, section.get('id'), section.get('metaData').get('timestamp'), ApiKey)

			listItem = createListItem(title, image, description, duration, time.strftime('%Y-%m-%d', date), result.get('_embedded').get('channel').get('name'), streamingURL, True, False, self.defaultbackdrop, self.pluginhandle)
			listItem.setProperty('inputstreamaddon', 'inputstream.adaptive')
			listItem.setProperty('inputstream.adaptive.manifest_type', 'hls')
			self.xbmc.Player().play(streamingURL, listItem)
Exemplo n.º 4
0
	def getHighlights(self):
		try:
			response = self.__makeRequest(self.serviceAPIHighlights)
			responseCode = response.getcode()
		except urllib.error.HTTPError as error:
			responseCode = error.getcode()

		if responseCode == 200:
			for result in json.loads(response.read().decode('UTF-8')).get('highlight_teasers'):
				if result.get('target').get('model') == 'Segment':
					self.JSONSegment2ListItem(result.get('target'))
Exemplo n.º 5
0
	def getMostViewed(self):
		try:
			response = self.__makeRequest(self.__urlMostViewed)
			responseCode = response.getcode()
		except urllib.error.HTTPError as error:
			responseCode = error.getcode()

		if responseCode == 200:
			for result in json.loads(response.read().decode('UTF-8')).get('most_viewed_segments'):
				if result.get('model') == 'Segment':
					self.JSONSegment2ListItem(result)
Exemplo n.º 6
0
    def getMostViewed(self):
        try:
            response = self.__makeRequest(self.__urlMostViewed)
            responseCode = response.getcode()
        except urllib.error.HTTPError as error:
            responseCode = error.getcode()

        if responseCode == 200:
            for result in json.loads(response.read().decode('UTF-8')).get(
                    'most_viewed_segments'):
                if result.get('model') == 'Segment':
                    self.JSONSegment2ListItem(result)
Exemplo n.º 7
0
    def getHighlights(self):
        try:
            response = self.__makeRequest(self.serviceAPIHighlights)
            responseCode = response.getcode()
        except urllib.error.HTTPError as error:
            responseCode = error.getcode()

        if responseCode == 200:
            for result in json.loads(
                    response.read().decode('UTF-8')).get('highlight_teasers'):
                if result.get('target').get('model') == 'Segment':
                    self.JSONSegment2ListItem(result.get('target'))
Exemplo n.º 8
0
	def getCategories(self):
		try:
			response = self.__makeRequest(self.__urlShows)
			responseCode = response.getcode()
		except urllib.error.HTTPError as error:
			responseCode = error.getcode()

		if responseCode == 200:
			for result in json.loads(response.read().decode('UTF-8')).get('_embedded').get('items'):
				self.__JSONProfile2ListItem(result)
		else:
			xbmcgui.Dialog().notification(self.translation(30045).encode('UTF-8'), self.translation(30046).encode('UTF-8'), xbmcaddon.Addon().getAddonInfo('icon'))
Exemplo n.º 9
0
	def getTrailers(self):
		try:
			response = self.__makeRequest(self.serviceAPITrailers)
			responseCode = response.getcode()
		except ValueError as error:
			responseCode = 404
		except urllib.error.HTTPError as error:
			responseCode = error.getcode()

		if responseCode == 200:
			for episode in json.loads(response.read().decode('UTF-8'))['_embedded']['items']:
				self.__JSONEpisode2ListItem(episode)
		else:
			xbmcgui.Dialog().notification(self.translation(30045).encode('UTF-8'), self.translation(30046).encode('UTF-8'), xbmcaddon.Addon().getAddonInfo('icon'))
Exemplo n.º 10
0
    def liveStreamRestart(self, link):
        try:
            xbmcaddon.Addon('inputstream.adaptive')
        except RuntimeError:
            return

        try:
            response = self.__makeRequest('livestream/' + link)
            responseCode = response.getcode()
        except urllib.error.HTTPError as error:
            responseCode = error.getcode()

        if responseCode == 200:
            result = json.loads(response.read().decode('UTF-8'))

            title = result.get('title').encode('UTF-8')
            image = self.JSONImage(result.get('_embedded').get('image'))
            description = result.get('description')
            duration = result.get('duration_seconds')
            date = time.strptime(
                result.get('start')[0:19], '%Y-%m-%dT%H:%M:%S')

            ApiKey = '2e9f11608ede41f1826488f1e23c4a8d'
            bitmovinStreamId = result.get('_embedded').get('channel').get(
                'restart_urls').get('default')
            if bitmovinStreamId:
                bitmovinStreamId = bitmovinStreamId.replace(
                    "https://playerapi-restarttv.ors.at/livestreams/",
                    "").replace("/sections/", "")
                bitmovinStreamId = bitmovinStreamId.split("?")[0]
            response = urllib.request.urlopen(
                'https://playerapi-restarttv.ors.at/livestreams/%s/sections/?state=active&X-Api-Key=%s'
                % (bitmovinStreamId, ApiKey))  # nosec
            section = json.loads(response.read().decode('UTF-8'))[0]

            streamingURL = 'https://playerapi-restarttv.ors.at/livestreams/%s/sections/%s/manifests/hls/?startTime=%s&X-Api-Key=%s' % (
                bitmovinStreamId, section.get('id'),
                section.get('metaData').get('timestamp'), ApiKey)

            listItem = createListItem(
                title, image, description, duration,
                time.strftime('%Y-%m-%d', date),
                result.get('_embedded').get('channel').get('name'),
                streamingURL, True, False, self.defaultbackdrop,
                self.pluginhandle)
            listItem.setProperty('inputstreamaddon', 'inputstream.adaptive')
            listItem.setProperty('inputstream.adaptive.manifest_type', 'hls')
            self.xbmc.Player().play(streamingURL, listItem)
Exemplo n.º 11
0
    def getCategories(self):
        try:
            response = self.__makeRequest(self.__urlShows)
            responseCode = response.getcode()
        except urllib.error.HTTPError as error:
            responseCode = error.getcode()

        if responseCode == 200:
            for result in json.loads(response.read().decode('UTF-8')).get(
                    '_embedded').get('items'):
                self.__JSONProfile2ListItem(result)
        else:
            xbmcgui.Dialog().notification(
                self.translation(30045).encode('UTF-8'),
                self.translation(30046).encode('UTF-8'),
                xbmcaddon.Addon().getAddonInfo('icon'))
Exemplo n.º 12
0
	def getTableResults(self, urlAPI):
		try:
			response = self.__makeRequest(urlAPI)
			responseCode = response.getcode()
		except urllib.error.HTTPError as error:
			responseCode = error.getcode()

		if responseCode == 200:
			for result in json.loads(response.read().decode('UTF-8')):
				if result.get('model') == 'Episode':
					self.__JSONEpisode2ListItem(result)
				elif result.get('model') == 'Tip':
					self.__JSONVideoItem2ListItem(result.get('_embedded').get('video_item'))

		else:
			self.xbmc.log(msg='ServiceAPI no available ... switch back to HTML Parsing in the Addon Settings', level=xbmc.LOGDEBUG);
			xbmcgui.Dialog().notification(self.translation(30045).encode('UTF-8'), self.translation(30046).encode('UTF-8'), xbmcaddon.Addon().getAddonInfo('icon'))
Exemplo n.º 13
0
    def getTrailers(self):
        try:
            response = self.__makeRequest(self.serviceAPITrailers)
            responseCode = response.getcode()
        except ValueError as error:
            responseCode = 404
        except urllib.error.HTTPError as error:
            responseCode = error.getcode()

        if responseCode == 200:
            for episode in json.loads(
                    response.read().decode('UTF-8'))['_embedded']['items']:
                self.__JSONEpisode2ListItem(episode)
        else:
            xbmcgui.Dialog().notification(
                self.translation(30045).encode('UTF-8'),
                self.translation(30046).encode('UTF-8'),
                xbmcaddon.Addon().getAddonInfo('icon'))
Exemplo n.º 14
0
	def getThemen(self):
		try:
			response = self.__makeRequest(self.__urlTopics)
			responseCode = response.getcode()
		except ValueError as error:
			responseCode = 404
		except urllib.error.HTTPError as error:
			responseCode = error.getcode()

		if responseCode == 200:
			for topic in json.loads(response.read().decode('UTF-8')).get('_embedded').get('items'):
				title       = topic.get('title').encode('UTF-8')
				description = topic.get('description')
				link        = topic.get('id')
				addDirectory(title, None, self.defaultbackdrop, description, link, 'openTopic', self.pluginhandle)

		else:
			xbmcgui.Dialog().notification(self.translation(30045).encode('UTF-8'), self.translation(30046).encode('UTF-8'), xbmcaddon.Addon().getAddonInfo('icon'))
Exemplo n.º 15
0
    def getLiveNotOnline(self, link):
        try:
            response = self.__makeRequest('livestream/' + link)
            responseCode = response.getcode()
        except urllib.error.HTTPError as error:
            responseCode = error.getcode()

        if responseCode == 200:
            result = json.loads(response.read().decode('UTF-8'))

            title = result.get('title').encode('UTF-8')
            image = self.JSONImage(result.get('_embedded').get('image'))
            description = result.get('description')
            duration = result.get('duration_seconds')
            date = time.strptime(
                result.get('start')[0:19], '%Y-%m-%dT%H:%M:%S')

            dialog = xbmcgui.Dialog()
            if dialog.yesno(
                (self.translation(30030)).encode("utf-8"),
                ((self.translation(30031)).encode("utf-8") + " %s.\n" +
                 (self.translation(30032)).encode("utf-8")) %
                    time.strftime('%H:%M', date)):
                sleepTime = int(
                    time.mktime(date) - time.mktime(time.localtime()))
                dialog.notification(
                    (self.translation(30033)).encode("utf-8"), '%s %s' %
                    ((self.translation(30034)).encode("utf-8"), sleepTime))
                self.xbmc.sleep(sleepTime * 1000)
                if dialog.yesno('', (self.translation(30035)).encode("utf-8")):
                    streamingURL = link = self.JSONStreamingURL(
                        result.get('sources'))
                    listItem = createListItem(
                        title, image, description, duration,
                        time.strftime('%Y-%m-%d', date),
                        result.get('_embedded').get('channel').get('name'),
                        streamingURL, True, False, self.defaultbackdrop,
                        self.pluginhandle)
                    self.xbmc.Player().play(streamingURL, listItem)
Exemplo n.º 16
0
	def getLiveStreams(self):
		try:
			response = self.__makeRequest(self.__urlLive)
			responseCode = response.getcode()
		except urllib.error.HTTPError as error:
			responseCode = error.getcode()

		if responseCode == 200:
			try:
				xbmcaddon.Addon('inputstream.adaptive')
				inputstreamAdaptive = True
			except RuntimeError:
				inputstreamAdaptive = False
			
			foundProgram = []
			
			for result in json.loads(response.read().decode('UTF-8')).get('_embedded').get('items'):
				description     = result.get('description')
				programName     = result.get('_embedded').get('channel').get('name')
				livestreamStart = time.strptime(result.get('start')[0:19], '%Y-%m-%dT%H:%M:%S')
				livestreamEnd   = time.strptime(result.get('end')[0:19],   '%Y-%m-%dT%H:%M:%S')
				duration        = max(time.mktime(livestreamEnd) - max(time.mktime(livestreamStart), time.mktime(time.localtime())), 1)
				contextMenuItems = []
				
				if programName not in foundProgram:
					foundProgram.append(programName)

					link = self.JSONStreamingURL(result.get('sources'))
					if inputstreamAdaptive and result.get('restart'):
						contextMenuItems.append(('Restart', 'RunPlugin(plugin://%s/?mode=liveStreamRestart&link=%s)' % (xbmcaddon.Addon().getAddonInfo('id'), result.get('id'))))

					title = "[%s]%s %s (%s)" % (programName, '[Restart]' if inputstreamAdaptive and result.get('restart') else '', result.get('title'), time.strftime('%H:%M', livestreamStart))

					banner = self.JSONImage(result.get('_embedded').get('image'))

					createListItem(title, banner, description, duration, time.strftime('%Y-%m-%d', livestreamStart), programName, link, True, False, self.defaultbackdrop, self.pluginhandle, contextMenuItems = contextMenuItems)
		else:
			xbmcgui.Dialog().notification(self.translation(30045).encode('UTF-8'), self.translation(30046).encode('UTF-8'), xbmcaddon.Addon().getAddonInfo('icon'))
Exemplo n.º 17
0
    def request(self, url, data=None):
        headers = {"Content-Type": "application/json"}

        if url == self.OAUTH_TOKEN_URL:
            # Inject username and password into the request URL
            url = utils.url_add_authentication(url, settings.FLATTR_KEY, settings.FLATTR_SECRET)
        elif self.user.profile.settings.get_setting("flattr_token", ""):
            headers["Authorization"] = "Bearer " + self.user.profile.settings.get_wksetting(FLATTR_TOKEN)

        if data is not None:
            data = json.dumps(data).encode("utf-8")

        try:
            response = utils.urlopen(url, headers, data)
        except urllib.error.HTTPError as error:
            return {"_gpodder_statuscode": error.getcode()}
        except urllib.error.URLError as error:
            return {"_gpodder_no_connection": False}

        if response.getcode() == 200:
            return json.loads(response.read().decode("utf-8"))

        return {"_gpodder_statuscode": response.getcode()}
Exemplo n.º 18
0
    def getThemen(self):
        try:
            response = self.__makeRequest(self.__urlTopics)
            responseCode = response.getcode()
        except ValueError as error:
            responseCode = 404
        except urllib.error.HTTPError as error:
            responseCode = error.getcode()

        if responseCode == 200:
            for topic in json.loads(response.read().decode('UTF-8')).get(
                    '_embedded').get('items'):
                title = topic.get('title').encode('UTF-8')
                description = topic.get('description')
                link = topic.get('id')
                addDirectory(title, None, self.defaultbackdrop, description,
                             link, 'openTopic', self.pluginhandle)

        else:
            xbmcgui.Dialog().notification(
                self.translation(30045).encode('UTF-8'),
                self.translation(30046).encode('UTF-8'),
                xbmcaddon.Addon().getAddonInfo('icon'))
Exemplo n.º 19
0
    def getTableResults(self, urlAPI):
        try:
            response = self.__makeRequest(urlAPI)
            responseCode = response.getcode()
        except urllib.error.HTTPError as error:
            responseCode = error.getcode()

        if responseCode == 200:
            for result in json.loads(response.read().decode('UTF-8')):
                if result.get('model') == 'Episode':
                    self.__JSONEpisode2ListItem(result)
                elif result.get('model') == 'Tip':
                    self.__JSONVideoItem2ListItem(
                        result.get('_embedded').get('video_item'))

        else:
            self.xbmc.log(
                msg=
                'ServiceAPI no available ... switch back to HTML Parsing in the Addon Settings',
                level=xbmc.LOGDEBUG)
            xbmcgui.Dialog().notification(
                self.translation(30045).encode('UTF-8'),
                self.translation(30046).encode('UTF-8'),
                xbmcaddon.Addon().getAddonInfo('icon'))
Exemplo n.º 20
0
    def _urlopen(self, *args, **kwds):
        """Wrapper around `urlopen` to facilitate rate limiting. Called by both
        `._fetch_json()` and `.get_blob()` to make the actual requests.

        When `.use_rate_limiting` is `False`, just proxies to `urlopen`.

        When `.use_rate_limiting` is `True`, stores the remaining request count
        and reset time, which are returned in each response's headers, and
        checks those before making the next request.

        If there are no more requests remaining, calculates the amount of time
        until the reset and sleep until then.
        
        Also catches the `503 - Over Rate Limit` error and re-runs.
        
        Returns the same ill-documented object that `urlopen` returns.
        
        Raises:
        
        1.  `QuipError` - When `urlopen` raises an `HTTPError` that is
            successfully parsed as an API error response.
            
        2.  `HTTPError` - When `urlopen` raises an `HTTPError` that could not
            be successfully parsed.
        """

        # If the rate limiting feature is not turned on then just call `urlopen`
        # and be done with it.
        if not self.use_rate_limiting:
            return urlopen(*args, **kwds)

        # So, everything from here on out is using rate limiting...

        # Are we gonna maybe sleep? Only if we know how many requests we have
        # remaining (which we must make a request first to learn) **and** that
        # remaining number is `1` or less.
        #
        # No, I have no idea why `1` works and `0` does not. But that's how it
        # be.
        if (self.rate_limit_remaining is not None
                and self.rate_limit_remaining <= 1):
            sleep_sec = self.rate_limit_reset - time.time()

            # Only actually sleep if the time is greater than `zero. It can end
            # up being less than zero. 'Cause economics and physics and stuff.
            if sleep_sec > 0:
                if sleep_sec > 60:
                    string = "%0.2f minutes" % (sleep_sec / 60)
                else:
                    string = "%0.2f seconds" % sleep_sec

                logging.info("Sleeping for %s due to rate limiting...", string)
                time.sleep(sleep_sec)
                logging.info("Ok, woke back up. Carrying on...")

        try:
            response = urlopen(*args, **kwds)
        except HTTPError as error:
            try:
                # Extract the developer-friendly error message from the response
                message = json.loads(
                    error.read().decode())["error_description"]
            except Exception:
                raise error

            # Is it a rate limit problem?
            if error.getcode() != 503 or message != u'Over Rate Limit':
                # It's not, raise 'er up
                raise QuipError(error.code, message, error)
            else:
                # Yup, it's rate limit. Usually this means we exhausted the
                # *hourly* rate limit, which doesn't even seem to show up
                # anywhere *until* you exhaust it, then it replaces the
                # per-minute one in the same headers.

                logging.warning("RATE LIMIT - EXHAUSTED (503 error)")

                # Set the limit values from the `error`, which is also a
                # whatever-like object like a successful response.
                self._set_rate_limit_values(error)

                # And go back through again! Which *should* now trigger a sleep.
                #
                # This is kinda dumb, on account of that 'should' just above,
                # but it's easy...
                return self._urlopen(*args, **kwds)

        self._set_rate_limit_values(response)

        return response
Exemplo n.º 21
0
    def getMemberInfoWhitecube(self, member_id, artist, bookmark=False):
        ''' get artist information using Ajax and AppAPI '''
        try:
            info = None
            if artist.reference_image_id > 0:
                url = "https://www.pixiv.net/rpc/get_work.php?id={0}".format(
                    artist.reference_image_id)
                PixivHelper.GetLogger().debug("using webrpc: %s", url)
                info = self._get_from_cache(url)
                if info is None:
                    request = urllib.request.Request(url)
                    infoStr = self.open_with_retry(request).read()
                    info = json.loads(infoStr)
                    self._put_to_cache(url, info)
            else:
                PixivHelper.print_and_log(
                    'info',
                    'Using OAuth to retrieve member info for: {0}'.format(
                        member_id))
                if self._username is None or self._username is None or len(
                        self._username) < 0 or len(self._password) < 0:
                    raise PixivException(
                        "Empty Username or Password, please remove the cookie value and relogin, or add username/password to config.ini."
                    )

                if self._oauth_manager is None:
                    proxy = None
                    if self._config.useProxy:
                        proxy = self._config.proxy
                    self._oauth_manager = PixivOAuth(
                        self._username,
                        self._password,
                        proxies=proxy,
                        refresh_token=self._config.refresh_token,
                        validate_ssl=self._config.enableSSLVerification)

                url = 'https://app-api.pixiv.net/v1/user/detail?user_id={0}'.format(
                    member_id)
                info = self._get_from_cache(url)
                if info is None:
                    PixivHelper.GetLogger().debug(
                        "Getting member information: %s", member_id)
                    login_response = self._oauth_manager.login()
                    if login_response.status_code == 200:
                        info = json.loads(login_response.text)
                        self._config.refresh_token = info["response"][
                            "refresh_token"]
                        self._config.writeConfig(
                            path=self._config.configFileLocation)

                    response = self._oauth_manager.get_user_info(member_id)
                    info = json.loads(response.text)
                    self._put_to_cache(url, info)
                    PixivHelper.GetLogger().debug("reply: %s", response.text)

            artist.ParseInfo(info, False, bookmark=bookmark)

            # will throw HTTPError if user is suspended/not logged in.
            url_ajax = 'https://www.pixiv.net/ajax/user/{0}'.format(member_id)
            info_ajax = self._get_from_cache(url_ajax)
            if info_ajax is None:
                info_ajax_str = self.open_with_retry(url_ajax).read()
                info_ajax = json.loads(info_ajax_str)
                self._put_to_cache(url_ajax, info_ajax)
            # 2nd pass to get the background
            artist.ParseBackground(info_ajax)

            return artist
        except urllib.error.HTTPError as error:
            errorCode = error.getcode()
            errorMessage = error.get_data()
            PixivHelper.GetLogger().error("Error data: \r\n %s", errorMessage)
            payload = demjson.decode(errorMessage)
            # Issue #432
            if "message" in payload:
                msg = payload["message"]
            elif "error" in payload and payload["error"] is not None:
                msgs = list()
                msgs.append(payload["error"]["user_message"])
                msgs.append(payload["error"]["message"])
                msgs.append(payload["error"]["reason"])
                msg = ",".join(msgs)
            if errorCode == 401:
                raise PixivException(msg,
                                     errorCode=PixivException.NOT_LOGGED_IN,
                                     htmlPage=errorMessage)
            elif errorCode == 403:
                raise PixivException(
                    msg,
                    errorCode=PixivException.USER_ID_SUSPENDED,
                    htmlPage=errorMessage)
            else:
                raise PixivException(
                    msg,
                    errorCode=PixivException.OTHER_MEMBER_ERROR,
                    htmlPage=errorMessage)
Exemplo n.º 22
0
    def getLiveStreams(self):
        try:
            response = self.__makeRequest(self.__urlLive)
            responseCode = response.getcode()
        except urllib.error.HTTPError as error:
            responseCode = error.getcode()

        if responseCode == 200:
            try:
                xbmcaddon.Addon('inputstream.adaptive')
                inputstreamAdaptive = True
            except RuntimeError:
                inputstreamAdaptive = False

            for result in json.loads(response.read().decode('UTF-8')).get(
                    '_embedded').get('items'):
                description = result.get('description')
                programName = result.get('_embedded').get('channel').get(
                    'name')
                livestreamStart = time.strptime(
                    result.get('start')[0:19], '%Y-%m-%dT%H:%M:%S')
                livestreamEnd = time.strptime(
                    result.get('end')[0:19], '%Y-%m-%dT%H:%M:%S')
                duration = max(
                    time.mktime(livestreamEnd) -
                    max(time.mktime(livestreamStart),
                        time.mktime(time.localtime())), 1)
                contextMenuItems = []

                # already finished
                if time.mktime(livestreamEnd) < time.mktime(time.localtime()):
                    continue
                # already playing
                elif livestreamStart < time.localtime():
                    link = self.JSONStreamingURL(result.get('sources'))
                    if inputstreamAdaptive and result.get('restart'):
                        contextMenuItems.append((
                            'Restart',
                            'RunPlugin(plugin://%s/?mode=liveStreamRestart&link=%s)'
                            % (xbmcaddon.Addon().getAddonInfo('id'),
                               result.get('id'))))
                else:
                    link = sys.argv[0] + '?' + urllib.parse.urlencode(
                        {
                            'mode': 'liveStreamNotOnline',
                            'link': result.get('id')
                        })

                title = "[%s]%s %s (%s)" % (
                    programName, '[Restart]' if inputstreamAdaptive
                    and result.get('restart') else '', result.get('title'),
                    time.strftime('%H:%M', livestreamStart))

                banner = self.JSONImage(result.get('_embedded').get('image'))

                createListItem(title,
                               banner,
                               description,
                               duration,
                               time.strftime('%Y-%m-%d', livestreamStart),
                               programName,
                               link,
                               True,
                               False,
                               self.defaultbackdrop,
                               self.pluginhandle,
                               contextMenuItems=contextMenuItems)
        else:
            xbmcgui.Dialog().notification(
                self.translation(30045).encode('UTF-8'),
                self.translation(30046).encode('UTF-8'),
                xbmcaddon.Addon().getAddonInfo('icon'))