From f6f87723690687a4eee70269a979e8024a2ea13c Mon Sep 17 00:00:00 2001 From: mk-pmb Date: Tue, 15 Mar 2022 02:10:25 +0100 Subject: [PATCH] Add tests for format selector criteria longside/shortside --- .../criteria_longside_shortside.py | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 test/formatselection/criteria_longside_shortside.py diff --git a/test/formatselection/criteria_longside_shortside.py b/test/formatselection/criteria_longside_shortside.py new file mode 100644 index 000000000..a9e30362f --- /dev/null +++ b/test/formatselection/criteria_longside_shortside.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +# coding: utf-8 + +from __future__ import unicode_literals + +# Allow direct execution +if __name__ == '__main__': + import os + import sys + repo_dir = os.path.abspath(os.path.join(__file__, '../' * 3)) + sys.path.insert(0, repo_dir) + +import unittest + +from youtube_dl.extractor import YoutubeIE +from test.test_YoutubeDL import YDL, TEST_URL, _make_result + + +default_common_video_properties = { + 'url': TEST_URL, +} + + +def prepare_formats_info_dict(sizes, common={}): + """Convert sizes (id, width, height) to info_dict.""" + formats = [{ + 'format_id': id, + 'width': w, + 'height': h, + **default_common_video_properties, + **common, + } for (id, w, h) in sizes] + info_dict = _make_result(formats) + return info_dict + + +def pick_format_ids(sizes, criteria): + """Check which size(s) match the criteria. Return their IDs.""" + ydl = YDL({'format': criteria}) + yie = YoutubeIE(ydl) + info_dict = prepare_formats_info_dict(sizes) + yie._sort_formats(info_dict['formats']) + ydl.process_ie_result(info_dict.copy()) + # ^-- :TODO: Do we need this .copy()? + picked_ids = [info['format_id'] for info in ydl.downloaded_info_dicts] + return picked_ids + + +class TestFormatSelection(unittest.TestCase): + """Tests class for longside/shortside format selector.""" + + def test_fmtsel_criteria_longside_shortside(self): + """Find largest video within upper limits.""" + # Feature request: https://github.com/ytdl-org/youtube-dl/issues/30737 + + crit = {'tendency': '', 'short': '', 'long': ''} + + def verify_fmtsel(sizes, want): + crit_all = crit['tendency'] + crit['short'] + crit['long'] + picked_ids = pick_format_ids(sizes, crit_all) + self.assertEqual(','.join(picked_ids), want) + + sizes_h = [ + ('A', 256, 144,), + ('B', 426, 240,), + ('C', 640, 360,), + ('D', 854, 480,), + ] + sizes_v = [(id, h, w) for (id, w, h) in sizes_h] + self.assertEqual(sizes_v, [ + # This list is non-authoritative, merely for readers' reference. + ('A', 144, 256,), + ('B', 240, 426,), + ('C', 360, 640,), + ('D', 480, 854,), + ]) + + # def size_by_id(sizes, id): + # return next((s for s in sizes if s[0] == id)) + + def verify_all_shapes_same(expected_id): + verify_fmtsel(sizes_h, expected_id) + verify_fmtsel(sizes_v, expected_id) + + # First, test with no criteria (still empty from initialization above): + # test_fmtsel(sizes_h, 'D') + # :TODO: ^-- "requested format not available", why not D? + + crit['tendency'] = 'best' + verify_all_shapes_same('D') + + crit['long'] = '[longside<=720]' + verify_all_shapes_same('C') + + crit['long'] = '[longside<=420]' + verify_all_shapes_same('A') + + def shortside_group_1(long, best): + crit['long'] = long + crit['short'] = '[shortside<=720]' + verify_all_shapes_same(best) + + crit['short'] = '[shortside<=420]' + verify_all_shapes_same('C') + + crit['short'] = '[shortside<=360]' + verify_all_shapes_same('C') + + crit['short'] = '[shortside<360]' + verify_all_shapes_same('B') + + shortside_group_1(long='', best='D') + shortside_group_1(long='[longside<=720]', best='C') + + +if __name__ == '__main__': + unittest.main()