def _find_video_id(self, url): m = _url_re.match(url) if m.group("video_id"): log.debug("Video ID from URL") return m.group("video_id") res = self.session.http.get(url) datam = _ytdata_re.search(res.text) if datam: data = parse_json(datam.group(1)) # find the videoRenderer object, where there is a LVE NOW badge for vid_ep in search_dict(data, 'currentVideoEndpoint'): video_id = vid_ep.get("watchEndpoint", {}).get("videoId") if video_id: log.debug("Video ID from currentVideoEndpoint") return video_id for x in search_dict(data, 'videoRenderer'): for bstyle in search_dict(x.get("badges", {}), "style"): if bstyle == "BADGE_STYLE_TYPE_LIVE_NOW": if x.get("videoId"): log.debug("Video ID from videoRenderer (live)") return x["videoId"] raise PluginError("Could not find a video on this page")
def _find_video_id(self, url): m = _url_re.match(url) if m.group("video_id"): log.debug("Video ID from URL") return m.group("video_id") res = self.session.http.get(url) datam = _ytdata_re.search(res.text) if datam: data = parse_json(datam.group(1)) # find the videoRenderer object, where there is a LVE NOW badge for vid_ep in search_dict(data, 'currentVideoEndpoint'): video_id = vid_ep.get("watchEndpoint", {}).get("videoId") if video_id: log.debug("Video ID from currentVideoEndpoint") return video_id for x in search_dict(data, 'videoRenderer'): for bstyle in search_dict(x.get("badges", {}), "style"): if bstyle == "BADGE_STYLE_TYPE_LIVE_NOW": if x.get("videoId"): log.debug("Video ID from videoRenderer (live)") return x["videoId"] if "/embed/live_stream" in url: for link in itertags(res.text, "link"): if link.attributes.get("rel") == "canonical": canon_link = link.attributes.get("href") if canon_link != url: log.debug("Re-directing to canonical URL: {0}".format(canon_link)) return self._find_video_id(canon_link) raise PluginError("Could not find a video on this page")
def _find_video_id(self, url): m = _url_re.match(url) video_id = m.group("video_id") or m.group("video_id_short") if video_id: log.debug("Video ID from URL") return video_id res = self.session.http.get(url) if urlparse(res.url).netloc == "consent.youtube.com": c_data = {} for _i in itertags(res.text, "input"): if _i.attributes.get("type") == "hidden": c_data[_i.attributes.get("name")] = _i.attributes.get( "value") log.debug(f"c_data_keys: {', '.join(c_data.keys())}") res = self.session.http.post("https://consent.youtube.com/s", data=c_data) datam = _ytdata_re.search(res.text) if datam: data = parse_json(datam.group(1)) # find the videoRenderer object, where there is a LVE NOW badge for vid_ep in search_dict(data, 'currentVideoEndpoint'): video_id = vid_ep.get("watchEndpoint", {}).get("videoId") if video_id: log.debug("Video ID from currentVideoEndpoint") return video_id for x in search_dict(data, 'videoRenderer'): if x.get("viewCountText", {}).get("runs"): if x.get("videoId"): log.debug("Video ID from videoRenderer (live)") return x["videoId"] for bstyle in search_dict(x.get("badges", {}), "style"): if bstyle == "BADGE_STYLE_TYPE_LIVE_NOW": if x.get("videoId"): log.debug("Video ID from videoRenderer (live)") return x["videoId"] if urlparse(url).path.endswith(("/embed/live_stream", "/live")): for link in itertags(res.text, "link"): if link.attributes.get("rel") == "canonical": canon_link = link.attributes.get("href") if canon_link != url: if canon_link.endswith("v=live_stream"): log.debug("The video is not available") break else: log.debug( "Re-directing to canonical URL: {0}".format( canon_link)) return self._find_video_id(canon_link) raise PluginError("Could not find a video on this page")
def test_search_dict(self): self.assertSequenceEqual( list(search_dict(["one", "two"], "one")), [] ) self.assertSequenceEqual( list(search_dict({"two": "test2"}, "one")), [] ) self.assertSequenceEqual( list(search_dict({"one": "test1", "two": "test2"}, "one")), ["test1"] ) self.assertSequenceEqual( list(search_dict({"one": {"inner": "test1"}, "two": "test2"}, "inner")), ["test1"] ) self.assertSequenceEqual( list(search_dict({"one": [{"inner": "test1"}], "two": "test2"}, "inner")), ["test1"] ) self.assertSequenceEqual( list(sorted(search_dict({"one": [{"inner": "test1"}], "two": {"inner": "test2"}}, "inner"))), list(sorted(["test1", "test2"])) )
def test_search_dict(self): self.assertSequenceEqual( list(search_dict(["one", "two"], "one")), [] ) self.assertSequenceEqual( list(search_dict({"two": "test2"}, "one")), [] ) self.assertSequenceEqual( list(search_dict({"one": "test1", "two": "test2"}, "one")), ["test1"] ) self.assertSequenceEqual( list(search_dict({"one": {"inner": "test1"}, "two": "test2"}, "inner")), ["test1"] ) self.assertSequenceEqual( list(search_dict({"one": [{"inner": "test1"}], "two": "test2"}, "inner")), ["test1"] ) self.assertSequenceEqual( list(sorted(search_dict({"one": [{"inner": "test1"}], "two": {"inner": "test2"}}, "inner"))), list(sorted(["test1", "test2"])) )
def _find_channel_video(self): res = http.get(self.url) datam = _ytdata_re.search(res.text) if datam: data = parse_json(datam.group(1)) # find the videoRenderer object, where there is a LVE NOW badge for x in search_dict(data, 'videoRenderer'): for bstyle in search_dict(x.get("badges", {}), "style"): if bstyle == "BADGE_STYLE_TYPE_LIVE_NOW": if x.get("videoId"): self.logger.debug("Found channel video ID via HTML: {0}", x["videoId"]) return x["videoId"] else: # fall back on API self.logger.debug("No channel data, falling back to API") match = _channelid_re.search(res.text) if not match: return channel_id = match.group(1) self.logger.debug("Found channel_id: {0}".format(channel_id)) return self._get_channel_video(channel_id)
def _get_streams(self): data = self.session.http.get(self.url, schema=self._data_schema) if data: for streaming_info in search_dict(data, "streamingInfo"): video_assets = streaming_info.get("videoAssets") if video_assets.get("hls"): log.debug("Found HLS stream: {}".format( video_assets.get("hls"))) for s in HLSStream.parse_variant_playlist( self.session, video_assets.get("hls")).items(): yield s if video_assets.get("mpeg"): for mpeg_stream in video_assets.get("mpeg"): q = mpeg_stream.get("renditionValue").strip( "_") or "{}k".format( mpeg_stream.get("bitrate") // 1000) or "vod" yield q, HTTPStream(self.session, mpeg_stream["url"])
def _data_video_id(data): if data: for videoRenderer in search_dict(data, "videoRenderer"): videoId = videoRenderer.get("videoId") if videoId is not None: return videoId