@ -15,6 +15,20 @@ from ..utils import (
)
MSO_INFO = {
' DTV ' : {
' name ' : ' DirecTV ' ,
' username_field ' : ' username ' ,
' password_field ' : ' password ' ,
} ,
' Rogers ' : {
' name ' : ' Rogers Cable ' ,
' username_field ' : ' UserName ' ,
' password_field ' : ' UserPassword ' ,
} ,
}
class AdobePassIE ( InfoExtractor ) :
_SERVICE_PROVIDER_TEMPLATE = ' https://sp.auth.adobe.com/adobe-services/ %s '
_USER_AGENT = ' Mozilla/5.0 (X11; Linux i686; rv:47.0) Gecko/20100101 Firefox/47.0 '
@ -43,6 +57,18 @@ class AdobePassIE(InfoExtractor):
token_expires = unified_timestamp ( re . sub ( r ' [_ ]GMT ' , ' ' , xml_text ( token , date_ele ) ) )
return token_expires and token_expires < = int ( time . time ( ) )
def post_form ( form_page_res , note , data = { } ) :
form_page , urlh = form_page_res
post_url = self . _html_search_regex ( r ' <form[^>]+action=([ " \' ])(?P<url>.+?) \ 1 ' , form_page , ' post url ' , group = ' url ' )
if not re . match ( r ' https?:// ' , post_url ) :
post_url = compat_urlparse . urljoin ( urlh . geturl ( ) , post_url )
form_data = self . _hidden_inputs ( form_page )
form_data . update ( data )
return self . _download_webpage_handle (
post_url , video_id , note , data = urlencode_postdata ( form_data ) , headers = {
' Content-Type ' : ' application/x-www-form-urlencoded ' ,
} )
def raise_mvpd_required ( ) :
raise ExtractorError (
' This video is only available for users of participating TV providers. '
@ -57,6 +83,9 @@ class AdobePassIE(InfoExtractor):
}
guid = xml_text ( resource , ' guid ' )
retries = self . _downloader . params . get ( ' ap_retries ' , 3 )
count = 0
while count < retries :
requestor_info = self . _downloader . cache . load ( ' mvpd ' , requestor_id ) or { }
authn_token = requestor_info . get ( ' authn_token ' )
if authn_token and is_expired ( authn_token , ' simpleTokenExpires ' ) :
@ -66,21 +95,13 @@ class AdobePassIE(InfoExtractor):
mso_id = self . _downloader . params . get ( ' ap_mso_id ' )
if not mso_id :
raise_mvpd_required ( )
username , password = self . _get_netrc_login_info ( mso_id )
if mso_id not in MSO_INFO :
raise ExtractorError (
' Unsupported TV Provider, use --list-ap-mso-ids to get a list of supported TV Providers ' % mso_id , expected = True )
username , password = self . _get_login_info ( ' ap_username ' , ' ap_password ' , mso_id )
if not username or not password :
return raise_mvpd_required ( )
def post_form ( form_page_res , note , data = { } ) :
form_page , urlh = form_page_res
post_url = self . _html_search_regex ( r ' <form[^>]+action=([ " \' ])(?P<url>.+?) \ 1 ' , form_page , ' post url ' , group = ' url ' )
if not re . match ( r ' https?:// ' , post_url ) :
post_url = compat_urlparse . urljoin ( urlh . geturl ( ) , post_url )
form_data = self . _hidden_inputs ( form_page )
form_data . update ( data )
return self . _download_webpage_handle (
post_url , video_id , note , data = urlencode_postdata ( form_data ) , headers = {
' Content-Type ' : ' application/x-www-form-urlencoded ' ,
} )
raise_mvpd_required ( )
mso_info = MSO_INFO [ mso_id ]
provider_redirect_page_res = self . _download_webpage_handle (
self . _SERVICE_PROVIDER_TEMPLATE % ' authenticate/saml ' , video_id ,
@ -94,18 +115,10 @@ class AdobePassIE(InfoExtractor):
} )
provider_login_page_res = post_form (
provider_redirect_page_res , ' Downloading Provider Login Page ' )
login_data = { }
if mso_id == ' DTV ' :
login_data = {
' username ' : username ,
' password ' : password ,
}
elif mso_id == ' Rogers ' :
login_data = {
' UserName ' : username ,
' UserPassword ' : password ,
}
mvpd_confirm_page_res = post_form ( provider_login_page_res , ' Logging in ' , login_data )
mvpd_confirm_page_res = post_form ( provider_login_page_res , ' Logging in ' , {
mso_info [ ' username_field ' ] : username ,
mso_info [ ' password_field ' ] : password ,
} )
if mso_id == ' DTV ' :
post_form ( mvpd_confirm_page_res , ' Confirming Login ' )
@ -117,7 +130,8 @@ class AdobePassIE(InfoExtractor):
} ) , headers = mvpd_headers )
if ' <pendingLogout ' in session :
self . _downloader . cache . store ( ' mvpd ' , requestor_id , { } )
return self . _extract_mvpd_auth ( url , video_id , requestor_id , resource )
count + = 1
continue
authn_token = unescapeHTML ( xml_text ( session , ' authnToken ' ) )
requestor_info [ ' authn_token ' ] = authn_token
self . _downloader . cache . store ( ' mvpd ' , requestor_id , requestor_info )
@ -137,7 +151,8 @@ class AdobePassIE(InfoExtractor):
} ) , headers = mvpd_headers )
if ' <pendingLogout ' in authorize :
self . _downloader . cache . store ( ' mvpd ' , requestor_id , { } )
return self . _extract_mvpd_auth ( url , video_id , requestor_id , resource )
count + = 1
continue
authz_token = unescapeHTML ( xml_text ( authorize , ' authzToken ' ) )
requestor_info [ guid ] = authz_token
self . _downloader . cache . store ( ' mvpd ' , requestor_id , requestor_info )
@ -157,5 +172,6 @@ class AdobePassIE(InfoExtractor):
} ) , headers = mvpd_headers )
if ' <pendingLogout ' in short_authorize :
self . _downloader . cache . store ( ' mvpd ' , requestor_id , { } )
return self . _extract_mvpd_auth ( url , video_id , requestor_id , resource )
count + = 1
continue
return short_authorize