Set downloaded file's time stamp from last-modified header

This file stamp setting is very relaxed. If there's any problem
along the way (no last-modified header, bad time string format,
no time set privileges,...) or if nothing is downloaded (e.g. using
resumed download but the file was already complete) then nothing
is done.
pull/8/head
Gergely Imreh 14 years ago
parent 9f7963468b
commit 09bd408c28

@ -9,6 +9,7 @@
import cookielib import cookielib
import ctypes import ctypes
import datetime import datetime
import email.utils
import gzip import gzip
import htmlentitydefs import htmlentitydefs
import httplib import httplib
@ -117,6 +118,14 @@ def sanitize_open(filename, open_mode):
stream = open(filename, open_mode) stream = open(filename, open_mode)
return (stream, filename) return (stream, filename)
def timeconvert(timestr):
"""Convert RFC 2822 defined time string into system timestamp"""
timestamp = None
timetuple = email.utils.parsedate_tz(timestr)
if timetuple is not None:
timestamp = email.utils.mktime_tz(timetuple)
return timestamp
class DownloadError(Exception): class DownloadError(Exception):
"""Download Error exception. """Download Error exception.
@ -748,6 +757,15 @@ class FileDownloader(object):
if data_len is not None and byte_counter != data_len: if data_len is not None and byte_counter != data_len:
raise ContentTooShortError(byte_counter, long(data_len)) raise ContentTooShortError(byte_counter, long(data_len))
self.try_rename(tmpfilename, filename) self.try_rename(tmpfilename, filename)
# Update file modification time
timestr = data.info().get('last-modified', None)
if timestr is not None:
filetime = timeconvert(timestr)
if filetime is not None:
try:
os.utime(filename,(time.time(), filetime))
except:
pass
return True return True
class InfoExtractor(object): class InfoExtractor(object):

Loading…
Cancel
Save