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