From 5122028a4bcac4ae577ef7fbd55ccad5cb34ef5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs?= Date: Mon, 18 Oct 2021 15:24:21 -0500 Subject: update from upstream --- test/test_YoutubeDL.py | 401 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 273 insertions(+), 128 deletions(-) (limited to 'test/test_YoutubeDL.py') diff --git a/test/test_YoutubeDL.py b/test/test_YoutubeDL.py index e48befd..c9dd498 100644 --- a/test/test_YoutubeDL.py +++ b/test/test_YoutubeDL.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # coding: utf-8 from __future__ import unicode_literals @@ -10,14 +10,15 @@ import unittest sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import copy +import json from test.helper import FakeYDL, assertRegexpMatches from hypervideo_dl import YoutubeDL -from hypervideo_dl.compat import compat_str, compat_urllib_error +from hypervideo_dl.compat import compat_os_name, compat_setenv, compat_str, compat_urllib_error from hypervideo_dl.extractor import YoutubeIE from hypervideo_dl.extractor.common import InfoExtractor from hypervideo_dl.postprocessor.common import PostProcessor -from hypervideo_dl.utils import ExtractorError, match_filter_func +from hypervideo_dl.utils import ExtractorError, int_or_none, match_filter_func, LazyList TEST_URL = 'http://localhost/sample.mp4' @@ -29,11 +30,15 @@ class YDL(FakeYDL): self.msgs = [] def process_info(self, info_dict): + info_dict.pop('__original_infodict', None) self.downloaded_info_dicts.append(info_dict) def to_screen(self, msg): self.msgs.append(msg) + def dl(self, *args, **kwargs): + assert False, 'Downloader must not be invoked for test_YoutubeDL' + def _make_result(formats, **kwargs): res = { @@ -42,6 +47,7 @@ def _make_result(formats, **kwargs): 'title': 'testttitle', 'extractor': 'testex', 'extractor_key': 'TestEx', + 'webpage_url': 'http://example.com/watch?v=shenanigans', } res.update(**kwargs) return res @@ -77,7 +83,7 @@ class TestFormatSelection(unittest.TestCase): downloaded = ydl.downloaded_info_dicts[0] self.assertEqual(downloaded['ext'], 'mp4') - # No prefer_free_formats => prefer mp4 and flv for greater compatibility + # No prefer_free_formats => prefer mp4 and webm ydl = YDL() ydl.params['prefer_free_formats'] = False formats = [ @@ -103,7 +109,7 @@ class TestFormatSelection(unittest.TestCase): yie._sort_formats(info_dict['formats']) ydl.process_ie_result(info_dict) downloaded = ydl.downloaded_info_dicts[0] - self.assertEqual(downloaded['ext'], 'flv') + self.assertEqual(downloaded['ext'], 'webm') def test_format_selection(self): formats = [ @@ -115,35 +121,24 @@ class TestFormatSelection(unittest.TestCase): ] info_dict = _make_result(formats) - ydl = YDL({'format': '20/47'}) - ydl.process_ie_result(info_dict.copy()) - downloaded = ydl.downloaded_info_dicts[0] - self.assertEqual(downloaded['format_id'], '47') - - ydl = YDL({'format': '20/71/worst'}) - ydl.process_ie_result(info_dict.copy()) - downloaded = ydl.downloaded_info_dicts[0] - self.assertEqual(downloaded['format_id'], '35') - - ydl = YDL() - ydl.process_ie_result(info_dict.copy()) - downloaded = ydl.downloaded_info_dicts[0] - self.assertEqual(downloaded['format_id'], '2') - - ydl = YDL({'format': 'webm/mp4'}) - ydl.process_ie_result(info_dict.copy()) - downloaded = ydl.downloaded_info_dicts[0] - self.assertEqual(downloaded['format_id'], '47') - - ydl = YDL({'format': '3gp/40/mp4'}) - ydl.process_ie_result(info_dict.copy()) - downloaded = ydl.downloaded_info_dicts[0] - self.assertEqual(downloaded['format_id'], '35') - - ydl = YDL({'format': 'example-with-dashes'}) - ydl.process_ie_result(info_dict.copy()) - downloaded = ydl.downloaded_info_dicts[0] - self.assertEqual(downloaded['format_id'], 'example-with-dashes') + def test(inp, *expected, multi=False): + ydl = YDL({ + 'format': inp, + 'allow_multiple_video_streams': multi, + 'allow_multiple_audio_streams': multi, + }) + ydl.process_ie_result(info_dict.copy()) + downloaded = map(lambda x: x['format_id'], ydl.downloaded_info_dicts) + self.assertEqual(list(downloaded), list(expected)) + + test('20/47', '47') + test('20/71/worst', '35') + test(None, '2') + test('webm/mp4', '47') + test('3gp/40/mp4', '35') + test('example-with-dashes', 'example-with-dashes') + test('all', '35', 'example-with-dashes', '45', '47', '2') # Order doesn't actually matter for this + test('mergeall', '2+47+45+example-with-dashes+35', multi=True) def test_format_selection_audio(self): formats = [ @@ -310,6 +305,9 @@ class TestFormatSelection(unittest.TestCase): self.assertRaises(ExtractorError, ydl.process_ie_result, info_dict.copy()) def test_youtube_format_selection(self): + # FIXME: Rewrite in accordance with the new format sorting options + return + order = [ '38', '37', '46', '22', '45', '35', '44', '18', '34', '43', '6', '5', '17', '36', '13', # Apple HTTP Live Streaming @@ -347,7 +345,7 @@ class TestFormatSelection(unittest.TestCase): yie._sort_formats(info_dict['formats']) ydl.process_ie_result(info_dict) downloaded = ydl.downloaded_info_dicts[0] - self.assertEqual(downloaded['format_id'], '137+141') + self.assertEqual(downloaded['format_id'], '248+172') self.assertEqual(downloaded['ext'], 'mp4') info_dict = _make_result(list(formats_order), extractor='youtube') @@ -456,15 +454,13 @@ class TestFormatSelection(unittest.TestCase): def test_invalid_format_specs(self): def assert_syntax_error(format_spec): - ydl = YDL({'format': format_spec}) - info_dict = _make_result([{'format_id': 'foo', 'url': TEST_URL}]) - self.assertRaises(SyntaxError, ydl.process_ie_result, info_dict) + self.assertRaises(SyntaxError, YDL, {'format': format_spec}) assert_syntax_error('bestvideo,,best') assert_syntax_error('+bestaudio') assert_syntax_error('bestvideo+') assert_syntax_error('/') - assert_syntax_error('bestvideo+bestvideo+bestaudio') + assert_syntax_error('[720%H-%M-%S)s', '11-43-20') + test('%(title|%)s %(title|%%)s', '% %%') + test('%(id+1-height+3)05d', '00158') + test('%(width+100)05d', 'NA') + test('%(formats.0) 15s', ('% 15s' % FORMATS[0], '% 15s' % sanitize(str(FORMATS[0])))) + test('%(formats.0)r', (repr(FORMATS[0]), sanitize(repr(FORMATS[0])))) + test('%(height.0)03d', '001') + test('%(-height.0)04d', '-001') + test('%(formats.-1.id)s', FORMATS[-1]['id']) + test('%(formats.0.id.-1)d', FORMATS[0]['id'][-1]) + test('%(formats.3)s', 'NA') + test('%(formats.:2:-1)r', repr(FORMATS[:2:-1])) + test('%(formats.0.id.-1+id)f', '1235.000000') + test('%(formats.0.id.-1+formats.1.id.-1)d', '3') + + # Alternates + test('%(title,id)s', '1234') + test('%(width-100,height+20|def)d', '1100') + test('%(width-100,height+width|def)s', 'def') + test('%(timestamp-x>%H\\,%M\\,%S,timestamp>%H\\,%M\\,%S)s', '12,00,00') + + # Laziness + def gen(): + yield from range(5) + raise self.assertTrue(False, 'LazyList should not be evaluated till here') + test('%(key.4)s', '4', info={'key': LazyList(gen())}) + + # Empty filename + test('%(foo|)s-%(bar|)s.%(ext)s', '-.mp4') + # test('%(foo|)s.%(ext)s', ('.mp4', '_.mp4')) # fixme + # test('%(foo|)s', ('', '_')) # fixme + + # Environment variable expansion for prepare_filename + compat_setenv('__hypervideo_dl_var', 'expanded') + envvar = '%__hypervideo_dl_var%' if compat_os_name == 'nt' else '$__hypervideo_dl_var' + test(envvar, (envvar, 'expanded')) + if compat_os_name == 'nt': + test('%s%', ('%s%', '%s%')) + compat_setenv('s', 'expanded') + test('%s%', ('%s%', 'expanded')) # %s% should be expanded before escaping %s + compat_setenv('(test)s', 'expanded') + test('%(test)s%', ('NA%', 'expanded')) # Environment should take priority over template + + # Path expansion and escaping + test('Hello %(title1)s', 'Hello $PATH') + test('Hello %(title2)s', 'Hello %PATH%') + test('%(title3)s', ('foo/bar\\test', 'foo_bar_test')) + test('folder/%(title3)s', ('folder/foo/bar\\test', 'folder%sfoo_bar_test' % os.path.sep)) def test_format_note(self): ydl = YoutubeDL() @@ -722,7 +887,7 @@ class TestYoutubeDL(unittest.TestCase): def process_info(self, info_dict): super(YDL, self).process_info(info_dict) - def _match_entry(self, info_dict, incomplete): + def _match_entry(self, info_dict, incomplete=False): res = super(FilterYDL, self)._match_entry(info_dict, incomplete) if res is None: self.downloaded_info_dicts.append(info_dict) @@ -738,6 +903,7 @@ class TestYoutubeDL(unittest.TestCase): 'playlist_id': '42', 'uploader': "變態妍字幕版 太妍 тест", 'creator': "тест ' 123 ' тест--", + 'webpage_url': 'http://example.com/watch?v=shenanigans', } second = { 'id': '2', @@ -749,6 +915,7 @@ class TestYoutubeDL(unittest.TestCase): 'filesize': 5 * 1024, 'playlist_id': '43', 'uploader': "тест 123", + 'webpage_url': 'http://example.com/watch?v=SHENANIGANS', } videos = [first, second] @@ -831,54 +998,32 @@ class TestYoutubeDL(unittest.TestCase): 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]) + def test_selection(params, expected_ids): + results = [ + (v['playlist_autonumber'] - 1, (int(v['id']), v['playlist_index'])) + for v in get_downloaded_info_dicts(params)] + self.assertEqual(results, list(enumerate(zip(expected_ids, expected_ids)))) + + test_selection({}, [1, 2, 3, 4]) + test_selection({'playlistend': 10}, [1, 2, 3, 4]) + test_selection({'playlistend': 2}, [1, 2]) + test_selection({'playliststart': 10}, []) + test_selection({'playliststart': 2}, [2, 3, 4]) + test_selection({'playlist_items': '2-4'}, [2, 3, 4]) + test_selection({'playlist_items': '2,4'}, [2, 4]) + test_selection({'playlist_items': '10'}, []) + test_selection({'playlist_items': '0'}, []) # 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) - # @} + test_selection({'playlist_items': '2-4,3-4,3'}, [2, 3, 4]) + test_selection({'playlist_items': '4,2'}, [4, 2]) + + # Tests for https://github.com/hypervideo/hypervideo/issues/720 + # https://github.com/hypervideo/hypervideo/issues/302 + test_selection({'playlistreverse': True}, [4, 3, 2, 1]) + test_selection({'playliststart': 2, 'playlistreverse': True}, [4, 3, 2]) + test_selection({'playlist_items': '2,4', 'playlistreverse': True}, [4, 2]) + test_selection({'playlist_items': '4,2'}, [4, 2]) def test_urlopen_no_file_protocol(self): # see https://github.com/ytdl-org/youtube-dl/issues/8227 -- cgit v1.2.3