@ -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,105 +83,95 @@ class AdobePassIE(InfoExtractor):
}
guid = xml_text ( resource , ' guid ' )
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 ' ) :
authn_token = None
if not authn_token :
# TODO add support for other TV Providers
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 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 ' ,
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 ' ) :
authn_token = None
if not authn_token :
# TODO add support for other TV Providers
mso_id = self . _downloader . params . get ( ' ap_mso_id ' )
if not mso_id :
raise_mvpd_required ( )
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 :
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 ,
' Downloading Provider Redirect Page ' , query = {
' noflash ' : ' true ' ,
' mso_id ' : mso_id ,
' requestor_id ' : requestor_id ,
' no_iframe ' : ' false ' ,
' domain_name ' : ' adobe.com ' ,
' redirect_url ' : url ,
} )
provider_redirect_page_res = self . _download_webpage_handle (
self . _SERVICE_PROVIDER_TEMPLATE % ' authenticate/saml ' , video_id ,
' Downloading Provider Redirect Page ' , query = {
' noflash ' : ' true ' ,
' mso_id ' : mso_id ,
' requestor_id ' : requestor_id ,
' no_iframe ' : ' false ' ,
' domain_name ' : ' adobe.com ' ,
' redirect_url ' : url ,
provider_login_page_res = post_form (
provider_redirect_page_res , ' Downloading Provider Login Page ' )
mvpd_confirm_page_res = post_form ( provider_login_page_res , ' Logging in ' , {
mso_info [ ' username_field ' ] : username ,
mso_info [ ' password_field ' ] : password ,
} )
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 )
if mso_id == ' DTV ' :
post_form ( mvpd_confirm_page_res , ' Confirming Login ' )
session = self . _download_webpage (
self . _SERVICE_PROVIDER_TEMPLATE % ' session ' , video_id ,
' Retrieving Session ' , data = urlencode_postdata ( {
' _method ' : ' GET ' ,
' requestor_id ' : requestor_id ,
} ) , 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 )
authn_token = unescapeHTML ( xml_text ( session , ' authnToken ' ) )
requestor_info [ ' authn_token ' ] = authn_token
self . _downloader . cache . store ( ' mvpd ' , requestor_id , requestor_info )
authz_token = requestor_info . get ( guid )
if authz_token and is_expired ( authz_token , ' simpleTokenTTL ' ) :
authz_token = None
if not authz_token :
authorize = self . _download_webpage (
self . _SERVICE_PROVIDER_TEMPLATE % ' authorize ' , video_id ,
' Retrieving Authorization Token ' , data = urlencode_postdata ( {
' resource_id ' : resource ,
if mso_id == ' DTV ' :
post_form ( mvpd_confirm_page_res , ' Confirming Login ' )
session = self . _download_webpage (
self . _SERVICE_PROVIDER_TEMPLATE % ' session ' , video_id ,
' Retrieving Session ' , data = urlencode_postdata ( {
' _method ' : ' GET ' ,
' requestor_id ' : requestor_id ,
} ) , headers = mvpd_headers )
if ' <pendingLogout ' in session :
self . _downloader . cache . store ( ' mvpd ' , requestor_id , { } )
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 )
authz_token = requestor_info . get ( guid )
if authz_token and is_expired ( authz_token , ' simpleTokenTTL ' ) :
authz_token = None
if not authz_token :
authorize = self . _download_webpage (
self . _SERVICE_PROVIDER_TEMPLATE % ' authorize ' , video_id ,
' Retrieving Authorization Token ' , data = urlencode_postdata ( {
' resource_id ' : resource ,
' requestor_id ' : requestor_id ,
' authentication_token ' : authn_token ,
' mso_id ' : xml_text ( authn_token , ' simpleTokenMsoID ' ) ,
' userMeta ' : ' 1 ' ,
} ) , headers = mvpd_headers )
if ' <pendingLogout ' in authorize :
self . _downloader . cache . store ( ' mvpd ' , requestor_id , { } )
count + = 1
continue
authz_token = unescapeHTML ( xml_text ( authorize , ' authzToken ' ) )
requestor_info [ guid ] = authz_token
self . _downloader . cache . store ( ' mvpd ' , requestor_id , requestor_info )
mvpd_headers . update ( {
' ap_19 ' : xml_text ( authn_token , ' simpleSamlNameID ' ) ,
' ap_23 ' : xml_text ( authn_token , ' simpleSamlSessionIndex ' ) ,
} )
short_authorize = self . _download_webpage (
self . _SERVICE_PROVIDER_TEMPLATE % ' shortAuthorize ' ,
video_id , ' Retrieving Media Token ' , data = urlencode_postdata ( {
' authz_token ' : authz_token ,
' requestor_id ' : requestor_id ,
' authentication_token ' : authn_token ,
' mso_id ' : xml_text ( authn_token , ' simpleTokenMsoID ' ) ,
' userMeta ' : ' 1 ' ,
' session_guid ' : xml_text ( authn_token , ' simpleTokenAuthenticationGuid ' ) ,
' hashed_guid ' : ' false ' ,
} ) , headers = mvpd_headers )
if ' <pendingLogout ' in authorize :
if ' <pendingLogout ' in short_ authorize:
self . _downloader . cache . store ( ' mvpd ' , requestor_id , { } )
return self . _extract_mvpd_auth ( url , video_id , requestor_id , resource )
authz_token = unescapeHTML ( xml_text ( authorize , ' authzToken ' ) )
requestor_info [ guid ] = authz_token
self . _downloader . cache . store ( ' mvpd ' , requestor_id , requestor_info )
mvpd_headers . update ( {
' ap_19 ' : xml_text ( authn_token , ' simpleSamlNameID ' ) ,
' ap_23 ' : xml_text ( authn_token , ' simpleSamlSessionIndex ' ) ,
} )
short_authorize = self . _download_webpage (
self . _SERVICE_PROVIDER_TEMPLATE % ' shortAuthorize ' ,
video_id , ' Retrieving Media Token ' , data = urlencode_postdata ( {
' authz_token ' : authz_token ,
' requestor_id ' : requestor_id ,
' session_guid ' : xml_text ( authn_token , ' simpleTokenAuthenticationGuid ' ) ,
' hashed_guid ' : ' false ' ,
} ) , 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 )
return short_authorize
count + = 1
continue
return short_authorize