aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/test_formatter.py16
-rw-r--r--test/test_job.py10
-rw-r--r--test/test_util.py14
-rw-r--r--test/test_ytdl.py274
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")