diff options
Diffstat (limited to 'hypervideo_dl/extractor/hidive.py')
-rw-r--r-- | hypervideo_dl/extractor/hidive.py | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/hypervideo_dl/extractor/hidive.py b/hypervideo_dl/extractor/hidive.py index 3a53f2c..df6868d 100644 --- a/hypervideo_dl/extractor/hidive.py +++ b/hypervideo_dl/extractor/hidive.py @@ -1,5 +1,3 @@ -import re - from .common import InfoExtractor from ..utils import ( ExtractorError, @@ -39,15 +37,28 @@ class HiDiveIE(InfoExtractor): form = self._search_regex( r'(?s)<form[^>]+action="/account/login"[^>]*>(.+?)</form>', webpage, 'login form', default=None) - if not form: # logged in + if not form: return data = self._hidden_inputs(form) data.update({ 'Email': username, 'Password': password, }) - self._download_webpage( + login_webpage = self._download_webpage( self._LOGIN_URL, None, 'Logging in', data=urlencode_postdata(data)) + # If the user has multiple profiles on their account, select one. For now pick the first profile. + profile_id = self._search_regex( + r'<button [^>]+?data-profile-id="(\w+)"', login_webpage, 'profile id', default=None) + if profile_id is None: + return # If only one profile, Hidive auto-selects it + self._request_webpage( + 'https://www.hidive.com/ajax/chooseprofile', None, + data=urlencode_postdata({ + 'profileId': profile_id, + 'hash': self._search_regex( + r'\<button [^>]+?data-hash="(\w+)"', login_webpage, 'profile id hash'), + 'returnUrl': '/dashboard' + })) def _call_api(self, video_id, title, key, data={}, **kwargs): data = { @@ -60,26 +71,6 @@ class HiDiveIE(InfoExtractor): 'https://www.hidive.com/play/settings', video_id, data=urlencode_postdata(data), **kwargs) or {} - def _extract_subtitles_from_rendition(self, rendition, subtitles, parsed_urls): - for cc_file in rendition.get('ccFiles', []): - cc_url = url_or_none(try_get(cc_file, lambda x: x[2])) - # name is used since we cant distinguish subs with same language code - cc_lang = try_get(cc_file, (lambda x: x[1].replace(' ', '-').lower(), lambda x: x[0]), str) - if cc_url not in parsed_urls and cc_lang: - parsed_urls.add(cc_url) - subtitles.setdefault(cc_lang, []).append({'url': cc_url}) - - def _get_subtitles(self, url, video_id, title, key, parsed_urls): - webpage = self._download_webpage(url, video_id, fatal=False) or '' - subtitles = {} - for caption in set(re.findall(r'data-captions=\"([^\"]+)\"', webpage)): - renditions = self._call_api( - video_id, title, key, {'Captions': caption}, fatal=False, - note=f'Downloading {caption} subtitle information').get('renditions') or {} - for rendition_id, rendition in renditions.items(): - self._extract_subtitles_from_rendition(rendition, subtitles, parsed_urls) - return subtitles - def _real_extract(self, url): video_id, title, key = self._match_valid_url(url).group('id', 'title', 'key') settings = self._call_api(video_id, title, key) @@ -104,10 +95,20 @@ class HiDiveIE(InfoExtractor): f['format_note'] = f'{version}, {extra}' formats.extend(frmt) + subtitles = {} + for rendition_id, rendition in settings['renditions'].items(): + audio, version, extra = rendition_id.split('_') + for cc_file in rendition.get('ccFiles') or []: + cc_url = url_or_none(try_get(cc_file, lambda x: x[2])) + cc_lang = try_get(cc_file, (lambda x: x[1].replace(' ', '-').lower(), lambda x: x[0]), str) + if cc_url not in parsed_urls and cc_lang: + parsed_urls.add(cc_url) + subtitles.setdefault(cc_lang, []).append({'url': cc_url}) + return { 'id': video_id, 'title': video_id, - 'subtitles': self.extract_subtitles(url, video_id, title, key, parsed_urls), + 'subtitles': subtitles, 'formats': formats, 'series': title, 'season_number': int_or_none( |