def download_trackdee(self, URL, output=localdir, quality="MP3_320", recursive_quality=True, recursive_download=True): datas = {} if "?utm" in URL: URL, a = URL.split("?utm") # URL1 = "https://www.deezer.com/track/" + URL.split("/")[-1] URL2 = "https://api.deezer.com/track/" + URL.split("/")[-1] url = request(URL2, True).json() url1 = request( "https://api.deezer.com/album/" + str(url['album']['id']), True).json() datas['music'] = url['title'] array = [] for a in url['contributors']: array.append(a['name']) array.append(url['artist']['name']) if len(array) > 1: for a in array: for b in array: if a in b and a != b: array.remove(b) datas['artist'] = ", ".join(OrderedDict.fromkeys(array)) datas['album'] = url1['title'] datas['tracknum'] = str(url['track_position']) datas['discnum'] = str(url['disk_number']) datas['year'] = url['release_date'] datas['genre'] = [] try: for a in url1['genres']['data']: datas['genre'].append(a['name']) except KeyError: pass datas['genre'] = " & ".join(datas['genre']) datas['ar_album'] = [] for a in url1['contributors']: if a['role'] == "Main": datas['ar_album'].append(a['name']) datas['ar_album'] = " & ".join(datas['ar_album']) datas['label'] = url1['label'] datas['bpm'] = str(url['bpm']) datas['gain'] = str(url['gain']) datas['duration'] = str(url['duration']) datas['isrc'] = url['isrc'] album = var_excape(datas['album']) dir = output / (album + " " + url1['upc']) try: os.makedirs(dir) except FileExistsError: pass name = dir / (album + " CD " + datas['discnum'] + " TRACK " + datas['tracknum']) name = str(name.absolute()) name, a = self.download(URL, name, quality, recursive_quality, recursive_download, datas) return name
def download_albumdee(self, URL, output=stock_output + "/", quality=stock_quality, recursive_quality=stock_recursive_quality, recursive_download=stock_recursive_download, not_interface=stock_not_interface, zips=stock_zip): datas = {} datas['music'] = [] datas['artist'] = [] datas['tracknum'] = [] datas['discnum'] = [] datas['bpm'] = [] datas['gain'] = [] datas['duration'] = [] datas['isrc'] = [] names = [] array = [] URL = URL.split("?utm")[0] URL1 = "https://www.deezer.com/album/%s" % URL.split("/")[-1] URL2 = "https://api.deezer.com/album/%s" % URL.split("/")[-1] url = request(URL2, True).json() datas['album'] = url['title'] datas['label'] = url['label'] datas['year'] = url['release_date'] datas['genre'] = [] try: for a in url['genres']['data']: datas['genre'].append(a['name']) except KeyError: pass datas['genre'] = " & ".join(datas['genre']) datas['ar_album'] = [] for a in url['contributors']: if a['role'] == "Main": datas['ar_album'].append(a['name']) datas['ar_album'] = " & ".join(datas['ar_album']) album = var_excape(datas['album']) directory = ("%s%s %s/" % (output, album, url['upc'])) for a in url['tracks']['data']: del array[:] datas['music'].append(a['title']) ur = request("https://api.deezer.com/track/%d" % a['id'], True).json() discnum = str(ur['disk_number']) tracknum = str(ur['track_position']) names.append("%s%s CD %s TRACK %s" % (directory, album, discnum, tracknum)) datas['tracknum'].append(tracknum) datas['discnum'].append(discnum) datas['bpm'].append(str(ur['bpm'])) datas['gain'].append(str(ur['gain'])) datas['duration'].append(str(ur['duration'])) datas['isrc'].append(ur['isrc']) for a in ur['contributors']: if a['name'] != "": array.append(a['name']) array.append(ur['artist']['name']) datas['artist'].append(artist_sort(array)) check_dir(directory) names, zip_name = self.download(URL, names, quality, recursive_quality, recursive_download, datas, not_interface, directory, zips) if zips: return names, zip_name return names
def download_trackdee(self, URL, output=stock_output, quality=stock_quality, recursive_quality=stock_recursive_quality, recursive_download=stock_recursive_download, not_interface=stock_not_interface): output += "/" datas = {} ids = (URL.split("?utm")[0].split("/")[-1]) URL1 = "https://www.deezer.com/track/%s" % ids URL2 = "https://api.deezer.com/track/%s" % ids url = request(URL2, True).json() url1 = request("http://api.deezer.com/album/%d" % url['album']['id'], True).json() datas['music'] = url['title'] array = [] for a in url['contributors']: if a['name'] != "": array.append(a['name']) array.append(url['artist']['name']) datas['artist'] = artist_sort(array) datas['album'] = url1['title'] datas['tracknum'] = str(url['track_position']) datas['discnum'] = str(url['disk_number']) datas['year'] = url['release_date'] datas['genre'] = [] try: for a in url1['genres']['data']: datas['genre'].append(a['name']) except KeyError: pass datas['genre'] = " & ".join(datas['genre']) datas['ar_album'] = [] for a in url1['contributors']: if a['role'] == "Main": datas['ar_album'].append(a['name']) datas['ar_album'] = " & ".join(datas['ar_album']) datas['label'] = url1['label'] datas['bpm'] = str(url['bpm']) datas['gain'] = str(url['gain']) datas['duration'] = str(url['duration']) datas['isrc'] = url['isrc'] album = var_excape(datas['album']) directory = (output) check_dir(directory) name = ("%s%s" % (directory, ids)) name = self.download(URL, name, quality, recursive_quality, recursive_download, datas, not_interface, directory) return name
def check_quality_song(infos, datas): ids = infos["SNG_ID"] num_quality = self.qualities[quality]["n_quality"] file_format = self.qualities[quality]["f_format"] song_quality = self.qualities[quality]["s_quality"] song_md5, version = utils.check_md5_song(infos) song_hash = download_utils.genurl(song_md5, num_quality, ids, version) try: crypted_audio = utils.song_exist(song_md5[0], song_hash) except (IndexError, exceptions.TrackNotFound): if not recursive_quality: raise exceptions.QualityNotFound( "The quality chosen can't be downloaded") for a in self.qualities: if details["quality"] == a: continue num_quality = self.qualities[a]["n_quality"] file_format = self.qualities[a]["f_format"] song_quality = self.qualities[a]["s_quality"] song_hash = download_utils.genurl(song_md5, num_quality, ids, infos["MEDIA_VERSION"]) try: crypted_audio = utils.song_exist( song_md5[0], song_hash) except exceptions.TrackNotFound: raise exceptions.TrackNotFound( "Error with this song %s" % link) album = utils.var_excape(datas["album"]) directory = "%s%s %s/" % ("%s/" % output, album, datas["upc"]) name = "%s%s CD %s TRACK %s" % ( directory, album, datas["discnum"], datas["tracknum"], ) utils.check_dir(directory) name += " ({}){}".format(song_quality, file_format) if isfile(name): if recursive_download: return name ans = input( "Track %s already exists, do you want to redownload it?(y or n):" % name) if not ans in answers: return name decrypted_audio = open(name, "wb") download_utils.decryptfile( crypted_audio.iter_content(2048), download_utils.calcbfkey(ids), decrypted_audio, ) utils.write_tags(name, add_more_tags(datas, infos, ids)) return name
def download( self, link, details, recursive_quality=None, recursive_download=None, not_interface=None, zips=False, ): if not details["quality"] in self.qualities: raise exceptions.QualityNotFound( "The qualities have to be FLAC or MP3_320 or MP3_256 or MP3_128" ) self.token = self.get_api(self.get_user_data)["checkForm"] ids = utils.get_ids(link) datas = details["datas"] quality = details["quality"] output = details["output"] def get_infos(method, json_data): infos = self.get_api(method, self.token, json_data) return infos def check_quality_song(infos, datas): ids = infos["SNG_ID"] num_quality = self.qualities[quality]["n_quality"] file_format = self.qualities[quality]["f_format"] song_quality = self.qualities[quality]["s_quality"] song_md5, version = utils.check_md5_song(infos) song_hash = download_utils.genurl(song_md5, num_quality, ids, version) try: crypted_audio = utils.song_exist(song_md5[0], song_hash) except (IndexError, exceptions.TrackNotFound): if not recursive_quality: raise exceptions.QualityNotFound( "The quality chosen can't be downloaded") for a in self.qualities: if details["quality"] == a: continue num_quality = self.qualities[a]["n_quality"] file_format = self.qualities[a]["f_format"] song_quality = self.qualities[a]["s_quality"] song_hash = download_utils.genurl(song_md5, num_quality, ids, infos["MEDIA_VERSION"]) try: crypted_audio = utils.song_exist( song_md5[0], song_hash) except exceptions.TrackNotFound: raise exceptions.TrackNotFound( "Error with this song %s" % link) album = utils.var_excape(datas["album"]) directory = "%s%s %s/" % ("%s/" % output, album, datas["upc"]) name = "%s%s CD %s TRACK %s" % ( directory, album, datas["discnum"], datas["tracknum"], ) utils.check_dir(directory) name += " ({}){}".format(song_quality, file_format) if isfile(name): if recursive_download: return name ans = input( "Track %s already exists, do you want to redownload it?(y or n):" % name) if not ans in answers: return name decrypted_audio = open(name, "wb") download_utils.decryptfile( crypted_audio.iter_content(2048), download_utils.calcbfkey(ids), decrypted_audio, ) utils.write_tags(name, add_more_tags(datas, infos, ids)) return name def add_more_tags(datas, infos, ids): json_data = {"sng_id": ids} try: datas["author"] = " & ".join( infos["SNG_CONTRIBUTORS"]["author"]) except: datas["author"] = "" try: datas["composer"] = " & ".join( infos["SNG_CONTRIBUTORS"]["composer"]) except: datas["composer"] = "" try: datas["lyricist"] = " & ".join( infos["SNG_CONTRIBUTORS"]["lyricist"]) except: datas["lyricist"] = "" try: datas["version"] = infos["VERSION"] except KeyError: datas["version"] = "" need = get_infos(self.get_lyric, json_data) try: datas["lyric"] = need["LYRICS_TEXT"] datas["copyright"] = need["LYRICS_COPYRIGHTS"] datas["lyricist"] = need["LYRICS_WRITERS"] except KeyError: datas["lyric"] = "" datas["copyright"] = "" datas["lyricist"] = "" return datas def tracking2(infos, datas): image = utils.choose_img(infos["ALB_PICTURE"]) datas["image"] = image song = "{} - {}".format(datas["music"], datas["artist"]) if not not_interface: print("Downloading: %s" % song) try: nams = check_quality_song(infos, datas) except exceptions.TrackNotFound: try: ids = utils.not_found(song, datas["music"]) except IndexError: raise exceptions.TrackNotFound("Track not found: %s" % song) json_data = {"sng_id": ids} infos = get_infos(self.get_song_data, json_data) nams = check_quality_song(infos, datas) return nams if "track" in link: json_data = {"sng_id": ids} infos = get_infos(self.get_song_data, json_data) nams = tracking2(infos, datas) return nams zip_name = "" if "album" in link: nams = [] detas = {} quali = "" json_data = {"alb_id": ids, "nb": -1} infos = get_infos(self.get_album, json_data)["data"] image = utils.choose_img(infos[0]["ALB_PICTURE"]) detas["image"] = image detas["album"] = datas["album"] detas["year"] = datas["year"] detas["genre"] = datas["genre"] detas["ar_album"] = datas["ar_album"] detas["label"] = datas["label"] detas["upc"] = datas["upc"] t = tqdm(range(len(infos)), desc=detas["album"], disable=not_interface) for a in t: detas["music"] = datas["music"][a] detas["artist"] = datas["artist"][a] detas["tracknum"] = datas["tracknum"][a] detas["discnum"] = datas["discnum"][a] detas["bpm"] = datas["bpm"][a] detas["duration"] = datas["duration"][a] detas["isrc"] = datas["isrc"][a] song = "{} - {}".format(detas["music"], detas["artist"]) t.set_description_str(song) try: nams.append(check_quality_song(infos[a], detas)) except exceptions.TrackNotFound: try: ids = utils.not_found(song, detas["music"]) json = {"sng_id": ids} nams.append( check_quality_song( get_infos(self.get_song_data, json), detas)) except (exceptions.TrackNotFound, IndexError): nams.append(song) print("Track not found: %s :(" % song) continue quali = nams[a].split("(")[-1].split(")")[0] if zips: album = utils.var_excape(datas["album"]) directory = "%s%s %s/" % ("%s/" % output, album, datas["upc"]) zip_name = "%s%s (%s).zip" % (directory, album, quali) try: utils.create_zip(zip_name, nams) except FileNotFoundError: raise exceptions.QualityNotFound( 'Can\'t download album "{}" in {} quality'.format( album, details["quality"])) elif "playlist" in link: json_data = {"playlist_id": ids, "nb": -1} infos = get_infos(methods.method_get_playlist_data, json_data)["data"] nams = [] for a in range(len(infos)): try: nams.append(tracking2(infos[a], datas[a])) except TypeError: c = infos[a] song = "{} - {}".format(c["SNG_TITLE"], c["ART_NAME"]) nams.append("Track not found") quali = "ALL" if zips: zip_name = "%s %s (%s).zip" % ( "%s/playlist" % output, ids, quali, ) utils.create_zip(zip_name, nams) return nams, zip_name
def download_albumdee(self, URL, output=localdir + "/Songs/", quality="MP3_320", recursive_quality=True, recursive_download=True, create_zip=False): datas = {} datas['music'] = [] datas['artist'] = [] datas['tracknum'] = [] datas['discnum'] = [] datas['bpm'] = [] datas['gain'] = [] datas['duration'] = [] datas['isrc'] = [] names = [] array = [] if "?utm" in URL: URL, a = URL.split("?utm") URL1 = "https://www.deezer.com/album/" + URL.split("/")[-1] URL2 = "https://api.deezer.com/album/" + URL.split("/")[-1] url = request(URL2, True).json() datas['album'] = url['title'] datas['label'] = url['label'] datas['year'] = url['release_date'] datas['genre'] = [] try: for a in url['genres']['data']: datas['genre'].append(a['name']) except KeyError: pass datas['genre'] = " & ".join(datas['genre']) datas['ar_album'] = [] for a in url['contributors']: if a['role'] == "Main": datas['ar_album'].append(a['name']) datas['ar_album'] = " & ".join(datas['ar_album']) album = var_excape(datas['album']) dir = output + "/" + album + " " + url['upc'] + "/" for a in url['tracks']['data']: del array[:] datas['music'].append(a['title']) ur = request("https://api.deezer.com/track/" + str(a['id']), True).json() discnum = str(ur['disk_number']) tracknum = str(ur['track_position']) names.append(dir + album + " CD " + discnum + " TRACK " + tracknum) datas['tracknum'].append(tracknum) datas['discnum'].append(discnum) datas['bpm'].append(str(ur['bpm'])) datas['gain'].append(str(ur['gain'])) datas['duration'].append(str(ur['duration'])) datas['isrc'].append(ur['isrc']) for a in ur['contributors']: array.append(a['name']) array.append(ur['artist']['name']) if len(array) > 1: for a in array: for b in array: if a in b and a != b: array.remove(b) datas['artist'].append(", ".join(OrderedDict.fromkeys(array))) try: os.makedirs(dir) except FileExistsError: pass names, zip_name = self.download(URL, names, quality, recursive_quality, recursive_download, datas, create_zip) if create_zip: return names, zip_name return names
def download(self, link, name, quality, recursive_quality, recursive_download, datas, create_zip=False): if not quality in qualities: raise QualityNotFound( "The qualities have to be FLAC or MP3_320 or MP3_256 or MP3_128" ) def login(method, json): infos = "" while not "MD5_ORIGIN" in str(infos): self.token = self.get_api("deezer.getUserData")['checkForm'] infos = self.get_api(method, self.token, json) return infos def ultimatum(infos, name, datas, quality, recursive_download, recursive_quality): extension = ".mp3" ids = infos['SNG_ID'] if int(infos['FILESIZE_' + quality]) > 0 and quality == "FLAC": quality = "9" extension = ".flac" qualit = "FLAC" elif int( infos['FILESIZE_' + quality]) > 0 and quality == "MP3_320": quality = "3" qualit = "320" elif int( infos['FILESIZE_' + quality]) > 0 and quality == "MP3_256": quality = "5" qualit = "256" elif int( infos['FILESIZE_' + quality]) > 0 and quality == "MP3_128": quality = "1" qualit = "128" else: if recursive_quality: raise QualityNotFound( "The quality chosen can't be downloaded") for a in qualities: if int(infos['FILESIZE_' + a]) > 0: quality = qualities[a]['quality'] extension = qualities[a]['extension'] qualit = qualities[a]['qualit'] break else: if a == "MP3_128": raise TrackNotFound( "There isn't any quality avalaible for download this song" ) name += " (" + qualit + ")" + extension if os.path.isfile(name): if not recursive_download: return name ans = input( "Track " + name + " already exists, do you want to redownload it?(y or n):") if ans != "y": return name try: md5 = infos['FALLBACK']['MD5_ORIGIN'] except KeyError: md5 = infos['MD5_ORIGIN'] hashs = genurl(md5, quality, ids, infos['MEDIA_VERSION']) try: crypt = request( "https://e-cdns-proxy-%s.dzcdn.net/mobile/1/%s" % (md5[0], hashs)) except IndexError: raise TrackNotFound("Track not found :(") if len(crypt.content) == 0: raise TrackNotFound("Error with this track :(") open(name, "wb").write(crypt.content) decry = open(name, "wb") decryptfile(crypt.iter_content(2048), calcbfkey(ids), decry) datas = add_more_tags(datas, infos, ids) write_tags(name, datas) return name def add_more_tags(datas, infos, ids): try: datas['author'] = " & ".join( infos['SNG_CONTRIBUTORS']['author']) except: datas['author'] = "" try: datas['composer'] = " & ".join( infos['SNG_CONTRIBUTORS']['composer']) except: datas['composer'] = "" try: datas['lyricist'] = " & ".join( infos['SNG_CONTRIBUTORS']['lyricist']) except: datas['lyricist'] = "" try: datas['version'] = infos['VERSION'] except KeyError: datas['version'] = "" need = self.get_api("song.getLyrics", self.token, {"sng_id": ids}) try: datas['lyric'] = need['LYRICS_TEXT'] datas['copyright'] = need['LYRICS_COPYRIGHTS'] datas['lyricist'] = need['LYRICS_WRITERS'] except KeyError: datas['lyric'] = "" datas['copyright'] = "" datas['lyricist'] = "" return datas ids = link.split("/")[-1] zip_name = "" quali = "" if "track" in link: method = "song.getData" json = {"sng_id": ids} infos = login(method, json) image = request("https://e-cdns-images.dzcdn.net/images/cover/" + infos['ALB_PICTURE'] + "/1200x1200-000000-80-0-0.jpg").content if len(image) == 13: image = request( "https://e-cdns-images.dzcdn.net/images/cover/1200x1200-000000-80-0-0.jpg" ).content datas['image'] = image song = datas['music'] + " - " + datas['artist'] song = var_excape(song) print("\nDownloading:" + song) try: nams = ultimatum(infos, name, datas, quality, recursive_download, recursive_quality) except TrackNotFound: url = request( "https://api.deezer.com/search/track/?q=" + datas['music'].replace("#", "") + " + " + datas['artist'].replace("#", ""), True).json() try: for b in range(url['total'] + 1): if url['data'][b]['title'] == datas['music'] or datas[ 'music'] in url['data'][b]['title_short']: URL = url['data'][b]['link'] break except IndexError: raise TrackNotFound("Track not found: " + song) json = {"sng_id": URL.split("/")[-1]} infos = login(method, json) nams = ultimatum(infos, name, datas, quality, recursive_download, recursive_quality) else: nams = [] detas = {} method = "song.getListByAlbum" json = {"alb_id": ids, "nb": -1} infos = login(method, json)['data'] image = request("https://e-cdns-images.dzcdn.net/images/cover/" + infos[0]['ALB_PICTURE'] + "/1200x1200-000000-80-0-0.jpg").content if len(image) == 13: image = request( "https://e-cdns-images.dzcdn.net/images/cover/1200x1200-000000-80-0-0.jpg" ).content detas['image'] = image detas['album'] = datas['album'] detas['year'] = datas['year'] detas['genre'] = datas['genre'] detas['ar_album'] = datas['ar_album'] detas['label'] = datas['label'] for a in tqdm(range(len(name))): detas['music'] = datas['music'][a] detas['artist'] = datas['artist'][a] detas['tracknum'] = datas['tracknum'][a] detas['discnum'] = datas['discnum'][a] detas['bpm'] = datas['bpm'][a] detas['gain'] = datas['gain'][a] detas['duration'] = datas['duration'][a] detas['isrc'] = datas['isrc'][a] try: nams.append( ultimatum(infos[a], name[a], detas, quality, recursive_download, recursive_quality)) except TrackNotFound: url = request( "https://api.deezer.com/search/track/?q=" + detas['music'].replace("#", "") + " + " + detas['artist'].replace("#", ""), True).json() try: for b in range(url['total'] + 1): if url['data'][b]['title'] == detas[ 'music'] or detas['music'] in url['data'][ b]['title_short']: URL = url['data'][b]['link'] break except IndexError: nams.append(name[a]) print("\nTrack not found: " + detas['music'] + " - " + detas['artist']) continue try: method = "song.getData" json = {"sng_id": URL.split("/")[-1]} nams.append( ultimatum(login(method, json), name[a], detas, quality, recursive_download, recursive_quality)) except TrackNotFound: nams.append(name[a]) print("\nTrack not found: " + detas['music'] + " - " + detas['artist']) continue quali = nams[a].split("(")[-1].split(")")[0] if create_zip: dir = "/".join(name[a].split("/")[:-1]) + "/" if len(nams) > 0: zip_name = dir + dir.split( "/")[-2] + " (" + quali + ").zip" z = zipfile.ZipFile(zip_name, "w", zipfile.ZIP_DEFLATED) for a in nams: b = a.split("/")[-1] try: z.write(a, b) except FileNotFoundError: pass z.close() return nams, zip_name
def check_quality_song(infos, datas): ids = infos['SNG_ID'] num_quality = self.qualities[quality]['n_quality'] file_format = self.qualities[quality]['f_format'] song_quality = self.qualities[quality]['s_quality'] song_md5, version = utils.check_md5_song(infos) song_hash = download_utils.genurl(song_md5, num_quality, ids, version) try: crypted_audio = utils.song_exist(song_md5[0], song_hash) except (IndexError, exceptions.TrackNotFound): if not recursive_quality: raise exceptions.QualityNotFound( "The quality chosen can't be downloaded") for a in self.qualities: if details['quality'] == a: continue num_quality = self.qualities[a]['n_quality'] file_format = self.qualities[a]['f_format'] song_quality = self.qualities[a]['s_quality'] song_hash = download_utils.genurl(song_md5, num_quality, ids, infos['MEDIA_VERSION']) try: crypted_audio = utils.song_exist( song_md5[0], song_hash) except exceptions.TrackNotFound: raise exceptions.TrackNotFound( "Error with this song %s" % link) music = utils.var_excape(datas['music']) artist = utils.var_excape(infos['ART_NAME']) directory = ("%s" % ("%s/" % output)) name = ("%s%s %s" % (directory, music, artist)) utils.check_dir(directory) name += " ({}){}".format(song_quality, file_format) if isfile(name): if recursive_download: return name ans = input( "Track %s already exists, do you want to redownload it?(y or n):" % name) if not ans in answers: return name decrypted_audio = open(name, "wb") download_utils.decryptfile(crypted_audio.iter_content(2048), download_utils.calcbfkey(ids), decrypted_audio) utils.write_tags(name, add_more_tags(datas, infos, ids)) return name