# coding: utf-8 from __future__ import unicode_literals import re import json import xml.etree.ElementTree as etree import zlib try: import cfscrape cfscrape_available = True except ImportError: cfscrape_available = False from hashlib import sha1 from math import pow, sqrt, floor from .common import InfoExtractor from .vrv import VRVIE from ..compat import ( compat_b64decode, compat_etree_fromstring, compat_urllib_parse_urlencode, compat_urllib_request, compat_urlparse, ) from ..utils import ( ExtractorError, bytes_to_intlist, extract_attributes, float_or_none, intlist_to_bytes, int_or_none, lowercase_escape, remove_end, sanitized_Request, std_headers, unified_strdate, urlencode_postdata, xpath_text, ) from ..aes import ( aes_cbc_decrypt, ) class CrunchyrollBaseIE(InfoExtractor): _LOGIN_URL = 'https://www.crunchyroll.com/login' _LOGIN_FORM = 'login_form' _NETRC_MACHINE = 'crunchyroll' def _call_rpc_api(self, method, video_id, note=None, data=None): data = data or {} data['req'] = 'RpcApi' + method data = compat_urllib_parse_urlencode(data).encode('utf-8') return self._download_xml( 'https://www.crunchyroll.com/xml/', video_id, note, fatal=False, data=data, headers={ 'Content-Type': 'application/x-www-form-urlencoded', }) def _login(self): username, password = self._get_login_info() if username is None: return if cfscrape_available: if cfscrape.__version__ >= '1.9.0': # Scrape cookie from cloudflare and insert them scraper = cfscrape.create_scraper() tokens = scraper.get_tokens(self._LOGIN_URL, std_headers['User-Agent']) self._set_crunchyroll_cookie('cf_clearance', tokens[0]['cf_clearance']) self._set_crunchyroll_cookie('__cfduid', tokens[0]['__cfduid']) else: self.report_warning('cfscrape version is bellow 1.9.0 please update cfscrape.') else: self.report_warning('cfscrape not found. Please install it if you want use login function for CrunchyRoll.') login_page = self._download_webpage( self._LOGIN_URL, None, 'Downloading login page') def is_logged(webpage): return 'href="/logout"' in webpage # Already logged in if is_logged(login_page): return login_form_str = self._search_regex( r'(?P