示例#1
0
def write_tags(song, data):
    try:
        tag = FLAC(song)
        tag.delete()
        images = Picture()
        images.type = 3
        images.data = data["image"]
        tag.clear_pictures()
        tag.add_picture(images)
        tag["lyrics"] = data["lyric"]
    except FLACNoHeaderError:
        try:
            tag = File(song, easy=True)
            tag.delete()
        except:
            if isfile(song):
                remove(song)

            raise exceptions.TrackNotFound("")
    except NOTVALIDSONG:
        raise exceptions.TrackNotFound("")

    tag["artist"] = data["artist"]
    tag["title"] = data["music"]
    tag["date"] = data["year"]
    tag["album"] = data["album"]
    tag["tracknumber"] = data["tracknum"]
    tag["discnumber"] = data["discnum"]
    tag["genre"] = data["genre"]
    tag["albumartist"] = data["ar_album"]
    tag["author"] = data["author"]
    tag["composer"] = data["composer"]
    tag["copyright"] = data["copyright"]
    tag["bpm"] = data["bpm"]
    tag["length"] = data["duration"]
    tag["organization"] = data["label"]
    tag["isrc"] = data["isrc"]
    tag["lyricist"] = data["lyricist"]
    tag.save()

    try:
        audio = ID3(song)

        audio.add(
            APIC(
                encoding=3,
                mime="image/jpeg",
                type=3,
                desc=u"Cover",
                data=data["image"],
            ))

        audio.add(
            USLT(encoding=3, lang=u"eng", desc=u"desc", text=data["lyric"]))

        audio.save()
    except ID3NoHeaderError:
        pass
示例#2
0
def write_tags(song, data):
    try:
        tag = FLAC(song)
        tag.delete()
        images = Picture()
        images.type = 3
        images.data = data['image']
        tag.clear_pictures()
        tag.add_picture(images)
        tag['lyrics'] = data['lyric']
    except FLACNoHeaderError:
        try:
            tag = File(song, easy=True)
            tag.delete()
        except:
            raise exceptions.TrackNotFound("")
    except error:
        raise exceptions.TrackNotFound("")

    tag['artist'] = data['artist']
    tag['title'] = data['music']
    tag['date'] = data['year']
    tag['album'] = data['album']
    tag['tracknumber'] = data['tracknum']
    tag['discnumber'] = data['discnum']
    tag['genre'] = data['genre']
    tag['albumartist'] = data['ar_album']
    tag['author'] = data['author']
    tag['composer'] = data['composer']
    tag['copyright'] = data['copyright']
    tag['bpm'] = data['bpm']
    tag['length'] = data['duration']
    tag['organization'] = data['label']
    tag['isrc'] = data['isrc']
    tag['replaygain_*_gain'] = data['gain']
    tag['lyricist'] = data['lyricist']
    tag.save()

    try:
        audio = ID3(song)

        audio.add(
            APIC(encoding=3,
                 mime="image/jpeg",
                 type=3,
                 desc=u"Cover",
                 data=data['image']))

        audio.add(
            USLT(encoding=3, lang=u"eng", desc=u"desc", text=data['lyric']))

        audio.save()
    except _util.ID3NoHeaderError:
        pass
示例#3
0
def request(url, control=False):
    try:
        thing = requests.get(url, headers=header)
    except:
        thing = requests.get(url, headers=header)

    if control:
        try:
            if thing.json()['error']['message'] == "no data":
                raise exceptions.TrackNotFound("Track not found :(")
        except KeyError:
            pass

        try:
            if thing.json()['error']['message'] == "Quota limit exceeded":
                raise exceptions.QuotaExceeded(
                    "Too much requests limit yourself")
        except KeyError:
            pass

        try:
            if thing.json()['error']:
                raise exceptions.InvalidLink("Invalid link ;)")
        except KeyError:
            pass

    return thing
示例#4
0
    def download_name(
        self,
        artist,
        song,
        output=stock_output,
        quality=stock_quality,
        recursive_quality=stock_recursive_quality,
        recursive_download=stock_recursive_download,
        not_interface=stock_not_interface,
    ):
        query = "track:{} artist:{}".format(song, artist)

        try:
            search = self.spo.search(query)
        except:
            self.spo = utils.generate_token()

            search = self.spo.search(query)

        try:
            return self.download_trackspo(
                search["tracks"]["items"][0]["external_urls"]["spotify"],
                output,
                quality,
                recursive_quality,
                recursive_download,
                not_interface,
            )
        except IndexError:
            raise exceptions.TrackNotFound("Track not found: :(")
示例#5
0
    def download_name(self,
                      artist,
                      song,
                      output=stock_output + "/",
                      quality=stock_quality,
                      recursive_quality=stock_recursive_quality,
                      recursive_download=stock_recursive_download,
                      not_interface=stock_not_interface):

        query = ("track:%s artist:%s" % (song, artist))

        try:
            search = self.spo.search(q=query)
        except:
            self.spo = Spotify(auth=generate_token())

            search = self.spo.search(q=query)

        try:
            return self.download_trackspo(
                search['tracks']['items'][0]['external_urls']['spotify'],
                output, quality, recursive_quality, recursive_download,
                not_interface)
        except IndexError:
            raise exceptions.TrackNotFound("Track not found: " + artist +
                                           " - " + song)
示例#6
0
def song_exist(n, song_hash):
    crypted_audio = request(songs_server.format(n, song_hash))

    if len(crypted_audio.content) == 0:
        raise exceptions.TrackNotFound("")

    return crypted_audio
示例#7
0
        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
示例#8
0
        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
示例#9
0
    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
示例#10
0
    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
示例#11
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
        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