mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	[Hidive] Fix subtitles broken by 705e7c2005
				
					
				
			This commit is contained in:
		| @@ -1,5 +1,5 @@ | |||||||
| # coding: utf-8 | # coding: utf-8 | ||||||
| from __future__ import unicode_literals | import re | ||||||
|  |  | ||||||
| from .common import InfoExtractor | from .common import InfoExtractor | ||||||
| from ..utils import ( | from ..utils import ( | ||||||
| @@ -52,15 +52,39 @@ class HiDiveIE(InfoExtractor): | |||||||
|         self._download_webpage( |         self._download_webpage( | ||||||
|             self._LOGIN_URL, None, 'Logging in', data=urlencode_postdata(data)) |             self._LOGIN_URL, None, 'Logging in', data=urlencode_postdata(data)) | ||||||
|  |  | ||||||
|  |     def _call_api(self, video_id, title, key, data={}, **kwargs): | ||||||
|  |         data = { | ||||||
|  |             **data, | ||||||
|  |             'Title': title, | ||||||
|  |             'Key': key, | ||||||
|  |             'PlayerId': 'f4f895ce1ca713ba263b91caeb1daa2d08904783', | ||||||
|  |         } | ||||||
|  |         return self._download_json( | ||||||
|  |             '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, subtitles, parsed_urls): | ||||||
|  |         webpage = self._download_webpage(url, video_id, fatal=False) or '' | ||||||
|  |         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): |     def _real_extract(self, url): | ||||||
|         video_id, title, key = self._match_valid_url(url).group('id', 'title', 'key') |         video_id, title, key = self._match_valid_url(url).group('id', 'title', 'key') | ||||||
|         settings = self._download_json( |         settings = self._call_api(video_id, title, key) | ||||||
|             'https://www.hidive.com/play/settings', video_id, |  | ||||||
|             data=urlencode_postdata({ |  | ||||||
|                 'Title': title, |  | ||||||
|                 'Key': key, |  | ||||||
|                 'PlayerId': 'f4f895ce1ca713ba263b91caeb1daa2d08904783', |  | ||||||
|             })) |  | ||||||
|  |  | ||||||
|         restriction = settings.get('restrictionReason') |         restriction = settings.get('restrictionReason') | ||||||
|         if restriction == 'RegionRestricted': |         if restriction == 'RegionRestricted': | ||||||
| @@ -69,12 +93,12 @@ class HiDiveIE(InfoExtractor): | |||||||
|             raise ExtractorError( |             raise ExtractorError( | ||||||
|                 '%s said: %s' % (self.IE_NAME, restriction), expected=True) |                 '%s said: %s' % (self.IE_NAME, restriction), expected=True) | ||||||
|  |  | ||||||
|         formats, subtitles, urls = [], {}, {None} |         formats, subtitles, parsed_urls = [], {}, {None} | ||||||
|         for rendition_id, rendition in settings['renditions'].items(): |         for rendition_id, rendition in settings['renditions'].items(): | ||||||
|             audio, version, extra = rendition_id.split('_') |             audio, version, extra = rendition_id.split('_') | ||||||
|             m3u8_url = url_or_none(try_get(rendition, lambda x: x['bitrates']['hls'])) |             m3u8_url = url_or_none(try_get(rendition, lambda x: x['bitrates']['hls'])) | ||||||
|             if m3u8_url not in urls: |             if m3u8_url not in parsed_urls: | ||||||
|                 urls.add(m3u8_url) |                 parsed_urls.add(m3u8_url) | ||||||
|                 frmt = self._extract_m3u8_formats( |                 frmt = self._extract_m3u8_formats( | ||||||
|                     m3u8_url, video_id, 'mp4', entry_protocol='m3u8_native', m3u8_id=rendition_id, fatal=False) |                     m3u8_url, video_id, 'mp4', entry_protocol='m3u8_native', m3u8_id=rendition_id, fatal=False) | ||||||
|                 for f in frmt: |                 for f in frmt: | ||||||
| @@ -82,19 +106,13 @@ class HiDiveIE(InfoExtractor): | |||||||
|                     f['format_note'] = f'{version}, {extra}' |                     f['format_note'] = f'{version}, {extra}' | ||||||
|                 formats.extend(frmt) |                 formats.extend(frmt) | ||||||
|  |  | ||||||
|             for cc_file in rendition.get('ccFiles', []): |             self._extract_subtitles_from_rendition(rendition, subtitles, parsed_urls) | ||||||
|                 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 urls and cc_lang: |  | ||||||
|                     urls.add(cc_url) |  | ||||||
|                     subtitles.setdefault(cc_lang, []).append({'url': cc_url}) |  | ||||||
|         self._sort_formats(formats) |         self._sort_formats(formats) | ||||||
|  |  | ||||||
|         return { |         return { | ||||||
|             'id': video_id, |             'id': video_id, | ||||||
|             'title': video_id, |             'title': video_id, | ||||||
|             'subtitles': subtitles, |             'subtitles': self.extract_subtitles(url, video_id, title, key, subtitles, parsed_urls), | ||||||
|             'formats': formats, |             'formats': formats, | ||||||
|             'series': title, |             'series': title, | ||||||
|             'season_number': int_or_none( |             'season_number': int_or_none( | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 pukkandan
					pukkandan