def __init__(self, url): Plugin.__init__(self, url) self._hosted_chain = [] match = _url_re.match(url).groupdict() parsed = urlparse(url) self.params = parse_query(parsed.query) self.subdomain = match.get("subdomain") self.video_id = None self.video_type = None self._channel_id = None self._channel = None self.clip_name = None if self.subdomain == "player": # pop-out player if self.params.get("video"): try: self.video_type = self.params["video"][0] self.video_id = self.params["video"][1:] except IndexError: self.logger.debug("Invalid video param: {0}", self.params["video"]) self._channel = self.params.get("channel") elif self.subdomain == "clips": # clip share URL self.clip_name = match.get("channel") else: self._channel = match.get("channel") and match.get("channel").lower() self.video_type = match.get("video_type") if match.get("videos_id"): self.video_type = "v" self.video_id = match.get("video_id") or match.get("videos_id") self.clip_name = match.get("clip_name") self.api = TwitchAPI(beta=self.subdomain == "beta", version=5) self.usher = UsherService()
def _get_stream_info(self, url): match = _url_re.match(url) user = match.group("user") live_channel = match.group("liveChannel") if user: video_id = self._find_channel_video() elif live_channel: return self._find_canonical_stream_info() else: video_id = match.group("video_id") if video_id == "live_stream": query_info = dict(parse_qsl(urlparse(url).query)) if "channel" in query_info: video_id = self._get_channel_video(query_info["channel"]) if not video_id: return for el in ("detailpage", "embedded"): params = { "video_id": video_id, "el": el } res = http.get(API_VIDEO_INFO, params=params, headers=HLS_HEADERS) info_parsed = parse_query(res.text, name="config", schema=_config_schema) if info_parsed.get("status") == "fail": self.logger.debug("get_video_info - {0}: {1}".format( el, info_parsed.get("reason")) ) continue break return info_parsed
def _get_stream_info(self, video_id): # normal _params_1 = {"el": "detailpage"} # age restricted _params_2 = {"el": "embedded"} # embedded restricted _params_3 = {"eurl": "https://youtube.googleapis.com/v/{0}".format(video_id)} count = 0 info_parsed = None for _params in (_params_1, _params_2, _params_3): count += 1 params = {"video_id": video_id} params.update(_params) res = self.session.http.get(self._video_info_url, params=params) info_parsed = parse_query(res.content if is_py2 else res.text, name="config", schema=_config_schema) if info_parsed.get("status") == "fail": log.debug("get_video_info - {0}: {1}".format( count, info_parsed.get("reason")) ) continue self.author = info_parsed.get("author") self.title = info_parsed.get("title") log.debug("get_video_info - {0}: Found data".format(count)) break return info_parsed
def _get_stream_info(self, url): match = _url_re.match(url) user = match.group("user") live_channel = match.group("liveChannel") if user: video_id = self._find_channel_video() elif live_channel: return self._find_canonical_stream_info() else: video_id = match.group("video_id") if video_id == "live_stream": query_info = dict(parse_qsl(urlparse(url).query)) if "channel" in query_info: video_id = self._get_channel_video(query_info["channel"]) if not video_id: return params = { "video_id": video_id, "el": "player_embedded" } res = http.get(API_VIDEO_INFO, params=params, headers=HLS_HEADERS) return parse_query(res.text, name="config", schema=_config_schema)
def __init__(self, url): Plugin.__init__(self, url) self._hosted_chain = [] match = _url_re.match(url).groupdict() parsed = urlparse(url) self.params = parse_query(parsed.query) self.subdomain = match.get("subdomain") self.video_id = None self.video_type = None self._channel_id = None self._channel = None self.clip_name = None if self.subdomain == "player": # pop-out player if self.params.get("video"): try: self.video_type = self.params["video"][0] self.video_id = self.params["video"][1:] except IndexError: self.logger.debug("Invalid video param: {0}", self.params["video"]) self._channel = self.params.get("channel") elif self.subdomain == "clips": # clip share URL self.clip_name = match.get("channel") else: self._channel = match.get("channel") and match.get("channel").lower() self.video_type = match.get("video_type") if match.get("videos_id"): self.video_type = "v" self.video_id = match.get("video_id") or match.get("videos_id") self.clip_name = match.get("clip_name") self.api = TwitchAPI(beta=self.subdomain == "beta", version=5) self.usher = UsherService()
def _get_stream_info(self, video_id): # normal _params_1 = {"el": "detailpage"} # age restricted _params_2 = {"el": "embedded"} # embedded restricted _params_3 = { "eurl": "https://youtube.googleapis.com/v/{0}".format(video_id) } count = 0 info_parsed = None for _params in (_params_1, _params_2, _params_3): count += 1 params = {"video_id": video_id} params.update(_params) res = self.session.http.get(self._video_info_url, params=params) info_parsed = parse_query(res.text, name="config", schema=_config_schema) player_response = info_parsed.get("player_response", {}) playability_status = player_response.get("playabilityStatus", {}) if (playability_status.get("status") != "OK"): reason = playability_status.get("reason") log.debug("get_video_info - {0}: {1}".format(count, reason)) continue self.author = player_response.get("videoDetails", {}).get("author") self.title = player_response.get("videoDetails", {}).get("title") log.debug("get_video_info - {0}: Found data".format(count)) break return info_parsed
def __init__(self, url): super(Twitch, self).__init__(url) match = self._re_url.match(url).groupdict() parsed = urlparse(url) self.params = parse_query(parsed.query) self.subdomain = match.get("subdomain") self.video_id = None self._channel_id = None self._channel = None self.clip_name = None self.title = None self.author = None self.category = None if self.subdomain == "player": # pop-out player if self.params.get("video"): self.video_id = self.params["video"] self._channel = self.params.get("channel") elif self.subdomain == "clips": # clip share URL self.clip_name = match.get("channel") else: self._channel = match.get("channel") and match.get("channel").lower() self.video_id = match.get("video_id") or match.get("videos_id") self.clip_name = match.get("clip_name") self.api = TwitchAPI(session=self.session) self.usher = UsherService(session=self.session)
def _get_stream_info(self, url): match = _url_re.match(url) user = match.group("user") live_channel = match.group("liveChannel") if user: video_id = self._find_channel_video() elif live_channel: return self._find_canonical_stream_info() else: video_id = match.group("video_id") if video_id == "live_stream": query_info = dict(parse_qsl(urlparse(url).query)) if "channel" in query_info: video_id = self._get_channel_video(query_info["channel"]) if not video_id: return params = { "video_id": video_id, # CUSTOM: Remove all "el" lines but first one and uncomment it to restore # Issues when trying to download Youtube videos, looks like 'el' value is key here # https://github.com/Tyrrrz/YoutubeExplode/issues/66#issuecomment-348685419 #"el": "player_embedded" "el": "detailpage" #"el": "embedded" } res = http.get(API_VIDEO_INFO, params=params, headers=HLS_HEADERS) return parse_query(res.text, name="config", schema=_config_schema)
def __init__(self, url): Plugin.__init__(self, url) match = _url_re.match(url).groupdict() self.channel = match.get("channel").lower() self.subdomain = match.get("subdomain") self.video_type = match.get("video_type") self.video_id = match.get("video_id") parsed = urlparse(url) self.params = parse_query(parsed.query) self.api = TwitchAPI(beta=self.subdomain == "beta") self.usher = UsherService()
def __init__(self, url): Plugin.__init__(self, url) match = _url_re.match(url).groupdict() self.channel = match.get("channel").lower() self.subdomain = match.get("subdomain") self.video_type = match.get("video_type") self.video_id = match.get("video_id") parsed = urlparse(url) self.params = parse_query(parsed.query) self.api = TwitchAPI(beta=self.subdomain == "beta") self.usher = UsherService()
def _get_streams(self): match = _url_re.match(self.url) channel_name = match.group("channel") form = { "cid": channel_name, "watchTime": 0, "firstConnect": 1, "ip": "NaN" } res = http.post(API_URL, data=form, headers=HEADERS) params = parse_query(res.text, schema=_schema) if params["status"] <= 0: return if params["block_type"] != 0: if params["block_type"] == BLOCK_TYPE_VIEWING_LIMIT: msg = BLOCKED_MSG_FORMAT.format( params.get("block_time", "UNKNOWN"), params.get("reconnect_time", "UNKNOWN")) raise PluginError(msg) elif params["block_type"] == BLOCK_TYPE_NO_SLOTS: raise PluginError("No free slots available") else: raise PluginError("Blocked for unknown reasons") if "token" not in params: raise PluginError("Server seems busy, retry again later") streams = {} stream_names = ["sd"] if params["multibitrate"]: stream_names += ["hd"] for stream_name in stream_names: playpath = params["playpath"] if stream_name == "hd": playpath += "HI" stream = RTMPStream( self.session, { "rtmp": "{0}/{1}".format(params["rtmp"], playpath), "pageUrl": self.url, "swfVfy": SWF_URL, "weeb": params["token"], "live": True }) streams[stream_name] = stream return streams
def _get_streams(self): match = _url_re.match(self.url) channel_name = match.group("channel") form = { "cid": channel_name, "watchTime": 0, "firstConnect": 1, "ip": "NaN" } res = http.post(API_URL, data=form, headers=HEADERS) params = parse_query(res.text, schema=_schema) if params["status"] <= 0: return if params["block_type"] != 0: if params["block_type"] == BLOCK_TYPE_VIEWING_LIMIT: msg = BLOCKED_MSG_FORMAT.format( params.get("block_time", "UNKNOWN"), params.get("reconnect_time", "UNKNOWN") ) raise PluginError(msg) elif params["block_type"] == BLOCK_TYPE_NO_SLOTS: raise PluginError("No free slots available") else: raise PluginError("Blocked for unknown reasons") if "token" not in params: raise PluginError("Server seems busy, retry again later") streams = {} stream_names = ["sd"] if params["multibitrate"]: stream_names += ["hd"] for stream_name in stream_names: playpath = params["playpath"] if stream_name == "hd": playpath += "HI" stream = RTMPStream(self.session, { "rtmp": "{0}/{1}".format(params["rtmp"], playpath), "pageUrl": self.url, "swfVfy": SWF_URL, "weeb": params["token"], "live": True }) streams[stream_name] = stream return streams
def _get_stream_info(self, url): match = _url_re.match(url) user = match.group("user") if user: video_id = self._find_channel_video() else: video_id = match.group("video_id") if not video_id: return params = {"video_id": video_id, "el": "player_embedded"} res = http.get(API_VIDEO_INFO, params=params, headers=HLS_HEADERS) return parse_query(res.text, name="config", schema=_config_schema)
def _get_stream_info(self, url): match = _url_re.match(url) user = match.group("user") live_channel = match.group("liveChannel") if user: video_id = self._find_channel_video() elif live_channel: return self._find_canonical_stream_info() else: video_id = match.group("video_id") if video_id == "live_stream": query_info = dict(parse_qsl(urlparse(url).query)) if "channel" in query_info: video_id = self._get_channel_video(query_info["channel"]) if not video_id: return # normal _params_1 = {"el": "detailpage"} # age restricted _params_2 = {"el": "embedded"} # embedded restricted _params_3 = { "eurl": "https://youtube.googleapis.com/v/{0}".format(video_id) } count = 0 for _params in (_params_1, _params_2, _params_3): count += 1 params = {"video_id": video_id} params.update(_params) res = http.get(API_VIDEO_INFO, params=params, headers=HLS_HEADERS) info_parsed = parse_query(res.text, name="config", schema=_config_schema) if info_parsed.get("status") == "fail": self.logger.debug("get_video_info - {0}: {1}".format( count, info_parsed.get("reason"))) continue self.logger.debug("get_video_info - {0}: Found data".format(count)) break return info_parsed
def __init__(self, url): Plugin.__init__(self, url) match = _url_re.match(url).groupdict() self._channel = match.get("channel") and match.get("channel").lower() self._channel_id = None self.subdomain = match.get("subdomain") self.video_type = match.get("video_type") if match.get("videos_id"): self.video_type = "v" self.video_id = match.get("video_id") or match.get("videos_id") self.clip_name = match.get("clip_name") self._hosted_chain = [] parsed = urlparse(url) self.params = parse_query(parsed.query) self.api = TwitchAPI(beta=self.subdomain == "beta", version=5) self.usher = UsherService()
def _get_stream_info(self, url): match = _url_re.match(url) user = match.group("user") if user: video_id = self._find_channel_video() else: video_id = match.group("video_id") if not video_id: return params = { "video_id": video_id, "el": "player_embedded" } res = http.get(API_VIDEO_INFO, params=params, headers=HLS_HEADERS) return parse_query(res.text, name="config", schema=_config_schema)
def _get_stream_info(self, url): match = _url_re.match(url) user = match.group("user") live_channel = match.group("liveChannel") if user: video_id = self._find_channel_video() elif live_channel: return self._find_canonical_stream_info() else: video_id = match.group("video_id") if video_id == "live_stream": query_info = dict(parse_qsl(urlparse(url).query)) if "channel" in query_info: video_id = self._get_channel_video(query_info["channel"]) if not video_id: return # normal _params_1 = {"el": "detailpage"} # age restricted _params_2 = {"el": "embedded"} # embedded restricted _params_3 = {"eurl": "https://youtube.googleapis.com/v/{0}".format(video_id)} count = 0 for _params in (_params_1, _params_2, _params_3): count += 1 params = {"video_id": video_id} params.update(_params) res = http.get(API_VIDEO_INFO, params=params, headers=HLS_HEADERS) info_parsed = parse_query(res.text, name="config", schema=_config_schema) if info_parsed.get("status") == "fail": self.logger.debug("get_video_info - {0}: {1}".format( count, info_parsed.get("reason")) ) continue self.logger.debug("get_video_info - {0}: Found data".format(count)) break return info_parsed
def parse_stream_map(stream_map): if not stream_map: return [] return [parse_query(s) for s in stream_map.split(",")]
def parse_stream_map(stream_map): if not stream_map: return [] return [parse_query(s) for s in stream_map.split(",")]