|
|
|
@ -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
|
|
|
|
|