From a1af9ffe272fda8c67f524b9daa17d339ae3f7a7 Mon Sep 17 00:00:00 2001 From: coletdjnz Date: Sat, 4 May 2024 21:46:31 +1200 Subject: [PATCH] Do not extract timestamp on 3.8 if timezone is not present --- test/test_utils.py | 2 ++ yt_dlp/extractor/youtube.py | 2 +- yt_dlp/utils/_utils.py | 7 +++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/test/test_utils.py b/test/test_utils.py index 405d93c25..77fadbbea 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -28,6 +28,7 @@ from yt_dlp.utils import ( ExtractorError, InAdvancePagedList, LazyList, + NO_DEFAULT, OnDemandPagedList, Popen, age_restricted, @@ -771,6 +772,7 @@ class TestUtil(unittest.TestCase): self.assertEqual(parse_iso8601('2014-03-23T23:04:26+0100'), 1395612266) self.assertEqual(parse_iso8601('2014-03-23T23:04:26-07:00'), 1395641066) self.assertEqual(parse_iso8601('2014-03-23T23:04:26', timezone=dt.timedelta(hours=-7)), 1395641066) + self.assertEqual(parse_iso8601('2014-03-23T23:04:26', timezone=NO_DEFAULT), None) # default does not override timezone in date_str self.assertEqual(parse_iso8601('2014-03-23T23:04:26-07:00', timezone=dt.timedelta(hours=-10)), 1395641066) self.assertEqual(parse_iso8601('2014-03-23T22:04:26+0000'), 1395612266) diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py index 4070a9c72..2e166b356 100644 --- a/yt_dlp/extractor/youtube.py +++ b/yt_dlp/extractor/youtube.py @@ -4557,7 +4557,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor): # Python 3.8 should be deprecated soon # This fallback may make the timestamp slightly inaccurate for 3.8 users. if sys.version_info < (3, 9): - return dt.timedelta(hours=-7) + return NO_DEFAULT from zoneinfo import ZoneInfo return dt.datetime.now(ZoneInfo('US/Pacific')).utcoffset() diff --git a/yt_dlp/utils/_utils.py b/yt_dlp/utils/_utils.py index c7c6bdbdd..5f458ea45 100644 --- a/yt_dlp/utils/_utils.py +++ b/yt_dlp/utils/_utils.py @@ -1162,7 +1162,10 @@ def extract_timezone(date_str, default=None): hours=sign * int(m.group('hours')), minutes=sign * int(m.group('minutes'))) - return timezone or default or dt.timedelta(), date_str + if timezone is None and default is not NO_DEFAULT: + timezone = default or dt.timedelta() + + return timezone, date_str def parse_iso8601(date_str, delimiter='T', timezone=None): @@ -1175,7 +1178,7 @@ def parse_iso8601(date_str, delimiter='T', timezone=None): timezone, date_str = extract_timezone(date_str, timezone) - with contextlib.suppress(ValueError): + with contextlib.suppress(ValueError, TypeError): date_format = f'%Y-%m-%d{delimiter}%H:%M:%S' dt_ = dt.datetime.strptime(date_str, date_format) - timezone return calendar.timegm(dt_.timetuple())