Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
        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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
    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