aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/test_InfoExtractor.py12
-rw-r--r--test/testdata/netrc/netrc4
-rw-r--r--test/testdata/netrc/print_netrc.py2
-rw-r--r--yt_dlp/extractor/common.py7
4 files changed, 25 insertions, 0 deletions
diff --git a/test/test_InfoExtractor.py b/test/test_InfoExtractor.py
index 31e8f8244..54f35ef55 100644
--- a/test/test_InfoExtractor.py
+++ b/test/test_InfoExtractor.py
@@ -53,6 +53,18 @@ class TestInfoExtractor(unittest.TestCase):
def test_ie_key(self):
self.assertEqual(get_info_extractor(YoutubeIE.ie_key()), YoutubeIE)
+ def test_get_netrc_login_info(self):
+ for params in [
+ {'usenetrc': True, 'netrc_location': './test/testdata/netrc/netrc'},
+ {'netrc_cmd': f'{sys.executable} ./test/testdata/netrc/print_netrc.py'},
+ ]:
+ ie = DummyIE(FakeYDL(params))
+ self.assertEqual(ie._get_netrc_login_info(netrc_machine='normal_use'), ('user', 'pass'))
+ self.assertEqual(ie._get_netrc_login_info(netrc_machine='empty_user'), ('', 'pass'))
+ self.assertEqual(ie._get_netrc_login_info(netrc_machine='empty_pass'), ('user', ''))
+ self.assertEqual(ie._get_netrc_login_info(netrc_machine='both_empty'), ('', ''))
+ self.assertEqual(ie._get_netrc_login_info(netrc_machine='nonexistent'), (None, None))
+
def test_html_search_regex(self):
html = '<p id="foo">Watch this <a href="http://www.youtube.com/watch?v=BaW_jenozKc">video</a></p>'
search = lambda re, *args: self.ie._html_search_regex(re, html, *args)
diff --git a/test/testdata/netrc/netrc b/test/testdata/netrc/netrc
new file mode 100644
index 000000000..bafe92fe6
--- /dev/null
+++ b/test/testdata/netrc/netrc
@@ -0,0 +1,4 @@
+machine normal_use login user password pass
+machine empty_user login "" password pass
+machine empty_pass login user password ""
+machine both_empty login "" password ""
diff --git a/test/testdata/netrc/print_netrc.py b/test/testdata/netrc/print_netrc.py
new file mode 100644
index 000000000..5c25814f8
--- /dev/null
+++ b/test/testdata/netrc/print_netrc.py
@@ -0,0 +1,2 @@
+with open('./test/testdata/netrc/netrc', encoding='utf-8') as fp:
+ print(fp.read())
diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py
index ecece85f5..7e6e6227d 100644
--- a/yt_dlp/extractor/common.py
+++ b/yt_dlp/extractor/common.py
@@ -1409,6 +1409,13 @@ class InfoExtractor:
return None, None
self.write_debug(f'Using netrc for {netrc_machine} authentication')
+
+ # compat: <=py3.10: netrc cannot parse tokens as empty strings, will return `""` instead
+ # Ref: https://github.com/yt-dlp/yt-dlp/issues/11413
+ # https://github.com/python/cpython/commit/15409c720be0503131713e3d3abc1acd0da07378
+ if sys.version_info < (3, 11):
+ return tuple(x if x != '""' else '' for x in info[::2])
+
return info[0], info[2]
def _get_login_info(self, username_option='username', password_option='password', netrc_machine=None):