def _res_text(self, url): '''Content of a website Args: url: URL with an embedded Video Player. Returns: Content of the response ''' try: res = http.get(url, allow_redirects=True) except Exception as e: if 'Received response with content-encoding: gzip' in str(e): headers = { 'User-Agent': useragents.FIREFOX, 'Accept-Encoding': 'deflate' } res = http.get(url, headers=headers, allow_redirects=True) elif '403 Client Error' in str(e): log.error( 'Website Access Denied/Forbidden, you might be geo-blocked or other params are missing.' ) raise NoStreamsError(self.url) elif '404 Client Error' in str(e): log.error('Website was not found, the link is broken or dead.') raise NoStreamsError(self.url) else: raise e if res.history: for resp in res.history: log.debug('Redirect: {0} - {1}'.format(resp.status_code, resp.url)) log.debug('URL: {0}'.format(res.url)) return res.text
def _get_streams(self): if "empty" in self.url: return if "NoStreamsError" in self.url: raise NoStreamsError(self.url) streams = {} streams["test"] = TestStream(self.session) streams["rtmp"] = RTMPStream(self.session, dict(rtmp="rtmp://test.se")) streams["hls"] = HLSStream(self.session, "http://test.se/playlist.m3u8") streams["http"] = HTTPStream(self.session, "http://test.se/stream") streams["akamaihd"] = AkamaiHDStream(self.session, "http://test.se/stream") streams["240p"] = HTTPStream(self.session, "http://test.se/stream") streams["360p"] = HTTPStream(self.session, "http://test.se/stream") streams["1080p"] = HTTPStream(self.session, "http://test.se/stream") streams["350k"] = HTTPStream(self.session, "http://test.se/stream") streams["800k"] = HTTPStream(self.session, "http://test.se/stream") streams["1500k"] = HTTPStream(self.session, "http://test.se/stream") streams["3000k"] = HTTPStream(self.session, "http://test.se/stream") streams["480p"] = [HTTPStream(self.session, "http://test.se/stream"), RTMPStream(self.session, dict(rtmp="rtmp://test.se"))] streams.update(testplugin_support.get_streams(self.session)) return streams
def _get_api_res(self, user_id): try: res = self.session.http.get( self._channel_info_api_url_base.format(channel=user_id)) return res except Exception: raise NoStreamsError(self.url)
def _get_streams(self): if "empty" in self.url: return if "UnsortableStreamNames" in self.url: def gen(): for i in range(3): yield "vod", HTTPStream(self.session, "http://test.se/stream") return gen() if "NoStreamsError" in self.url: raise NoStreamsError(self.url) streams = {} streams["test"] = TestStream(self.session) streams["hls"] = HLSStream(self.session, "http://test.se/playlist.m3u8") streams["http"] = HTTPStream(self.session, "http://test.se/stream") streams["240p"] = HTTPStream(self.session, "http://test.se/stream") streams["360p"] = HTTPStream(self.session, "http://test.se/stream") streams["1080p"] = HTTPStream(self.session, "http://test.se/stream") streams["350k"] = HTTPStream(self.session, "http://test.se/stream") streams["800k"] = HTTPStream(self.session, "http://test.se/stream") streams["1500k"] = HTTPStream(self.session, "http://test.se/stream") streams["3000k"] = HTTPStream(self.session, "http://test.se/stream") streams["480p"] = [ HTTPStream(self.session, "http://test.se/stream"), HLSStream(self.session, "http://test.se/playlist.m3u8") ] return streams
def _get_api_res(self, api_type, api_id): try: res = http.get(self.api_url.format(type=api_type, id=api_id)) return res except Exception as e: if "404" in str(e): self.logger.error("invalid {0} - {1}".format(api_type, api_id)) elif "429" in str(e): self.logger.error("Too Many Requests, API rate limit exceeded.") raise NoStreamsError(self.url)
def _get_streams(self): user_id = self._url_re.match(self.url).group(2) res = self._get_api_res(user_id) user_gid = self.session.http.json(res, schema=self._channel_info_schema)['data']['gid'] try: stream_data = self.session.http.get(self._stream_data_api_url_base.format(gid=user_gid)) hls = self.session.http.json(stream_data, schema=self._stream_data_schema)['data']['video_src'] except Exception: raise NoStreamsError(self.url) return HLSStream.parse_variant_playlist(self.session, hls)
def _get_streams(self): user_id = self._url_re.match(self.url).group('id') try: api_response = self.session.http.get(self._api_url_base.format(id=user_id)) streams = self.session.http.json(api_response, schema=self._api_response_schema)['data']['stream'] except Exception: raise NoStreamsError(self.url) unique_stream_urls = [] for stream in streams.keys(): if streams[stream] not in unique_stream_urls: unique_stream_urls.append(streams[stream]) quality = self._stream_qualities[stream] if stream in self._stream_qualities.keys() else "720p+" yield quality, HTTPStream(self.session, streams[stream])
def _extract_streams(self, stream_id): res = self.session.http.get(STREAM_API_URL.format(stream_id), raise_for_status=False) stream_info = self.session.http.json(res, schema=_stream_schema) if stream_info.get("msg"): # error message log.error(stream_info.get("msg")) raise NoStreamsError(self.url) mapper = StreamMapper( lambda pattern, video: re.search(pattern, video[1])) mapper.map(r"/\w+\.m3u8", self._create_dynamic_streams, "HLS", HLSStream.parse_variant_playlist) mapper.map(r"/\w+\.f4m", self._create_dynamic_streams, "HDS", HDSStream.parse_manifest) mapper.map(r"^rtmp://", self._create_rtmp_stream) return mapper(stream_info.items())
def get_stream_url(self, data): """ Get the hls_url from the post request :param data: dict with "gcp" and "ogn" :return: hls_url """ try: res = http.post(self.gate_url, headers=self.headers, data=data) except Exception as e: if "403" in str(e): self.logger.error("This Video is Not Available in Your Country.") raise NoStreamsError(self.url) r_data = parse_json(res.text) hls_url = r_data.get("stream") suffix = r_data.get("suffix") if hls_url is None and suffix: hls_url = self.create_hls_url(suffix) return hls_url