mirror of
https://github.com/yt-dlp/yt-dlp
synced 2024-12-26 21:59:08 +01:00
parent
b19ae095fd
commit
216f6a3cb5
6 changed files with 44 additions and 25 deletions
2
.github/workflows/quick-test.yml
vendored
2
.github/workflows/quick-test.yml
vendored
|
@ -27,6 +27,8 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-python@v5
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.8'
|
||||||
- name: Install flake8
|
- name: Install flake8
|
||||||
run: python3 ./devscripts/install_deps.py -o --include dev
|
run: python3 ./devscripts/install_deps.py -o --include dev
|
||||||
- name: Make lazy extractors
|
- name: Make lazy extractors
|
||||||
|
|
5
Makefile
5
Makefile
|
@ -12,7 +12,10 @@ tar: yt-dlp.tar.gz
|
||||||
pypi-files: AUTHORS Changelog.md LICENSE README.md README.txt supportedsites \
|
pypi-files: AUTHORS Changelog.md LICENSE README.md README.txt supportedsites \
|
||||||
completions yt-dlp.1 pyproject.toml setup.cfg devscripts/* test/*
|
completions yt-dlp.1 pyproject.toml setup.cfg devscripts/* test/*
|
||||||
|
|
||||||
.PHONY: all clean install test tar pypi-files completions ot offlinetest codetest supportedsites
|
.PHONY: all clean clean-all clean-test clean-dist clean-cache \
|
||||||
|
completions completion-bash completion-fish completion-zsh \
|
||||||
|
doc issuetemplates supportedsites ot offlinetest codetest test \
|
||||||
|
tar pypi-files lazy-extractors install uninstall
|
||||||
|
|
||||||
clean-test:
|
clean-test:
|
||||||
rm -rf test/testdata/sigs/player-*.js tmp/ *.annotations.xml *.aria2 *.description *.dump *.frag \
|
rm -rf test/testdata/sigs/player-*.js tmp/ *.annotations.xml *.aria2 *.description *.dump *.frag \
|
||||||
|
|
|
@ -127,8 +127,20 @@
|
||||||
"short": "[ie] Support multi-period MPD streams (#6654)",
|
"short": "[ie] Support multi-period MPD streams (#6654)",
|
||||||
"authors": ["alard", "pukkandan"]
|
"authors": ["alard", "pukkandan"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"action": "change",
|
||||||
|
"when": "aa7e9ae4f48276bd5d0173966c77db9484f65a0a",
|
||||||
|
"short": "[ie/xvideos] Support new URL format (#9502)",
|
||||||
|
"authors": ["sta1us"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"action": "remove",
|
"action": "remove",
|
||||||
"when": "22e4dfacb61f62dfbb3eb41b31c7b69ba1059b80"
|
"when": "22e4dfacb61f62dfbb3eb41b31c7b69ba1059b80"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"action": "change",
|
||||||
|
"when": "e3a3ed8a981d9395c4859b6ef56cd02bc3148db2",
|
||||||
|
"short": "[cleanup:ie] No `from` stdlib imports in extractors",
|
||||||
|
"authors": ["pukkandan"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -26,27 +26,6 @@ _TEST_DATA = {
|
||||||
|
|
||||||
|
|
||||||
class TestTraversal:
|
class TestTraversal:
|
||||||
def test_dict_get(self):
|
|
||||||
FALSE_VALUES = {
|
|
||||||
'none': None,
|
|
||||||
'false': False,
|
|
||||||
'zero': 0,
|
|
||||||
'empty_string': '',
|
|
||||||
'empty_list': [],
|
|
||||||
}
|
|
||||||
d = {**FALSE_VALUES, 'a': 42}
|
|
||||||
assert dict_get(d, 'a') == 42
|
|
||||||
assert dict_get(d, 'b') is None
|
|
||||||
assert dict_get(d, 'b', 42) == 42
|
|
||||||
assert dict_get(d, ('a',)) == 42
|
|
||||||
assert dict_get(d, ('b', 'a')) == 42
|
|
||||||
assert dict_get(d, ('b', 'c', 'a', 'd')) == 42
|
|
||||||
assert dict_get(d, ('b', 'c')) is None
|
|
||||||
assert dict_get(d, ('b', 'c'), 42) == 42
|
|
||||||
for key, false_value in FALSE_VALUES.items():
|
|
||||||
assert dict_get(d, ('b', 'c', key)) is None
|
|
||||||
assert dict_get(d, ('b', 'c', key), skip_false_values=False) == false_value
|
|
||||||
|
|
||||||
def test_traversal_base(self):
|
def test_traversal_base(self):
|
||||||
assert traverse_obj(_TEST_DATA, ('str',)) == 'str', \
|
assert traverse_obj(_TEST_DATA, ('str',)) == 'str', \
|
||||||
'allow tuple path'
|
'allow tuple path'
|
||||||
|
@ -440,3 +419,26 @@ class TestTraversal:
|
||||||
'function key should yield all values'
|
'function key should yield all values'
|
||||||
assert traverse_obj(morsel, [(None,), any]) == morsel, \
|
assert traverse_obj(morsel, [(None,), any]) == morsel, \
|
||||||
'Morsel should not be implicitly changed to dict on usage'
|
'Morsel should not be implicitly changed to dict on usage'
|
||||||
|
|
||||||
|
|
||||||
|
class TestDictGet:
|
||||||
|
def test_dict_get(self):
|
||||||
|
FALSE_VALUES = {
|
||||||
|
'none': None,
|
||||||
|
'false': False,
|
||||||
|
'zero': 0,
|
||||||
|
'empty_string': '',
|
||||||
|
'empty_list': [],
|
||||||
|
}
|
||||||
|
d = {**FALSE_VALUES, 'a': 42}
|
||||||
|
assert dict_get(d, 'a') == 42
|
||||||
|
assert dict_get(d, 'b') is None
|
||||||
|
assert dict_get(d, 'b', 42) == 42
|
||||||
|
assert dict_get(d, ('a',)) == 42
|
||||||
|
assert dict_get(d, ('b', 'a')) == 42
|
||||||
|
assert dict_get(d, ('b', 'c', 'a', 'd')) == 42
|
||||||
|
assert dict_get(d, ('b', 'c')) is None
|
||||||
|
assert dict_get(d, ('b', 'c'), 42) == 42
|
||||||
|
for key, false_value in FALSE_VALUES.items():
|
||||||
|
assert dict_get(d, ('b', 'c', key)) is None
|
||||||
|
assert dict_get(d, ('b', 'c', key), skip_false_values=False) == false_value
|
||||||
|
|
|
@ -124,7 +124,7 @@ def make_ssl_context(
|
||||||
context.verify_mode = ssl.CERT_REQUIRED if verify else ssl.CERT_NONE
|
context.verify_mode = ssl.CERT_REQUIRED if verify else ssl.CERT_NONE
|
||||||
# OpenSSL 1.1.1+ Python 3.8+ keylog file
|
# OpenSSL 1.1.1+ Python 3.8+ keylog file
|
||||||
if hasattr(context, 'keylog_filename'):
|
if hasattr(context, 'keylog_filename'):
|
||||||
context.keylog_filename = os.environ.get('SSLKEYLOGFILE')
|
context.keylog_filename = os.environ.get('SSLKEYLOGFILE') or None
|
||||||
|
|
||||||
# Some servers may reject requests if ALPN extension is not sent. See:
|
# Some servers may reject requests if ALPN extension is not sent. See:
|
||||||
# https://github.com/python/cpython/issues/85140
|
# https://github.com/python/cpython/issues/85140
|
||||||
|
|
|
@ -114,7 +114,7 @@ _NON_UPDATEABLE_REASONS = {
|
||||||
**{variant: f'Auto-update is not supported for unpackaged {name} executable; Re-download the latest release'
|
**{variant: f'Auto-update is not supported for unpackaged {name} executable; Re-download the latest release'
|
||||||
for variant, name in {'win32_dir': 'Windows', 'darwin_dir': 'MacOS', 'linux_dir': 'Linux'}.items()},
|
for variant, name in {'win32_dir': 'Windows', 'darwin_dir': 'MacOS', 'linux_dir': 'Linux'}.items()},
|
||||||
'source': 'You cannot update when running from source code; Use git to pull the latest changes',
|
'source': 'You cannot update when running from source code; Use git to pull the latest changes',
|
||||||
'unknown': 'You installed yt-dlp with a package manager or setup.py; Use that to update',
|
'unknown': 'You installed yt-dlp from a manual build or with a package manager; Use that to update',
|
||||||
'other': 'You are using an unofficial build of yt-dlp; Build the executable again',
|
'other': 'You are using an unofficial build of yt-dlp; Build the executable again',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue