[youtube] Simplify format specification

This commit is contained in:
Philipp Hagemeister 2013-12-24 12:34:09 +01:00
parent 3d4a70b821
commit 2c62dc26c8
1 changed files with 61 additions and 159 deletions

View File

@ -150,151 +150,68 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor):
(?(1).+)? # if we found the ID, everything can follow (?(1).+)? # if we found the ID, everything can follow
$""" $"""
_NEXT_URL_RE = r'[\?&]next_url=([^&]+)' _NEXT_URL_RE = r'[\?&]next_url=([^&]+)'
# Listed in order of quality _formats = {
_available_formats = ['38', '37', '46', '22', '45', '35', '44', '34', '18', '43', '6', '5', '36', '17', '13', '5': {'ext': 'flv', 'width': 400, 'height': 240},
# Apple HTTP Live Streaming '6': {'ext': 'flv', 'width': 450, 'height': 270},
'96', '95', '94', '93', '92', '132', '151', '13': {'ext': '3gp'},
# 3D '17': {'ext': '3gp', 'width': 176, 'height': 144},
'85', '84', '102', '83', '101', '82', '100', '18': {'ext': 'mp4', 'width': 640, 'height': 360},
# Dash video '22': {'ext': 'mp4', 'width': 1280, 'height': 720},
'138', '137', '248', '136', '247', '135', '246', '34': {'ext': 'flv', 'width': 640, 'height': 360},
'245', '244', '134', '243', '133', '242', '160', '35': {'ext': 'flv', 'width': 854, 'height': 480},
# Dash audio '36': {'ext': '3gp', 'width': 320, 'height': 240},
'141', '172', '140', '171', '139', '37': {'ext': 'mp4', 'width': 1920, 'height': 1080},
] '38': {'ext': 'mp4', 'width': 4096, 'height': 3072},
_video_extensions = { '43': {'ext': 'webm', 'width': 640, 'height': 360},
'13': '3gp', '44': {'ext': 'webm', 'width': 854, 'height': 480},
'17': '3gp', '45': {'ext': 'webm', 'width': 1280, 'height': 720},
'18': 'mp4', '46': {'ext': 'webm', 'width': 1920, 'height': 1080},
'22': 'mp4',
'36': '3gp',
'37': 'mp4',
'38': 'mp4',
'43': 'webm',
'44': 'webm',
'45': 'webm',
'46': 'webm',
# 3d videos # 3d videos
'82': 'mp4', '82': {'ext': 'mp4', 'height': 360, 'resolution': '360p', 'format_note': '3D', 'preference': -20},
'83': 'mp4', '83': {'ext': 'mp4', 'height': 480, 'resolution': '480p', 'format_note': '3D', 'preference': -20},
'84': 'mp4', '84': {'ext': 'mp4', 'height': 720, 'resolution': '720p', 'format_note': '3D', 'preference': -20},
'85': 'mp4', '85': {'ext': 'mp4', 'height': 1080, 'resolution': '1080p', 'format_note': '3D', 'preference': -20},
'100': 'webm', '100': {'ext': 'webm', 'height': 360, 'resolution': '360p', 'format_note': '3D', 'preference': -20},
'101': 'webm', '101': {'ext': 'webm', 'height': 480, 'resolution': '480p', 'format_note': '3D', 'preference': -20},
'102': 'webm', '102': {'ext': 'webm', 'height': 720, 'resolution': '720p', 'format_note': '3D', 'preference': -20},
# Apple HTTP Live Streaming # Apple HTTP Live Streaming
'92': 'mp4', '92': {'ext': 'mp4', 'height': 240, 'resolution': '240p', 'format_note': 'HLS', 'preference': -10},
'93': 'mp4', '93': {'ext': 'mp4', 'height': 360, 'resolution': '360p', 'format_note': 'HLS', 'preference': -10},
'94': 'mp4', '94': {'ext': 'mp4', 'height': 480, 'resolution': '480p', 'format_note': 'HLS', 'preference': -10},
'95': 'mp4', '95': {'ext': 'mp4', 'height': 720, 'resolution': '720p', 'format_note': 'HLS', 'preference': -10},
'96': 'mp4', '96': {'ext': 'mp4', 'height': 1080, 'resolution': '1080p', 'format_note': 'HLS', 'preference': -10},
'132': 'mp4', '132': {'ext': 'mp4', 'height': 240, 'resolution': '240p', 'format_note': 'HLS', 'preference': -10},
'151': 'mp4', '151': {'ext': 'mp4', 'height': 72, 'resolution': '72p', 'format_note': 'HLS', 'preference': -10},
# Dash mp4 # DASH mp4 video
'133': 'mp4', '133': {'ext': 'mp4', 'height': 240, 'resolution': '240p', 'format_note': 'DASH video', 'preference': -40},
'134': 'mp4', '134': {'ext': 'mp4', 'height': 360, 'resolution': '360p', 'format_note': 'DASH video', 'preference': -40},
'135': 'mp4', '135': {'ext': 'mp4', 'height': 480, 'resolution': '480p', 'format_note': 'DASH video', 'preference': -40},
'136': 'mp4', '136': {'ext': 'mp4', 'height': 720, 'resolution': '720p', 'format_note': 'DASH video', 'preference': -40},
'137': 'mp4', '137': {'ext': 'mp4', 'height': 1080, 'resolution': '1080p', 'format_note': 'DASH video', 'preference': -40},
'138': 'mp4', '138': {'ext': 'mp4', 'height': 1081, 'resolution': '>1080p', 'format_note': 'DASH video', 'preference': -40},
'160': 'mp4', '160': {'ext': 'mp4', 'height': 192, 'resolution': '192p', 'format_note': 'DASH video', 'preference': -40},
# Dash mp4 audio # Dash mp4 audio
'139': 'm4a', '139': {'ext': 'm4a', 'format_note': 'DASH audio', 'vcodec': 'none', 'abr': 48, 'preference': -50},
'140': 'm4a', '140': {'ext': 'm4a', 'format_note': 'DASH audio', 'vcodec': 'none', 'abr': 128, 'preference': -50},
'141': 'm4a', '141': {'ext': 'm4a', 'format_note': 'DASH audio', 'vcodec': 'none', 'abr': 256, 'preference': -50},
# Dash webm # Dash webm
'171': 'webm', '242': {'ext': 'webm', 'height': 240, 'resolution': '240p', 'format_note': 'DASH webm', 'preference': -40},
'172': 'webm', '243': {'ext': 'webm', 'height': 360, 'resolution': '360p', 'format_note': 'DASH webm', 'preference': -40},
'242': 'webm', '244': {'ext': 'webm', 'height': 480, 'resolution': '480p', 'format_note': 'DASH webm', 'preference': -40},
'243': 'webm', '245': {'ext': 'webm', 'height': 480, 'resolution': '480p', 'format_note': 'DASH webm', 'preference': -40},
'244': 'webm', '246': {'ext': 'webm', 'height': 480, 'resolution': '480p', 'format_note': 'DASH webm', 'preference': -40},
'245': 'webm', '247': {'ext': 'webm', 'height': 720, 'resolution': '720p', 'format_note': 'DASH webm', 'preference': -40},
'246': 'webm', '248': {'ext': 'webm', 'height': 1080, 'resolution': '1080p', 'format_note': 'DASH webm', 'preference': -40},
'247': 'webm',
'248': 'webm', # Dash webm audio
} '171': {'ext': 'webm', 'vcodec': 'none', 'format_note': 'DASH webm audio', 'abr': 48, 'preference': -50},
_video_dimensions = { '172': {'ext': 'webm', 'vcodec': 'none', 'format_note': 'DASH webm audio', 'abr': 256, 'preference': -50},
'5': {'width': 400, 'height': 240},
'6': {},
'13': {},
'17': {'width': 176, 'height': 144},
'18': {'width': 640, 'height': 360},
'22': {'width': 1280, 'height': 720},
'34': {'width': 640, 'height': 360},
'35': {'width': 854, 'height': 480},
'36': {'width': 320, 'height': 240},
'37': {'width': 1920, 'height': 1080},
'38': {'width': 4096, 'height': 3072},
'43': {'width': 640, 'height': 360},
'44': {'width': 854, 'height': 480},
'45': {'width': 1280, 'height': 720},
'46': {'width': 1920, 'height': 1080},
'82': {'height': 360, 'display': '360p'},
'83': {'height': 480, 'display': '480p'},
'84': {'height': 720, 'display': '720p'},
'85': {'height': 1080, 'display': '1080p'},
'92': {'height': 240, 'display': '240p'},
'93': {'height': 360, 'display': '360p'},
'94': {'height': 480, 'display': '480p'},
'95': {'height': 720, 'display': '720p'},
'96': {'height': 1080, 'display': '1080p'},
'100': {'height': 360, 'display': '360p'},
'101': {'height': 480, 'display': '480p'},
'102': {'height': 720, 'display': '720p'},
'132': {'height': 240, 'display': '240p'},
'151': {'height': 72, 'display': '72p'},
'133': {'height': 240, 'display': '240p'},
'134': {'height': 360, 'display': '360p'},
'135': {'height': 480, 'display': '480p'},
'136': {'height': 720, 'display': '720p'},
'137': {'height': 1080, 'display': '1080p'},
'138': {'height': 1081, 'display': '>1080p'},
'139': {'display': '48k'},
'140': {'display': '128k'},
'141': {'display': '256k'},
'160': {'height': 192, 'display': '192p'},
'171': {'display': '128k'},
'172': {'display': '256k'},
'242': {'height': 240, 'display': '240p'},
'243': {'height': 360, 'display': '360p'},
'244': {'height': 480, 'display': '480p'},
'245': {'height': 480, 'display': '480p'},
'246': {'height': 480, 'display': '480p'},
'247': {'height': 720, 'display': '720p'},
'248': {'height': 1080, 'display': '1080p'},
}
_special_itags = {
'82': '3D',
'83': '3D',
'84': '3D',
'85': '3D',
'100': '3D',
'101': '3D',
'102': '3D',
'133': 'DASH Video',
'134': 'DASH Video',
'135': 'DASH Video',
'136': 'DASH Video',
'137': 'DASH Video',
'138': 'DASH Video',
'139': 'DASH Audio',
'140': 'DASH Audio',
'141': 'DASH Audio',
'160': 'DASH Video',
'171': 'DASH Audio',
'172': 'DASH Audio',
'242': 'DASH Video',
'243': 'DASH Video',
'244': 'DASH Video',
'245': 'DASH Video',
'246': 'DASH Video',
'247': 'DASH Video',
'248': 'DASH Video',
} }
IE_NAME = u'youtube' IE_NAME = u'youtube'
@ -1148,7 +1065,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor):
Transform a dictionary in the format {itag:url} to a list of (itag, url) Transform a dictionary in the format {itag:url} to a list of (itag, url)
with the requested formats. with the requested formats.
""" """
existing_formats = [x for x in self._available_formats if x in url_map] existing_formats = [x for x in self._formats if x in url_map]
if len(existing_formats) == 0: if len(existing_formats) == 0:
raise ExtractorError(u'no known formats available for video') raise ExtractorError(u'no known formats available for video')
video_url_list = [(f, url_map[f]) for f in existing_formats] # All formats video_url_list = [(f, url_map[f]) for f in existing_formats] # All formats
@ -1410,28 +1327,13 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor):
formats = [] formats = []
for itag, video_real_url in video_url_list: for itag, video_real_url in video_url_list:
# Extension dct = {
video_extension = self._video_extensions.get(itag, 'flv') 'format_id': itag,
resolution = self._video_dimensions.get(itag, {}).get('display') 'url': video_real_url,
width = self._video_dimensions.get(itag, {}).get('width') 'player_url': player_url,
height = self._video_dimensions.get(itag, {}).get('height') }
note = self._special_itags.get(itag) dct.update(self._formats[itag])
formats.append(dct)
video_format = '{0} - {1}{2}'.format(itag if itag else video_extension,
'%dx%d' % (width, height) if width is not None and height is not None else (resolution if resolution is not None else '???'),
' ('+self._special_itags[itag]+')' if itag in self._special_itags else '')
formats.append({
'url': video_real_url,
'ext': video_extension,
'format': video_format,
'format_id': itag,
'player_url': player_url,
'_resolution': resolution,
'width': width,
'height': height,
'format_note': note,
})
self._sort_formats(formats) self._sort_formats(formats)