aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rwxr-xr-xdevscripts/bash-completion.py2
-rw-r--r--devscripts/check-porn.py5
-rwxr-xr-xdevscripts/fish-completion.py2
-rw-r--r--devscripts/generate_aes_testdata.py6
-rw-r--r--devscripts/make_lazy_extractors.py4
-rwxr-xr-xdevscripts/make_readme.py2
-rw-r--r--devscripts/make_supportedsites.py1
-rw-r--r--devscripts/update-formulae.py1
-rw-r--r--devscripts/update-version.py5
-rwxr-xr-xdevscripts/zsh-completion.py2
-rw-r--r--pyinst.py12
-rw-r--r--setup.py6
-rw-r--r--test/helper.py13
-rw-r--r--test/test_InfoExtractor.py14
-rw-r--r--test/test_YoutubeDL.py17
-rw-r--r--test/test_YoutubeDLCookieJar.py1
-rw-r--r--test/test_aes.py16
-rw-r--r--test/test_age_restriction.py3
-rw-r--r--test/test_all_urls.py9
-rw-r--r--test/test_cache.py5
-rw-r--r--test/test_compat.py5
-rw-r--r--test/test_cookies.py4
-rwxr-xr-xtest/test_download.py15
-rw-r--r--test/test_downloader_http.py4
-rw-r--r--test/test_execution.py6
-rw-r--r--test/test_http.py6
-rw-r--r--test/test_iqiyi_sdk_interpreter.py2
-rw-r--r--test/test_jsinterp.py1
-rw-r--r--test/test_netrc.py1
-rw-r--r--test/test_overwrites.py4
-rw-r--r--test/test_post_hooks.py4
-rw-r--r--test/test_postprocessors.py2
-rw-r--r--test/test_socks.py12
-rw-r--r--test/test_subtitles.py28
-rw-r--r--test/test_update.py.disabled2
-rw-r--r--test/test_utils.py95
-rw-r--r--test/test_verbose_output.py6
-rw-r--r--test/test_write_annotations.py.disabled8
-rw-r--r--test/test_youtube_lists.py6
-rw-r--r--test/test_youtube_misc.py1
-rw-r--r--test/test_youtube_signature.py5
-rw-r--r--yt_dlp/YoutubeDL.py124
-rw-r--r--yt_dlp/__init__.py42
-rw-r--r--yt_dlp/aes.py12
-rw-r--r--yt_dlp/cache.py5
-rw-r--r--yt_dlp/cookies.py12
-rw-r--r--yt_dlp/downloader/__init__.py14
-rw-r--r--yt_dlp/downloader/common.py18
-rw-r--r--yt_dlp/downloader/dash.py3
-rw-r--r--yt_dlp/downloader/external.py17
-rw-r--r--yt_dlp/downloader/f4m.py11
-rw-r--r--yt_dlp/downloader/fragment.py8
-rw-r--r--yt_dlp/downloader/hls.py20
-rw-r--r--yt_dlp/downloader/http.py13
-rw-r--r--yt_dlp/downloader/ism.py7
-rw-r--r--yt_dlp/downloader/mhtml.py7
-rw-r--r--yt_dlp/downloader/rtmp.py4
-rw-r--r--yt_dlp/downloader/rtsp.py5
-rw-r--r--yt_dlp/downloader/websocket.py2
-rw-r--r--yt_dlp/downloader/youtube_live_chat.py7
-rw-r--r--yt_dlp/extractor/abematv.py28
-rw-r--r--yt_dlp/extractor/common.py23
-rw-r--r--yt_dlp/extractor/commonprotocols.py4
-rw-r--r--yt_dlp/extractor/generic.py215
-rw-r--r--yt_dlp/extractor/mtv.py4
-rw-r--r--yt_dlp/extractor/noz.py4
-rw-r--r--yt_dlp/extractor/openload.py8
-rw-r--r--yt_dlp/extractor/youtube.py7
-rw-r--r--yt_dlp/jsinterp.py7
-rw-r--r--yt_dlp/minicurses.py2
-rw-r--r--yt_dlp/options.py29
-rw-r--r--yt_dlp/postprocessor/__init__.py15
-rw-r--r--yt_dlp/postprocessor/common.py2
-rw-r--r--yt_dlp/postprocessor/embedthumbnail.py13
-rw-r--r--yt_dlp/postprocessor/exec.py6
-rw-r--r--yt_dlp/postprocessor/ffmpeg.py16
-rw-r--r--yt_dlp/postprocessor/modify_chapters.py12
-rw-r--r--yt_dlp/postprocessor/movefilesafterdownload.py2
-rw-r--r--yt_dlp/postprocessor/sponskrub.py6
-rw-r--r--yt_dlp/postprocessor/sponsorblock.py2
-rw-r--r--yt_dlp/postprocessor/xattrpp.py4
-rw-r--r--yt_dlp/socks.py6
-rw-r--r--yt_dlp/update.py3
-rw-r--r--yt_dlp/utils.py22
-rw-r--r--yt_dlp/webvtt.py8
86 files changed, 504 insertions, 619 deletions
diff --git a/.gitignore b/.gitignore
index c815538e8..92f9029e3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -82,6 +82,7 @@ updates_key.pem
*.egg-info
.tox
*.class
+*.isorted
# Generated
AUTHORS
diff --git a/devscripts/bash-completion.py b/devscripts/bash-completion.py
index 23a9a5781..73d698c39 100755
--- a/devscripts/bash-completion.py
+++ b/devscripts/bash-completion.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
import os
-from os.path import dirname as dirn
import sys
+from os.path import dirname as dirn
sys.path.insert(0, dirn(dirn(os.path.abspath(__file__))))
import yt_dlp
diff --git a/devscripts/check-porn.py b/devscripts/check-porn.py
index 6188f68ec..08f663e4b 100644
--- a/devscripts/check-porn.py
+++ b/devscripts/check-porn.py
@@ -10,11 +10,12 @@ pass the list filename as the only argument
# Allow direct execution
import os
import sys
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from test.helper import gettestcases
-from yt_dlp.utils import compat_urllib_parse_urlparse
-from yt_dlp.utils import compat_urllib_request
+
+from yt_dlp.utils import compat_urllib_parse_urlparse, compat_urllib_request
if len(sys.argv) > 1:
METHOD = 'LIST'
diff --git a/devscripts/fish-completion.py b/devscripts/fish-completion.py
index d958a5d6b..c318b69e4 100755
--- a/devscripts/fish-completion.py
+++ b/devscripts/fish-completion.py
@@ -1,8 +1,8 @@
#!/usr/bin/env python3
import optparse
import os
-from os.path import dirname as dirn
import sys
+from os.path import dirname as dirn
sys.path.insert(0, dirn(dirn(os.path.abspath(__file__))))
import yt_dlp
diff --git a/devscripts/generate_aes_testdata.py b/devscripts/generate_aes_testdata.py
index 308c74a20..c7d83f1a7 100644
--- a/devscripts/generate_aes_testdata.py
+++ b/devscripts/generate_aes_testdata.py
@@ -1,13 +1,13 @@
#!/usr/bin/env python3
import codecs
-import subprocess
-
import os
+import subprocess
import sys
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from yt_dlp.utils import intlist_to_bytes
from yt_dlp.aes import aes_encrypt, key_expansion
+from yt_dlp.utils import intlist_to_bytes
secret_msg = b'Secret message goes here'
diff --git a/devscripts/make_lazy_extractors.py b/devscripts/make_lazy_extractors.py
index 24e8cfa5b..6d5f96cf0 100644
--- a/devscripts/make_lazy_extractors.py
+++ b/devscripts/make_lazy_extractors.py
@@ -1,8 +1,8 @@
#!/usr/bin/env python3
-from inspect import getsource
import os
-from os.path import dirname as dirn
import sys
+from inspect import getsource
+from os.path import dirname as dirn
sys.path.insert(0, dirn(dirn(os.path.abspath(__file__))))
diff --git a/devscripts/make_readme.py b/devscripts/make_readme.py
index 5d85bcc63..1719ac8e4 100755
--- a/devscripts/make_readme.py
+++ b/devscripts/make_readme.py
@@ -2,8 +2,8 @@
# yt-dlp --help | make_readme.py
# This must be run in a console of correct width
-import sys
import re
+import sys
README_FILE = 'README.md'
helptext = sys.stdin.read()
diff --git a/devscripts/make_supportedsites.py b/devscripts/make_supportedsites.py
index 26d25704e..0a0d08f56 100644
--- a/devscripts/make_supportedsites.py
+++ b/devscripts/make_supportedsites.py
@@ -3,7 +3,6 @@ import optparse
import os
import sys
-
# Import yt_dlp
ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')
sys.path.insert(0, ROOT_DIR)
diff --git a/devscripts/update-formulae.py b/devscripts/update-formulae.py
index 3a0bef52e..6424f5d9b 100644
--- a/devscripts/update-formulae.py
+++ b/devscripts/update-formulae.py
@@ -8,7 +8,6 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from yt_dlp.compat import compat_urllib_request
-
# usage: python3 ./devscripts/update-formulae.py <path-to-formulae-rb> <version>
# version can be either 0-aligned (yt-dlp version) or normalized (PyPl version)
diff --git a/devscripts/update-version.py b/devscripts/update-version.py
index 233cdaa76..991cfb2af 100644
--- a/devscripts/update-version.py
+++ b/devscripts/update-version.py
@@ -1,8 +1,7 @@
#!/usr/bin/env python3
-from datetime import datetime
-import sys
import subprocess
-
+import sys
+from datetime import datetime
with open('yt_dlp/version.py') as f:
exec(compile(f.read(), 'yt_dlp/version.py', 'exec'))
diff --git a/devscripts/zsh-completion.py b/devscripts/zsh-completion.py
index 677fe7373..2d5ac2a45 100755
--- a/devscripts/zsh-completion.py
+++ b/devscripts/zsh-completion.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
import os
-from os.path import dirname as dirn
import sys
+from os.path import dirname as dirn
sys.path.insert(0, dirn(dirn(os.path.abspath(__file__))))
import yt_dlp
diff --git a/pyinst.py b/pyinst.py
index 1f72bd4be..9e8128e09 100644
--- a/pyinst.py
+++ b/pyinst.py
@@ -2,14 +2,20 @@
import os
import platform
import sys
-from PyInstaller.utils.hooks import collect_submodules
+from PyInstaller.utils.hooks import collect_submodules
OS_NAME = platform.system()
if OS_NAME == 'Windows':
from PyInstaller.utils.win32.versioninfo import (
- VarStruct, VarFileInfo, StringStruct, StringTable,
- StringFileInfo, FixedFileInfo, VSVersionInfo, SetVersion,
+ FixedFileInfo,
+ SetVersion,
+ StringFileInfo,
+ StringStruct,
+ StringTable,
+ VarFileInfo,
+ VarStruct,
+ VSVersionInfo,
)
elif OS_NAME == 'Darwin':
pass
diff --git a/setup.py b/setup.py
index 9eab7f1d7..45f4d6b49 100644
--- a/setup.py
+++ b/setup.py
@@ -1,13 +1,13 @@
#!/usr/bin/env python3
import os.path
-import warnings
import sys
+import warnings
try:
- from setuptools import setup, Command, find_packages
+ from setuptools import Command, find_packages, setup
setuptools_available = True
except ImportError:
- from distutils.core import setup, Command
+ from distutils.core import Command, setup
setuptools_available = False
from distutils.spawn import spawn
diff --git a/test/helper.py b/test/helper.py
index d940e327c..81e53ed74 100644
--- a/test/helper.py
+++ b/test/helper.py
@@ -3,21 +3,14 @@ import hashlib
import json
import os.path
import re
-import types
import ssl
import sys
+import types
import yt_dlp.extractor
from yt_dlp import YoutubeDL
-from yt_dlp.compat import (
- compat_os_name,
- compat_str,
-)
-from yt_dlp.utils import (
- preferredencoding,
- write_string,
-)
-
+from yt_dlp.compat import compat_os_name, compat_str
+from yt_dlp.utils import preferredencoding, write_string
if 'pytest' in sys.modules:
import pytest
diff --git a/test/test_InfoExtractor.py b/test/test_InfoExtractor.py
index 4fd21bed4..173b62920 100644
--- a/test/test_InfoExtractor.py
+++ b/test/test_InfoExtractor.py
@@ -3,15 +3,21 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+import threading
from test.helper import FakeYDL, expect_dict, expect_value, http_server_port
+
from yt_dlp.compat import compat_etree_fromstring, compat_http_server
-from yt_dlp.extractor.common import InfoExtractor
from yt_dlp.extractor import YoutubeIE, get_info_extractor
-from yt_dlp.utils import encode_data_uri, strip_jsonp, ExtractorError, RegexNotFoundError
-import threading
-
+from yt_dlp.extractor.common import InfoExtractor
+from yt_dlp.utils import (
+ ExtractorError,
+ RegexNotFoundError,
+ encode_data_uri,
+ strip_jsonp,
+)
TEAPOT_RESPONSE_STATUS = 418
TEAPOT_RESPONSE_BODY = "<h1>418 I'm a teapot</h1>"
diff --git a/test/test_YoutubeDL.py b/test/test_YoutubeDL.py
index 480c7539c..051a203ac 100644
--- a/test/test_YoutubeDL.py
+++ b/test/test_YoutubeDL.py
@@ -3,18 +3,29 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import copy
import json
-
from test.helper import FakeYDL, assertRegexpMatches
+
from yt_dlp import YoutubeDL
-from yt_dlp.compat import compat_os_name, compat_setenv, compat_str, compat_urllib_error
+from yt_dlp.compat import (
+ compat_os_name,
+ compat_setenv,
+ compat_str,
+ compat_urllib_error,
+)
from yt_dlp.extractor import YoutubeIE
from yt_dlp.extractor.common import InfoExtractor
from yt_dlp.postprocessor.common import PostProcessor
-from yt_dlp.utils import ExtractorError, int_or_none, match_filter_func, LazyList
+from yt_dlp.utils import (
+ ExtractorError,
+ LazyList,
+ int_or_none,
+ match_filter_func,
+)
TEST_URL = 'http://localhost/sample.mp4'
diff --git a/test/test_YoutubeDLCookieJar.py b/test/test_YoutubeDLCookieJar.py
index 1e5bedcae..13a4569b2 100644
--- a/test/test_YoutubeDLCookieJar.py
+++ b/test/test_YoutubeDLCookieJar.py
@@ -4,6 +4,7 @@ import re
import sys
import tempfile
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from yt_dlp.utils import YoutubeDLCookieJar
diff --git a/test/test_aes.py b/test/test_aes.py
index 34584a04f..1c1238c8b 100644
--- a/test/test_aes.py
+++ b/test/test_aes.py
@@ -3,26 +3,28 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+import base64
+
from yt_dlp.aes import (
- aes_decrypt,
- aes_encrypt,
- aes_ecb_encrypt,
- aes_ecb_decrypt,
+ BLOCK_SIZE_BYTES,
aes_cbc_decrypt,
aes_cbc_decrypt_bytes,
aes_cbc_encrypt,
aes_ctr_decrypt,
aes_ctr_encrypt,
+ aes_decrypt,
+ aes_decrypt_text,
+ aes_ecb_decrypt,
+ aes_ecb_encrypt,
+ aes_encrypt,
aes_gcm_decrypt_and_verify,
aes_gcm_decrypt_and_verify_bytes,
- aes_decrypt_text,
- BLOCK_SIZE_BYTES,
)
from yt_dlp.compat import compat_pycrypto_AES
from yt_dlp.utils import bytes_to_intlist, intlist_to_bytes
-import base64
# the encrypted data can be generate with 'devscripts/generate_aes_testdata.py'
diff --git a/test/test_age_restriction.py b/test/test_age_restriction.py
index 50d16a729..e1012f69b 100644
--- a/test/test_age_restriction.py
+++ b/test/test_age_restriction.py
@@ -3,9 +3,10 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from test.helper import try_rm, is_download_test
+from test.helper import is_download_test, try_rm
from yt_dlp import YoutubeDL
diff --git a/test/test_all_urls.py b/test/test_all_urls.py
index d70da8cae..b6019554e 100644
--- a/test/test_all_urls.py
+++ b/test/test_all_urls.py
@@ -1,19 +1,16 @@
#!/usr/bin/env python3
# Allow direct execution
+import collections
import os
import sys
import unittest
-import collections
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from test.helper import gettestcases
-from yt_dlp.extractor import (
- FacebookIE,
- gen_extractors,
- YoutubeIE,
-)
+from yt_dlp.extractor import FacebookIE, YoutubeIE, gen_extractors
class TestAllURLsMatching(unittest.TestCase):
diff --git a/test/test_cache.py b/test/test_cache.py
index 4e4641eba..14e54ba20 100644
--- a/test/test_cache.py
+++ b/test/test_cache.py
@@ -1,14 +1,15 @@
#!/usr/bin/env python3
-import shutil
-
# Allow direct execution
import os
+import shutil
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from test.helper import FakeYDL
+
from yt_dlp.cache import Cache
diff --git a/test/test_compat.py b/test/test_compat.py
index 31524c5ab..20dab9573 100644
--- a/test/test_compat.py
+++ b/test/test_compat.py
@@ -3,14 +3,15 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from yt_dlp.compat import (
- compat_getenv,
- compat_setenv,
compat_etree_fromstring,
compat_expanduser,
+ compat_getenv,
+ compat_setenv,
compat_str,
compat_struct_unpack,
compat_urllib_parse_unquote,
diff --git a/test/test_cookies.py b/test/test_cookies.py
index 842ebcb99..5bfaec367 100644
--- a/test/test_cookies.py
+++ b/test/test_cookies.py
@@ -6,10 +6,10 @@ from yt_dlp.cookies import (
LinuxChromeCookieDecryptor,
MacChromeCookieDecryptor,
WindowsChromeCookieDecryptor,
- parse_safari_cookies,
- pbkdf2_sha1,
_get_linux_desktop_environment,
_LinuxDesktopEnvironment,
+ parse_safari_cookies,
+ pbkdf2_sha1,
)
diff --git a/test/test_download.py b/test/test_download.py
index 3c6b55d98..9a83bee2f 100755
--- a/test/test_download.py
+++ b/test/test_download.py
@@ -1,8 +1,12 @@
#!/usr/bin/env python3
# Allow direct execution
+import hashlib
+import json
import os
+import socket
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from test.helper import (
@@ -16,24 +20,19 @@ from test.helper import (
try_rm,
)
-
-import hashlib
-import json
-import socket
-
import yt_dlp.YoutubeDL
from yt_dlp.compat import (
compat_http_client,
- compat_urllib_error,
compat_HTTPError,
+ compat_urllib_error,
)
+from yt_dlp.extractor import get_info_extractor
from yt_dlp.utils import (
DownloadError,
ExtractorError,
- format_bytes,
UnavailableVideoError,
+ format_bytes,
)
-from yt_dlp.extractor import get_info_extractor
RETRIES = 3
diff --git a/test/test_downloader_http.py b/test/test_downloader_http.py
index c511909c7..c33308064 100644
--- a/test/test_downloader_http.py
+++ b/test/test_downloader_http.py
@@ -4,14 +4,16 @@ import os
import re
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+import threading
from test.helper import http_server_port, try_rm
+
from yt_dlp import YoutubeDL
from yt_dlp.compat import compat_http_server
from yt_dlp.downloader.http import HttpFD
from yt_dlp.utils import encodeFilename
-import threading
TEST_DIR = os.path.dirname(os.path.abspath(__file__))
diff --git a/test/test_execution.py b/test/test_execution.py
index 623f08165..6a3e9944b 100644
--- a/test/test_execution.py
+++ b/test/test_execution.py
@@ -1,9 +1,9 @@
#!/usr/bin/env python3
-import unittest
-
-import sys
import os
import subprocess
+import sys
+import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from yt_dlp.utils import encodeArgument
diff --git a/test/test_http.py b/test/test_http.py
index 2106220eb..029996ca9 100644
--- a/test/test_http.py
+++ b/test/test_http.py
@@ -3,13 +3,15 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+import ssl
+import threading
from test.helper import http_server_port
+
from yt_dlp import YoutubeDL
from yt_dlp.compat import compat_http_server, compat_urllib_request
-import ssl
-import threading
TEST_DIR = os.path.dirname(os.path.abspath(__file__))
diff --git a/test/test_iqiyi_sdk_interpreter.py b/test/test_iqiyi_sdk_interpreter.py
index 57a7ed3a8..4b82b7187 100644
--- a/test/test_iqiyi_sdk_interpreter.py
+++ b/test/test_iqiyi_sdk_interpreter.py
@@ -3,9 +3,11 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from test.helper import FakeYDL, is_download_test
+
from yt_dlp.extractor import IqiyiIE
diff --git a/test/test_jsinterp.py b/test/test_jsinterp.py
index 10a465cf9..872c58c8f 100644
--- a/test/test_jsinterp.py
+++ b/test/test_jsinterp.py
@@ -3,6 +3,7 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from yt_dlp.jsinterp import JSInterpreter
diff --git a/test/test_netrc.py b/test/test_netrc.py
index adc3a0ed1..f7a0b33d2 100644
--- a/test/test_netrc.py
+++ b/test/test_netrc.py
@@ -1,6 +1,7 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
diff --git a/test/test_overwrites.py b/test/test_overwrites.py
index 8e0548db5..39741b65c 100644
--- a/test/test_overwrites.py
+++ b/test/test_overwrites.py
@@ -1,14 +1,14 @@
#!/usr/bin/env python3
import os
-from os.path import join
import subprocess
import sys
import unittest
+from os.path import join
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from test.helper import is_download_test, try_rm
-
root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
download_file = join(root_dir, 'test.webm')
diff --git a/test/test_post_hooks.py b/test/test_post_hooks.py
index 020203f2f..e84a08f29 100644
--- a/test/test_post_hooks.py
+++ b/test/test_post_hooks.py
@@ -2,9 +2,11 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from test.helper import get_params, try_rm, is_download_test
+from test.helper import get_params, is_download_test, try_rm
+
import yt_dlp.YoutubeDL
from yt_dlp.utils import DownloadError
diff --git a/test/test_postprocessors.py b/test/test_postprocessors.py
index e5893f7d2..9d8a4dcc5 100644
--- a/test/test_postprocessors.py
+++ b/test/test_postprocessors.py
@@ -13,7 +13,7 @@ from yt_dlp.postprocessor import (
FFmpegThumbnailsConvertorPP,
MetadataFromFieldPP,
MetadataParserPP,
- ModifyChaptersPP
+ ModifyChaptersPP,
)
diff --git a/test/test_socks.py b/test/test_socks.py
index 02723b469..546f0d73d 100644
--- a/test/test_socks.py
+++ b/test/test_socks.py
@@ -3,20 +3,14 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import random
import subprocess
+from test.helper import FakeYDL, get_params, is_download_test
-from test.helper import (
- FakeYDL,
- get_params,
- is_download_test,
-)
-from yt_dlp.compat import (
- compat_str,
- compat_urllib_request,
-)
+from yt_dlp.compat import compat_str, compat_urllib_request
@is_download_test
diff --git a/test/test_subtitles.py b/test/test_subtitles.py
index 0be1842da..362b67cef 100644
--- a/test/test_subtitles.py
+++ b/test/test_subtitles.py
@@ -3,29 +3,29 @@
import os
import sys
import unittest
-sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from test.helper import FakeYDL, md5, is_download_test
+sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+from test.helper import FakeYDL, is_download_test, md5
from yt_dlp.extractor import (
- YoutubeIE,
- DailymotionIE,
- TedTalkIE,
- VimeoIE,
- WallaIE,
- CeskaTelevizeIE,
- LyndaIE,
NPOIE,
+ NRKTVIE,
PBSIE,
+ CeskaTelevizeIE,
ComedyCentralIE,
- NRKTVIE,
+ DailymotionIE,
+ DemocracynowIE,
+ LyndaIE,
RaiPlayIE,
- VikiIE,
- ThePlatformIE,
- ThePlatformFeedIE,
RTVEALaCartaIE,
- DemocracynowIE,
+ TedTalkIE,
+ ThePlatformFeedIE,
+ ThePlatformIE,
+ VikiIE,
+ VimeoIE,
+ WallaIE,
+ YoutubeIE,
)
diff --git a/test/test_update.py.disabled b/test/test_update.py.disabled
index 5f0794ae2..389b8ffe5 100644
--- a/test/test_update.py.disabled
+++ b/test/test_update.py.disabled
@@ -3,10 +3,12 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import json
+
from yt_dlp.update import rsa_verify
diff --git a/test/test_utils.py b/test/test_utils.py
index e0c862807..7909dc61c 100644
--- a/test/test_utils.py
+++ b/test/test_utils.py
@@ -3,6 +3,7 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@@ -12,75 +13,95 @@ import itertools
import json
import xml.etree.ElementTree
+from yt_dlp.compat import (
+ compat_chr,
+ compat_etree_fromstring,
+ compat_getenv,
+ compat_HTMLParseError,
+ compat_os_name,
+ compat_setenv,
+)
from yt_dlp.utils import (
+ Config,
+ DateRange,
+ ExtractorError,
+ InAdvancePagedList,
+ LazyList,
+ OnDemandPagedList,
age_restricted,
args_to_str,
- encode_base_n,
+ base_url,
caesar,
clean_html,
clean_podcast_url,
- Config,
+ cli_bool_option,
+ cli_option,
+ cli_valueless_option,
date_from_str,
datetime_from_str,
- DateRange,
detect_exe_version,
determine_ext,
+ dfxp2srt,
dict_get,
+ encode_base_n,
encode_compat_str,
encodeFilename,
escape_rfc3986,
escape_url,
+ expand_path,
extract_attributes,
- ExtractorError,
find_xpath_attr,
fix_xml_ampersands,
- format_bytes,
float_or_none,
- get_element_by_class,
+ format_bytes,
get_element_by_attribute,
- get_elements_by_class,
- get_elements_by_attribute,
- get_element_html_by_class,
+ get_element_by_class,
get_element_html_by_attribute,
- get_elements_html_by_class,
+ get_element_html_by_class,
+ get_element_text_and_html_by_tag,
+ get_elements_by_attribute,
+ get_elements_by_class,
get_elements_html_by_attribute,
+ get_elements_html_by_class,
get_elements_text_and_html_by_attribute,
- get_element_text_and_html_by_tag,
- InAdvancePagedList,
int_or_none,
intlist_to_bytes,
+ iri_to_uri,
is_html,
js_to_json,
limit_length,
locked_file,
+ lowercase_escape,
+ match_str,
merge_dicts,
mimetype2ext,
month_by_name,
multipart_encode,
ohdave_rsa_encrypt,
- OnDemandPagedList,
orderedSet,
parse_age_limit,
+ parse_bitrate,
+ parse_codecs,
+ parse_count,
+ parse_dfxp_time_expr,
parse_duration,
parse_filesize,
- parse_count,
parse_iso8601,
- parse_resolution,
- parse_bitrate,
parse_qs,
+ parse_resolution,
pkcs1pad,
+ prepend_extension,
read_batch_urls,
+ remove_end,
+ remove_quotes,
+ remove_start,
+ render_table,
+ replace_extension,
+ rot47,
sanitize_filename,
sanitize_path,
sanitize_url,
sanitized_Request,
- expand_path,
- prepend_extension,
- replace_extension,
- remove_start,
- remove_end,
- remove_quotes,
- rot47,
shell_quote,
smuggle_url,
str_to_int,
@@ -92,38 +113,18 @@ from yt_dlp.utils import (
unified_strdate,
unified_timestamp,
unsmuggle_url,
+ update_url_query,
uppercase_escape,
- lowercase_escape,
url_basename,
url_or_none,
- base_url,
- urljoin,
urlencode_postdata,
+ urljoin,
urshift,
- update_url_query,
version_tuple,
- xpath_with_ns,
+ xpath_attr,
xpath_element,
xpath_text,
- xpath_attr,
- render_table,
- match_str,
- parse_dfxp_time_expr,
- dfxp2srt,
- cli_option,
- cli_valueless_option,
- cli_bool_option,
- parse_codecs,
- iri_to_uri,
- LazyList,
-)
-from yt_dlp.compat import (
- compat_chr,
- compat_etree_fromstring,
- compat_getenv,
- compat_HTMLParseError,
- compat_os_name,
- compat_setenv,
+ xpath_with_ns,
)
diff --git a/test/test_verbose_output.py b/test/test_verbose_output.py
index 17aeafbc0..1213a9726 100644
--- a/test/test_verbose_output.py
+++ b/test/test_verbose_output.py
@@ -1,9 +1,9 @@
#!/usr/bin/env python3
-import unittest
-
-import sys
import os
import subprocess
+import sys
+import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
rootDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
diff --git a/test/test_write_annotations.py.disabled b/test/test_write_annotations.py.disabled
index 4173fd09d..bf13efe2c 100644
--- a/test/test_write_annotations.py.disabled
+++ b/test/test_write_annotations.py.disabled
@@ -3,17 +3,15 @@
import os
import sys
import unittest
-sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-
-from test.helper import get_params, try_rm, is_download_test
+sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import io
-
import xml.etree.ElementTree
+from test.helper import get_params, is_download_test, try_rm
-import yt_dlp.YoutubeDL
import yt_dlp.extractor
+import yt_dlp.YoutubeDL
class YoutubeDL(yt_dlp.YoutubeDL):
diff --git a/test/test_youtube_lists.py b/test/test_youtube_lists.py
index 8691abb67..66611e236 100644
--- a/test/test_youtube_lists.py
+++ b/test/test_youtube_lists.py
@@ -3,14 +3,12 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from test.helper import FakeYDL, is_download_test
-from yt_dlp.extractor import (
- YoutubeIE,
- YoutubeTabIE,
-)
+from yt_dlp.extractor import YoutubeIE, YoutubeTabIE
@is_download_test
diff --git a/test/test_youtube_misc.py b/test/test_youtube_misc.py
index 70d6d9949..36f8be689 100644
--- a/test/test_youtube_misc.py
+++ b/test/test_youtube_misc.py
@@ -3,6 +3,7 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
diff --git a/test/test_youtube_signature.py b/test/test_youtube_signature.py
index d751d5396..ca23c910d 100644
--- a/test/test_youtube_signature.py
+++ b/test/test_youtube_signature.py
@@ -3,16 +3,17 @@
import os
import sys
import unittest
+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import re
import string
import urllib.request
-
from test.helper import FakeYDL, is_download_test
+
+from yt_dlp.compat import compat_str
from yt_dlp.extractor import YoutubeIE
from yt_dlp.jsinterp import JSInterpreter
-from yt_dlp.compat import compat_str
_SIG_TESTS = [
(
diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py
index 56f0346dc..a8bb7f45c 100644
--- a/yt_dlp/YoutubeDL.py
+++ b/yt_dlp/YoutubeDL.py
@@ -12,6 +12,7 @@ import locale
import operator
import os
import platform
+import random
import re
import shutil
import subprocess
@@ -20,13 +21,12 @@ import tempfile
import time
import tokenize
import traceback
-import random
import unicodedata
import urllib.request
-
from enum import Enum
from string import ascii_letters
+from .cache import Cache
from .compat import (
compat_brotli,
compat_get_terminal_size,
@@ -39,74 +39,100 @@ from .compat import (
windows_enable_vt_mode,
)
from .cookies import load_cookies
+from .downloader import FFmpegFD, get_suitable_downloader, shorten_protocol_name
+from .downloader.rtmp import rtmpdump_version
+from .extractor import _LAZY_LOADER
+from .extractor import _PLUGIN_CLASSES as plugin_extractors
+from .extractor import gen_extractor_classes, get_info_extractor
+from .extractor.openload import PhantomJSwrapper
+from .minicurses import format_text
+from .postprocessor import _PLUGIN_CLASSES as plugin_postprocessors
+from .postprocessor import (
+ EmbedThumbnailPP,
+ FFmpegFixupDuplicateMoovPP,
+ FFmpegFixupDurationPP,
+ FFmpegFixupM3u8PP,
+ FFmpegFixupM4aPP,
+ FFmpegFixupStretchedPP,
+ FFmpegFixupTimestampPP,
+ FFmpegMergerPP,
+ FFmpegPostProcessor,
+ MoveFilesAfterDownloadPP,
+ get_postprocessor,
+)
+from .update import detect_variant
from .utils import (
+ DEFAULT_OUTTMPL,
+ LINK_TEMPLATES,
+ NO_DEFAULT,
+ OUTTMPL_TYPES,
+ POSTPROCESS_WHEN,
+ STR_FORMAT_RE_TMPL,
+ STR_FORMAT_TYPES,
+ ContentTooShortError,
+ DateRange,
+ DownloadCancelled,
+ DownloadError,
+ EntryNotInPlaylist,
+ ExistingVideoReached,
+ ExtractorError,
+ GeoRestrictedError,
+ HEADRequest,
+ InAdvancePagedList,
+ ISO3166Utils,
+ LazyList,
+ MaxDownloadsReached,
+ PagedList,
+ PerRequestProxyHandler,
+ Popen,
+ PostProcessingError,
+ ReExtractInfo,
+ RejectedVideoReached,
+ SameFileError,
+ UnavailableVideoError,
+ YoutubeDLCookieProcessor,
+ YoutubeDLHandler,
+ YoutubeDLRedirectHandler,
age_restricted,
args_to_str,
- ContentTooShortError,
date_from_str,
- DateRange,
- DEFAULT_OUTTMPL,
determine_ext,
determine_protocol,
- DownloadCancelled,
- DownloadError,
encode_compat_str,
encodeFilename,
- EntryNotInPlaylist,
error_to_compat_str,
- ExistingVideoReached,
expand_path,
- ExtractorError,
filter_dict,
float_or_none,
format_bytes,
- format_field,
format_decimal_suffix,
+ format_field,
formatSeconds,
- GeoRestrictedError,
get_domain,
has_certifi,
- HEADRequest,
- InAdvancePagedList,
int_or_none,
iri_to_uri,
- ISO3166Utils,
join_nonempty,
- LazyList,
- LINK_TEMPLATES,
locked_file,
make_dir,
make_HTTPS_handler,
- MaxDownloadsReached,
merge_headers,
network_exceptions,
- NO_DEFAULT,
number_of_digits,
orderedSet,
- OUTTMPL_TYPES,
- PagedList,
parse_filesize,
- PerRequestProxyHandler,
platform_name,
- Popen,
- POSTPROCESS_WHEN,
- PostProcessingError,
preferredencoding,
prepend_extension,
- ReExtractInfo,
register_socks_protocols,
- RejectedVideoReached,
remove_terminal_sequences,
render_table,
replace_extension,
- SameFileError,
sanitize_filename,
sanitize_path,
sanitize_url,
sanitized_Request,
std_headers,
- STR_FORMAT_RE_TMPL,
- STR_FORMAT_TYPES,
str_or_none,
strftime_or_none,
subtitles_filename,
@@ -115,47 +141,13 @@ from .utils import (
to_high_limit_path,
traverse_obj,
try_get,
- UnavailableVideoError,
url_basename,
variadic,
version_tuple,
write_json_file,
write_string,
- YoutubeDLCookieProcessor,
- YoutubeDLHandler,
- YoutubeDLRedirectHandler,
-)
-from .cache import Cache
-from .minicurses import format_text
-from .extractor import (
- gen_extractor_classes,
- get_info_extractor,
- _LAZY_LOADER,
- _PLUGIN_CLASSES as plugin_extractors
-)
-from .extractor.openload import PhantomJSwrapper
-from .downloader import (
- FFmpegFD,
- get_suitable_downloader,
- shorten_protocol_name
-)
-from .downloader.rtmp import rtmpdump_version
-from .postprocessor import (
- get_postprocessor,
- EmbedThumbnailPP,
- FFmpegFixupDuplicateMoovPP,
- FFmpegFixupDurationPP,
- FFmpegFixupM3u8PP,
- FFmpegFixupM4aPP,
- FFmpegFixupStretchedPP,
- FFmpegFixupTimestampPP,
- FFmpegMergerPP,
- FFmpegPostProcessor,
- MoveFilesAfterDownloadPP,
- _PLUGIN_CLASSES as plugin_postprocessors
)
-from .update import detect_variant
-from .version import __version__, RELEASE_GIT_HEAD
+from .version import RELEASE_GIT_HEAD, __version__
if compat_os_name == 'nt':
import ctypes
@@ -3666,9 +3658,9 @@ class YoutubeDL:
) or 'none'
write_debug('exe versions: %s' % exe_str)
+ from .cookies import SECRETSTORAGE_AVAILABLE, SQLITE_AVAILABLE
from .downloader.websocket import has_websockets
from .postprocessor.embedthumbnail import has_mutagen
- from .cookies import SQLITE_AVAILABLE, SECRETSTORAGE_AVAILABLE
lib_str = join_nonempty(
compat_brotli and compat_brotli.__name__,
diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py
index 91bf5c4ce..f339e4cd1 100644
--- a/yt_dlp/__init__.py
+++ b/yt_dlp/__init__.py
@@ -9,48 +9,44 @@ import random
import re
import sys
+from .compat import compat_getpass, compat_os_name, compat_shlex_quote
+from .cookies import SUPPORTED_BROWSERS, SUPPORTED_KEYRINGS
+from .downloader import FileDownloader
+from .extractor import gen_extractors, list_extractors
+from .extractor.adobepass import MSO_INFO
+from .extractor.common import InfoExtractor
from .options import parseOpts
-from .compat import (
- compat_getpass,
- compat_os_name,
- compat_shlex_quote,
+from .postprocessor import (
+ FFmpegExtractAudioPP,
+ FFmpegSubtitlesConvertorPP,
+ FFmpegThumbnailsConvertorPP,
+ FFmpegVideoConvertorPP,
+ FFmpegVideoRemuxerPP,
+ MetadataFromFieldPP,
+ MetadataParserPP,
)
-from .cookies import SUPPORTED_BROWSERS, SUPPORTED_KEYRINGS
+from .update import run_update
from .utils import (
+ NO_DEFAULT,
DateRange,
- decodeOption,
DownloadCancelled,
DownloadError,
+ GeoUtils,
+ SameFileError,
+ decodeOption,
expand_path,
float_or_none,
- GeoUtils,
int_or_none,
match_filter_func,
- NO_DEFAULT,
parse_duration,
preferredencoding,
read_batch_urls,
render_table,
- SameFileError,
setproctitle,
std_headers,
traverse_obj,
write_string,
)
-from .update import run_update
-from .downloader import FileDownloader
-from .extractor import gen_extractors, list_extractors
-from .extractor.common import InfoExtractor
-from .extractor.adobepass import MSO_INFO
-from .postprocessor import (
- FFmpegExtractAudioPP,
- FFmpegSubtitlesConvertorPP,
- FFmpegThumbnailsConvertorPP,
- FFmpegVideoConvertorPP,
- FFmpegVideoRemuxerPP,
- MetadataFromFieldPP,
- MetadataParserPP,
-)
from .YoutubeDL import YoutubeDL
diff --git a/yt_dlp/aes.py b/yt_dlp/aes.py
index e5d73f740..01818df61 100644
--- a/yt_dlp/aes.py
+++ b/yt_dlp/aes.py
@@ -1,15 +1,7 @@
from math import ceil
-from .compat import (
- compat_b64decode,
- compat_ord,
- compat_pycrypto_AES,
-)
-from .utils import (
- bytes_to_intlist,
- intlist_to_bytes,
-)
-
+from .compat import compat_b64decode, compat_ord, compat_pycrypto_AES
+from .utils import bytes_to_intlist, intlist_to_bytes
if compat_pycrypto_AES:
def aes_cbc_decrypt_bytes(data, key, iv):
diff --git a/yt_dlp/cache.py b/yt_dlp/cache.py
index f93ef85e7..0cac3ee88 100644
--- a/yt_dlp/cache.py
+++ b/yt_dlp/cache.py
@@ -6,10 +6,7 @@ import shutil
import traceback
from .compat import compat_getenv
-from .utils import (
- expand_path,
- write_json_file,
-)
+from .utils import expand_path, write_json_file
class Cache:
diff --git a/yt_dlp/cookies.py b/yt_dlp/cookies.py
index 1d92fd8ce..6ff9f6f2d 100644
--- a/yt_dlp/cookies.py
+++ b/yt_dlp/cookies.py
@@ -16,17 +16,9 @@ from .aes import (
aes_gcm_decrypt_and_verify_bytes,
unpad_pkcs7,
)
-from .compat import (
- compat_b64decode,
- compat_cookiejar_Cookie,
-)
+from .compat import compat_b64decode, compat_cookiejar_Cookie
from .minicurses import MultilinePrinter, QuietMultilinePrinter
-from .utils import (
- error_to_str,
- expand_path,
- Popen,
- YoutubeDLCookieJar,
-)
+from .utils import Popen, YoutubeDLCookieJar, error_to_str, expand_path
try:
import sqlite3
diff --git a/yt_dlp/downloader/__init__.py b/yt_dlp/downloader/__init__.py
index f5abfd5df..5aba303dd 100644
--- a/yt_dlp/downloader/__init__.py
+++ b/yt_dlp/downloader/__init__.py
@@ -1,8 +1,5 @@
from ..compat import compat_str
-from ..utils import (
- determine_protocol,
- NO_DEFAULT
-)
+from ..utils import NO_DEFAULT, determine_protocol
def get_suitable_downloader(info_dict, params={}, default=NO_DEFAULT, protocol=None, to_stdout=False):
@@ -27,21 +24,18 @@ def get_suitable_downloader(info_dict, params={}, default=NO_DEFAULT, protocol=N
# Some of these require get_suitable_downloader
from .common import FileDownloader
from .dash import DashSegmentsFD
+from .external import FFmpegFD, get_external_downloader
from .f4m import F4mFD
from .fc2 import FC2LiveFD
from .hls import HlsFD
from .http import HttpFD
-from .rtmp import RtmpFD
-from .rtsp import RtspFD
from .ism import IsmFD
from .mhtml import MhtmlFD
from .niconico import NiconicoDmcFD
+from .rtmp import RtmpFD
+from .rtsp import RtspFD
from .websocket import WebSocketFragmentFD
from .youtube_live_chat import YoutubeLiveChatFD
-from .external import (
- get_external_downloader,
- FFmpegFD,
-)
PROTOCOL_MAP = {
'rtmp': RtmpFD,
diff --git a/yt_dlp/downloader/common.py b/yt_dlp/downloader/common.py
index d42539931..3033926ae 100644
--- a/yt_dlp/downloader/common.py
+++ b/yt_dlp/downloader/common.py
@@ -1,26 +1,26 @@
+import errno
import os
+import random
import re
import time
-import random
-import errno
+from ..minicurses import (
+ BreaklineStatusPrinter,
+ MultilineLogger,
+ MultilinePrinter,
+ QuietMultilinePrinter,
+)
from ..utils import (
+ LockingUnsupportedError,
decodeArgument,
encodeFilename,
error_to_compat_str,
format_bytes,
- LockingUnsupportedError,
sanitize_open,
shell_quote,
timeconvert,
timetuple_from_msec,
)
-from ..minicurses import (
- MultilineLogger,
- MultilinePrinter,
- QuietMultilinePrinter,
- BreaklineStatusPrinter
-)
class FileDownloader:
diff --git a/yt_dlp/downloader/dash.py b/yt_dlp/downloader/dash.py
index 64eb5e66a..e6efae485 100644
--- a/yt_dlp/downloader/dash.py
+++ b/yt_dlp/downloader/dash.py
@@ -1,8 +1,7 @@
import time
-from ..downloader import get_suitable_downloader
from .fragment import FragmentFD
-
+from ..downloader import get_suitable_downloader
from ..utils import urljoin
diff --git a/yt_dlp/downloader/external.py b/yt_dlp/downloader/external.py
index b6dd32701..6c5616c60 100644
--- a/yt_dlp/downloader/external.py
+++ b/yt_dlp/downloader/external.py
@@ -5,23 +5,20 @@ import sys
import time
from .fragment import FragmentFD
-from ..compat import (
- compat_setenv,
- compat_str,
-)
-from ..postprocessor.ffmpeg import FFmpegPostProcessor, EXT_TO_OUT_FORMATS
+from ..compat import compat_setenv, compat_str
+from ..postprocessor.ffmpeg import EXT_TO_OUT_FORMATS, FFmpegPostProcessor
from ..utils import (
+ Popen,
+ _configuration_args,
+ check_executable,
classproperty,
+ cli_bool_option,
cli_option,
cli_valueless_option,
- cli_bool_option,
- _configuration_args,
determine_ext,
- encodeFilename,
encodeArgument,
+ encodeFilename,
handle_youtubedl_headers,
- check_executable,
- Popen,
remove_end,
)
diff --git a/yt_dlp/downloader/f4m.py b/yt_dlp/downloader/f4m.py
index 414071075..12ecec008 100644
--- a/yt_dlp/downloader/f4m.py
+++ b/yt_dlp/downloader/f4m.py
@@ -6,16 +6,13 @@ from .fragment import FragmentFD
from ..compat import (
compat_b64decode,
compat_etree_fromstring,
- compat_urlparse,
- compat_urllib_error,
- compat_urllib_parse_urlparse,
compat_struct_pack,
compat_struct_unpack,
+ compat_urllib_error,
+ compat_urllib_parse_urlparse,
+ compat_urlparse,
)
-from ..utils import (
- fix_xml_ampersands,
- xpath_text,
-)
+from ..utils import fix_xml_ampersands, xpath_text
class DataTruncatedError(Exception):
diff --git a/yt_dlp/downloader/fragment.py b/yt_dlp/downloader/fragment.py
index 217b89e3f..a2a2fe950 100644
--- a/yt_dlp/downloader/fragment.py
+++ b/yt_dlp/downloader/fragment.py
@@ -13,15 +13,11 @@ except ImportError:
from .common import FileDownloader
from .http import HttpFD
from ..aes import aes_cbc_decrypt_bytes, unpad_pkcs7
-from ..compat import (
- compat_os_name,
- compat_urllib_error,
- compat_struct_pack,
-)
+from ..compat import compat_os_name, compat_struct_pack, compat_urllib_error
from ..utils import (
DownloadError,
- error_to_compat_str,
encodeFilename,
+ error_to_compat_str,
sanitized_Request,
traverse_obj,
)
diff --git a/yt_dlp/downloader/hls.py b/yt_dlp/downloader/hls.py
index 00695f93f..2d65f48ae 100644
--- a/yt_dlp/downloader/hls.py
+++ b/yt_dlp/downloader/hls.py
@@ -1,21 +1,13 @@
-import re
-import io
import binascii
+import io
+import re
-from ..downloader import get_suitable_downloader
-from .fragment import FragmentFD
from .external import FFmpegFD
-
-from ..compat import (
- compat_pycrypto_AES,
- compat_urlparse,
-)
-from ..utils import (
- parse_m3u8_attributes,
- update_url_query,
- bug_reports_message,
-)
+from .fragment import FragmentFD
from .. import webvtt
+from ..compat import compat_pycrypto_AES, compat_urlparse
+from ..downloader import get_suitable_downloader
+from ..utils import bug_reports_message, parse_m3u8_attributes, update_url_query
class HlsFD(FragmentFD):
diff --git a/yt_dlp/downloader/http.py b/yt_dlp/downloader/http.py
index 03efbf1cd..d590dbfbd 100644
--- a/yt_dlp/downloader/http.py
+++ b/yt_dlp/downloader/http.py
@@ -1,24 +1,21 @@
import os
+import random
import ssl
import time
-import random
from .common import FileDownloader
-from ..compat import (
- compat_urllib_error,
- compat_http_client
-)
+from ..compat import compat_http_client, compat_urllib_error
from ..utils import (
ContentTooShortError,
+ ThrottledDownload,
+ XAttrMetadataError,
+ XAttrUnavailableError,
encodeFilename,
int_or_none,
parse_http_range,
sanitized_Request,
- ThrottledDownload,
try_call,
write_xattr,
- XAttrMetadataError,
- XAttrUnavailableError,
)
RESPONSE_READ_EXCEPTIONS = (TimeoutError, ConnectionError, ssl.SSLError, compat_http_client.HTTPException)
diff --git a/yt_dlp/downloader/ism.py b/yt_dlp/downloader/ism.py
index ca4ca3a19..82ed51e88 100644
--- a/yt_dlp/downloader/ism.py
+++ b/yt_dlp/downloader/ism.py
@@ -1,13 +1,10 @@
-import time
import binascii
import io
import struct
+import time
from .fragment import FragmentFD
-from ..compat import (
- compat_urllib_error,
-)
-
+from ..compat import compat_urllib_error
u8 = struct.Struct('>B')
u88 = struct.Struct('>Bx')
diff --git a/yt_dlp/downloader/mhtml.py b/yt_dlp/downloader/mhtml.py
index 5a322f1db..7bc3ab049 100644
--- a/yt_dlp/downloader/mhtml.py
+++ b/yt_dlp/downloader/mhtml.py
@@ -4,12 +4,7 @@ import re
import uuid
from .fragment import FragmentFD
-from ..utils import (
- escapeHTML,
- formatSeconds,
- srt_subtitles_timecode,
- urljoin,
-)
+from ..utils import escapeHTML, formatSeconds, srt_subtitles_timecode, urljoin
from ..version import __version__ as YT_DLP_VERSION
diff --git a/yt_dlp/downloader/rtmp.py b/yt_dlp/downloader/rtmp.py
index 12aa04cf3..3464eeef9 100644
--- a/yt_dlp/downloader/rtmp.py
+++ b/yt_dlp/downloader/rtmp.py
@@ -6,11 +6,11 @@ import time
from .common import FileDownloader
from ..compat import compat_str
from ..utils import (
+ Popen,
check_executable,
- encodeFilename,
encodeArgument,
+ encodeFilename,
get_exe_version,
- Popen,
)
diff --git a/yt_dlp/downloader/rtsp.py b/yt_dlp/downloader/rtsp.py
index 26dbd9ef7..e89269fed 100644
--- a/yt_dlp/downloader/rtsp.py
+++ b/yt_dlp/downloader/rtsp.py
@@ -2,10 +2,7 @@ import os
import subprocess
from .common import FileDownloader
-from ..utils import (
- check_executable,
- encodeFilename,
-)
+from ..utils import check_executable, encodeFilename
class RtspFD(FileDownloader):
diff --git a/yt_dlp/downloader/websocket.py b/yt_dlp/downloader/websocket.py
index daac34884..96d113846 100644
--- a/yt_dlp/downloader/websocket.py
+++ b/yt_dlp/downloader/websocket.py
@@ -1,6 +1,6 @@
+import asyncio
import os
import signal
-import asyncio
import threading
try:
diff --git a/yt_dlp/downloader/youtube_live_chat.py b/yt_dlp/downloader/youtube_live_chat.py
index 36c82b03b..7f06dfb48 100644
--- a/yt_dlp/downloader/youtube_live_chat.py
+++ b/yt_dlp/downloader/youtube_live_chat.py
@@ -3,13 +3,8 @@ import time
from .fragment import FragmentFD
from ..compat import compat_urllib_error
-from ..utils import (
- try_get,
- dict_get,
- int_or_none,
- RegexNotFoundError,
-)
from ..extractor.youtube import YoutubeBaseInfoExtractor as YT_BaseIE
+from ..utils import RegexNotFoundError, dict_get, int_or_none, try_get
class YoutubeLiveChatFD(FragmentFD):
diff --git a/yt_dlp/extractor/abematv.py b/yt_dlp/extractor/abematv.py
index c7db05475..0dc8dea26 100644
--- a/yt_dlp/extractor/abematv.py
+++ b/yt_dlp/extractor/abematv.py
@@ -1,35 +1,31 @@
-import io
-import json
-import time
+import base64
+import binascii
import hashlib
import hmac
+import io
+import json
import re
import struct
+import time
import urllib.response
import uuid
-from base64 import urlsafe_b64encode
-from binascii import unhexlify
from .common import InfoExtractor
from ..aes import aes_ecb_decrypt
-from ..compat import (
- compat_urllib_parse_urlparse,
- compat_urllib_request,
-)
+from ..compat import compat_urllib_parse_urlparse, compat_urllib_request
from ..utils import (
ExtractorError,
+ bytes_to_intlist,
decode_base,
int_or_none,
+ intlist_to_bytes,
request_to_url,
time_seconds,
- update_url_query,
traverse_obj,
- intlist_to_bytes,
- bytes_to_intlist,
+ update_url_query,
urljoin,
)
-
# NOTE: network handler related code is temporary thing until network stack overhaul PRs are merged (#2861/#2862)
def add_opener(ydl, handler):
@@ -130,7 +126,7 @@ class AbemaLicenseHandler(compat_urllib_request.BaseHandler):
encvideokey = bytes_to_intlist(struct.pack('>QQ', res >> 64, res & 0xffffffffffffffff))
h = hmac.new(
- unhexlify(self.HKEY),
+ binascii.unhexlify(self.HKEY),
(license_response['cid'] + self.ie._DEVICE_ID).encode('utf-8'),
digestmod=hashlib.sha256)
enckey = bytes_to_intlist(h.digest())
@@ -238,7 +234,7 @@ class AbemaTVIE(AbemaTVBaseIE):
def mix_twist(nonce):
nonlocal tmp
- mix_once(urlsafe_b64encode(tmp).rstrip(b'=') + nonce)
+ mix_once(base64.urlsafe_b64encode(tmp).rstrip(b'=') + nonce)
mix_once(self._SECRETKEY)
mix_tmp(time_struct.tm_mon)
@@ -247,7 +243,7 @@ class AbemaTVIE(AbemaTVBaseIE):
mix_twist(ts_1hour_str)
mix_tmp(time_struct.tm_hour % 5)
- return urlsafe_b64encode(tmp).rstrip(b'=').decode('utf-8')
+ return base64.urlsafe_b64encode(tmp).rstrip(b'=').decode('utf-8')
def _get_device_token(self):
if self._USERTOKEN:
diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py
index ef22c7876..10b297708 100644
--- a/yt_dlp/extractor/common.py
+++ b/yt_dlp/extractor/common.py
@@ -1,16 +1,16 @@
import base64
import collections
-import xml.etree.ElementTree
import hashlib
import itertools
import json
+import math
import netrc
import os
import random
import re
import sys
import time
-import math
+import xml.etree.ElementTree
from ..compat import (
compat_cookiejar_Cookie,
@@ -29,11 +29,15 @@ from ..compat import (
compat_urlparse,
)
from ..downloader import FileDownloader
-from ..downloader.f4m import (
- get_base_url,
- remove_encrypted_media,
-)
+from ..downloader.f4m import get_base_url, remove_encrypted_media
from ..utils import (
+ JSON_LD_RE,
+ NO_DEFAULT,
+ ExtractorError,
+ GeoRestrictedError,
+ GeoUtils,
+ RegexNotFoundError,
+ UnsupportedError,
age_restricted,
base_url,
bug_reports_message,
@@ -44,20 +48,15 @@ from ..utils import (
encode_data_uri,
error_to_compat_str,
extract_attributes,
- ExtractorError,
filter_dict,
fix_xml_ampersands,
float_or_none,
format_field,
- GeoRestrictedError,
- GeoUtils,
int_or_none,
join_nonempty,
js_to_json,
- JSON_LD_RE,
mimetype2ext,
network_exceptions,
- NO_DEFAULT,
orderedSet,
parse_bitrate,
parse_codecs,
@@ -65,7 +64,6 @@ from ..utils import (
parse_iso8601,
parse_m3u8_attributes,
parse_resolution,
- RegexNotFoundError,
sanitize_filename,
sanitized_Request,
str_or_none,
@@ -74,7 +72,6 @@ from ..utils import (
traverse_obj,
try_get,
unescapeHTML,
- UnsupportedError,
unified_strdate,
unified_timestamp,
update_Request,
diff --git a/yt_dlp/extractor/commonprotocols.py b/yt_dlp/extractor/commonprotocols.py
index 40475f7ec..e8f19b9e0 100644
--- a/yt_dlp/extractor/commonprotocols.py
+++ b/yt_dlp/extractor/commonprotocols.py
@@ -1,7 +1,5 @@
from .common import InfoExtractor
-from ..compat import (
- compat_urlparse,
-)
+from ..compat import compat_urlparse
class RtmpIE(InfoExtractor):
diff --git a/yt_dlp/extractor/generic.py b/yt_dlp/extractor/generic.py
index f44f19a54..c708b4cee 100644
--- a/yt_dlp/extractor/generic.py
+++ b/yt_dlp/extractor/generic.py
@@ -2,8 +2,107 @@ import os
import re
import xml.etree.ElementTree
+from .ant1newsgr import Ant1NewsGrEmbedIE
+from .anvato import AnvatoIE
+from .apa import APAIE
+from .arcpublishing import ArcPublishingIE
+from .arkena import ArkenaIE
+from .arte import ArteTVEmbedIE
+from .bitchute import BitChuteIE
+from .blogger import BloggerIE
+from .brightcove import BrightcoveLegacyIE, BrightcoveNewIE
+from .channel9 import Channel9IE
+from .cloudflarestream import CloudflareStreamIE
from .common import InfoExtractor
+from .commonprotocols import RtmpIE
+from .condenast import CondeNastIE
+from .dailymail import DailyMailIE
+from .dailymotion import DailymotionIE
+from .dbtv import DBTVIE
+from .digiteka import DigitekaIE
+from .drtuber import DrTuberIE
+from .eagleplatform import EaglePlatformIE
+from .ertgr import ERTWebtvEmbedIE
+from .expressen import ExpressenIE
+from .facebook import FacebookIE
+from .foxnews import FoxNewsIE
+from .gedidigital import GediDigitalIE
+from .gfycat import GfycatIE
+from .glomex import GlomexEmbedIE
+from .googledrive import GoogleDriveIE
+from .indavideo import IndavideoEmbedIE
+from .instagram import InstagramIE
+from .joj import JojIE
+from .jwplatform import JWPlatformIE
+from .kaltura import KalturaIE
+from .kinja import KinjaEmbedIE
+from .limelight import LimelightBaseIE
+from .mainstreaming import MainStreamingIE
+from .medialaan import MedialaanIE
+from .mediaset import MediasetIE
+from .mediasite import MediasiteIE
+from .megaphone import MegaphoneIE
+from .megatvcom import MegaTVComEmbedIE
+from .mofosex import MofosexEmbedIE
+from .mtv import MTVServicesEmbeddedIE
+from .myvi import MyviIE
+from .nbc import NBCSportsVPlayerIE
+from .nexx import NexxEmbedIE, NexxIE
+from .odnoklassniki import OdnoklassnikiIE
+from .onionstudios import OnionStudiosIE
+from .ooyala import OoyalaIE
+from .panopto import PanoptoBaseIE
+from .peertube import PeerTubeIE
+from .piksel import PikselIE
+from .pladform import PladformIE
+from .pornhub import PornHubIE
+from .rcs import RCSEmbedsIE
+from .redtube import RedTubeIE
+from .rumble import RumbleEmbedIE
+from .rutube import RutubeIE
+from .rutv import RUTVIE
+from .ruutu import RuutuIE
+from .senategov import SenateISVPIE
+from .simplecast import SimplecastIE
+from .soundcloud import SoundcloudEmbedIE
+from .spankwire import SpankwireIE
+from .sportbox import SportBoxIE
+from .springboardplatform import SpringboardPlatformIE
+from .svt import SVTIE
+from .teachable import TeachableIE
+from .ted import TedEmbedIE
+from .theplatform import ThePlatformIE
+from .threeqsdn import ThreeQSDNIE
+from .tnaflix import TNAFlixNetworkEmbedIE
+from .tube8 import Tube8IE
+from .tunein import TuneInBaseIE
+from .tvc import TVCIE
+from .tvopengr import TVOpenGrEmbedIE
+from .tvp import TVPEmbedIE
+from .twentymin import TwentyMinutenIE
+from .udn import UDNEmbedIE
+from .ustream import UstreamIE
+from .vbox7 import Vbox7IE
+from .vice import ViceIE
+from .videa import VideaIE
+from .videomore import VideomoreIE
+from .videopress import VideoPressIE
+from .viewlift import ViewLiftEmbedIE
+from .vimeo import VHXEmbedIE, VimeoIE
+from .viqeo import ViqeoIE
+from .vk import VKIE
+from .vshare import VShareIE
+from .vzaar import VzaarIE
+from .washingtonpost import WashingtonPostIE
+from .webcaster import WebcasterFeedIE
+from .wimtv import WimTVIE
+from .wistia import WistiaIE
+from .xfileshare import XFileShareIE
+from .xhamster import XHamsterEmbedIE
+from .yapfiles import YapFilesIE
+from .youporn import YouPornIE
from .youtube import YoutubeIE
+from .zype import ZypeIE
from ..compat import (
compat_etree_fromstring,
compat_str,
@@ -11,15 +110,16 @@ from ..compat import (
compat_urlparse,
)
from ..utils import (
+ KNOWN_EXTENSIONS,
+ ExtractorError,
+ HEADRequest,
+ UnsupportedError,
determine_ext,
dict_get,
- ExtractorError,
float_or_none,
- HEADRequest,
int_or_none,
is_html,
js_to_json,
- KNOWN_EXTENSIONS,
merge_dicts,
mimetype2ext,
orderedSet,
@@ -31,120 +131,11 @@ from ..utils import (
unescapeHTML,
unified_timestamp,
unsmuggle_url,
- UnsupportedError,
url_or_none,
xpath_attr,
xpath_text,
xpath_with_ns,
)
-from .commonprotocols import RtmpIE
-from .brightcove import (
- BrightcoveLegacyIE,
- BrightcoveNewIE,
-)
-from .nexx import (
- NexxIE,
- NexxEmbedIE,
-)
-from .nbc import NBCSportsVPlayerIE
-from .ooyala import OoyalaIE
-from .rutv import RUTVIE
-from .tvc import TVCIE
-from .sportbox import SportBoxIE
-from .myvi import MyviIE
-from .condenast import CondeNastIE
-from .udn import UDNEmbedIE
-from .senategov import SenateISVPIE
-from .svt import SVTIE
-from .pornhub import PornHubIE
-from .xhamster import XHamsterEmbedIE
-from .tnaflix import TNAFlixNetworkEmbedIE
-from .drtuber import DrTuberIE
-from .redtube import RedTubeIE
-from .tube8 import Tube8IE
-from .mofosex import MofosexEmbedIE
-from .spankwire import SpankwireIE
-from .youporn import YouPornIE
-from .vimeo import (
- VimeoIE,
- VHXEmbedIE,
-)
-from .dailymotion import DailymotionIE
-from .dailymail import DailyMailIE
-from .onionstudios import OnionStudiosIE
-from .viewlift import ViewLiftEmbedIE
-from .mtv import MTVServicesEmbeddedIE
-from .pladform import PladformIE
-from .videomore import VideomoreIE
-from .webcaster import WebcasterFeedIE
-from .googledrive import GoogleDriveIE
-from .jwplatform import JWPlatformIE
-from .digiteka import DigitekaIE
-from .arkena import ArkenaIE
-from .instagram import InstagramIE
-from .threeqsdn import ThreeQSDNIE
-from .theplatform import ThePlatformIE
-from .kaltura import KalturaIE
-from .eagleplatform import EaglePlatformIE
-from .facebook import FacebookIE
-from .soundcloud import SoundcloudEmbedIE
-from .tunein import TuneInBaseIE
-from .vbox7 import Vbox7IE
-from .dbtv import DBTVIE
-from .piksel import PikselIE
-from .videa import VideaIE
-from .twentymin import TwentyMinutenIE
-from .ustream import UstreamIE
-from .arte import ArteTVEmbedIE
-from .videopress import VideoPressIE
-from .rutube import RutubeIE
-from .glomex import GlomexEmbedIE
-from .megatvcom import MegaTVComEmbedIE
-from .ant1newsgr import Ant1NewsGrEmbedIE
-from .limelight import LimelightBaseIE
-from .anvato import AnvatoIE
-from .washingtonpost import WashingtonPostIE
-from .wistia import WistiaIE
-from .mediaset import MediasetIE
-from .joj import JojIE
-from .megaphone import MegaphoneIE
-from .vzaar import VzaarIE
-from .channel9 import Channel9IE
-from .vshare import VShareIE
-from .mediasite import MediasiteIE
-from .springboardplatform import SpringboardPlatformIE
-from .ted import TedEmbedIE
-from .yapfiles import YapFilesIE
-from .vice import ViceIE
-from .xfileshare import XFileShareIE
-from .cloudflarestream import CloudflareStreamIE
-from .peertube import PeerTubeIE
-from .teachable import TeachableIE
-from .indavideo import IndavideoEmbedIE
-from .apa import APAIE
-from .foxnews import FoxNewsIE
-from .viqeo import ViqeoIE
-from .expressen import ExpressenIE
-from .zype import ZypeIE
-from .odnoklassniki import OdnoklassnikiIE
-from .vk import VKIE
-from .kinja import KinjaEmbedIE
-from .gedidigital import GediDigitalIE
-from .rcs import RCSEmbedsIE
-from .bitchute import BitChuteIE
-from .rumble import RumbleEmbedIE
-from .arcpublishing import ArcPublishingIE
-from .medialaan import MedialaanIE
-from .simplecast import SimplecastIE
-from .wimtv import WimTVIE
-from .tvopengr import TVOpenGrEmbedIE
-from .ertgr import ERTWebtvEmbedIE
-from .tvp import TVPEmbedIE
-from .blogger import BloggerIE
-from .mainstreaming import MainStreamingIE
-from .gfycat import GfycatIE
-from .panopto import PanoptoBaseIE
-from .ruutu import RuutuIE
class GenericIE(InfoExtractor):
diff --git a/yt_dlp/extractor/mtv.py b/yt_dlp/extractor/mtv.py
index 3ef851e0b..d161c33c1 100644
--- a/yt_dlp/extractor/mtv.py
+++ b/yt_dlp/extractor/mtv.py
@@ -1,9 +1,7 @@
import re
from .common import InfoExtractor
-from ..compat import (
- compat_str,
-)
+from ..compat import compat_str
from ..utils import (
ExtractorError,
find_xpath_attr,
diff --git a/yt_dlp/extractor/noz.py b/yt_dlp/extractor/noz.py
index 22cb08e8a..b42a56f7e 100644
--- a/yt_dlp/extractor/noz.py
+++ b/yt_dlp/extractor/noz.py
@@ -1,13 +1,11 @@
from .common import InfoExtractor
-from ..compat import (
- compat_urllib_parse_unquote,
-)
from ..utils import (
int_or_none,
find_xpath_attr,
xpath_text,
update_url_query,
)
+from ..compat import compat_urllib_parse_unquote
class NozIE(InfoExtractor):
diff --git a/yt_dlp/extractor/openload.py b/yt_dlp/extractor/openload.py
index 41ef2e892..f2600aaa4 100644
--- a/yt_dlp/extractor/openload.py
+++ b/yt_dlp/extractor/openload.py
@@ -3,16 +3,14 @@ import os
import subprocess
import tempfile
-from ..compat import (
- compat_urlparse,
-)
+from ..compat import compat_urlparse
from ..utils import (
+ ExtractorError,
+ Popen,
check_executable,
encodeArgument,
- ExtractorError,
get_exe_version,
is_outdated_version,
- Popen,
)
diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py
index 21c6143bd..dee1b2315 100644
--- a/yt_dlp/extractor/youtube.py
+++ b/yt_dlp/extractor/youtube.py
@@ -10,9 +10,9 @@ import os.path
import random
import re
import sys
+import threading
import time
import traceback
-import threading
from .common import InfoExtractor, SearchInfoExtractor
from ..compat import (
@@ -27,12 +27,13 @@ from ..compat import (
)
from ..jsinterp import JSInterpreter
from ..utils import (
+ NO_DEFAULT,
+ ExtractorError,
bug_reports_message,
clean_html,
datetime_from_str,
dict_get,
error_to_compat_str,
- ExtractorError,
float_or_none,
format_field,
get_first,
@@ -42,7 +43,6 @@ from ..utils import (
js_to_json,
mimetype2ext,
network_exceptions,
- NO_DEFAULT,
orderedSet,
parse_codecs,
parse_count,
@@ -68,7 +68,6 @@ from ..utils import (
variadic,
)
-
# any clients starting with _ cannot be explicity requested by the user
INNERTUBE_CLIENTS = {
'web': {
diff --git a/yt_dlp/jsinterp.py b/yt_dlp/jsinterp.py
index 3695a282d..001836887 100644
--- a/yt_dlp/jsinterp.py
+++ b/yt_dlp/jsinterp.py
@@ -1,12 +1,9 @@
-from collections.abc import MutableMapping
import json
import operator
import re
+from collections.abc import MutableMapping
-from .utils import (
- ExtractorError,
- remove_quotes,
-)
+from .utils import ExtractorError, remove_quotes
_OPERATORS = [
('|', operator.or_),
diff --git a/yt_dlp/minicurses.py b/yt_dlp/minicurses.py
index d7a8ffddd..9fd679a48 100644
--- a/yt_dlp/minicurses.py
+++ b/yt_dlp/minicurses.py
@@ -1,7 +1,7 @@
import functools
from threading import Lock
-from .utils import supports_terminal_sequences, write_string
+from .utils import supports_terminal_sequences, write_string
CONTROL_SEQUENCES = {
'DOWN': '\n',
diff --git a/yt_dlp/options.py b/yt_dlp/options.py
index c434e32b9..243beab4d 100644
--- a/yt_dlp/options.py
+++ b/yt_dlp/options.py
@@ -1,26 +1,11 @@
-import os.path
import optparse
+import os.path
import re
import shlex
import sys
-from .compat import (
- compat_expanduser,
- compat_get_terminal_size,
- compat_getenv,
-)
-from .utils import (
- Config,
- expand_path,
- get_executable_path,
- OUTTMPL_TYPES,
- POSTPROCESS_WHEN,
- remove_end,
- write_string,
-)
+from .compat import compat_expanduser, compat_get_terminal_size, compat_getenv
from .cookies import SUPPORTED_BROWSERS, SUPPORTED_KEYRINGS
-from .version import __version__
-
from .downloader.external import list_external_downloaders
from .postprocessor import (
FFmpegExtractAudioPP,
@@ -30,6 +15,16 @@ from .postprocessor import (
SponsorBlockPP,
)
from .postprocessor.modify_chapters import DEFAULT_SPONSORBLOCK_CHAPTER_TITLE
+from .utils import (
+ OUTTMPL_TYPES,
+ POSTPROCESS_WHEN,
+ Config,
+ expand_path,
+ get_executable_path,
+ remove_end,
+ write_string,
+)
+from .version import __version__
def parseOpts(overrideArguments=None, ignore_config_files='if_override'):
diff --git a/yt_dlp/postprocessor/__init__.py b/yt_dlp/postprocessor/__init__.py
index e47631eb6..f168be46a 100644
--- a/yt_dlp/postprocessor/__init__.py
+++ b/yt_dlp/postprocessor/__init__.py
@@ -1,27 +1,25 @@
# flake8: noqa: F401
-from ..utils import load_plugins
-
from .common import PostProcessor
from .embedthumbnail import EmbedThumbnailPP
-from .exec import ExecPP, ExecAfterDownloadPP
+from .exec import ExecAfterDownloadPP, ExecPP
from .ffmpeg import (
- FFmpegPostProcessor,
- FFmpegCopyStreamPP,
FFmpegConcatPP,
+ FFmpegCopyStreamPP,
FFmpegEmbedSubtitlePP,
FFmpegExtractAudioPP,
FFmpegFixupDuplicateMoovPP,
FFmpegFixupDurationPP,
- FFmpegFixupStretchedPP,
- FFmpegFixupTimestampPP,
FFmpegFixupM3u8PP,
FFmpegFixupM4aPP,
+ FFmpegFixupStretchedPP,
+ FFmpegFixupTimestampPP,
FFmpegMergerPP,
FFmpegMetadataPP,
+ FFmpegPostProcessor,
+ FFmpegSplitChaptersPP,
FFmpegSubtitlesConvertorPP,
FFmpegThumbnailsConvertorPP,
- FFmpegSplitChaptersPP,
FFmpegVideoConvertorPP,
FFmpegVideoRemuxerPP,
)
@@ -35,6 +33,7 @@ from .movefilesafterdownload import MoveFilesAfterDownloadPP
from .sponskrub import SponSkrubPP
from .sponsorblock import SponsorBlockPP
from .xattrpp import XAttrMetadataPP
+from ..utils import load_plugins
_PLUGIN_CLASSES = load_plugins('postprocessor', 'PP', globals())
diff --git a/yt_dlp/postprocessor/common.py b/yt_dlp/postprocessor/common.py
index 3f55b24f2..ce6dec2f5 100644
--- a/yt_dlp/postprocessor/common.py
+++ b/yt_dlp/postprocessor/common.py
@@ -6,10 +6,10 @@ import time
import urllib.error
from ..utils import (
+ PostProcessingError,
_configuration_args,
encodeFilename,
network_exceptions,
- PostProcessingError,
sanitized_Request,
write_string,
)
diff --git a/yt_dlp/postprocessor/embedthumbnail.py b/yt_dlp/postprocessor/embedthumbnail.py
index 2fca97784..5469f25e0 100644
--- a/yt_dlp/postprocessor/embedthumbnail.py
+++ b/yt_dlp/postprocessor/embedthumbnail.py
@@ -1,11 +1,11 @@
import base64
import imghdr
import os
-import subprocess
import re
+import subprocess
try:
- from mutagen.flac import Picture, FLAC
+ from mutagen.flac import FLAC, Picture
from mutagen.mp4 import MP4, MP4Cover
from mutagen.oggopus import OggOpus
from mutagen.oggvorbis import OggVorbis
@@ -14,17 +14,14 @@ except ImportError:
has_mutagen = False
from .common import PostProcessor
-from .ffmpeg import (
- FFmpegPostProcessor,
- FFmpegThumbnailsConvertorPP,
-)
+from .ffmpeg import FFmpegPostProcessor, FFmpegThumbnailsConvertorPP
from ..utils import (
+ Popen,
+ PostProcessingError,
check_executable,
encodeArgument,
encodeFilename,
error_to_compat_str,
- Popen,
- PostProcessingError,
prepend_extension,
shell_quote,
)
diff --git a/yt_dlp/postprocessor/exec.py b/yt_dlp/postprocessor/exec.py
index 6621889d5..cfc83167c 100644
--- a/yt_dlp/postprocessor/exec.py
+++ b/yt_dlp/postprocessor/exec.py
@@ -2,11 +2,7 @@ import subprocess
from .common import PostProcessor
from ..compat import compat_shlex_quote
-from ..utils import (
- encodeArgument,
- PostProcessingError,
- variadic,
-)
+from ..utils import PostProcessingError, encodeArgument, variadic
class ExecPP(PostProcessor):
diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py
index 3175c8d10..69182618b 100644
--- a/yt_dlp/postprocessor/ffmpeg.py
+++ b/yt_dlp/postprocessor/ffmpeg.py
@@ -1,27 +1,26 @@
import collections
import itertools
+import json
import os
+import re
import subprocess
import time
-import re
-import json
from .common import AudioConversionError, PostProcessor
-
from ..compat import compat_str
from ..utils import (
+ ISO639Utils,
+ Popen,
+ PostProcessingError,
+ _get_exe_version_output,
+ detect_exe_version,
determine_ext,
dfxp2srt,
encodeArgument,
encodeFilename,
float_or_none,
- _get_exe_version_output,
- detect_exe_version,
is_outdated_version,
- ISO639Utils,
orderedSet,
- Popen,
- PostProcessingError,
prepend_extension,
replace_extension,
shell_quote,
@@ -30,7 +29,6 @@ from ..utils import (
write_json_file,
)
-
EXT_TO_OUT_FORMATS = {
'aac': 'adts',
'flac': 'flac',
diff --git a/yt_dlp/postprocessor/modify_chapters.py b/yt_dlp/postprocessor/modify_chapters.py
index 22506bc21..7e2c23288 100644
--- a/yt_dlp/postprocessor/modify_chapters.py
+++ b/yt_dlp/postprocessor/modify_chapters.py
@@ -3,17 +3,9 @@ import heapq
import os
from .common import PostProcessor
-from .ffmpeg import (
- FFmpegPostProcessor,
- FFmpegSubtitlesConvertorPP
-)
+from .ffmpeg import FFmpegPostProcessor, FFmpegSubtitlesConvertorPP
from .sponsorblock import SponsorBlockPP
-from ..utils import (
- orderedSet,
- PostProcessingError,
- prepend_extension,
-)
-
+from ..utils import PostProcessingError, orderedSet, prepend_extension
_TINY_CHAPTER_DURATION = 1
DEFAULT_SPONSORBLOCK_CHAPTER_TITLE = '[SponsorBlock]: %(category_names)l'
diff --git a/yt_dlp/postprocessor/movefilesafterdownload.py b/yt_dlp/postprocessor/movefilesafterdownload.py
index bc3d15ca4..436d13227 100644
--- a/yt_dlp/postprocessor/movefilesafterdownload.py
+++ b/yt_dlp/postprocessor/movefilesafterdownload.py
@@ -3,10 +3,10 @@ import shutil
from .common import PostProcessor
from ..utils import (
+ PostProcessingError,
decodeFilename,
encodeFilename,
make_dir,
- PostProcessingError,
)
diff --git a/yt_dlp/postprocessor/sponskrub.py b/yt_dlp/postprocessor/sponskrub.py
index 38089de08..1a9f5dc66 100644
--- a/yt_dlp/postprocessor/sponskrub.py
+++ b/yt_dlp/postprocessor/sponskrub.py
@@ -4,15 +4,15 @@ import subprocess
from .common import PostProcessor
from ..utils import (
+ Popen,
+ PostProcessingError,
check_executable,
cli_option,
encodeArgument,
encodeFilename,
+ prepend_extension,
shell_quote,
str_or_none,
- Popen,
- PostProcessingError,
- prepend_extension,
)
diff --git a/yt_dlp/postprocessor/sponsorblock.py b/yt_dlp/postprocessor/sponsorblock.py
index 7943014e2..501e30320 100644
--- a/yt_dlp/postprocessor/sponsorblock.py
+++ b/yt_dlp/postprocessor/sponsorblock.py
@@ -1,6 +1,6 @@
-from hashlib import sha256
import json
import re
+from hashlib import sha256
from .ffmpeg import FFmpegPostProcessor
from ..compat import compat_urllib_parse_urlencode
diff --git a/yt_dlp/postprocessor/xattrpp.py b/yt_dlp/postprocessor/xattrpp.py
index 5ad8509e7..3c431941b 100644
--- a/yt_dlp/postprocessor/xattrpp.py
+++ b/yt_dlp/postprocessor/xattrpp.py
@@ -1,11 +1,11 @@
from .common import PostProcessor
from ..compat import compat_os_name
from ..utils import (
- hyphenate_date,
- write_xattr,
PostProcessingError,
XAttrMetadataError,
XAttrUnavailableError,
+ hyphenate_date,
+ write_xattr,
)
diff --git a/yt_dlp/socks.py b/yt_dlp/socks.py
index ffa960e03..56fab08ab 100644
--- a/yt_dlp/socks.py
+++ b/yt_dlp/socks.py
@@ -9,11 +9,7 @@
import collections
import socket
-from .compat import (
- compat_ord,
- compat_struct_pack,
- compat_struct_unpack,
-)
+from .compat import compat_ord, compat_struct_pack, compat_struct_unpack
__author__ = 'Timo Schmid <coding@timoschmid.de>'
diff --git a/yt_dlp/update.py b/yt_dlp/update.py
index 7db260e96..eea08ce43 100644
--- a/yt_dlp/update.py
+++ b/yt_dlp/update.py
@@ -8,8 +8,7 @@ import traceback
from zipimport import zipimporter
from .compat import compat_realpath
-from .utils import encode_compat_str, Popen, write_string
-
+from .utils import Popen, encode_compat_str, write_string
from .version import __version__
diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py
index 91e1a9870..25ac864f3 100644
--- a/yt_dlp/utils.py
+++ b/yt_dlp/utils.py
@@ -9,8 +9,8 @@ import collections
import contextlib
import ctypes
import datetime
-import email.utils
import email.header
+import email.utils
import errno
import functools
import gzip
@@ -22,11 +22,13 @@ import itertools
import json
import locale
import math
+import mimetypes
import operator
import os
import platform
import random
import re
+import shlex
import socket
import ssl
import subprocess
@@ -34,16 +36,11 @@ import sys
import tempfile
import time
import traceback
+import urllib.parse
import xml.etree.ElementTree
import zlib
-import mimetypes
-import urllib.parse
-import shlex
from .compat import (
- compat_HTMLParseError,
- compat_HTMLParser,
- compat_HTTPError,
compat_brotli,
compat_chr,
compat_cookiejar,
@@ -51,7 +48,10 @@ from .compat import (
compat_expanduser,
compat_html_entities,
compat_html_entities_html5,
+ compat_HTMLParseError,
+ compat_HTMLParser,
compat_http_client,
+ compat_HTTPError,
compat_os_name,
compat_parse_qs,
compat_shlex_quote,
@@ -59,18 +59,14 @@ from .compat import (
compat_struct_pack,
compat_struct_unpack,
compat_urllib_error,
+ compat_urllib_parse_unquote_plus,
compat_urllib_parse_urlencode,
compat_urllib_parse_urlparse,
- compat_urllib_parse_unquote_plus,
compat_urllib_request,
compat_urlparse,
compat_websockets,
)
-
-from .socks import (
- ProxyType,
- sockssocket,
-)
+from .socks import ProxyType, sockssocket
try:
import certifi
diff --git a/yt_dlp/webvtt.py b/yt_dlp/webvtt.py
index e0d7f6743..3180eafde 100644
--- a/yt_dlp/webvtt.py
+++ b/yt_dlp/webvtt.py
@@ -8,13 +8,11 @@ Regular expressions based on the W3C WebVTT specification
in RFC 8216 ยง3.5 <https://tools.ietf.org/html/rfc8216#section-3.5>.
"""
-import re
import io
+import re
+
+from .compat import compat_Match, compat_Pattern
from .utils import int_or_none, timetuple_from_msec
-from .compat import (
- compat_Pattern,
- compat_Match,
-)
class _MatchParser: