1
0
mirror of https://github.com/l1ving/youtube-dl synced 2024-11-20 18:36:06 +08:00

[funimation] fix authentication(closes #13021)

This commit is contained in:
Remita Amine 2017-05-08 18:13:58 +01:00
parent 3b859145c2
commit 8fa17117df

View File

@ -20,6 +20,7 @@ class FunimationIE(InfoExtractor):
_VALID_URL = r'https?://(?:www\.)?funimation(?:\.com|now\.uk)/shows/[^/]+/(?P<id>[^/?#&]+)' _VALID_URL = r'https?://(?:www\.)?funimation(?:\.com|now\.uk)/shows/[^/]+/(?P<id>[^/?#&]+)'
_NETRC_MACHINE = 'funimation' _NETRC_MACHINE = 'funimation'
_TOKEN = None
_TESTS = [{ _TESTS = [{
'url': 'https://www.funimation.com/shows/hacksign/role-play/', 'url': 'https://www.funimation.com/shows/hacksign/role-play/',
@ -67,27 +68,19 @@ class FunimationIE(InfoExtractor):
(username, password) = self._get_login_info() (username, password) = self._get_login_info()
if username is None: if username is None:
return return
data = urlencode_postdata({ try:
'email_field': username, data = self._download_json(
'password_field': password, 'https://prod-api-funimationnow.dadcdigital.com/api/auth/login/',
}) None, 'Logging in as %s' % username, data=urlencode_postdata({
user_agent = self._extract_cloudflare_session_ua(self._LOGIN_URL) 'username': username,
if not user_agent: 'password': password,
user_agent = 'Mozilla/5.0 (Windows NT 5.2; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0' }))
login_request = sanitized_Request(self._LOGIN_URL, data, headers={ self._TOKEN = data['token']
'User-Agent': user_agent, except ExtractorError as e:
'Content-Type': 'application/x-www-form-urlencoded' if isinstance(e.cause, compat_HTTPError) and e.cause.code == 401:
}) error = self._parse_json(e.cause.read().decode(), None)['error']
login_page = self._download_webpage( raise ExtractorError(error, expected=True)
login_request, None, 'Logging in as %s' % username) raise
if any(p in login_page for p in ('funimation.com/logout', '>Log Out<')):
return
error = self._html_search_regex(
r'(?s)<div[^>]+id=["\']errorMessages["\'][^>]*>(.+?)</div>',
login_page, 'error messages', default=None)
if error:
raise ExtractorError('Unable to login: %s' % error, expected=True)
raise ExtractorError('Unable to log in')
def _real_initialize(self): def _real_initialize(self):
self._login() self._login()
@ -125,9 +118,12 @@ class FunimationIE(InfoExtractor):
description = self._html_search_meta(['description', 'og:description'], webpage, fatal=True) description = self._html_search_meta(['description', 'og:description'], webpage, fatal=True)
try: try:
headers = {}
if self._TOKEN:
headers['Authorization'] = 'Token %s' % self._TOKEN
sources = self._download_json( sources = self._download_json(
'https://prod-api-funimationnow.dadcdigital.com/api/source/catalog/video/%s/signed/' % video_id, 'https://prod-api-funimationnow.dadcdigital.com/api/source/catalog/video/%s/signed/' % video_id,
video_id)['items'] video_id, headers=headers)['items']
except ExtractorError as e: except ExtractorError as e:
if isinstance(e.cause, compat_HTTPError) and e.cause.code == 403: if isinstance(e.cause, compat_HTTPError) and e.cause.code == 403:
error = self._parse_json(e.cause.read(), video_id)['errors'][0] error = self._parse_json(e.cause.read(), video_id)['errors'][0]