mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	[bbc] Add support for authentication
This commit is contained in:
		| @@ -6,14 +6,18 @@ import itertools | ||||
|  | ||||
| from .common import InfoExtractor | ||||
| from ..utils import ( | ||||
|     clean_html, | ||||
|     dict_get, | ||||
|     ExtractorError, | ||||
|     float_or_none, | ||||
|     get_element_by_class, | ||||
|     int_or_none, | ||||
|     parse_duration, | ||||
|     parse_iso8601, | ||||
|     try_get, | ||||
|     unescapeHTML, | ||||
|     urlencode_postdata, | ||||
|     urljoin, | ||||
| ) | ||||
| from ..compat import ( | ||||
|     compat_etree_fromstring, | ||||
| @@ -38,6 +42,9 @@ class BBCCoUkIE(InfoExtractor): | ||||
|                         (?P<id>%s)(?!/(?:episodes|broadcasts|clips)) | ||||
|                     ''' % _ID_REGEX | ||||
|  | ||||
|     _LOGIN_URL = 'https://account.bbc.com/signin' | ||||
|     _NETRC_MACHINE = 'bbc' | ||||
|  | ||||
|     _MEDIASELECTOR_URLS = [ | ||||
|         # Provides HQ HLS streams with even better quality that pc mediaset but fails | ||||
|         # with geolocation in some cases when it's even not geo restricted at all (e.g. | ||||
| @@ -227,6 +234,39 @@ class BBCCoUkIE(InfoExtractor): | ||||
|  | ||||
|     _USP_RE = r'/([^/]+?)\.ism(?:\.hlsv2\.ism)?/[^/]+\.m3u8' | ||||
|  | ||||
|     def _login(self): | ||||
|         username, password = self._get_login_info() | ||||
|         if username is None: | ||||
|             return | ||||
|  | ||||
|         login_page = self._download_webpage( | ||||
|             self._LOGIN_URL, None, 'Downloading signin page') | ||||
|  | ||||
|         login_form = self._hidden_inputs(login_page) | ||||
|  | ||||
|         login_form.update({ | ||||
|             'username': username, | ||||
|             'password': password, | ||||
|         }) | ||||
|  | ||||
|         post_url = urljoin(self._LOGIN_URL, self._search_regex( | ||||
|             r'<form[^>]+action=(["\'])(?P<url>.+?)\1', login_page, | ||||
|             'post url', default=self._LOGIN_URL, group='url')) | ||||
|  | ||||
|         response, urlh = self._download_webpage_handle( | ||||
|             post_url, None, 'Logging in', data=urlencode_postdata(login_form), | ||||
|             headers={'Referer': self._LOGIN_URL}) | ||||
|  | ||||
|         if self._LOGIN_URL in urlh.geturl(): | ||||
|             error = clean_html(get_element_by_class('form-message', response)) | ||||
|             if error: | ||||
|                 raise ExtractorError( | ||||
|                     'Unable to login: %s' % error, expected=True) | ||||
|             raise ExtractorError('Unable to log in') | ||||
|  | ||||
|     def _real_initialize(self): | ||||
|         self._login() | ||||
|  | ||||
|     class MediaSelectionError(Exception): | ||||
|         def __init__(self, id): | ||||
|             self.id = id | ||||
|   | ||||
		Reference in New Issue
	
	Block a user