import datetime as dt import functools import itertools import json import re import time from .common import InfoExtractor, SearchInfoExtractor from ..networking.exceptions import HTTPError from ..utils import ( ExtractorError, OnDemandPagedList, clean_html, determine_ext, extract_attributes, float_or_none, int_or_none, parse_bitrate, parse_duration, parse_iso8601, parse_qs, parse_resolution, qualities, str_or_none, truncate_string, unified_timestamp, update_url_query, url_basename, url_or_none, urlencode_postdata, urljoin, ) from ..utils.traversal import ( find_element, require, traverse_obj, ) class NiconicoBaseIE(InfoExtractor): _GEO_BYPASS = False _GEO_COUNTRIES = ['JP'] _LOGIN_BASE = 'https://account.nicovideo.jp' _NETRC_MACHINE = 'niconico' @property def is_logged_in(self): return bool(self._get_cookies('https://www.nicovideo.jp').get('user_session')) def _raise_login_error(self, message, expected=True): raise ExtractorError(f'Unable to login: {message}', expected=expected) def _perform_login(self, username, password): if self.is_logged_in: return self._request_webpage( f'{self._LOGIN_BASE}/login', None, 'Requesting session cookies') webpage = self._download_webpage( f'{self._LOGIN_BASE}/login/redirector', None, 'Logging in', 'Unable to log in', headers={ 'Content-Type': 'application/x-www-form-urlencoded', 'Referer': f'{self._LOGIN_BASE}/login', }, data=urlencode_postdata({ 'mail_tel': username, 'password': password, })) if self.is_logged_in: return elif err_msg := traverse_obj(webpage, ( {find_element(cls='notice error')}, {find_element(cls='notice__text')}, {clean_html}, )): self._raise_login_error(err_msg or 'Invalid username or password') elif 'oneTimePw' in webpage: post_url = self._search_regex( r'