From 989136bc5966aed975d6fe0366ce04beded279fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Sun, 19 Oct 2025 18:26:32 +0200 Subject: [PATCH] [dt] replace 'parse_compat' with compat workaround --- gallery_dl/dt.py | 26 ++++++-------------------- gallery_dl/extractor/newgrounds.py | 6 +++--- test/test_dt.py | 17 +++++++---------- 3 files changed, 16 insertions(+), 33 deletions(-) diff --git a/gallery_dl/dt.py b/gallery_dl/dt.py index 3f803171..a09e028e 100644 --- a/gallery_dl/dt.py +++ b/gallery_dl/dt.py @@ -38,19 +38,10 @@ def convert(value): """Convert 'value' to a naive UTC datetime object""" if not value: return NONE - if isinstance(value, datetime): - return value - - if isinstance(value, str): - try: - if value[-1] == "Z": - # compat for Python < 3.11 - value = value[:-1] - return normalize(datetime.fromisoformat(value)) - except Exception: - pass - + return normalize(value) + if isinstance(value, str) and (dt := parse_iso(value)) is not NONE: + return dt return parse_ts(value) @@ -70,14 +61,13 @@ if sys.hexversion < 0x30c0000: if dt_string[-1] == "Z": # compat for Python < 3.11 dt_string = dt_string[:-1] + elif dt_string[-5] in "+-": + # compat for Python < 3.11 + dt_string = f"{dt_string[:-2]}:{dt_string[-2:]}" return normalize(datetime.fromisoformat(dt_string)) except Exception: return NONE - def parse_compat(dt_string, format="%Y-%m-%dT%H:%M:%S%z"): - """Parse 'dt_string' as ISO 8601 value using 'format'""" - return parse(dt_string, format) - from_ts = datetime.utcfromtimestamp now = datetime.utcnow @@ -90,10 +80,6 @@ else: except Exception: return NONE - def parse_compat(dt_string, format=None): - """Parse 'dt_string' as ISO 8601 value""" - return parse_iso(dt_string) - def from_ts(ts=None): """Convert Unix timestamp to naive UTC datetime""" Y, m, d, H, M, S, _, _, _ = time.gmtime(ts) diff --git a/gallery_dl/extractor/newgrounds.py b/gallery_dl/extractor/newgrounds.py index 58e07130..768a115f 100644 --- a/gallery_dl/extractor/newgrounds.py +++ b/gallery_dl/extractor/newgrounds.py @@ -218,7 +218,7 @@ class NewgroundsExtractor(Extractor): "description": text.unescape(extr(':description" content="', '"')), "type" : "art", "_type" : "i", - "date" : dt.parse_compat(extr( + "date" : dt.parse_iso(extr( 'itemprop="datePublished" content="', '"')), "rating" : extr('class="rated-', '"'), "url" : full('src="', '"'), @@ -268,7 +268,7 @@ class NewgroundsExtractor(Extractor): "description": text.unescape(extr(':description" content="', '"')), "type" : "audio", "_type" : "a", - "date" : dt.parse_compat(extr( + "date" : dt.parse_iso(extr( 'itemprop="datePublished" content="', '"')), "url" : extr('{"url":"', '"').replace("\\/", "/"), "index" : text.parse_int(index), @@ -287,7 +287,7 @@ class NewgroundsExtractor(Extractor): src = src.replace("\\/", "/") formats = () type = extr(',"description":"', '"') - date = dt.parse_compat(extr( + date = dt.parse_iso(extr( 'itemprop="datePublished" content="', '"')) if type: type = type.rpartition(" ")[2].lower() diff --git a/test/test_dt.py b/test/test_dt.py index 1c0aa16b..dc00d4b4 100644 --- a/test/test_dt.py +++ b/test/test_dt.py @@ -43,6 +43,8 @@ class TestDatetime(unittest.TestCase): _assert("2009-12-31T19:00:00.123456-05:00", d) _assert("2010-01-01T00:00:00Z" , d) _assert("2010-01-01T00:00:00.123456Z" , d) + _assert("2009-12-31T19:00:00-0500" , d) + _assert("2009-12-31T19:00:00.123456-0500" , d) _assert(0 , dt.NONE) _assert("" , dt.NONE) @@ -63,11 +65,8 @@ class TestDatetime(unittest.TestCase): self.assertEqual(result, expected, msg=repr(value)) d = datetime.datetime(2010, 1, 1) - _assert("2009-12-31T19:00:00-05" , d) - _assert("2009-12-31T19:00:00-0500" , d) _assert("2009-12-31T19:00:00.123456-05" , d) - _assert("2009-12-31T19:00:00.123456-0500" , d) def test_to_timestamp(self, f=dt.to_ts): self.assertEqual(f(dt.EPOCH), 0.0) @@ -146,20 +145,18 @@ class TestDatetime(unittest.TestCase): f("1970.01.01"), dt.NONE, ) - - for value in ((), [], {}, None, 1, 2.3): - self.assertEqual(f(value), dt.NONE) - - def test_parse_compat(self, f=dt.parse_compat): self.assertEqual( - f("1970-01-01T00:00:00+0000", "%Y-%m-%dT%H:%M:%S%z"), + f("1970-01-01T00:00:00+0000"), dt.EPOCH, ) self.assertEqual( - f("2019-05-07T21:25:02.753+0900", "%Y-%m-%dT%H:%M:%S.%f%z"), + f("2019-05-07T21:25:02.753+0900"), datetime.datetime(2019, 5, 7, 12, 25, 2), ) + for value in ((), [], {}, None, 1, 2.3): + self.assertEqual(f(value), dt.NONE) + def test_none(self): self.assertFalse(dt.NONE) self.assertIsInstance(dt.NONE, dt.datetime)