[WIP] Use YoutubeIE._formats as fallback

This commit is contained in:
Yen Chi Hsuan 2016-01-14 14:11:21 +08:00
parent 40cf7fcbd2
commit 9b9d90214a
3 changed files with 22 additions and 12 deletions

View File

@ -1021,9 +1021,9 @@ class InfoExtractor(object):
# TODO: looks like video codec is not always necessarily goes first # TODO: looks like video codec is not always necessarily goes first
va_codecs = codecs.split(',') va_codecs = codecs.split(',')
if va_codecs[0]: if va_codecs[0]:
f['vcodec'] = va_codecs[0].partition('.')[0] f['vcodec'] = va_codecs[0]
if len(va_codecs) > 1 and va_codecs[1]: if len(va_codecs) > 1 and va_codecs[1]:
f['acodec'] = va_codecs[1].partition('.')[0] f['acodec'] = va_codecs[1]
resolution = last_info.get('RESOLUTION') resolution = last_info.get('RESOLUTION')
if resolution: if resolution:
width_str, height_str = resolution.split('x') width_str, height_str = resolution.split('x')

View File

@ -32,6 +32,7 @@ from ..utils import (
get_element_by_attribute, get_element_by_attribute,
get_element_by_id, get_element_by_id,
int_or_none, int_or_none,
mimetype2ext,
orderedSet, orderedSet,
parse_duration, parse_duration,
remove_quotes, remove_quotes,
@ -1083,9 +1084,9 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
full_info.update(f) full_info.update(f)
codecs = r.attrib.get('codecs') codecs = r.attrib.get('codecs')
if codecs: if codecs:
if full_info.get('acodec') == 'none' and 'vcodec' not in full_info: if full_info.get('acodec') == 'none':
full_info['vcodec'] = codecs full_info['vcodec'] = codecs
elif full_info.get('vcodec') == 'none' and 'acodec' not in full_info: elif full_info.get('vcodec') == 'none':
full_info['acodec'] = codecs full_info['acodec'] = codecs
formats.append(full_info) formats.append(full_info)
else: else:
@ -1454,15 +1455,21 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
if 'ratebypass' not in url: if 'ratebypass' not in url:
url += '&ratebypass=yes' url += '&ratebypass=yes'
dct = {
'format_id': format_id,
'url': url,
'player_url': player_url,
}
if format_id in self._formats:
dct.update(self._formats[format_id])
# Some itags are not included in DASH manifest thus corresponding formats will # Some itags are not included in DASH manifest thus corresponding formats will
# lack metadata (see https://github.com/rg3/youtube-dl/pull/5993). # lack metadata (see https://github.com/rg3/youtube-dl/pull/5993).
# Trying to extract metadata from url_encoded_fmt_stream_map entry. # Trying to extract metadata from url_encoded_fmt_stream_map entry.
mobj = re.search(r'^(?P<width>\d+)[xX](?P<height>\d+)$', url_data.get('size', [''])[0]) mobj = re.search(r'^(?P<width>\d+)[xX](?P<height>\d+)$', url_data.get('size', [''])[0])
width, height = (int(mobj.group('width')), int(mobj.group('height'))) if mobj else (None, None) width, height = (int(mobj.group('width')), int(mobj.group('height'))) if mobj else (None, None)
dct = {
'format_id': format_id, more_fields = {
'url': url,
'player_url': player_url,
'filesize': int_or_none(url_data.get('clen', [None])[0]), 'filesize': int_or_none(url_data.get('clen', [None])[0]),
'tbr': float_or_none(url_data.get('bitrate', [None])[0], 1000), 'tbr': float_or_none(url_data.get('bitrate', [None])[0], 1000),
'width': width, 'width': width,
@ -1470,13 +1477,16 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
'fps': int_or_none(url_data.get('fps', [None])[0]), 'fps': int_or_none(url_data.get('fps', [None])[0]),
'format_note': url_data.get('quality_label', [None])[0] or url_data.get('quality', [None])[0], 'format_note': url_data.get('quality_label', [None])[0] or url_data.get('quality', [None])[0],
} }
for key, value in more_fields.items():
if value:
dct[key] = value
type_ = url_data.get('type', [None])[0] type_ = url_data.get('type', [None])[0]
if type_: if type_:
type_split = type_.split(';') type_split = type_.split(';')
kind_ext = type_split[0].split('/') kind_ext = type_split[0].split('/')
if len(kind_ext) == 2: if len(kind_ext) == 2:
kind, ext = kind_ext kind, _ = kind_ext
dct['ext'] = ext dct['ext'] = mimetype2ext(type_split[0])
if kind in ('audio', 'video'): if kind in ('audio', 'video'):
codecs = None codecs = None
for mobj in re.finditer( for mobj in re.finditer(
@ -1494,8 +1504,6 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
'acodec': acodec, 'acodec': acodec,
'vcodec': vcodec, 'vcodec': vcodec,
}) })
if format_id in self._formats:
dct.update(self._formats[format_id])
formats.append(dct) formats.append(dct)
elif video_info.get('hlsvp'): elif video_info.get('hlsvp'):
manifest_url = video_info['hlsvp'][0] manifest_url = video_info['hlsvp'][0]

View File

@ -1831,6 +1831,8 @@ def mimetype2ext(mt):
'x-ms-wmv': 'wmv', 'x-ms-wmv': 'wmv',
'x-mp4-fragmented': 'mp4', 'x-mp4-fragmented': 'mp4',
'ttml+xml': 'ttml', 'ttml+xml': 'ttml',
'3gpp': '3gp',
'x-flv': 'flv',
}.get(res, res) }.get(res, res)