Exemple #1
0
 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')
Exemple #2
0
 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)
Exemple #4
0
    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
Exemple #5
0
    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)
Exemple #7
0
    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