from __future__ import unicode_literals
-import base64
import functools
import itertools
import re
from .common import InfoExtractor
from ..compat import (
+ compat_b64decode,
compat_chr,
compat_ord,
compat_str,
if encrypted_play_info is not None:
# Decode
- encrypted_play_info = base64.b64decode(encrypted_play_info)
+ encrypted_play_info = compat_b64decode(encrypted_play_info)
else:
# New path
full_info_json = self._parse_json(self._html_search_regex(
kpa_target = encrypted_play_info
else:
kps = ['https://', 'http://']
- kpa_target = base64.b64decode(info_json['streamInfo']['url'])
+ kpa_target = compat_b64decode(info_json['streamInfo']['url'])
for kp in kps:
partial_key = self._decrypt_xor_cipher(kpa_target, kp)
for quote in ["'", '"']:
stream_info = info_json['streamInfo']
formats = []
+ def decrypt_url(f_url):
+ for k in (key, 'IFYOUWANTTHEARTISTSTOGETPAIDDONOTDOWNLOADFROMMIXCLOUD'):
+ decrypted_url = self._decrypt_xor_cipher(k, f_url)
+ if re.search(r'^https?://[0-9a-z.]+/[0-9A-Za-z/.?=&_-]+$', decrypted_url):
+ return decrypted_url
+
for url_key in ('url', 'hlsUrl', 'dashUrl'):
format_url = stream_info.get(url_key)
if not format_url:
continue
- decrypted = self._decrypt_xor_cipher(key, base64.b64decode(format_url))
+ decrypted = decrypt_url(compat_b64decode(format_url))
if not decrypted:
continue
if url_key == 'hlsUrl':
formats.append({
'format_id': 'http',
'url': decrypted,
+ 'downloader_options': {
+ # Mixcloud starts throttling at >~5M
+ 'http_chunk_size': 5242880,
+ },
})
self._sort_formats(formats)