From 69f7cfdd0c567a4662207eda9d01b3ec0896e597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Thu, 16 Oct 2025 10:59:03 +0200 Subject: [PATCH] [dt] replace 'datetime' imports --- gallery_dl/extractor/aryion.py | 5 ++--- gallery_dl/extractor/common.py | 9 ++++----- gallery_dl/extractor/danbooru.py | 12 +++++------- gallery_dl/extractor/moebooru.py | 11 +++++------ gallery_dl/extractor/naverblog.py | 11 +++++------ gallery_dl/extractor/plurk.py | 11 ++++------- gallery_dl/extractor/sexcom.py | 11 +++++------ gallery_dl/extractor/tumblr.py | 7 +++---- gallery_dl/formatter.py | 7 +++---- test/test_dt.py | 13 ++++++++----- 10 files changed, 44 insertions(+), 53 deletions(-) diff --git a/gallery_dl/extractor/aryion.py b/gallery_dl/extractor/aryion.py index 38b8ee40..b584c462 100644 --- a/gallery_dl/extractor/aryion.py +++ b/gallery_dl/extractor/aryion.py @@ -9,10 +9,9 @@ """Extractors for https://aryion.com/""" from .common import Extractor, Message -from .. import text, util, exception +from .. import text, util, dt, exception from ..cache import cache from email.utils import parsedate_tz -from datetime import datetime BASE_PATTERN = r"(?:https?://)?(?:www\.)?aryion\.com/g4" @@ -156,7 +155,7 @@ class AryionExtractor(Extractor): "artist": artist, "path" : text.split_html(extr( "cookiecrumb'>", ':", "<").replace(",", "")), "width" : text.parse_int(extr("Resolution:", "x")), diff --git a/gallery_dl/extractor/common.py b/gallery_dl/extractor/common.py index 83cb7a50..dd8f119e 100644 --- a/gallery_dl/extractor/common.py +++ b/gallery_dl/extractor/common.py @@ -19,7 +19,6 @@ import getpass import logging import requests import threading -from datetime import datetime from xml.etree import ElementTree from requests.adapters import HTTPAdapter from .message import Message @@ -313,7 +312,7 @@ class Extractor(): seconds = float(seconds) until = now + seconds elif until: - if isinstance(until, datetime): + if isinstance(until, dt.datetime): # convert to UTC timestamp until = dt.to_ts(until) else: @@ -327,7 +326,7 @@ class Extractor(): return if reason: - t = datetime.fromtimestamp(until).time() + t = dt.datetime.fromtimestamp(until).time() isotime = f"{t.hour:02}:{t.minute:02}:{t.second:02}" self.log.info("Waiting until %s (%s)", isotime, reason) time.sleep(seconds) @@ -652,7 +651,7 @@ class Extractor(): self.log.warning( "cookies: %s/%s expired at %s", cookie.domain.lstrip("."), cookie.name, - datetime.fromtimestamp(cookie.expires)) + dt.datetime.fromtimestamp(cookie.expires)) continue elif diff <= 86400: @@ -694,7 +693,7 @@ class Extractor(): ts = self.config(key, default) if isinstance(ts, str): try: - ts = int(datetime.strptime(ts, fmt).timestamp()) + ts = int(dt.parse(ts, fmt).timestamp()) except ValueError as exc: self.log.warning("Unable to parse '%s': %s", key, exc) ts = default diff --git a/gallery_dl/extractor/danbooru.py b/gallery_dl/extractor/danbooru.py index 29c77634..bbe20ed3 100644 --- a/gallery_dl/extractor/danbooru.py +++ b/gallery_dl/extractor/danbooru.py @@ -9,8 +9,7 @@ """Extractors for https://danbooru.donmai.us/ and other Danbooru instances""" from .common import BaseExtractor, Message -from .. import text, util -import datetime +from .. import text, util, dt class DanbooruExtractor(BaseExtractor): @@ -69,8 +68,7 @@ class DanbooruExtractor(BaseExtractor): continue text.nameext_from_url(url, post) - post["date"] = text.parse_datetime( - post["created_at"], "%Y-%m-%dT%H:%M:%S.%f%z") + post["date"] = dt.parse_iso(post["created_at"]) post["tags"] = ( post["tag_string"].split(" ") @@ -357,11 +355,11 @@ class DanbooruPopularExtractor(DanbooruExtractor): def metadata(self): self.params = params = text.parse_query(self.groups[-1]) scale = params.get("scale", "day") - date = params.get("date") or datetime.date.today().isoformat() + date = params.get("date") or dt.date.today().isoformat() if scale == "week": - date = datetime.date.fromisoformat(date) - date = (date - datetime.timedelta(days=date.weekday())).isoformat() + date = dt.date.fromisoformat(date) + date = (date - dt.timedelta(days=date.weekday())).isoformat() elif scale == "month": date = date[:-3] diff --git a/gallery_dl/extractor/moebooru.py b/gallery_dl/extractor/moebooru.py index ba279948..e4c8f1c7 100644 --- a/gallery_dl/extractor/moebooru.py +++ b/gallery_dl/extractor/moebooru.py @@ -9,9 +9,8 @@ """Extractors for Moebooru based sites""" from .booru import BooruExtractor -from .. import text, util +from .. import text, util, dt import collections -import datetime class MoebooruExtractor(BooruExtractor): @@ -21,7 +20,7 @@ class MoebooruExtractor(BooruExtractor): page_start = 1 def _prepare(self, post): - post["date"] = text.parse_timestamp(post["created_at"]) + post["date"] = dt.parse_ts(post["created_at"]) def _html(self, post): url = f"{self.root}/post/show/{post['id']}" @@ -164,14 +163,14 @@ class MoebooruPopularExtractor(MoebooruExtractor): date = (f"{params['year']:>04}-{params.get('month', '01'):>02}-" f"{params.get('day', '01'):>02}") else: - date = datetime.date.today().isoformat() + date = dt.date.today().isoformat() scale = self.scale if scale.startswith("by_"): scale = scale[3:] if scale == "week": - date = datetime.date.fromisoformat(date) - date = (date - datetime.timedelta(days=date.weekday())).isoformat() + date = dt.date.fromisoformat(date) + date = (date - dt.timedelta(days=date.weekday())).isoformat() elif scale == "month": date = date[:-3] diff --git a/gallery_dl/extractor/naverblog.py b/gallery_dl/extractor/naverblog.py index b55e0012..cc96e099 100644 --- a/gallery_dl/extractor/naverblog.py +++ b/gallery_dl/extractor/naverblog.py @@ -9,8 +9,7 @@ """Extractors for https://blog.naver.com/""" from .common import GalleryExtractor, Extractor, Message -from .. import text, util -import datetime +from .. import text, util, dt import time @@ -67,11 +66,11 @@ class NaverBlogPostExtractor(NaverBlogBase, GalleryExtractor): return data - def _parse_datetime(self, date_string): - if "전" in date_string: + def _parse_datetime(self, dt_string): + if "전" in dt_string: ts = time.gmtime() - return datetime.datetime(ts.tm_year, ts.tm_mon, ts.tm_mday) - return text.parse_datetime(date_string, "%Y. %m. %d. %H:%M") + return dt.datetime(ts.tm_year, ts.tm_mon, ts.tm_mday) + return dt.parse(dt_string, "%Y. %m. %d. %H:%M") def images(self, page): files = [] diff --git a/gallery_dl/extractor/plurk.py b/gallery_dl/extractor/plurk.py index 37b9b100..ed7e0105 100644 --- a/gallery_dl/extractor/plurk.py +++ b/gallery_dl/extractor/plurk.py @@ -9,8 +9,7 @@ """Extractors for https://www.plurk.com/""" from .common import Extractor, Message -from .. import text, util, exception -import datetime +from .. import text, util, dt, exception class PlurkExtractor(Extractor): @@ -88,12 +87,10 @@ class PlurkTimelineExtractor(PlurkExtractor): while plurks: yield from plurks - offset = datetime.datetime.strptime( - plurks[-1]["posted"], "%a, %d %b %Y %H:%M:%S %Z") + offset = dt.parse(plurks[-1]["posted"], "%a, %d %b %Y %H:%M:%S %Z") data["offset"] = offset.strftime("%Y-%m-%dT%H:%M:%S.000Z") - response = self.request( - url, method="POST", headers=headers, data=data) - plurks = response.json()["plurks"] + plurks = self.request_json( + url, method="POST", headers=headers, data=data)["plurks"] class PlurkPostExtractor(PlurkExtractor): diff --git a/gallery_dl/extractor/sexcom.py b/gallery_dl/extractor/sexcom.py index 2feb64eb..6a52f823 100644 --- a/gallery_dl/extractor/sexcom.py +++ b/gallery_dl/extractor/sexcom.py @@ -9,8 +9,7 @@ """Extractors for https://www.sex.com/""" from .common import Extractor, Message -from .. import text -from datetime import datetime +from .. import text, dt BASE_PATTERN = r"(?:https?://)?(?:www\.)?sex\.com(?:/[a-z]{2})?" @@ -34,10 +33,10 @@ class SexcomExtractor(Extractor): url = pin["url"] parts = url.rsplit("/", 4) try: - pin["date_url"] = dt = datetime( + pin["date_url"] = d = dt.datetime( int(parts[1]), int(parts[2]), int(parts[3])) if "date" not in pin: - pin["date"] = dt + pin["date"] = d except Exception: pass pin["tags"] = [t[1:] for t in pin["tags"]] @@ -136,7 +135,7 @@ class SexcomExtractor(Extractor): text.nameext_from_url(data["url"], data) data["uploader"] = extr('itemprop="author">', '<') - data["date"] = text.parse_datetime(extr('datetime="', '"')) + data["date"] = dt.parse_iso(extr('datetime="', '"')) data["tags"] = text.split_html(extr('class="tags"> Tags', '')) data["comments"] = text.parse_int(extr('Comments (', ')')) @@ -314,7 +313,7 @@ class SexcomSearchExtractor(SexcomExtractor): parts = path.rsplit("/", 4) try: - pin["date_url"] = pin["date"] = datetime( + pin["date_url"] = pin["date"] = dt.datetime( int(parts[1]), int(parts[2]), int(parts[3])) except Exception: pass diff --git a/gallery_dl/extractor/tumblr.py b/gallery_dl/extractor/tumblr.py index 92fc8314..beaa5c77 100644 --- a/gallery_dl/extractor/tumblr.py +++ b/gallery_dl/extractor/tumblr.py @@ -9,8 +9,7 @@ """Extractors for https://www.tumblr.com/""" from .common import Extractor, Message -from .. import text, util, oauth, exception -from datetime import datetime, date, timedelta +from .. import text, util, dt, oauth, exception BASE_PATTERN = ( @@ -313,7 +312,7 @@ class TumblrDayExtractor(TumblrExtractor): def posts(self): year, month, day = self.groups[3].split("/") - ordinal = date(int(year), int(month), int(day)).toordinal() + ordinal = dt.date(int(year), int(month), int(day)).toordinal() # 719163 == date(1970, 1, 1).toordinal() self.date_min = (ordinal - 719163) * 86400 @@ -514,7 +513,7 @@ class TumblrAPI(oauth.OAuth1API): self.extractor.wait(seconds=reset) continue - t = (datetime.now() + timedelta(0, float(reset))).time() + t = (dt.now() + dt.timedelta(0, float(reset))).time() raise exception.AbortExtraction( f"Aborting - Rate limit will reset at " f"{t.hour:02}:{t.minute:02}:{t.second:02}") diff --git a/gallery_dl/formatter.py b/gallery_dl/formatter.py index 39a5e4e2..8b5e7adf 100644 --- a/gallery_dl/formatter.py +++ b/gallery_dl/formatter.py @@ -13,7 +13,6 @@ import sys import time import string import _string -import datetime import operator from . import text, util, dt @@ -484,13 +483,13 @@ def _parse_offset(format_spec, default): if not offset or offset == "local": def off(dt_utc): local = time.localtime(dt.to_ts(dt_utc)) - return fmt(dt_utc + datetime.timedelta(0, local.tm_gmtoff)) + return fmt(dt_utc + dt.timedelta(0, local.tm_gmtoff)) else: hours, _, minutes = offset.partition(":") offset = 3600 * int(hours) if minutes: offset += 60 * (int(minutes) if offset > 0 else -int(minutes)) - offset = datetime.timedelta(0, offset) + offset = dt.timedelta(0, offset) def off(obj): return fmt(obj + offset) @@ -557,7 +556,7 @@ _FORMATTERS = { _GLOBALS = { "_env": lambda: os.environ, "_lit": lambda: _literal, - "_now": datetime.datetime.now, + "_now": dt.datetime.now, "_nul": lambda: util.NONE, } _CONVERSIONS = { diff --git a/test/test_dt.py b/test/test_dt.py index 6eea4df4..1c0aa16b 100644 --- a/test/test_dt.py +++ b/test/test_dt.py @@ -122,11 +122,10 @@ class TestDatetime(unittest.TestCase): self.assertEqual(f(value, "%Y"), dt.NONE) def test_parse_iso(self, f=dt.parse_iso): - null = dt.from_ts(0) - - self.assertEqual(f("1970-01-01T00:00:00+00:00"), null) - self.assertEqual(f("1970-01-01T00:00:00+0000") , null) - + self.assertEqual( + f("1970-01-01T00:00:00+00:00"), + dt.from_ts(0), + ) self.assertEqual( f("2019-05-07T21:25:02+09:00"), datetime.datetime(2019, 5, 7, 12, 25, 2), @@ -152,6 +151,10 @@ class TestDatetime(unittest.TestCase): 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"), + dt.EPOCH, + ) self.assertEqual( f("2019-05-07T21:25:02.753+0900", "%Y-%m-%dT%H:%M:%S.%f%z"), datetime.datetime(2019, 5, 7, 12, 25, 2),