diff --git a/README.md b/README.md index 0d0a53ea00..1e970b1e24 100644 --- a/README.md +++ b/README.md @@ -1786,8 +1786,8 @@ The following extractors use this feature: ##### PO Token settings * `po_token`: Proof of Origin (PO) Token(s) to use. Comma seperated list of PO Tokens in the format `CLIENT.CONTEXT+PO_TOKEN`, e.g. `youtube:po_token=web.gvs+XXX,web.player=XXX,web_safari.gvs+YYY`. Context can be either `gvs` (Google Video Server URLs) or `player` (Innertube player request) -* `pot_log_level`: PO Token provider log level. One of `TRACE`, `DEBUG`, `INFO`, `WARNING`, `ERROR`. Default is `DEBUG` if `-v` is used, otherwise `INFO` -* `fetch_pot`: Policy to use for fetching a PO Token from providers. `always` to always try fetch a PO Token regardless if the client requires one for the given context. `when_required` to only fetch a PO Token if the client requires one for the given context (default) +* `pot_trace`: Enable debug logging for PO Token fetching. Either `true` or `false` (default) +* `fetch_pot`: Policy to use for fetching a PO Token from providers. `always` to always try fetch a PO Token regardless if the client requires one for the given context, `auto` to only fetch a PO Token if the client requires one for the given context (default) ###### youtubepot-webpo * `bind_to_visitor_id`: Whether to use the Visitor ID instead of Visitor Data for caching WebPO tokens. Either `true` or `false` (default `true`) diff --git a/yt_dlp/extractor/youtube/_video.py b/yt_dlp/extractor/youtube/_video.py index 902de14825..3c88c88595 100644 --- a/yt_dlp/extractor/youtube/_video.py +++ b/yt_dlp/extractor/youtube/_video.py @@ -2903,7 +2903,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor): # Avoid fetching PO Tokens when not required if not ( _PoTokenContext(context) in self._get_default_ytcfg(client)['PO_TOKEN_REQUIRED_CONTEXTS'] - or self._configuration_arg('fetch_pot', ['when_required'], ie_key=YoutubeIE)[0] == 'always' + or self._configuration_arg('fetch_pot', ['auto'], ie_key=YoutubeIE)[0] == 'always' ): return None diff --git a/yt_dlp/extractor/youtube/pot/_director.py b/yt_dlp/extractor/youtube/pot/_director.py index 7ba88adb6a..0234d95070 100644 --- a/yt_dlp/extractor/youtube/pot/_director.py +++ b/yt_dlp/extractor/youtube/pot/_director.py @@ -44,10 +44,10 @@ if typing.TYPE_CHECKING: class YoutubeIEContentProviderLogger(IEContentProviderLogger): - def __init__(self, ie, prefix, log_level=IEContentProviderLogger.LogLevel.INFO): + def __init__(self, ie, prefix, log_level: IEContentProviderLogger.LogLevel | None = None): self.__ie = ie self.prefix = prefix - self.log_level = log_level + self.log_level = log_level if log_level is not None else self.LogLevel.INFO def _format_msg(self, message: str): prefixstr = format_field(self.prefix, None, '[%s] ') @@ -325,21 +325,30 @@ def initialize_pot_director(ie): if not ie._downloader: raise ExtractorError('Downloader not set', expected=False) - log_level = min( - IEContentProviderLogger.LogLevel(ie._configuration_arg('pot_log_level', ['INFO'], ie_key='youtube', casesense=False)[0].upper()), - IEContentProviderLogger.LogLevel.DEBUG if ie._downloader.params.get('verbose', False) else IEContentProviderLogger.LogLevel.INFO, - ) + enable_trace = ie._configuration_arg( + 'pot_trace', ['false'], ie_key='youtube', casesense=False)[0] == 'true' + + if enable_trace: + log_level = IEContentProviderLogger.LogLevel.TRACE + elif ie._downloader.params.get('verbose', False): + log_level = IEContentProviderLogger.LogLevel.DEBUG + else: + log_level = IEContentProviderLogger.LogLevel.INFO cache_providers = [] for cache_provider in _pot_cache_providers.value.values(): - settings = traverse_obj(ie._downloader.params, ('extractor_args', f'{EXTRACTOR_ARG_PREFIX}-{cache_provider.PROVIDER_KEY.lower()}')) - cache_provider_logger = YoutubeIEContentProviderLogger(ie, f'pot:cache:{cache_provider.PROVIDER_NAME}', log_level=log_level) + settings = traverse_obj( + ie._downloader.params, ('extractor_args', f'{EXTRACTOR_ARG_PREFIX}-{cache_provider.PROVIDER_KEY.lower()}')) + cache_provider_logger = YoutubeIEContentProviderLogger( + ie, f'pot:cache:{cache_provider.PROVIDER_NAME}', log_level=log_level) cache_providers.append(cache_provider(ie, cache_provider_logger, settings or {})) cache_spec_providers = [] for cache_spec_provider in _pot_pcs_providers.value.values(): - settings = traverse_obj(ie._downloader.params, ('extractor_args', f'{EXTRACTOR_ARG_PREFIX}-{cache_spec_provider.PROVIDER_KEY.lower()}')) - cache_spec_provider_logger = YoutubeIEContentProviderLogger(ie, f'pot:cache:spec:{cache_spec_provider.PROVIDER_NAME}', log_level=log_level) + settings = traverse_obj( + ie._downloader.params, ('extractor_args', f'{EXTRACTOR_ARG_PREFIX}-{cache_spec_provider.PROVIDER_KEY.lower()}')) + cache_spec_provider_logger = YoutubeIEContentProviderLogger( + ie, f'pot:cache:spec:{cache_spec_provider.PROVIDER_NAME}', log_level=log_level) cache_spec_providers.append(cache_spec_provider(ie, cache_spec_provider_logger, settings or {})) cache = PoTokenCache( @@ -421,7 +430,6 @@ def validate_response(response: PoTokenResponse): def validate_cache_spec(spec: PoTokenCacheSpec): - return ( isinstance(spec, PoTokenCacheSpec) and isinstance(spec.write_policy, CacheProviderWritePolicy)