aboutsummaryrefslogtreecommitdiff
path: root/youtube_dl/YoutubeDL.py
diff options
context:
space:
mode:
authordirkf <fieldhouse@gmx.net>2023-04-10 17:12:31 +0100
committerdirkf <fieldhouse@gmx.net>2023-04-10 17:12:31 +0100
commitfe7e13066c20b10fe48bc154431440da36baec53 (patch)
treef6507af2d6bcde7af5235422f6fed77c12719bad /youtube_dl/YoutubeDL.py
parent213d1d91bfc4a00fefc72fa2730555d51060b42d (diff)
downloadyoutube-dl-fe7e13066c20b10fe48bc154431440da36baec53.tar.xz
[core] Add and use sanitize_info() method from yt-dlp
Diffstat (limited to 'youtube_dl/YoutubeDL.py')
-rwxr-xr-xyoutube_dl/YoutubeDL.py38
1 files changed, 34 insertions, 4 deletions
diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py
index 2a1e59bf8..2719d546f 100755
--- a/youtube_dl/YoutubeDL.py
+++ b/youtube_dl/YoutubeDL.py
@@ -30,9 +30,12 @@ from string import ascii_letters
from .compat import (
compat_basestring,
compat_cookiejar,
+ compat_filter as filter,
compat_get_terminal_size,
compat_http_client,
+ compat_integer_types,
compat_kwargs,
+ compat_map as map,
compat_numeric_types,
compat_os_name,
compat_str,
@@ -64,6 +67,7 @@ from .utils import (
int_or_none,
ISO3166Utils,
locked_file,
+ LazyList,
make_HTTPS_handler,
MaxDownloadsReached,
orderedSet,
@@ -2109,10 +2113,36 @@ class YoutubeDL(object):
return self._download_retcode
@staticmethod
- def filter_requested_info(info_dict):
- return dict(
- (k, v) for k, v in info_dict.items()
- if k not in ['requested_formats', 'requested_subtitles'])
+ def sanitize_info(info_dict, remove_private_keys=False):
+ ''' Sanitize the infodict for converting to json '''
+ if info_dict is None:
+ return info_dict
+
+ if remove_private_keys:
+ reject = lambda k, v: (v is None
+ or k.startswith('__')
+ or k in ('requested_formats',
+ 'requested_subtitles'))
+ else:
+ reject = lambda k, v: False
+
+ def filter_fn(obj):
+ if isinstance(obj, dict):
+ return dict((k, filter_fn(v)) for k, v in obj.items() if not reject(k, v))
+ elif isinstance(obj, (list, tuple, set, LazyList)):
+ return list(map(filter_fn, obj))
+ elif obj is None or any(isinstance(obj, c)
+ for c in (compat_integer_types,
+ (compat_str, float, bool))):
+ return obj
+ else:
+ return repr(obj)
+
+ return filter_fn(info_dict)
+
+ @classmethod
+ def filter_requested_info(cls, info_dict):
+ return cls.sanitize_info(info_dict, True)
def post_process(self, filename, ie_info):
"""Run all the postprocessors on the given file."""