def ultimatum(infos, datas, name, quality): extension = ".mp3" ids = infos['SNG_ID'] key = "FILESIZE_" + quality if int(infos[key]) > 0 and quality == "FLAC": quality = "9" extension = ".flac" qualit = "FLAC" elif int(infos[key]) > 0 and quality == "MP3_320": quality = "3" qualit = "320" elif int(infos[key]) > 0 and quality == "MP3_256": quality = "5" qualit = "256" elif int(infos[key]) > 0 and quality == "MP3_128": quality = "1" qualit = "128" else: if not recursive_quality: raise exceptions.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 exceptions.TrackNotFound( "There isn't any quality avalaible for download this song: %s" % name) name += " ({}){}".format(qualit, extension) if os.path.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 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-{}.dzcdn.net/mobile/1/{}".format( md5[0], hashs)) except IndexError: raise exceptions.TrackNotFound("Track: %s not found:(" % name) if len(crypt.content) == 0: raise exceptions.TrackNotFound( "Something is wrong with %s :(" % name) encry = open(name, "wb") encry.write(crypt.content) encry.close() decry = open(name, "wb") decryptfile(crypt.iter_content(2048), calcbfkey(ids), decry) write_tags(name, add_more_tags(datas, infos, ids)) 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_albumdee(self, URL, output=localdir + "/Songs/", quality="MP3_320", recursive=True): datas = {} array = [] music = [] artist = [] tracknum = [] discnum = [] bpm = [] gain = [] duration = [] isrc = [] urls = [] names = [] 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() for a in url['tracks']['data']: del array[:] music.append(a['title']) urls.append(a['link']) ur = request("https://api.deezer.com/track/" + str(a['id']), True).json() tracknum.append(str(ur['track_position'])) discnum.append(str(ur['disk_number'])) bpm.append(str(ur['bpm'])) gain.append(str(ur['gain'])) duration.append(str(ur['duration'])) isrc.append(ur['isrc']) for a in ur['contributors']: array.append(a['name']) if len(array) > 1: for a in array: for b in array: if a in b and a != b: array.remove(b) artist.append(", ".join(OrderedDict.fromkeys(array))) datas['label'] = url['label'] datas['album'] = url['title'] 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']) dir = str(output) + "/" + datas['album'].replace("/", "").replace("$", "S") + "/" try: os.makedirs(dir) except FileExistsError: pass for a in tqdm(range(len(urls))): name = datas['album'].replace("/", "").replace("$", "S") + " " + discnum[a] + " " + tracknum[a] datas['artist'] = artist[a] datas['music'] = music[a] datas['tracknum'] = tracknum[a] datas['discnum'] = discnum[a] datas['bpm'] = bpm[a] datas['gain'] = gain[a] datas['duration'] = duration[a] datas['isrc'] = isrc[a] try: extension, qualit, datas = self.download(urls[a], dir, quality, recursive, datas) except TrackNotFound: url = request("https://api.deezer.com/search/track/?q=" + music[a].replace("#", "") + " + " + artist[a].replace("#", ""), True).json() try: for b in range(url['total'] + 1): if url['data'][b]['title'] == music[a] or url['data'][b]['title_short'] in music[a]: URL = url['data'][b]['link'] break except IndexError: names.append(dir + name) print("\nTrack not found: " + music[a] + " - " + artist[a]) continue try: extension, qualit, datas = self.download(URL, dir, quality, recursive, datas) except TrackNotFound: names.append(dir + name) print("\nTrack not found: " + music[a] + " - " + artist[a]) continue urls[a] = URL name += " (" + qualit + ")" + extension names.append(dir + name) os.rename(dir + urls[a].split("/")[-1], dir + name) write_tags(names[a], datas) return names
def download_trackdee(self, URL, output=localdir + "/Songs/", quality="MP3_320", recursive=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("http://api.deezer.com/album/" + str(url['album']['id']), True).json() datas['music'] = url['title'] array = [] for a in url['contributors']: array.append(a['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'] song = datas['music'] + " - " + datas['artist'] 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'] dir = str(output) + "/" + datas['album'].replace("/", "").replace("$", "S") + "/" try: os.makedirs(dir) except FileExistsError: pass name = datas['album'].replace("/", "").replace("$", "S") + " " + datas['discnum'] + " " + datas['tracknum'] print("\nDownloading:" + song) try: extension, qualit, datas = self.download(URL, dir, quality, recursive, datas) except TrackNotFound: url = request("https://api.deezer.com/search/track/?q=" + datas['music'].replace("#", "") + " + " + datas['artist'].replace("#", ""), True).json() try: for a in range(url['total'] + 1): if url['data'][a]['title'] == datas['music'] or url['data'][a]['title_short'] in datas['music']: URL = url['data'][a]['link'] break except IndexError: raise TrackNotFound("Track not found: " + song) extension, qualit, datas = self.download(URL, dir, quality, recursive, datas) name += " (" + qualit + ")" + extension os.rename(dir + URL.split("/")[-1], dir + name) write_tags(dir + name, datas) return dir + name
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 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