diff --git a/yt_dlp/jsinterp.py b/yt_dlp/jsinterp.py index 31ab204d75..db65260091 100644 --- a/yt_dlp/jsinterp.py +++ b/yt_dlp/jsinterp.py @@ -9,6 +9,7 @@ from .utils import ( NO_DEFAULT, ExtractorError, + function_with_repr, js_to_json, remove_quotes, truncate_string, @@ -184,7 +185,8 @@ def interpret_statement(self, stmt, local_vars, allow_recursion, *args, **kwargs cls.write('=> Raises:', e, '<-|', stmt, level=allow_recursion) raise if cls.ENABLED and stmt.strip(): - cls.write(['->', '=>'][should_ret], repr(ret), '<-|', stmt, level=allow_recursion) + if should_ret or not repr(ret) == stmt: + cls.write(['->', '=>'][should_ret], repr(ret), '<-|', stmt, level=allow_recursion) return ret, should_ret return interpret_statement @@ -205,8 +207,6 @@ class JSInterpreter: 'y': 4096, # Perform a "sticky" search that matches starting at the current position in the target string } - _EXC_NAME = '__yt_dlp_exception__' - def __init__(self, code, objects=None): self.code, self._functions = code, {} self._objects = {} if objects is None else objects @@ -220,6 +220,8 @@ def __init__(self, msg, expr=None, *args, **kwargs): def _named_object(self, namespace, obj): self.__named_object_counter += 1 name = f'__yt_dlp_jsinterp_obj{self.__named_object_counter}' + if callable(obj) and not isinstance(obj, function_with_repr): + obj = function_with_repr(obj, f'F<{self.__named_object_counter}>') namespace[name] = obj return name @@ -784,7 +786,8 @@ def extract_object(self, objname): fields) for f in fields_m: argnames = f.group('args').split(',') - obj[remove_quotes(f.group('key'))] = self.build_function(argnames, f.group('code')) + name = remove_quotes(f.group('key')) + obj[name] = function_with_repr(self.build_function(argnames, f.group('code')), f'F<{name}>') return obj @@ -806,7 +809,9 @@ def extract_function_code(self, funcname): return [x.strip() for x in func_m.group('args').split(',')], code def extract_function(self, funcname): - return self.extract_function_from_code(*self.extract_function_code(funcname)) + return function_with_repr( + self.extract_function_from_code(*self.extract_function_code(funcname)), + f'F<{funcname}>') def extract_function_from_code(self, argnames, code, *global_stack): local_vars = {} diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py index 9ff096433b..19c1404839 100644 --- a/yt_dlp/utils.py +++ b/yt_dlp/utils.py @@ -6057,14 +6057,16 @@ def __get__(self, _, cls): class function_with_repr: - def __init__(self, func): + def __init__(self, func, repr_=None): functools.update_wrapper(self, func) - self.func = func + self.func, self.__repr = func, repr_ def __call__(self, *args, **kwargs): return self.func(*args, **kwargs) def __repr__(self): + if self.__repr: + return self.__repr return f'{self.func.__module__}.{self.func.__qualname__}'