[postprocessor:mtime] fix timestamps from datetime objects (#2307)

'datetime.timestamp()', which got used to convert datetime objects to
POSIX timestamps, assumes naive datetimes represent LOCAL time, while
datetimes in 'date' metadata fields represent UTC time.

Ref: https://docs.python.org/3/library/datetime.html#datetime.datetime.timestamp
> Naive datetime instances are assumed to represent local time
> you can obtain the POSIX timestamp by … calculating the timestamp directly
pull/2474/head
Mike Fährmann 3 years ago
parent 29db716a63
commit e7b30866d0
No known key found for this signature in database
GPG Key ID: 5680CA389D365A88

@ -9,7 +9,8 @@
"""Use metadata as file modification time"""
from .common import PostProcessor
from ..text import parse_int
from .. import text, util
from datetime import datetime
class MtimePP(PostProcessor):
@ -27,8 +28,11 @@ class MtimePP(PostProcessor):
def run(self, pathfmt):
mtime = pathfmt.kwdict.get(self.key)
ts = getattr(mtime, "timestamp", None)
pathfmt.kwdict["_mtime"] = ts() if ts else parse_int(mtime)
pathfmt.kwdict["_mtime"] = (
util.datetime_to_timestamp(mtime)
if isinstance(mtime, datetime) else
text.parse_int(mtime)
)
__postprocessor__ = MtimePP

@ -1,7 +1,7 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2019-2021 Mike Fährmann
# Copyright 2019-2022 Mike Fährmann
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
@ -16,7 +16,7 @@ import logging
import zipfile
import tempfile
import collections
from datetime import datetime, timezone as tz
from datetime import datetime
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from gallery_dl import extractor, output, path # noqa E402
@ -345,7 +345,7 @@ class MtimeTest(BasePostprocessorTest):
self.assertEqual(pp.key, "date")
def test_mtime_datetime(self):
self._create(None, {"date": datetime(1980, 1, 1, tzinfo=tz.utc)})
self._create(None, {"date": datetime(1980, 1, 1)})
self._trigger()
self.assertEqual(self.pathfmt.kwdict["_mtime"], 315532800)

Loading…
Cancel
Save