def download_playlistdee(self, URL, output=stock_output + "/", quality=stock_quality, recursive_quality=True, recursive_download=True, not_interface=stock_not_interface, zips=stock_zip): array = [] URL = URL.split("?utm")[0] ids = URL.split("/")[-1] url = request("https://api.deezer.com/playlist/%s" % ids, True).json() for a in url['tracks']['data']: try: array.append( self.download_trackdee(a['link'], output, quality, recursive_quality, recursive_download, not_interface)) except (exceptions.TrackNotFound, exceptions.NoDataApi): song = "{} - {}".format(a['title'], a['artist']['name']) print("Track not found: %s" % song) array.append(song) if zips: zip_name = "{}playlist {}.zip".format(output, ids) create_zip(zip_name, array) return array, zip_name return array
def download_trackspo(self, URL, output=stock_output + "/", quality=stock_quality, recursive_quality=stock_recursive_quality, recursive_download=stock_recursive_download, not_interface=stock_not_interface): URL = URL.split("?")[0] try: url = self.spo.track(URL) except Exception as a: if not "The access token expired" in str(a): raise exceptions.InvalidLink("Invalid link ;)") self.spo = Spotify(generate_token()) url = self.spo.track(URL) isrc = url['external_ids']['isrc'] url = request("https://api.deezer.com/track/isrc:%s" % isrc, True).json() name = self.download_trackdee(url['link'], output, quality, recursive_quality, recursive_download, not_interface) return name
def download_trackspo( self, URL, output=stock_output, quality=stock_quality, recursive_quality=stock_recursive_quality, recursive_download=stock_recursive_download, not_interface=stock_not_interface, ): URL = URL.split("?")[0] try: url = self.spo.track(URL) except Exception as a: if not "The access token expired" in str(a): raise exceptions.InvalidLink("Invalid link ;)") self.spo = utils.generate_token() url = self.spo.track(URL) isrc = "isrc:%s" % url["external_ids"]["isrc"] url = utils.request(self.api_track % isrc, True).json() name = self.download_trackdee( url["link"], output, quality, recursive_quality, recursive_download, not_interface, ) return name
def download_playlistdee(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 = [] ids = utils.get_ids(URL) URL2 = self.api_playlist % ids playlist_json = utils.request(URL2, True).json()['tracks']['data'] for a in playlist_json: URL3 = self.api_track % str(a['id']) try: detas = utils.tracking(URL3) datas.append(detas) except exceptions.NoDataApi: datas.append(None) details = {"datas": datas, "quality": quality, "output": output} names, zip_name = self.download(URL2, details, recursive_quality, recursive_download, not_interface, zips) if zips: return names, zip_name return names
def download_playlistdee(self, URL, output=stock_output + "/", quality=stock_quality, recursive_quality=True, recursive_download=True, not_interface=stock_not_interface, zips=stock_zip): array = [] if "?utm" in URL: URL, a = URL.split("?utm") ids = URL.split("/")[-1] url = request("https://api.deezer.com/playlist/" + ids, True).json() for a in url['tracks']['data']: try: array.append( self.download_trackdee(a['link'], output, quality, recursive_quality, recursive_download, not_interface)) except exceptions.TrackNotFound: print("Track not found " + a['title']) array.append("None") if zips: zip_name = output + "playlist_" + ids + ".zip" create_zip(zip_name, array) return array, zip_name return array
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 download(self, link, name, quality, recursive_quality, recursive_download, datas, not_interface, directory, zips=False): if not quality in qualities: raise exceptions.QualityNotFound( "The qualities have to be FLAC or MP3_320 or MP3_256 or MP3_128" ) self.token = self.get_api("deezer.getUserData")['checkForm'] def get_infos(method, json): infos = None while not "MD5_ORIGIN" in str(infos): infos = self.get_api(method, self.token, json) return infos 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 add_more_tags(datas, infos, ids): json = {"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 = self.get_api("song.getLyrics", self.token, json) 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] if "track" in link: json = {"sng_id": ids} infos = get_infos(method_get_track, json) image = choose_img(infos['ALB_PICTURE']) datas['image'] = image song = "{} - {}".format(datas['music'], datas['artist']) if not not_interface: print("Downloading: %s" % song) try: nams = ultimatum(infos, datas, name, quality) except exceptions.TrackNotFound: url = request( "https://api.deezer.com/search/track/?q=%s" % song.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 exceptions.TrackNotFound("Track not found: %s" % song) json = {"sng_id": URL.split("/")[-1]} infos = get_infos(method_get_track, json) nams = ultimatum(infos, datas, name, quality) return nams nams = [] detas = {} zip_name = "" quali = "" json = {"alb_id": ids, "nb": -1} infos = get_infos(method_get_album, json)['data'] image = 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'] for a in tqdm(range(len(name)), disable=not_interface): 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] song = "{} - {}".format(detas['music'], detas['artist']) try: nams.append(ultimatum(infos[a], detas, name[a], quality)) except exceptions.TrackNotFound: try: url = request( "https://api.deezer.com/search/track/?q=%s" % song.replace("#", ""), True).json() 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 json = {"sng_id": URL.split("/")[-1]} nams.append( ultimatum(get_infos(method_get_track, json), detas, name[a], quality)) except (exceptions.TrackNotFound, IndexError, exceptions.InvalidLink): nams.append(name[a]) print("Track not found: %s :(" % song) continue quali = (nams[a].split("(")[-1].split(")")[0]) if zips: zip_name = ("%s%s (%s).zip" % (directory, directory.split("/")[-2], quali)) create_zip(zip_name, nams) return nams, zip_name
def download_albumspo(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): URL = URL.split("?")[0] try: tracks = self.spo.album(URL) except Exception as a: if not "The access token expired" in str(a): raise exceptions.InvalidLink("Invalid link ;)") self.spo = Spotify(generate_token()) tracks = self.spo.album(URL) tot = tracks['total_tracks'] try: upc = tracks['external_ids']['upc'] while upc[0] == "0": upc = upc[1:] url = request("https://api.deezer.com/album/upc:%s" % upc).json() names = self.download_albumdee(url['link'], output, quality, recursive_quality, recursive_download, not_interface, zips) except KeyError: search = tot // 5 try: url = self.spo.track(tracks['tracks']['items'][search] ['external_urls']['spotify']) except: self.spo = Spotify(generate_token()) url = self.spo.track(tracks['tracks']['items'][search] ['external_urls']['spotify']) isrc = url['external_ids']['isrc'] try: ids = request("https://api.deezer.com/track/isrc:%s" % isrc, True).json()['album']['id'] tracks = request("https://api.deezer.com/album/%d" % ids, True).json() if tot != tracks['nb_tracks']: raise exceptions.TrackNotFound("") names = self.download_albumdee(tracks['link'], output, quality, recursive_quality, recursive_download, not_interface, zips) except (exceptions.TrackNotFound, exceptions.NoDataApi): raise exceptions.AlbumNotFound("Album %s not found :(" % tracks['name']) return names
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 download_albumspo( 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, ): URL = URL.split("?")[0] try: tracks = self.spo.album(URL) except Exception as a: if not "The access token expired" in str(a): raise exceptions.InvalidLink("Invalid link ;)") self.spo = utils.generate_token() tracks = self.spo.album(URL) try: upc = "0%s" % tracks["external_ids"]["upc"] while upc[0] == "0": upc = upc[1:] try: upc = "upc:%s" % upc url = utils.request(self.api_album % upc, True).json() names = self.download_albumdee( url["link"], output, quality, recursive_quality, recursive_download, not_interface, zips, ) break except exceptions.NoDataApi: if upc[0] != "0": raise KeyError except KeyError: tot = tracks["total_tracks"] for a in tracks["tracks"]["items"]: try: isrc = self.spo.track( a["external_urls"]["spotify"])["external_ids"]["isrc"] except: self.spo = utils.generate_token() isrc = self.spo.track( a["external_urls"]["spotify"])["external_ids"]["isrc"] try: isrc = "isrc:%s" % isrc ids = utils.request(self.api_track % isrc, True).json()["album"]["id"] tracks = utils.request(self.api_album % str(ids), True).json() if tot == tracks["nb_tracks"]: break except exceptions.NoDataApi: pass try: if tot != tracks["nb_tracks"]: raise KeyError names = self.download_albumdee( tracks["link"], output, quality, recursive_quality, recursive_download, not_interface, zips, ) except KeyError: raise exceptions.AlbumNotFound("Album not found :(") return names
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["duration"] = [] datas["isrc"] = [] names = [] ids = utils.get_ids(URL) URL2 = self.api_album % ids album_json = utils.request(URL2, True).json() datas["album"] = album_json["title"] datas["label"] = album_json["label"] datas["year"] = album_json["release_date"] datas["upc"] = album_json["upc"] datas["genre"] = [] try: for a in album_json["genres"]["data"]: datas["genre"].append(a["name"]) except KeyError: pass datas["genre"] = " & ".join(datas["genre"]) datas["ar_album"] = [] for a in album_json["contributors"]: if a["role"] == "Main": datas["ar_album"].append(a["name"]) datas["ar_album"] = " & ".join(datas["ar_album"]) for a in album_json["tracks"]["data"]: URL3 = self.api_track % str(a["id"]) detas = utils.tracking(URL3, True) datas["music"].append(detas["music"]) discnum = detas["discnum"] tracknum = detas["tracknum"] datas["tracknum"].append(tracknum) datas["discnum"].append(discnum) datas["bpm"].append(detas["bpm"]) datas["duration"].append(detas["duration"]) datas["isrc"].append(detas["isrc"]) datas["artist"].append(detas["artist"]) details = {"datas": datas, "quality": quality, "output": output} names, zip_name = self.download( URL2, details, recursive_quality, recursive_download, not_interface, zips, ) if zips: return names, zip_name return names
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['duration'] = [] datas['isrc'] = [] names = [] ids = utils.get_ids(URL) URL2 = self.api_album % ids album_json = utils.request(URL2, True).json() datas['album'] = album_json['title'] datas['label'] = album_json['label'] datas['year'] = album_json['release_date'] datas['upc'] = album_json['upc'] datas['genre'] = [] try: for a in album_json['genres']['data']: datas['genre'].append(a['name']) except KeyError: pass datas['genre'] = " & ".join(datas['genre']) datas['ar_album'] = [] for a in album_json['contributors']: if a['role'] == "Main": datas['ar_album'].append(a['name']) datas['ar_album'] = " & ".join(datas['ar_album']) for a in album_json['tracks']['data']: URL3 = self.api_track % str(a['id']) detas = utils.tracking(URL3, True) datas['music'].append(detas['music']) discnum = detas['discnum'] tracknum = detas['tracknum'] datas['tracknum'].append(tracknum) datas['discnum'].append(discnum) datas['bpm'].append(detas['bpm']) datas['duration'].append(detas['duration']) datas['isrc'].append(detas['isrc']) datas['artist'].append(detas['artist']) details = {"datas": datas, "quality": quality, "output": output} names, zip_name = self.download(URL2, details, recursive_quality, recursive_download, not_interface, zips) if zips: return names, zip_name return names
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 = [] 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']) directory = 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(directory + 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(directory) except FileExistsError: pass names, zip_name = self.download(URL, names, quality, recursive_quality, recursive_download, datas, not_interface, zips) if zips: return names, zip_name return names