|
@ -181,46 +181,46 @@ class SoundcloudIE(InfoExtractor): |
|
|
}) |
|
|
}) |
|
|
|
|
|
|
|
|
for key, stream_url in format_dict.items(): |
|
|
for key, stream_url in format_dict.items(): |
|
|
|
|
|
abr = int_or_none(self._search_regex( |
|
|
|
|
|
r'_(\d+)_url', key, 'audio bitrate', default=None)) |
|
|
if key.startswith('http'): |
|
|
if key.startswith('http'): |
|
|
formats.append({ |
|
|
|
|
|
|
|
|
stream_formats = [{ |
|
|
'format_id': key, |
|
|
'format_id': key, |
|
|
'ext': ext, |
|
|
'ext': ext, |
|
|
'url': stream_url, |
|
|
'url': stream_url, |
|
|
'vcodec': 'none', |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
}] |
|
|
elif key.startswith('rtmp'): |
|
|
elif key.startswith('rtmp'): |
|
|
# The url doesn't have an rtmp app, we have to extract the playpath |
|
|
# The url doesn't have an rtmp app, we have to extract the playpath |
|
|
url, path = stream_url.split('mp3:', 1) |
|
|
url, path = stream_url.split('mp3:', 1) |
|
|
formats.append({ |
|
|
|
|
|
|
|
|
stream_formats = [{ |
|
|
'format_id': key, |
|
|
'format_id': key, |
|
|
'url': url, |
|
|
'url': url, |
|
|
'play_path': 'mp3:' + path, |
|
|
'play_path': 'mp3:' + path, |
|
|
'ext': 'flv', |
|
|
'ext': 'flv', |
|
|
'vcodec': 'none', |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
}] |
|
|
elif key.startswith('hls'): |
|
|
elif key.startswith('hls'): |
|
|
m3u8_formats = self._extract_m3u8_formats( |
|
|
|
|
|
|
|
|
stream_formats = self._extract_m3u8_formats( |
|
|
stream_url, track_id, 'mp3', entry_protocol='m3u8_native', |
|
|
stream_url, track_id, 'mp3', entry_protocol='m3u8_native', |
|
|
m3u8_id=key, fatal=False) |
|
|
m3u8_id=key, fatal=False) |
|
|
for f in m3u8_formats: |
|
|
|
|
|
f['vcodec'] = 'none' |
|
|
|
|
|
formats.extend(m3u8_formats) |
|
|
|
|
|
|
|
|
|
|
|
if not formats: |
|
|
|
|
|
# We fallback to the stream_url in the original info, this |
|
|
|
|
|
# cannot be always used, sometimes it can give an HTTP 404 error |
|
|
|
|
|
formats.append({ |
|
|
|
|
|
'format_id': 'fallback', |
|
|
|
|
|
'url': info['stream_url'] + '?client_id=' + self._CLIENT_ID, |
|
|
|
|
|
'ext': ext, |
|
|
|
|
|
'vcodec': 'none', |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
for f in formats: |
|
|
|
|
|
if f['format_id'].startswith('http'): |
|
|
|
|
|
f['protocol'] = 'http' |
|
|
|
|
|
if f['format_id'].startswith('rtmp'): |
|
|
|
|
|
f['protocol'] = 'rtmp' |
|
|
|
|
|
|
|
|
else: |
|
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
for f in stream_formats: |
|
|
|
|
|
f['abr'] = abr |
|
|
|
|
|
|
|
|
|
|
|
formats.extend(stream_formats) |
|
|
|
|
|
|
|
|
|
|
|
if not formats: |
|
|
|
|
|
# We fallback to the stream_url in the original info, this |
|
|
|
|
|
# cannot be always used, sometimes it can give an HTTP 404 error |
|
|
|
|
|
formats.append({ |
|
|
|
|
|
'format_id': 'fallback', |
|
|
|
|
|
'url': info['stream_url'] + '?client_id=' + self._CLIENT_ID, |
|
|
|
|
|
'ext': ext, |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
for f in formats: |
|
|
|
|
|
f['vcodec'] = 'none' |
|
|
|
|
|
|
|
|
self._check_formats(formats, track_id) |
|
|
self._check_formats(formats, track_id) |
|
|
self._sort_formats(formats) |
|
|
self._sort_formats(formats) |
|
|