Răsfoiți Sursa

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.
Gergely Imreh 14 ani în urmă
părinte
comite
09bd408c28
1 a modificat fișierele cu 18 adăugiri și 0 ștergeri
  1. 18 0
      youtube-dl

+ 18 - 0
youtube-dl

@@ -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):