mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	[abc:iview] Improve extraction and bypass geo restriction (closes #14782)
This commit is contained in:
		| @@ -13,6 +13,7 @@ from ..utils import ( | ||||
|     int_or_none, | ||||
|     parse_iso8601, | ||||
|     try_get, | ||||
|     update_url_query, | ||||
| ) | ||||
|  | ||||
|  | ||||
| @@ -104,21 +105,24 @@ class ABCIE(InfoExtractor): | ||||
| class ABCIViewIE(InfoExtractor): | ||||
|     IE_NAME = 'abc.net.au:iview' | ||||
|     _VALID_URL = r'https?://iview\.abc\.net\.au/programs/[^/]+/(?P<id>[^/?#]+)' | ||||
|     _GEO_COUNTRIES = ['AU'] | ||||
|  | ||||
|     # ABC iview programs are normally available for 14 days only. | ||||
|     _TESTS = [{ | ||||
|         'url': 'http://iview.abc.net.au/programs/diaries-of-a-broken-mind/ZX9735A001S00', | ||||
|         'url': 'http://iview.abc.net.au/programs/call-the-midwife/ZW0898A003S00', | ||||
|         'md5': 'cde42d728b3b7c2b32b1b94b4a548afc', | ||||
|         'info_dict': { | ||||
|             'id': 'ZX9735A001S00', | ||||
|             'id': 'ZW0898A003S00', | ||||
|             'ext': 'mp4', | ||||
|             'title': 'Diaries Of A Broken Mind', | ||||
|             'description': 'md5:7de3903874b7a1be279fe6b68718fc9e', | ||||
|             'upload_date': '20161010', | ||||
|             'uploader_id': 'abc2', | ||||
|             'timestamp': 1476064920, | ||||
|             'title': 'Series 5 Ep 3', | ||||
|             'description': 'md5:e0ef7d4f92055b86c4f33611f180ed79', | ||||
|             'upload_date': '20171228', | ||||
|             'uploader_id': 'abc1', | ||||
|             'timestamp': 1514499187, | ||||
|         }, | ||||
|         'params': { | ||||
|             'skip_download': True, | ||||
|         }, | ||||
|         'skip': 'Video gone', | ||||
|     }] | ||||
|  | ||||
|     def _real_extract(self, url): | ||||
| @@ -129,35 +133,30 @@ class ABCIViewIE(InfoExtractor): | ||||
|         title = video_params.get('title') or video_params['seriesTitle'] | ||||
|         stream = next(s for s in video_params['playlist'] if s.get('type') == 'program') | ||||
|  | ||||
|         key = 'android.content.res.Resources'.encode('utf-8') | ||||
|         time_str = str(int(time.time())) | ||||
|         house_number = video_params.get('episodeHouseNumber') | ||||
|         path = '/auth/hls/sign?ts={0}&hn={1}&d=android-mobile'.format( | ||||
|             time_str, house_number) | ||||
|         sig = hmac.new(key, path.encode('utf-8'), hashlib.sha256).hexdigest() | ||||
|         auth_url = 'http://iview.abc.net.au{0}&sig={1}'.format(path, sig) | ||||
|         token = self._download_webpage(auth_url, video_id) | ||||
|  | ||||
|         format_urls = [] | ||||
|             int(time.time()), house_number) | ||||
|         sig = hmac.new( | ||||
|             'android.content.res.Resources'.encode('utf-8'), | ||||
|             path.encode('utf-8'), hashlib.sha256).hexdigest() | ||||
|         token = self._download_webpage( | ||||
|             'http://iview.abc.net.au{0}&sig={1}'.format(path, sig), video_id) | ||||
|  | ||||
|         def tokenize_url(url, token): | ||||
|             return ''.join([url, '?hdnea=', token]) | ||||
|             return update_url_query(url, { | ||||
|                 'hdnea': token, | ||||
|             }) | ||||
|  | ||||
|         # May have higher quality video | ||||
|         sd_url = try_get( | ||||
|             stream, lambda x: x['streams']['hls']['sd'], compat_str) | ||||
|         if sd_url: | ||||
|             format_urls.append(tokenize_url(sd_url, token)) | ||||
|         else: | ||||
|             sd_low_url = try_get( | ||||
|                 stream, lambda x: x['streams']['hls']['sd-low'], compat_str) | ||||
|             format_urls.append(tokenize_url(sd_low_url, token)) | ||||
|  | ||||
|         formats = [] | ||||
|         for format_url in format_urls: | ||||
|             if format_url: | ||||
|                 formats.extend( | ||||
|                     self._extract_m3u8_formats(format_url, video_id, 'mp4')) | ||||
|         for sd in ('sd', 'sd-low'): | ||||
|             sd_url = try_get( | ||||
|                 stream, lambda x: x['streams']['hls'][sd], compat_str) | ||||
|             if not sd_url: | ||||
|                 continue | ||||
|             formats = self._extract_m3u8_formats( | ||||
|                 tokenize_url(sd_url, token), video_id, 'mp4', | ||||
|                 entry_protocol='m3u8_native', m3u8_id='hls', fatal=False) | ||||
|             if formats: | ||||
|                 break | ||||
|         self._sort_formats(formats) | ||||
|  | ||||
|         subtitles = {} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Sergey M․
					Sergey M․