def do_GET(self): path = compat_urlparse.urlparse(self.path) paramDict = dict([(key, value[0]) for key, value in compat_urlparse.parse_qs(path.query).items()]) action, _, path = path.path.strip('/').partition('/') if path: path = path.split('/') if action in self.actionDict: try: builder = self.actionDict[action](path=path, handler=self, **paramDict) builder.start() try: builder.build() finally: builder.close() except BuildError as e: self.send_response(e.code) msg = compat_str(e).encode('UTF-8') self.send_header('Content-Type', 'text/plain; charset=UTF-8') self.send_header('Content-Length', len(msg)) self.end_headers() self.wfile.write(msg) else: self.send_response(500, 'Unknown build method "%s"' % action) else: self.send_response(500, 'Malformed URL')
def _entries(self): for n in range(3): video_id = compat_str(n) yield { '_type': 'url_transparent', 'ie_key': VideoIE.ie_key(), 'id': video_id, 'url': 'video:%s' % video_id, 'title': 'Video Transparent %s' % video_id, }
def test_func(self): basename = 'player-%s.js' % test_id fn = os.path.join(self.TESTDATA_DIR, basename) if not os.path.exists(fn): compat_urlretrieve(url, fn) ydl = FakeYDL() ie = YoutubeIE(ydl) with io.open(fn, encoding='utf-8') as testf: jscode = testf.read() func = ie._parse_sig_js(jscode) src_sig = (compat_str(string.printable[:sig_input]) if isinstance( sig_input, int) else sig_input) got_sig = func(src_sig) self.assertEqual(got_sig, expected_sig)
def _set_auth_basic(self): header = {} username, password = self._get_login_info() if username is None: return header if isinstance(username, str): username = username.encode("latin1") if isinstance(password, str): password = password.encode("latin1") authstr = "Basic " + compat_str( b64encode(b":".join((username, password))).decode("utf-8")) header["Authorization"] = authstr return header
def test_playlist_items_selection(self): entries = [{ 'id': compat_str(i), 'title': compat_str(i), 'url': TEST_URL, } for i in range(1, 5)] playlist = { '_type': 'playlist', 'id': 'test', 'entries': entries, 'extractor': 'test:playlist', 'extractor_key': 'test:playlist', 'webpage_url': 'http://example.com', } def get_downloaded_info_dicts(params): ydl = YDL(params) # make a deep copy because the dictionary and nested entries # can be modified ydl.process_ie_result(copy.deepcopy(playlist)) return ydl.downloaded_info_dicts def get_ids(params): return [int(v['id']) for v in get_downloaded_info_dicts(params)] result = get_ids({}) self.assertEqual(result, [1, 2, 3, 4]) result = get_ids({'playlistend': 10}) self.assertEqual(result, [1, 2, 3, 4]) result = get_ids({'playlistend': 2}) self.assertEqual(result, [1, 2]) result = get_ids({'playliststart': 10}) self.assertEqual(result, []) result = get_ids({'playliststart': 2}) self.assertEqual(result, [2, 3, 4]) result = get_ids({'playlist_items': '2-4'}) self.assertEqual(result, [2, 3, 4]) result = get_ids({'playlist_items': '2,4'}) self.assertEqual(result, [2, 4]) result = get_ids({'playlist_items': '10'}) self.assertEqual(result, []) result = get_ids({'playlist_items': '3-10'}) self.assertEqual(result, [3, 4]) result = get_ids({'playlist_items': '2-4,3-4,3'}) self.assertEqual(result, [2, 3, 4]) # Tests for https://github.com/ytdl-org/youtube-dl/issues/10591 # @{ result = get_downloaded_info_dicts({'playlist_items': '2-4,3-4,3'}) self.assertEqual(result[0]['playlist_index'], 2) self.assertEqual(result[1]['playlist_index'], 3) result = get_downloaded_info_dicts({'playlist_items': '2-4,3-4,3'}) self.assertEqual(result[0]['playlist_index'], 2) self.assertEqual(result[1]['playlist_index'], 3) self.assertEqual(result[2]['playlist_index'], 4) result = get_downloaded_info_dicts({'playlist_items': '4,2'}) self.assertEqual(result[0]['playlist_index'], 4) self.assertEqual(result[1]['playlist_index'], 2)
def signature(jscode, sig_input): func = YoutubeIE(FakeYDL())._parse_sig_js(jscode) src_sig = (compat_str(string.printable[:sig_input]) if isinstance( sig_input, int) else sig_input) return func(src_sig)
def _real_extract(self, url): playlist_id = None video_id = self._match_id(url) json_url = API_BASE_URL + "publicacion/?format=json&slug_url_raw=%s" % video_id video = self._download_json(json_url, video_id, "Downloading video JSON") info = self._extract_video(video, video_id) if (info["playlist_channel"] and self.playlist_id is None and self._match_playlist_id(url) is None): playlist_id = info["playlist_channel"].get("id") self.playlist_id = playlist_id # Download Playlist (--yes-playlist) in first place if (self.playlist_id is None and self._match_playlist_id(url) and not self._downloader.params.get("noplaylist")): playlist_id = compat_str(self._match_playlist_id(url)) self.playlist_id = playlist_id self.to_screen( "Downloading playlist %s - add --no-playlist to just download video" % playlist_id) return self.url_result( ROOT_BASE_URL + "medias/" + video_id + "?" + "playlist=" + playlist_id, PictaUserPlaylistIE.ie_key(), playlist_id, ) elif playlist_id and not self._downloader.params.get("noplaylist"): playlist_id = compat_str(playlist_id) self.to_screen( "Downloading playlist %s - add --no-playlist to just download video" % playlist_id) return self.url_result( ROOT_BASE_URL + "medias/" + video_id + "?" + "playlist=" + playlist_id, PictaChannelPlaylistIE.ie_key(), playlist_id, ) elif self._downloader.params.get("noplaylist"): self.to_screen( "Downloading just video %s because of --no-playlist" % video_id) formats = [] # M3U8|MPD manifest manifest_url = info.get("manifest_url") src_ext = determine_ext(manifest_url) if src_ext.startswith("m3u"): formats.extend( self._extract_m3u8_formats(manifest_url, video_id, "mp4", m3u8_id="hls")) elif src_ext == "mpd": formats.extend( self._extract_mpd_formats(manifest_url, video_id, mpd_id="dash")) if not formats: raise ExtractorError("Cannot find video formats") self._sort_formats(formats) info["formats"] = formats # subtitles video_subtitles = self.extract_subtitles(info) info["subtitles"] = video_subtitles return info