mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 06:35:12 +00:00 
			
		
		
		
	[adobepass] add specific options for adobe pass authentication
- add --ap-username and --ap-password option to specify TV provider username and password in the cmd line - add --ap-retries option to limit the number of retries - add --list-ap-msi-ids to list the supported TV Providers
This commit is contained in:
		| @@ -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() | ||||
|         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] | ||||
|  | ||||
|             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', | ||||
|                 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') | ||||
|                 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', | ||||
|                 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, | ||||
|                     'session_guid': xml_text(authn_token, 'simpleTokenAuthenticationGuid'), | ||||
|                     'hashed_guid': 'false', | ||||
|                 }), headers=mvpd_headers) | ||||
|             if '<pendingLogout' in session: | ||||
|             if '<pendingLogout' in short_authorize: | ||||
|                 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, | ||||
|                     '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, {}) | ||||
|                 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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Remita Amine
					Remita Amine