diff --git a/youtube_dl/extractor/adobepass.py b/youtube_dl/extractor/adobepass.py index 38dca1b0a..0b760f4c4 100644 --- a/youtube_dl/extractor/adobepass.py +++ b/youtube_dl/extractor/adobepass.py @@ -1319,6 +1319,11 @@ MSO_INFO = { 'cou060': { 'name': 'Zito Media' }, + 'slingtv': { + 'name': 'Sling TV', + 'username_field': 'username', + 'password_field': 'password', + }, } @@ -1496,6 +1501,60 @@ class AdobePassIE(InfoExtractor): }), headers={ 'Content-Type': 'application/x-www-form-urlencoded' }) + elif mso_id == 'slingtv': + # sling authentication requires several steps + # + # firstbookend - The first redirect is to a bookend page, which + # is just an HTTP get that runs some JS to look at + # window history (?) and count how many times + # the browser has been on a page. To stop back buttons? + # After resubmitting, we are redirected to the login form + # + # after the login form, there is a meta-refresh (bypassing some JS) + # that redirects to another bookend page that once again + # looks at the browser window history... It seems to increment + # by two during the process, so do that here. + # + # after the last bookend, a manual form to finish the login + + first_bookend_page, urlh = provider_redirect_page_res + + # extract the form data from the first bookend and re-send via GET + hidden_data = self._hidden_inputs(first_bookend_page) + hidden_data['history'] = 1 + + provider_login_page_res = self._download_webpage_handle( + urlh.geturl(), video_id, 'Sending first bookend.', query=hidden_data) + + # log in after being redirected + provider_redirect_post_login_res = post_form(provider_login_page_res, 'Logging in', { + mso_info.get('username_field', 'username'): username, + mso_info.get('password_field', 'password'): password, + }) + + provider_association_redirect, urlh = provider_redirect_post_login_res + + # extract the redirect URL (executes with JS in the browser) + provider_refresh_redirect_url = extract_redirect_url( + provider_association_redirect, url=urlh.geturl()) + + # the redirected URL sends us to the final bookend page + last_bookend_page_res = self._download_webpage_handle( + provider_refresh_redirect_url, video_id, + 'Downloading Auth Association Redirect Page (meta refresh)') + + last_bookend_page, urlh = last_bookend_page_res + + # extract the form data from the final page + hidden_data = self._hidden_inputs(last_bookend_page) + hidden_data['history'] = 3 + + # re-send via GET + mvpd_confirm_page_res = self._download_webpage_handle( + urlh.geturl(), video_id, 'Sending final bookend.', query=hidden_data) + + # press the "button" to confirm login + post_form(mvpd_confirm_page_res, 'Confirming Login') else: # Some providers (e.g. DIRECTV NOW) have another meta refresh # based redirect that should be followed.