|
|
@ -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""" |
|
|
|
|
|
|
|