[youtube] Enforce UTC (#2402)

and [utils] use `utcnow` in `datetime_from_str`

Related: #2223 
Authored by: coletdjnz
This commit is contained in:
coletdjnz 2022-01-20 15:02:01 +00:00 committed by GitHub
parent 301d07fc4b
commit 396a76f7bf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 5 deletions

View file

@ -373,7 +373,7 @@ def _initialize_pref(self):
pref = dict(compat_urlparse.parse_qsl(pref_cookie.value)) pref = dict(compat_urlparse.parse_qsl(pref_cookie.value))
except ValueError: except ValueError:
self.report_warning('Failed to parse user PREF cookie' + bug_reports_message()) self.report_warning('Failed to parse user PREF cookie' + bug_reports_message())
pref.update({'hl': 'en'}) pref.update({'hl': 'en', 'tz': 'UTC'})
self._set_cookie('.youtube.com', name='PREF', value=compat_urllib_parse_urlencode(pref)) self._set_cookie('.youtube.com', name='PREF', value=compat_urllib_parse_urlencode(pref))
def _real_initialize(self): def _real_initialize(self):
@ -412,8 +412,9 @@ def _extract_api_key(self, ytcfg=None, default_client='web'):
def _extract_context(self, ytcfg=None, default_client='web'): def _extract_context(self, ytcfg=None, default_client='web'):
context = get_first( context = get_first(
(ytcfg, self._get_default_ytcfg(default_client)), 'INNERTUBE_CONTEXT', expected_type=dict) (ytcfg, self._get_default_ytcfg(default_client)), 'INNERTUBE_CONTEXT', expected_type=dict)
# Enforce language for extraction # Enforce language and tz for extraction
traverse_obj(context, 'client', expected_type=dict, default={})['hl'] = 'en' client_context = traverse_obj(context, 'client', expected_type=dict, default={})
client_context.update({'hl': 'en', 'timeZone': 'UTC', 'utcOffsetMinutes': 0})
return context return context
_SAPISID = None _SAPISID = None
@ -729,7 +730,8 @@ def _extract_time_text(self, renderer, *path_list):
timestamp = ( timestamp = (
unified_timestamp(text) or unified_timestamp( unified_timestamp(text) or unified_timestamp(
self._search_regex( self._search_regex(
(r'(?:.+|^)(?:live|premieres|ed|ing)(?:\s*on)?\s*(.+\d)', r'\w+[\s,\.-]*\w+[\s,\.-]+20\d{2}'), text.lower(), 'time text', default=None))) (r'(?:.+|^)(?:live|premieres|ed|ing)(?:\s*on)?\s*(.+\d)', r'\w+[\s,\.-]*\w+[\s,\.-]+20\d{2}'),
text.lower(), 'time text', default=None)))
if text and timestamp is None: if text and timestamp is None:
self.report_warning('Cannot parse localized time text' + bug_reports_message(), only_once=True) self.report_warning('Cannot parse localized time text' + bug_reports_message(), only_once=True)

View file

@ -1846,7 +1846,7 @@ def datetime_from_str(date_str, precision='auto', format='%Y%m%d'):
if precision == 'auto': if precision == 'auto':
auto_precision = True auto_precision = True
precision = 'microsecond' precision = 'microsecond'
today = datetime_round(datetime.datetime.now(), precision) today = datetime_round(datetime.datetime.utcnow(), precision)
if date_str in ('now', 'today'): if date_str in ('now', 'today'):
return today return today
if date_str == 'yesterday': if date_str == 'yesterday':