|
@@ -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
|
|
|
|
- _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
|
|
# 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
|
|
# 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
|
|
# 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
|
|
# 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'
|
|
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
|
|
|
|
- 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)
|
|
self._sort_formats(formats)
|
|
|
|
|