diff --git a/youtube_dl/extractor/deezer.py b/youtube_dl/extractor/deezer.py index ec87b94db..05df2235f 100644 --- a/youtube_dl/extractor/deezer.py +++ b/youtube_dl/extractor/deezer.py @@ -10,9 +10,53 @@ from ..utils import ( orderedSet, ) +from hashlib import md5 +from Crypto.Cipher import AES, Blowfish +from binascii import b2a_hex + +############ + +def md5hex(data): + """ return hex string of md5 of the given string """ + return md5(data).hexdigest() + + +def hexaescrypt(data, key): + """ returns hex string of aes encrypted data """ + c = AES.new(key, AES.MODE_ECB) + return b2a_hex(c.encrypt(data)) + + +def calcurlkey(songid, md5origin, mediaver=4, fmt=1): + """ Calculate the deezer download url given the songid, origin and media+format """ + data = b'\xa4'.join(_.encode("utf-8") for _ in [md5origin, str(fmt), str(songid), str(mediaver)]) + data = b'\xa4'.join([md5hex(data), data])+b'\xa4' + if len(data)%16: + data += b'\x00' * (16-len(data)%16) + return hexaescrypt(data, "jo6aey6haid2Teih").decode('utf-8') + + +def calcblowfishkey(songid): + """ Calculate the Blowfish decrypt key for a given songid """ + h = md5hex(b"%d" % songid) + key = b"g4el58wc0zvf9na1" + return "".join(chr(ord(h[i]) ^ ord(h[i+16]) ^ ord(key[i])) for i in range(16)) + + +def getformat(song): + """ return format id for a song """ + if song["FILESIZE_MP3_320"]: + return 3 + if song["FILESIZE_MP3_256"]: + return 5 + return 1 + + + +############ class DeezerPlaylistIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?deezer\.com/playlist/(?P[0-9]+)' + _VALID_URL = r'https?://(?:www\.)?deezer\.com/\w+/(?P[0-9]+)' _TEST = { 'url': 'http://www.deezer.com/playlist/176747451', 'info_dict': { @@ -40,6 +84,11 @@ class DeezerPlaylistIE(InfoExtractor): raise ExtractorError( 'Deezer said: %s' % geoblocking_msg, expected=True) + host_stream_cdn = self._search_regex( + r'var HOST_STREAM_CDN = \'(.*?)\'', webpage, 'host stream cdn') + setting_domain_img = self._search_regex( + r'var SETTING_DOMAIN_IMG = \'(.*?)\'', webpage, 'setting domain img') + data_json = self._search_regex( (r'__DZR_APP_STATE__\s*=\s*({.+?})\s*', r'naboo\.display\(\'[^\']+\',\s*(.*?)\);\n'), @@ -47,6 +96,63 @@ class DeezerPlaylistIE(InfoExtractor): data = json.loads(data_json) playlist_title = data.get('DATA', {}).get('TITLE') + playlist_uploader = data.get('DATA', {}).get('PARENT_USERNAME') + #playlist_thumbnail = self._search_regex( r'