|
@@ -1,6 +1,7 @@
|
|
|
#!/usr/bin/env python
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
+import calendar
|
|
|
import contextlib
|
|
|
import ctypes
|
|
|
import datetime
|
|
@@ -501,13 +502,13 @@ def orderedSet(iterable):
|
|
|
res.append(el)
|
|
|
return res
|
|
|
|
|
|
+
|
|
|
def unescapeHTML(s):
|
|
|
- """
|
|
|
- @param s a string
|
|
|
- """
|
|
|
- assert type(s) == type(u'')
|
|
|
+ if s is None:
|
|
|
+ return None
|
|
|
+ assert type(s) == compat_str
|
|
|
|
|
|
- result = re.sub(u'(?u)&(.+?);', htmlentity_transform, s)
|
|
|
+ result = re.sub(r'(?u)&(.+?);', htmlentity_transform, s)
|
|
|
return result
|
|
|
|
|
|
|
|
@@ -761,6 +762,31 @@ class YoutubeDLHandler(compat_urllib_request.HTTPHandler):
|
|
|
https_response = http_response
|
|
|
|
|
|
|
|
|
+def parse_iso8601(date_str):
|
|
|
+ """ Return a UNIX timestamp from the given date """
|
|
|
+
|
|
|
+ if date_str is None:
|
|
|
+ return None
|
|
|
+
|
|
|
+ m = re.search(
|
|
|
+ r'Z$| ?(?P<sign>\+|-)(?P<hours>[0-9]{2}):?(?P<minutes>[0-9]{2})$',
|
|
|
+ date_str)
|
|
|
+ if not m:
|
|
|
+ timezone = datetime.timedelta()
|
|
|
+ else:
|
|
|
+ date_str = date_str[:-len(m.group(0))]
|
|
|
+ if not m.group('sign'):
|
|
|
+ timezone = datetime.timedelta()
|
|
|
+ else:
|
|
|
+ sign = 1 if m.group('sign') == '+' else -1
|
|
|
+ timezone = datetime.timedelta(
|
|
|
+ hours=sign * int(m.group('hours')),
|
|
|
+ minutes=sign * int(m.group('minutes')))
|
|
|
+
|
|
|
+ dt = datetime.datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S') - timezone
|
|
|
+ return calendar.timegm(dt.timetuple())
|
|
|
+
|
|
|
+
|
|
|
def unified_strdate(date_str):
|
|
|
"""Return a string with the date in the format YYYYMMDD"""
|
|
|
|