diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/test_formatter.py | 16 | ||||
| -rw-r--r-- | test/test_job.py | 10 | ||||
| -rw-r--r-- | test/test_util.py | 14 | ||||
| -rw-r--r-- | test/test_ytdl.py | 274 |
4 files changed, 308 insertions, 6 deletions
diff --git a/test/test_formatter.py b/test/test_formatter.py index 4cce8a3..efb6963 100644 --- a/test/test_formatter.py +++ b/test/test_formatter.py @@ -208,6 +208,22 @@ class TestFormatter(unittest.TestCase): self.assertRegex(out1, r"^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d(\.\d+)?$") self.assertNotEqual(out1, out2) + def test_literals(self): + value = "foo" + + self._run_test("{'foo'}" , value) + self._run_test("{'foo'!u}" , value.upper()) + self._run_test("{'f00':R0/o/}" , value) + self._run_test("{'foobar'[:3]}", value) + self._run_test("{z|'foo'}" , value) + self._run_test("{z|''|'foo'}" , value) + + self._run_test("{_lit[foo]}" , value) + self._run_test("{_lit[foo]!u}" , value.upper()) + self._run_test("{_lit[f00]:R0/o/}" , value) + self._run_test("{_lit[foobar][:3]}", value) + self._run_test("{z|_lit[foo]}" , value) + def test_template(self): with tempfile.TemporaryDirectory() as tmpdirname: path1 = os.path.join(tmpdirname, "tpl1") diff --git a/test/test_job.py b/test/test_job.py index 0276555..fec6997 100644 --- a/test/test_job.py +++ b/test/test_job.py @@ -149,10 +149,13 @@ class TestInfoJob(TestJob): self.assertEqual(self._capture_stdout(extr), """\ Category / Subcategory "test_category" / "test_subcategory" + Filename format (default): "test_{filename}.{extension}" + Directory format (default): ["{category}"] + """) def test_custom(self): @@ -165,18 +168,22 @@ Directory format (default): self.assertEqual(self._capture_stdout(extr), """\ Category / Subcategory "test_category" / "test_subcategory" + Filename format (custom): "custom" Filename format (default): "test_{filename}.{extension}" + Directory format (custom): ["custom"] Directory format (default): ["{category}"] + Request interval (custom): 321 Request interval (default): 123.456 + """) def test_base_category(self): @@ -186,10 +193,13 @@ Request interval (default): self.assertEqual(self._capture_stdout(extr), """\ Category / Subcategory / Basecategory "test_category" / "test_subcategory" / "test_basecategory" + Filename format (default): "test_{filename}.{extension}" + Directory format (default): ["{category}"] + """) diff --git a/test/test_util.py b/test/test_util.py index c269c9e..7ab1175 100644 --- a/test/test_util.py +++ b/test/test_util.py @@ -168,11 +168,12 @@ class TestISO639_1(unittest.TestCase): class TestCookiesTxt(unittest.TestCase): - def test_load_cookiestxt(self): + def test_cookiestxt_load(self): def _assert(content, expected): - cookies = util.load_cookiestxt(io.StringIO(content, None)) - for c, e in zip(cookies, expected): + jar = http.cookiejar.CookieJar() + util.cookiestxt_load(io.StringIO(content, None), jar) + for c, e in zip(jar, expected): self.assertEqual(c.__dict__, e.__dict__) _assert("", []) @@ -218,13 +219,14 @@ class TestCookiesTxt(unittest.TestCase): ) with self.assertRaises(ValueError): - util.load_cookiestxt("example.org\tTRUE\t/\tTRUE\t0\tname") + util.cookiestxt_load("example.org\tTRUE\t/\tTRUE\t0\tname", + http.cookiejar.CookieJar()) - def test_save_cookiestxt(self): + def test_cookiestxt_store(self): def _assert(cookies, expected): fp = io.StringIO(newline=None) - util.save_cookiestxt(fp, cookies) + util.cookiestxt_store(fp, cookies) self.assertMultiLineEqual(fp.getvalue(), expected) _assert([], "# Netscape HTTP Cookie File\n\n") diff --git a/test/test_ytdl.py b/test/test_ytdl.py new file mode 100644 index 0000000..eedb4f9 --- /dev/null +++ b/test/test_ytdl.py @@ -0,0 +1,274 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Copyright 2022 Mike Fährmann +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. + +import os +import sys +import unittest + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from gallery_dl import ytdl, util, config # noqa E402 + + +class Test_CommandlineArguments(unittest.TestCase): + module_name = "youtube_dl" + + @classmethod + def setUpClass(cls): + try: + cls.module = __import__(cls.module_name) + except ImportError: + raise unittest.SkipTest("cannot import module '{}'".format( + cls.module_name)) + cls.default = ytdl.parse_command_line(cls.module, []) + + def test_ignore_errors(self): + self._("--ignore-errors" , "ignoreerrors", True) + self._("--abort-on-error", "ignoreerrors", False) + + def test_default_search(self): + self._(["--default-search", "foo"] , "default_search", "foo") + + def test_mark_watched(self): + self._("--mark-watched" , "mark_watched", True) + self._("--no-mark-watched", "mark_watched", False) + + def test_proxy(self): + self._(["--proxy", "socks5://127.0.0.1:1080/"], + "proxy", "socks5://127.0.0.1:1080/") + self._(["--cn-verification-proxy", "https://127.0.0.1"], + "cn_verification_proxy", "https://127.0.0.1") + self._(["--geo-verification-proxy", "127.0.0.1"], + "geo_verification_proxy", "127.0.0.1") + + def test_network_options(self): + self._(["--socket-timeout", "3.5"], + "socket_timeout", 3.5) + self._(["--source-address", "127.0.0.1"], + "source_address", "127.0.0.1") + self._("-4" , "source_address", "0.0.0.0") + self._("--force-ipv4", "source_address", "0.0.0.0") + self._("-6" , "source_address", "::") + self._("--force-ipv6", "source_address", "::") + + def test_thumbnail_options(self): + self._("--write-thumbnail", "writethumbnail", True) + self._("--write-all-thumbnails", "write_all_thumbnails", True) + + def test_authentication_options(self): + self._(["-u" , "foo"], "username", "foo") + self._(["--username", "foo"], "username", "foo") + + self._(["-p" , "bar"], "password", "bar") + self._(["--password", "bar"], "password", "bar") + + self._(["--ap-mso" , "mso"], "ap_mso", "mso") + self._(["--ap-username", "foo"], "ap_username", "foo") + self._(["--ap-password", "bar"], "ap_password", "bar") + + self._(["-2" , "pass"], "twofactor", "pass") + self._(["--twofactor", "pass"], "twofactor", "pass") + + self._(["--video-password", "pass"], "videopassword", "pass") + + self._("-n" , "usenetrc", True) + self._("--netrc", "usenetrc", True) + + def test_subtitle_options(self): + self._("--write-sub" , "writesubtitles" , True) + self._("--write-auto-sub", "writeautomaticsub", True) + + self._(["--sub-format", "best"], "subtitlesformat", "best") + self._(["--sub-langs", "en,ru"], "subtitleslangs", ["en", "ru"]) + + def test_retries(self): + inf = float("inf") + + self._(["--retries", "5"], "retries", 5) + self._(["--retries", "inf"], "retries", inf) + self._(["--retries", "infinite"], "retries", inf) + self._(["--fragment-retries", "8"], "fragment_retries", 8) + self._(["--fragment-retries", "inf"], "fragment_retries", inf) + self._(["--fragment-retries", "infinite"], "fragment_retries", inf) + + def test_geo_bypass(self): + self._("--geo-bypass", "geo_bypass", True) + self._("--no-geo-bypass", "geo_bypass", False) + self._(["--geo-bypass-country", "EN"], "geo_bypass_country", "EN") + self._(["--geo-bypass-ip-block", "198.51.100.14/24"], + "geo_bypass_ip_block", "198.51.100.14/24") + + def test_headers(self): + headers = self.module.std_headers + + self.assertNotEqual(headers["User-Agent"], "Foo/1.0") + self._(["--user-agent", "Foo/1.0"]) + self.assertEqual(headers["User-Agent"], "Foo/1.0") + + self.assertNotIn("Referer", headers) + self._(["--referer", "http://example.org/"]) + self.assertEqual(headers["Referer"], "http://example.org/") + + self.assertNotEqual(headers["Accept"], "*/*") + self.assertNotIn("DNT", headers) + self._([ + "--add-header", "accept:*/*", + "--add-header", "dnt:1", + ]) + self.assertEqual(headers["accept"], "*/*") + self.assertEqual(headers["dnt"], "1") + + def test_extract_audio(self): + opts = self._(["--extract-audio"]) + self.assertEqual(opts["postprocessors"][0], { + "key": "FFmpegExtractAudio", + "preferredcodec": "best", + "preferredquality": "5", + "nopostoverwrites": False, + }) + + opts = self._([ + "--extract-audio", + "--audio-format", "opus", + "--audio-quality", "9", + "--no-post-overwrites", + ]) + self.assertEqual(opts["postprocessors"][0], { + "key": "FFmpegExtractAudio", + "preferredcodec": "opus", + "preferredquality": "9", + "nopostoverwrites": True, + }) + + def test_recode_video(self): + opts = self._(["--recode-video", " mkv "]) + self.assertEqual(opts["postprocessors"][0], { + "key": "FFmpegVideoConvertor", + "preferedformat": "mkv", + }) + + def test_subs(self): + opts = self._(["--convert-subs", "srt"]) + conv = {"key": "FFmpegSubtitlesConvertor", "format": "srt"} + if self.module_name == "yt_dlp": + conv["when"] = "before_dl" + self.assertEqual(opts["postprocessors"][0], conv) + + def test_embed(self): + subs = {"key": "FFmpegEmbedSubtitle"} + thumb = {"key": "EmbedThumbnail", "already_have_thumbnail": False} + if self.module_name == "yt_dlp": + subs["already_have_subtitle"] = False + + opts = self._(["--embed-subs", "--embed-thumbnail"]) + self.assertEqual(opts["postprocessors"], [subs, thumb]) + + thumb["already_have_thumbnail"] = True + if self.module_name == "yt_dlp": + subs["already_have_subtitle"] = True + thumb["already_have_thumbnail"] = "all" + + opts = self._([ + "--embed-thumbnail", + "--embed-subs", + "--write-sub", + "--write-all-thumbnails", + ]) + self.assertEqual(opts["postprocessors"], [subs, thumb]) + + def test_metadata(self): + opts = self._("--add-metadata") + self.assertEqual(opts["postprocessors"][0], {"key": "FFmpegMetadata"}) + + def test_metadata_from_title(self): + opts = self._(["--metadata-from-title", "%(artist)s - %(title)s"]) + self.assertEqual(opts["postprocessors"][0], { + "key": "MetadataFromTitle", + "titleformat": "%(artist)s - %(title)s", + }) + + def test_xattr(self): + self._("--xattr-set-filesize", "xattr_set_filesize", True) + + opts = self._("--xattrs") + self.assertEqual(opts["postprocessors"][0], {"key": "XAttrMetadata"}) + + def test_noop(self): + cmdline = [ + "--update", + "--dump-user-agent", + "-F", + "--list-formats", + "--list-extractors", + "--list-thumbnails", + "--list-subs", + "--ap-list-mso", + "--extractor-descriptions", + "--ignore-config", + ] + + if self.module_name != "yt_dlp": + cmdline.extend(( + "--dump-json", + "--dump-single-json", + "--config-location", "~", + )) + + result = self._(cmdline) + result["daterange"] = self.default["daterange"] + self.assertEqual(result, self.default) + + def _(self, cmdline, option=util.SENTINEL, expected=None): + if isinstance(cmdline, str): + cmdline = [cmdline] + result = ytdl.parse_command_line(self.module, cmdline) + if option is not util.SENTINEL: + self.assertEqual(result[option], expected, option) + return result + + +class Test_CommandlineArguments_YtDlp(Test_CommandlineArguments): + module_name = "yt_dlp" + + def test_retries_extractor(self): + inf = float("inf") + + self._(["--extractor-retries", "5"], "extractor_retries", 5) + self._(["--extractor-retries", "inf"], "extractor_retries", inf) + self._(["--extractor-retries", "infinite"], "extractor_retries", inf) + + def test_remuxs_video(self): + opts = self._(["--remux-video", " mkv "]) + self.assertEqual(opts["postprocessors"][0], { + "key": "FFmpegVideoRemuxer", + "preferedformat": "mkv", + }) + + def test_metadata(self): + opts = self._(["--embed-metadata", + "--no-embed-chapters", + "--embed-info-json"]) + self.assertEqual(opts["postprocessors"][0], { + "key": "FFmpegMetadata", + "add_chapters": False, + "add_metadata": True, + "add_infojson": True, + }) + + def test_metadata_from_title(self): + opts = self._(["--metadata-from-title", "%(artist)s - %(title)s"]) + self.assertEqual(opts["postprocessors"][0], { + "key": "MetadataParser", + "when": "pre_process", + "actions": [self.module.MetadataFromFieldPP.to_action( + "title:%(artist)s - %(title)s")], + }) + + +if __name__ == "__main__": + unittest.main(warnings="ignore") |
