35
35
sanitized_Request ,
36
36
traverse_obj ,
37
37
try_get ,
38
- urlencode_postdata ,
39
38
xpath_text ,
40
39
)
41
40
from ..aes import (
44
43
45
44
46
45
class CrunchyrollBaseIE (InfoExtractor ):
47
- _LOGIN_URL = 'https://www.crunchyroll.com/login'
48
- _LOGIN_FORM = 'login_form '
46
+ _LOGIN_URL = 'https://www.crunchyroll.com/%3Cspan%20class="x x-first x-last">welcome/ login'
47
+ _API_BASE = 'https://api.crunchyroll.com '
49
48
_NETRC_MACHINE = 'crunchyroll'
50
49
51
50
def _call_rpc_api (self , method , video_id , note = None , data = None ):
@@ -62,50 +61,33 @@ def _login(self):
62
61
username , password = self ._get_login_info ()
63
62
if username is None :
64
63
return
65
-
66
- login_page = self ._download_webpage (
67
- self ._LOGIN_URL , None , 'Downloading login page' )
68
-
69
- def is_logged (webpage ):
70
- return 'href="/logout"' in webpage
71
-
72
- # Already logged in
73
- if is_logged (login_page ):
74
- return
75
-
76
- login_form_str = self ._search_regex (
77
- r'(?P<form><form[^>]+?id=(["\'])%s\2[^>]*>)' % self ._LOGIN_FORM ,
78
- login_page , 'login form' , group = 'form' )
79
-
80
- post_url = extract_attributes (login_form_str ).get ('action' )
81
- if not post_url :
82
- post_url = self ._LOGIN_URL
83
- elif not post_url .startswith ('http' ):
84
- post_url = compat_urlparse .urljoin (self ._LOGIN_URL , post_url )
85
-
86
- login_form = self ._form_hidden_inputs (self ._LOGIN_FORM , login_page )
87
-
88
- login_form .update ({
89
- 'login_form[name]' : username ,
90
- 'login_form[password]' : password ,
91
- })
92
-
93
- response = self ._download_webpage (
94
- post_url , None , 'Logging in' , 'Wrong login info' ,
95
- data = urlencode_postdata (login_form ),
96
- headers = {'Content-Type' : 'application/x-www-form-urlencoded' })
97
-
98
- # Successful login
99
- if is_logged (response ):
64
+ if self ._get_cookies (self ._LOGIN_URL ).get ('etp_rt' ):
100
65
return
101
66
102
- error = self ._html_search_regex (
103
- '(?s)<ul[^>]+class=["\' ]messages["\' ][^>]*>(.+?)</ul>' ,
104
- response , 'error message' , default = None )
105
- if error :
106
- raise ExtractorError ('Unable to login: %s' % error , expected = True )
107
-
108
- raise ExtractorError ('Unable to log in' )
67
+ upsell_response = self ._download_json (
68
+ f'{ self ._API_BASE } /get_upsell_data.0.json' , None , 'Getting session id' ,
69
+ query = {
70
+ 'sess_id' : 1 ,
71
+ 'device_id' : 'whatvalueshouldbeforweb' ,
72
+ 'device_type' : 'com.crunchyroll.static' ,
73
+ 'access_token' : 'giKq5eY27ny3cqz' ,
74
+ 'referer' : self ._LOGIN_URL
75
+ })
76
+ if upsell_response ['code' ] != 'ok' :
77
+ raise ExtractorError ('Could not get session id' )
78
+ session_id = upsell_response ['data' ]['session_id' ]
79
+
80
+ login_response = self ._download_json (
81
+ f'{ self ._API_BASE } /login.1.json' , None , 'Logging in' ,
82
+ data = compat_urllib_parse_urlencode ({
83
+ 'account' : username ,
84
+ 'password' : password ,
85
+ 'session_id' : session_id
86
+ }).encode ('ascii' ))
87
+ if login_response ['code' ] != 'ok' :
88
+ raise ExtractorError ('Login failed. Bad username or password?' , expected = True )
89
+ if not self ._get_cookies (self ._LOGIN_URL ).get ('etp_rt' ):
90
+ raise ExtractorError ('Login succeeded but did not set etp_rt cookie' )
109
91
110
92
def _real_initialize (self ):
111
93
self ._login ()
0 commit comments