コード例 #1
0
 def test_youtube_chapters(self):
     for description, duration, expected_chapters in self._TEST_CASES:
         ie = YoutubeIE()
         expect_value(
             self,
             ie._extract_chapters_from_description(description, duration),
             expected_chapters, None)
コード例 #2
0
 def test_youtube_matching(self):
     self.assertTrue(YoutubeIE.suitable('PLtS2H6bU1M'))
     self.assertFalse(
         YoutubeIE.suitable(
             'https://www.youtube.com/watch?v=AV6J6_AeFEQ&playnext=1&list=PL4023E734DA416012'
         ))  # 668
     self.assertMatch('http://youtu.be/BaW_jenozKc', ['youtube'])
     # self.assertMatch('http://www.youtube.com/v/BaW_jenozKc', ['youtube'])  # /v/ is no longer valid
     self.assertMatch('https://youtube.googleapis.com/v/BaW_jenozKc',
                      ['youtube'])
     self.assertMatch(
         'http://www.cleanvideosearch.com/media/action/yt/watch?videoId=8v_4O44sfjM',
         ['youtube'])
コード例 #3
0
 def test_youtube_course(self):
     dl = FakeYDL()
     ie = YoutubePlaylistIE(dl)
     # TODO find a > 100 (paginating?) videos course
     result = ie.extract(
         'https://www.youtube.com/course?list=ECUl4u3cNGP61MdtwGTqZA0MreSaDybji8'
     )
     entries = list(result['entries'])
     self.assertEqual(YoutubeIE().extract_id(entries[0]['url']),
                      'j9WZyLZCBzs')
     self.assertEqual(len(entries), 25)
     self.assertEqual(YoutubeIE().extract_id(entries[-1]['url']),
                      'rYefUsYuEp0')
コード例 #4
0
 def test_youtube_extract_player_info(self):
     PLAYER_URLS = (
         ('https://www.youtube.com/s/player/64dddad9/player_ias.vflset/en_US/base.js',
          '64dddad9'),
         ('https://www.youtube.com/s/player/64dddad9/player_ias.vflset/fr_FR/base.js',
          '64dddad9'),
         ('https://www.youtube.com/s/player/64dddad9/player-plasma-ias-phone-en_US.vflset/base.js',
          '64dddad9'),
         ('https://www.youtube.com/s/player/64dddad9/player-plasma-ias-phone-de_DE.vflset/base.js',
          '64dddad9'),
         ('https://www.youtube.com/s/player/64dddad9/player-plasma-ias-tablet-en_US.vflset/base.js',
          '64dddad9'),
         # obsolete
         ('https://www.youtube.com/yts/jsbin/player_ias-vfle4-e03/en_US/base.js',
          'vfle4-e03'),
         ('https://www.youtube.com/yts/jsbin/player_ias-vfl49f_g4/en_US/base.js',
          'vfl49f_g4'),
         ('https://www.youtube.com/yts/jsbin/player_ias-vflCPQUIL/en_US/base.js',
          'vflCPQUIL'),
         ('https://www.youtube.com/yts/jsbin/player-vflzQZbt7/en_US/base.js',
          'vflzQZbt7'),
         ('https://www.youtube.com/yts/jsbin/player-en_US-vflaxXRn1/base.js',
          'vflaxXRn1'),
         ('https://s.ytimg.com/yts/jsbin/html5player-en_US-vflXGBaUN.js',
          'vflXGBaUN'),
         ('https://s.ytimg.com/yts/jsbin/html5player-en_US-vflKjOTVq/html5player.js',
          'vflKjOTVq'),
     )
     for player_url, expected_player_id in PLAYER_URLS:
         player_id = YoutubeIE._extract_player_info(player_url)
         self.assertEqual(player_id, expected_player_id)
コード例 #5
0
    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)
コード例 #6
0
 def test_youtube_extract_player_info(self):
     PLAYER_URLS = (
         ('https://www.youtube.com/s/player/64dddad9/player_ias.vflset/en_US/base.js',
          '64dddad9'),
         # obsolete
         ('https://www.youtube.com/yts/jsbin/player_ias-vfle4-e03/en_US/base.js',
          'vfle4-e03'),
         ('https://www.youtube.com/yts/jsbin/player_ias-vfl49f_g4/en_US/base.js',
          'vfl49f_g4'),
         ('https://www.youtube.com/yts/jsbin/player_ias-vflCPQUIL/en_US/base.js',
          'vflCPQUIL'),
         ('https://www.youtube.com/yts/jsbin/player-vflzQZbt7/en_US/base.js',
          'vflzQZbt7'),
         ('https://www.youtube.com/yts/jsbin/player-en_US-vflaxXRn1/base.js',
          'vflaxXRn1'),
         ('https://s.ytimg.com/yts/jsbin/html5player-en_US-vflXGBaUN.js',
          'vflXGBaUN'),
         ('https://s.ytimg.com/yts/jsbin/html5player-en_US-vflKjOTVq/html5player.js',
          'vflKjOTVq'),
         ('http://s.ytimg.com/yt/swfbin/watch_as3-vflrEm9Nq.swf',
          'vflrEm9Nq'),
         ('https://s.ytimg.com/yts/swfbin/player-vflenCdZL/watch_as3.swf',
          'vflenCdZL'),
     )
     for player_url, expected_player_id in PLAYER_URLS:
         expected_player_type = player_url.split('.')[-1]
         player_type, player_id = YoutubeIE._extract_player_info(player_url)
         self.assertEqual(player_type, expected_player_type)
         self.assertEqual(player_id, expected_player_id)
コード例 #7
0
 def test_youtube_playlist_noplaylist(self):
     dl = FakeYDL()
     dl.params['noplaylist'] = True
     ie = YoutubePlaylistIE(dl)
     result = ie.extract(
         'https://www.youtube.com/watch?v=FXxLjLQi3Fg&list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re'
     )
     self.assertEqual(result['_type'], 'url')
     self.assertEqual(YoutubeIE().extract_id(result['url']), 'FXxLjLQi3Fg')
コード例 #8
0
 def test_youtube_extract(self):
     assertExtractId = lambda url, id: self.assertEqual(
         YoutubeIE.extract_id(url), id)
     assertExtractId('http://www.youtube.com/watch?&v=BaW_jenozKc',
                     'BaW_jenozKc')
     assertExtractId('https://www.youtube.com/watch?&v=BaW_jenozKc',
                     'BaW_jenozKc')
     assertExtractId(
         'https://www.youtube.com/watch?feature=player_embedded&v=BaW_jenozKc',
         'BaW_jenozKc')
     assertExtractId('https://www.youtube.com/watch_popup?v=BaW_jenozKc',
                     'BaW_jenozKc')
     assertExtractId(
         'http://www.youtube.com/watch?v=BaW_jenozKcsharePLED17F32AD9753930',
         'BaW_jenozKc')
     assertExtractId('BaW_jenozKc', 'BaW_jenozKc')
コード例 #9
0
    def test_prefer_free_formats(self):
        # Same resolution => download webm
        ydl = YDL()
        ydl.params['prefer_free_formats'] = True
        formats = [
            {
                'ext': 'webm',
                'height': 460,
                'url': TEST_URL
            },
            {
                'ext': 'mp4',
                'height': 460,
                'url': TEST_URL
            },
        ]
        info_dict = _make_result(formats)
        yie = YoutubeIE(ydl)
        yie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(info_dict)
        downloaded = ydl.downloaded_info_dicts[0]
        self.assertEqual(downloaded['ext'], 'webm')

        # Different resolution => download best quality (mp4)
        ydl = YDL()
        ydl.params['prefer_free_formats'] = True
        formats = [
            {
                'ext': 'webm',
                'height': 720,
                'url': TEST_URL
            },
            {
                'ext': 'mp4',
                'height': 1080,
                'url': TEST_URL
            },
        ]
        info_dict['formats'] = formats
        yie = YoutubeIE(ydl)
        yie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(info_dict)
        downloaded = ydl.downloaded_info_dicts[0]
        self.assertEqual(downloaded['ext'], 'mp4')

        # No prefer_free_formats => prefer mp4 and webm
        ydl = YDL()
        ydl.params['prefer_free_formats'] = False
        formats = [
            {
                'ext': 'webm',
                'height': 720,
                'url': TEST_URL
            },
            {
                'ext': 'mp4',
                'height': 720,
                'url': TEST_URL
            },
            {
                'ext': 'flv',
                'height': 720,
                'url': TEST_URL
            },
        ]
        info_dict['formats'] = formats
        yie = YoutubeIE(ydl)
        yie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(info_dict)
        downloaded = ydl.downloaded_info_dicts[0]
        self.assertEqual(downloaded['ext'], 'mp4')

        ydl = YDL()
        ydl.params['prefer_free_formats'] = False
        formats = [
            {
                'ext': 'flv',
                'height': 720,
                'url': TEST_URL
            },
            {
                'ext': 'webm',
                'height': 720,
                'url': TEST_URL
            },
        ]
        info_dict['formats'] = formats
        yie = YoutubeIE(ydl)
        yie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(info_dict)
        downloaded = ydl.downloaded_info_dicts[0]
        self.assertEqual(downloaded['ext'], 'webm')
コード例 #10
0
    def test_youtube_format_selection(self):
        return
        # disabled for now - this needs some changes

        order = [
            '38',
            '37',
            '46',
            '22',
            '45',
            '35',
            '44',
            '18',
            '34',
            '43',
            '6',
            '5',
            '17',
            '36',
            '13',
            # Apple HTTP Live Streaming
            '96',
            '95',
            '94',
            '93',
            '92',
            '132',
            '151',
            # 3D
            '85',
            '84',
            '102',
            '83',
            '101',
            '82',
            '100',
            # Dash video
            '137',
            '248',
            '136',
            '247',
            '135',
            '246',
            '245',
            '244',
            '134',
            '243',
            '133',
            '242',
            '160',
            # Dash audio
            '141',
            '172',
            '140',
            '171',
            '139',
        ]

        def format_info(f_id):
            info = YoutubeIE._formats[f_id].copy()

            # XXX: In real cases InfoExtractor._parse_mpd_formats() fills up 'acodec'
            # and 'vcodec', while in tests such information is incomplete since
            # commit a6c2c24479e5f4827ceb06f64d855329c0a6f593
            # test_YoutubeDL.test_youtube_format_selection is broken without
            # this fix
            if 'acodec' in info and 'vcodec' not in info:
                info['vcodec'] = 'none'
            elif 'vcodec' in info and 'acodec' not in info:
                info['acodec'] = 'none'

            info['format_id'] = f_id
            info['url'] = 'url:' + f_id
            return info

        formats_order = [format_info(f_id) for f_id in order]

        info_dict = _make_result(list(formats_order), extractor='youtube')
        ydl = YDL({'format': 'bestvideo+bestaudio'})
        yie = YoutubeIE(ydl)
        yie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(info_dict)
        downloaded = ydl.downloaded_info_dicts[0]
        self.assertEqual(downloaded['format_id'], '248+172')
        self.assertEqual(downloaded['ext'], 'mp4')

        info_dict = _make_result(list(formats_order), extractor='youtube')
        ydl = YDL({'format': 'bestvideo[height>=999999]+bestaudio/best'})
        yie = YoutubeIE(ydl)
        yie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(info_dict)
        downloaded = ydl.downloaded_info_dicts[0]
        self.assertEqual(downloaded['format_id'], '38')

        info_dict = _make_result(list(formats_order), extractor='youtube')
        ydl = YDL({'format': 'bestvideo/best,bestaudio'})
        yie = YoutubeIE(ydl)
        yie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(info_dict)
        downloaded_ids = [
            info['format_id'] for info in ydl.downloaded_info_dicts
        ]
        self.assertEqual(downloaded_ids, ['137', '141'])

        info_dict = _make_result(list(formats_order), extractor='youtube')
        ydl = YDL(
            {'format': '(bestvideo[ext=mp4],bestvideo[ext=webm])+bestaudio'})
        yie = YoutubeIE(ydl)
        yie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(info_dict)
        downloaded_ids = [
            info['format_id'] for info in ydl.downloaded_info_dicts
        ]
        self.assertEqual(downloaded_ids, ['137+141', '248+141'])

        info_dict = _make_result(list(formats_order), extractor='youtube')
        ydl = YDL({
            'format':
            '(bestvideo[ext=mp4],bestvideo[ext=webm])[height<=720]+bestaudio'
        })
        yie = YoutubeIE(ydl)
        yie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(info_dict)
        downloaded_ids = [
            info['format_id'] for info in ydl.downloaded_info_dicts
        ]
        self.assertEqual(downloaded_ids, ['136+141', '247+141'])

        info_dict = _make_result(list(formats_order), extractor='youtube')
        ydl = YDL(
            {'format': '(bestvideo[ext=none]/bestvideo[ext=webm])+bestaudio'})
        yie = YoutubeIE(ydl)
        yie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(info_dict)
        downloaded_ids = [
            info['format_id'] for info in ydl.downloaded_info_dicts
        ]
        self.assertEqual(downloaded_ids, ['248+141'])

        for f1, f2 in zip(formats_order, formats_order[1:]):
            info_dict = _make_result([f1, f2], extractor='youtube')
            ydl = YDL({'format': 'best/bestvideo'})
            yie = YoutubeIE(ydl)
            yie._sort_formats(info_dict['formats'])
            ydl.process_ie_result(info_dict)
            downloaded = ydl.downloaded_info_dicts[0]
            self.assertEqual(downloaded['format_id'], f1['format_id'])

            info_dict = _make_result([f2, f1], extractor='youtube')
            ydl = YDL({'format': 'best/bestvideo'})
            yie = YoutubeIE(ydl)
            yie._sort_formats(info_dict['formats'])
            ydl.process_ie_result(info_dict)
            downloaded = ydl.downloaded_info_dicts[0]
            self.assertEqual(downloaded['format_id'], f1['format_id'])
コード例 #11
0
    def test_format_selection_audio_exts(self):
        formats = [
            {
                'format_id': 'mp3-64',
                'ext': 'mp3',
                'abr': 64,
                'url': 'http://_',
                'vcodec': 'none'
            },
            {
                'format_id': 'ogg-64',
                'ext': 'ogg',
                'abr': 64,
                'url': 'http://_',
                'vcodec': 'none'
            },
            {
                'format_id': 'aac-64',
                'ext': 'aac',
                'abr': 64,
                'url': 'http://_',
                'vcodec': 'none'
            },
            {
                'format_id': 'mp3-32',
                'ext': 'mp3',
                'abr': 32,
                'url': 'http://_',
                'vcodec': 'none'
            },
            {
                'format_id': 'aac-32',
                'ext': 'aac',
                'abr': 32,
                'url': 'http://_',
                'vcodec': 'none'
            },
        ]

        info_dict = _make_result(formats)
        ydl = YDL({'format': 'best'})
        ie = YoutubeIE(ydl)
        ie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(copy.deepcopy(info_dict))
        downloaded = ydl.downloaded_info_dicts[0]
        self.assertEqual(downloaded['format_id'], 'aac-64')

        ydl = YDL({'format': 'mp3'})
        ie = YoutubeIE(ydl)
        ie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(copy.deepcopy(info_dict))
        downloaded = ydl.downloaded_info_dicts[0]
        self.assertEqual(downloaded['format_id'], 'mp3-64')

        ydl = YDL({'prefer_free_formats': True})
        ie = YoutubeIE(ydl)
        ie._sort_formats(info_dict['formats'])
        ydl.process_ie_result(copy.deepcopy(info_dict))
        downloaded = ydl.downloaded_info_dicts[0]
        self.assertEqual(downloaded['format_id'], 'ogg-64')