From 08625e412508dd962e82c2bc8b2d292f15cfa1d9 Mon Sep 17 00:00:00 2001 From: OhMyBahGosh <77786782+ohmybahgosh@users.noreply.github.com> Date: Tue, 6 Jul 2021 17:56:51 -0400 Subject: [PATCH] [AdobePass] Add Spectrum MSO (#470) From: https://github.com/ytdl-org/youtube-dl/pull/26792 Co-authored by: kevinoconnor7, ohmybahgosh --- yt_dlp/extractor/adobepass.py | 41 +++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/yt_dlp/extractor/adobepass.py b/yt_dlp/extractor/adobepass.py index 47cae661e..2a06bbd0c 100644 --- a/yt_dlp/extractor/adobepass.py +++ b/yt_dlp/extractor/adobepass.py @@ -1,6 +1,7 @@ # coding: utf-8 from __future__ import unicode_literals +import json import re import time import xml.etree.ElementTree as etree @@ -61,6 +62,11 @@ 'username_field': 'IDToken1', 'password_field': 'IDToken2', }, + 'Spectrum': { + 'name': 'Spectrum', + 'username_field': 'IDToken1', + 'password_field': 'IDToken2', + }, 'Philo': { 'name': 'Philo', 'username_field': 'ident' @@ -1524,6 +1530,41 @@ def extract_redirect_url(html, url=None, fatal=False): }), headers={ 'Content-Type': 'application/x-www-form-urlencoded' }) + elif mso_id == 'Spectrum': + # Spectrum's login for is dynamically loaded via JS so we need to hardcode the flow + # as a one-off implementation. + provider_redirect_page, urlh = provider_redirect_page_res + provider_login_page_res = post_form( + provider_redirect_page_res, self._DOWNLOADING_LOGIN_PAGE) + saml_login_page, urlh = provider_login_page_res + relay_state = self._search_regex( + r'RelayState\s*=\s*"(?P.+?)";', + saml_login_page, 'RelayState', group='relay') + saml_request = self._search_regex( + r'SAMLRequest\s*=\s*"(?P.+?)";', + saml_login_page, 'SAMLRequest', group='saml_request') + login_json = { + mso_info['username_field']: username, + mso_info['password_field']: password, + 'RelayState': relay_state, + 'SAMLRequest': saml_request, + } + saml_response_json = self._download_json( + 'https://tveauthn.spectrum.net/tveauthentication/api/v1/manualAuth', video_id, + 'Downloading SAML Response', + data=json.dumps(login_json).encode(), + headers={ + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }) + self._download_webpage( + saml_response_json['SAMLRedirectUri'], video_id, + 'Confirming Login', data=urlencode_postdata({ + 'SAMLResponse': saml_response_json['SAMLResponse'], + 'RelayState': relay_state, + }), headers={ + 'Content-Type': 'application/x-www-form-urlencoded' + }) else: # Some providers (e.g. DIRECTV NOW) have another meta refresh # based redirect that should be followed.