diff --git a/youtube_dl/extractor/crunchyroll.py b/youtube_dl/extractor/crunchyroll.py index fd1e7afad..e442005d4 100644 --- a/youtube_dl/extractor/crunchyroll.py +++ b/youtube_dl/extractor/crunchyroll.py @@ -5,6 +5,11 @@ 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 @@ -27,6 +32,7 @@ from ..utils import ( lowercase_escape, remove_end, sanitized_Request, + std_headers, unified_strdate, urlencode_postdata, xpath_text, @@ -56,6 +62,18 @@ class CrunchyrollBaseIE(InfoExtractor): 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') @@ -116,6 +134,9 @@ class CrunchyrollBaseIE(InfoExtractor): request.add_header('Accept-Language', '*') return super(CrunchyrollBaseIE, self)._download_webpage(request, *args, **kwargs) + def _set_crunchyroll_cookie(self, name, value): + self._set_cookie('crunchyroll.com', name, value) + @staticmethod def _add_skip_wall(url): parsed_url = compat_urlparse.urlparse(url)