[ABC] Fix extraction

This commit is contained in:
Adrian Heine 2020-08-16 01:30:49 +02:00
parent 10709fc7c6
commit 76b01870f8
1 changed files with 63 additions and 20 deletions

View File

@ -12,6 +12,7 @@ from ..utils import (
js_to_json, js_to_json,
int_or_none, int_or_none,
parse_iso8601, parse_iso8601,
str_or_none,
try_get, try_get,
unescapeHTML, unescapeHTML,
update_url_query, update_url_query,
@ -34,7 +35,7 @@ class ABCIE(InfoExtractor):
'skip': 'this video has expired', 'skip': 'this video has expired',
}, { }, {
'url': 'http://www.abc.net.au/news/2015-08-17/warren-entsch-introduces-same-sex-marriage-bill/6702326', 'url': 'http://www.abc.net.au/news/2015-08-17/warren-entsch-introduces-same-sex-marriage-bill/6702326',
'md5': 'db2a5369238b51f9811ad815b69dc086', 'md5': '4ebd61bdc82d9a8b722f64f1f4b4d121',
'info_dict': { 'info_dict': {
'id': 'NvqvPeNZsHU', 'id': 'NvqvPeNZsHU',
'ext': 'mp4', 'ext': 'mp4',
@ -58,39 +59,81 @@ class ABCIE(InfoExtractor):
}, { }, {
'url': 'http://www.abc.net.au/news/2015-10-19/6866214', 'url': 'http://www.abc.net.au/news/2015-10-19/6866214',
'only_matching': True, 'only_matching': True,
}, {
'url': 'https://www.abc.net.au/news/programs/the-world/2020-06-10/black-lives-matter-protests-spawn-support-for/12342074',
'info_dict': {
'id': '12342074',
'ext': 'mp4',
'title': 'Black Lives Matter protests spawn support for Papuans in Indonesia',
'description': 'md5:2961a17dc53abc558589ccd0fb8edd6f',
}
}] }]
def _real_extract(self, url): def _real_extract(self, url):
video_id = self._match_id(url) video_id = self._match_id(url)
webpage = self._download_webpage(url, video_id) webpage = self._download_webpage(url, video_id)
mobj = re.search( mobj = re.search(r'<a\s+href="(?P<url>[^"]+)"\s+data-duration="\d+"\s+title="Download audio directly">', webpage)
r'inline(?P<type>Video|Audio|YouTube)Data\.push\((?P<json_data>[^)]+)\);', if mobj:
webpage) urls_info = mobj.groupdict()
if mobj is None: youtube = False
expired = self._html_search_regex(r'(?s)class="expired-(?:video|audio)".+?<span>(.+?)</span>', webpage, 'expired', None) video = False
if expired: else:
raise ExtractorError('%s said: %s' % (self.IE_NAME, expired), expected=True) mobj = re.search(r'<a href="(?P<url>http://www\.youtube\.com/watch\?v=[^"]+)"><span><strong>External Link:</strong>',
raise ExtractorError('Unable to extract video urls') webpage)
if mobj:
urls_info = mobj.groupdict()
youtube = True
video = True
urls_info = self._parse_json( if mobj is None:
mobj.group('json_data'), video_id, transform_source=js_to_json) mobj = re.search(r'(?P<type>)"sources": (?P<json_data>\[[^\]]+\]),', webpage)
if mobj is None:
mobj = re.search(
r'inline(?P<type>Video|Audio|YouTube)Data\.push\((?P<json_data>[^)]+)\);',
webpage)
if mobj is None:
expired = self._html_search_regex(r'(?s)class="expired-(?:video|audio)".+?<span>(.+?)</span>', webpage, 'expired', None)
if expired:
raise ExtractorError('%s said: %s' % (self.IE_NAME, expired), expected=True)
raise ExtractorError('Unable to extract video urls')
urls_info = self._parse_json(
mobj.group('json_data'), video_id, transform_source=js_to_json)
youtube = mobj.group('type') == 'YouTube'
video = mobj.group('type') == 'Video' or urls_info[0]['contentType'] == 'video/mp4'
if not isinstance(urls_info, list): if not isinstance(urls_info, list):
urls_info = [urls_info] urls_info = [urls_info]
if mobj.group('type') == 'YouTube': if youtube:
return self.playlist_result([ return self.playlist_result([
self.url_result(url_info['url']) for url_info in urls_info]) self.url_result(url_info['url']) for url_info in urls_info])
formats = [{ formats = []
'url': url_info['url'], for url_info in urls_info:
'vcodec': url_info.get('codec') if mobj.group('type') == 'Video' else 'none', height = int_or_none(url_info.get('height'))
'width': int_or_none(url_info.get('width')), bitrate = int_or_none(url_info.get('bitrate'))
'height': int_or_none(url_info.get('height')), width = int_or_none(url_info.get('width'))
'tbr': int_or_none(url_info.get('bitrate')), format_id = None
'filesize': int_or_none(url_info.get('filesize')), mobj = re.search(r'_(?:(?P<height>\d+)|(?P<bitrate>\d+)k)\.mp4$', url_info['url'])
} for url_info in urls_info] if mobj:
height_from_url = mobj.group('height')
if height_from_url:
height = height or int_or_none(height_from_url)
width = width or int_or_none(url_info.get('label'))
else:
bitrate = bitrate or int_or_none(mobj.group('bitrate'))
format_id = str_or_none(url_info.get('label'))
formats.append({
'url': url_info['url'],
'vcodec': url_info.get('codec') if video else 'none',
'width': width,
'height': height,
'tbr': bitrate,
'filesize': int_or_none(url_info.get('filesize')),
'format_id': format_id
})
self._sort_formats(formats) self._sort_formats(formats)