aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpukkandan <pukkandan.ytdlp@gmail.com>2023-05-24 23:29:30 +0530
committerpukkandan <pukkandan.ytdlp@gmail.com>2023-05-24 23:29:30 +0530
commit46f1370e9af6f8af8762f67e27e5acb8f0c48a47 (patch)
tree3248685f68fdb473ec7e4fdab9447a90e0d82cf6
parent69a40e4a7f6caa5662527ebd2f3c4e8aa02857a2 (diff)
downloadhypervideo-pre-46f1370e9af6f8af8762f67e27e5acb8f0c48a47.tar.lz
hypervideo-pre-46f1370e9af6f8af8762f67e27e5acb8f0c48a47.tar.xz
hypervideo-pre-46f1370e9af6f8af8762f67e27e5acb8f0c48a47.zip
[devscripts/cli_to_api] Add script
-rw-r--r--devscripts/cli_to_api.py48
-rw-r--r--yt_dlp/YoutubeDL.py8
-rw-r--r--yt_dlp/downloader/common.py7
-rw-r--r--yt_dlp/downloader/fragment.py4
-rw-r--r--yt_dlp/utils/_utils.py6
5 files changed, 62 insertions, 11 deletions
diff --git a/devscripts/cli_to_api.py b/devscripts/cli_to_api.py
new file mode 100644
index 000000000..b8b7cbcf1
--- /dev/null
+++ b/devscripts/cli_to_api.py
@@ -0,0 +1,48 @@
+# Allow direct execution
+import os
+import sys
+
+sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+
+import yt_dlp
+import yt_dlp.options
+
+create_parser = yt_dlp.options.create_parser
+
+
+def parse_patched_options(opts):
+ patched_parser = create_parser()
+ patched_parser.defaults.update({
+ 'ignoreerrors': False,
+ 'retries': 0,
+ 'fragment_retries': 0,
+ 'extract_flat': False,
+ 'concat_playlist': 'never',
+ })
+ yt_dlp.options.__dict__['create_parser'] = lambda: patched_parser
+ try:
+ return yt_dlp.parse_options(opts)
+ finally:
+ yt_dlp.options.__dict__['create_parser'] = create_parser
+
+
+default_opts = parse_patched_options([]).ydl_opts
+
+
+def cli_to_api(opts, cli_defaults=False):
+ opts = (yt_dlp.parse_options if cli_defaults else parse_patched_options)(opts).ydl_opts
+
+ diff = {k: v for k, v in opts.items() if default_opts[k] != v}
+ if 'postprocessors' in diff:
+ diff['postprocessors'] = [pp for pp in diff['postprocessors']
+ if pp not in default_opts['postprocessors']]
+ return diff
+
+
+if __name__ == '__main__':
+ from pprint import pprint
+
+ print('\nThe arguments passed translate to:\n')
+ pprint(cli_to_api(sys.argv[1:]))
+ print('\nCombining these with the CLI defaults gives:\n')
+ pprint(cli_to_api(sys.argv[1:], True))
diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py
index 1162d2df1..cd82b2772 100644
--- a/yt_dlp/YoutubeDL.py
+++ b/yt_dlp/YoutubeDL.py
@@ -280,7 +280,7 @@ class YoutubeDL:
subtitles. The language can be prefixed with a "-" to
exclude it from the requested languages, e.g. ['all', '-live_chat']
keepvideo: Keep the video file after post-processing
- daterange: A DateRange object, download only if the upload_date is in the range.
+ daterange: A utils.DateRange object, download only if the upload_date is in the range.
skip_download: Skip the actual download of the video file
cachedir: Location of the cache files in the filesystem.
False to disable filesystem cache.
@@ -329,13 +329,13 @@ class YoutubeDL:
'auto' for elaborate guessing
encoding: Use this encoding instead of the system-specified.
extract_flat: Whether to resolve and process url_results further
- * False: Always process (default)
+ * False: Always process. Default for API
* True: Never process
* 'in_playlist': Do not process inside playlist/multi_video
* 'discard': Always process, but don't return the result
from inside playlist/multi_video
* 'discard_in_playlist': Same as "discard", but only for
- playlists (not multi_video)
+ playlists (not multi_video). Default for CLI
wait_for_video: If given, wait for scheduled streams to become available.
The value should be a tuple containing the range
(min_secs, max_secs) to wait between retries
@@ -472,7 +472,7 @@ class YoutubeDL:
can also be used
The following options are used by the extractors:
- extractor_retries: Number of times to retry for known errors
+ extractor_retries: Number of times to retry for known errors (default: 3)
dynamic_mpd: Whether to process dynamic DASH manifests (default: True)
hls_split_discontinuity: Split HLS playlists to different formats at
discontinuities such as ad breaks (default: False)
diff --git a/yt_dlp/downloader/common.py b/yt_dlp/downloader/common.py
index 077b29b41..8f9bc05d6 100644
--- a/yt_dlp/downloader/common.py
+++ b/yt_dlp/downloader/common.py
@@ -51,8 +51,9 @@ class FileDownloader:
ratelimit: Download speed limit, in bytes/sec.
continuedl: Attempt to continue downloads if possible
throttledratelimit: Assume the download is being throttled below this speed (bytes/sec)
- retries: Number of times to retry for HTTP error 5xx
- file_access_retries: Number of times to retry on file access error
+ retries: Number of times to retry for expected network errors.
+ Default is 0 for API, but 10 for CLI
+ file_access_retries: Number of times to retry on file access error (default: 3)
buffersize: Size of download buffer in bytes.
noresizebuffer: Do not automatically resize the download buffer.
continuedl: Try to continue downloads if possible.
@@ -225,7 +226,7 @@ class FileDownloader:
sleep_func=fd.params.get('retry_sleep_functions', {}).get('file_access'))
def wrapper(self, func, *args, **kwargs):
- for retry in RetryManager(self.params.get('file_access_retries'), error_callback, fd=self):
+ for retry in RetryManager(self.params.get('file_access_retries', 3), error_callback, fd=self):
try:
return func(self, *args, **kwargs)
except OSError as err:
diff --git a/yt_dlp/downloader/fragment.py b/yt_dlp/downloader/fragment.py
index 3dc638f52..8abf7760b 100644
--- a/yt_dlp/downloader/fragment.py
+++ b/yt_dlp/downloader/fragment.py
@@ -34,8 +34,8 @@ class FragmentFD(FileDownloader):
Available options:
- fragment_retries: Number of times to retry a fragment for HTTP error (DASH
- and hlsnative only)
+ fragment_retries: Number of times to retry a fragment for HTTP error
+ (DASH and hlsnative only). Default is 0 for API, but 10 for CLI
skip_unavailable_fragments:
Skip unavailable fragments (DASH and hlsnative only)
keep_fragments: Keep downloaded fragments on disk after downloading is
diff --git a/yt_dlp/utils/_utils.py b/yt_dlp/utils/_utils.py
index 9f1a127cd..afcb2a164 100644
--- a/yt_dlp/utils/_utils.py
+++ b/yt_dlp/utils/_utils.py
@@ -60,6 +60,8 @@ from ..compat import (
from ..dependencies import brotli, certifi, websockets, xattr
from ..socks import ProxyType, sockssocket
+__name__ = __name__.rsplit('.', 1)[0] # Pretend to be the parent module
+
# This is not clearly defined otherwise
compiled_regex_type = type(re.compile(''))
@@ -1957,8 +1959,8 @@ class DateRange:
date = date_from_str(date)
return self.start <= date <= self.end
- def __str__(self):
- return f'{self.start.isoformat()} - {self.end.isoformat()}'
+ def __repr__(self):
+ return f'{__name__}.{type(self).__name__}({self.start.isoformat()!r}, {self.end.isoformat()!r})'
def __eq__(self, other):
return (isinstance(other, DateRange)