From ccc25d6710a4aa373b7e15c558e07f8a2ffae5f3 Mon Sep 17 00:00:00 2001 From: coletdjnz Date: Sun, 12 Oct 2025 08:29:06 +1300 Subject: [PATCH] [ie/youtube:tab] Fix approximate timestamp extraction for feeds (#14539) Authored by: coletdjnz --- yt_dlp/extractor/youtube/_base.py | 4 ++-- yt_dlp/extractor/youtube/_tab.py | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/yt_dlp/extractor/youtube/_base.py b/yt_dlp/extractor/youtube/_base.py index 47e09c4f21..ded43b8aea 100644 --- a/yt_dlp/extractor/youtube/_base.py +++ b/yt_dlp/extractor/youtube/_base.py @@ -1196,7 +1196,7 @@ def extract_relative_time(relative_time_text): except ValueError: return None - def _parse_time_text(self, text): + def _parse_time_text(self, text, report_failure=True): if not text: return dt_ = self.extract_relative_time(text) @@ -1211,7 +1211,7 @@ def _parse_time_text(self, text): (r'([a-z]+\s*\d{1,2},?\s*20\d{2})', r'(?:.+|^)(?:live|premieres|ed|ing)(?:\s*(?:on|for))?\s*(.+\d)'), text.lower(), 'time text', default=None))) - if text and timestamp is None and self._preferred_lang in (None, 'en'): + if report_failure and text and timestamp is None and self._preferred_lang in (None, 'en'): self.report_warning( f'Cannot parse localized time text "{text}"', only_once=True) return timestamp diff --git a/yt_dlp/extractor/youtube/_tab.py b/yt_dlp/extractor/youtube/_tab.py index 5870786978..72a66e0a1a 100644 --- a/yt_dlp/extractor/youtube/_tab.py +++ b/yt_dlp/extractor/youtube/_tab.py @@ -341,7 +341,11 @@ def _extract_lockup_view_model(self, view_model): 'contentImage', *thumb_keys, 'thumbnailViewModel', 'image'), final_key='sources'), duration=traverse_obj(view_model, ( 'contentImage', 'thumbnailViewModel', 'overlays', ..., 'thumbnailOverlayBadgeViewModel', - 'thumbnailBadges', ..., 'thumbnailBadgeViewModel', 'text', {parse_duration}, any))) + 'thumbnailBadges', ..., 'thumbnailBadgeViewModel', 'text', {parse_duration}, any)), + timestamp=(traverse_obj(view_model, ( + 'metadata', 'lockupMetadataViewModel', 'metadata', 'contentMetadataViewModel', 'metadataRows', + ..., 'metadataParts', ..., 'text', 'content', {lambda t: self._parse_time_text(t, report_failure=False)}, any)) + if self._configuration_arg('approximate_date', ie_key=YoutubeTabIE) else None)) def _rich_entries(self, rich_grid_renderer): if lockup_view_model := traverse_obj(rich_grid_renderer, ('content', 'lockupViewModel', {dict})):