diff --git a/deemix/__main__.py b/deemix/__main__.py index 4b779b4..33a4d32 100644 --- a/deemix/__main__.py +++ b/deemix/__main__.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import click -from deemix.utils.misc import getIDFromLink, getTypeFromLink, getBitrateInt -from deemix.app.downloader import download_track, download_album, download_playlist +import deemix.app.main as app from deemix.app.settings import initSettings @click.command() @@ -9,19 +8,7 @@ from deemix.app.settings import initSettings @click.argument('url') def download(bitrate, url): settings = initSettings() - forcedBitrate = getBitrateInt(bitrate) - type = getTypeFromLink(url) - id = getIDFromLink(url, type) - if type == None or id == None: - click.echo("URL not recognized") - if type == "track": - download_track(id, settings, forcedBitrate) - elif type == "album": - download_album(id, settings, forcedBitrate) - elif type == "playlist": - download_playlist(id, settings, forcedBitrate) - else: - click.echo("URL not supported yet") + app.downloadLink(url, settings, bitrate) click.echo("All done!") if __name__ == '__main__': diff --git a/deemix/api/deezer.py b/deemix/api/deezer.py index e747e48..47c93ef 100755 --- a/deemix/api/deezer.py +++ b/deemix/api/deezer.py @@ -253,7 +253,7 @@ class Deezer: i += 1 def stream_track(self, track_id, url, stream): - request = requests.get(url, stream=True) + request = requests.get(url, headers=self.http_headers, stream=True) request.raise_for_status() blowfish_key = str.encode(self._get_blowfish_key(str(track_id))) i = 0 diff --git a/deemix/app/downloader.py b/deemix/app/downloader.py index 984ce63..abc6230 100644 --- a/deemix/app/downloader.py +++ b/deemix/app/downloader.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -from deemix.api.deezer import Deezer, APIError +from deemix.api.deezer import APIError, USER_AGENT_HEADER from deemix.utils.taggers import tagID3, tagFLAC from deemix.utils.pathtemplates import generateFilename, generateFilepath, settingsRegexAlbum, settingsRegexArtist import os.path @@ -8,8 +8,8 @@ from requests import get from requests.exceptions import HTTPError from tempfile import gettempdir from concurrent.futures import ThreadPoolExecutor +import json -dz = Deezer() TEMPDIR = os.path.join(gettempdir(), 'deezloader-imgs') if not os.path.isdir(TEMPDIR): makedirs(TEMPDIR) @@ -28,7 +28,7 @@ def downloadImage(url, path): if not os.path.isfile(path): with open(path, 'wb') as f: try: - f.write(get(url).content) + f.write(get(url, headers={'User-Agent': USER_AGENT_HEADER}).content) return path except HTTPError: print("Couldn't download Image") @@ -90,7 +90,7 @@ def parseEssentialTrackData(track, trackAPI): return track -def getTrackData(trackAPI_gw, trackAPI = None, albumAPI_gw = None, albumAPI = None): +def getTrackData(dz, trackAPI_gw, trackAPI = None, albumAPI_gw = None, albumAPI = None): if not 'MD5_ORIGIN' in trackAPI_gw: trackAPI_gw['MD5_ORIGIN'] = dz.get_track_md5(trackAPI_gw['SNG_ID']) @@ -254,13 +254,13 @@ def getTrackData(trackAPI_gw, trackAPI = None, albumAPI_gw = None, albumAPI = No track['copyright'] = albumAPI_gw['COPYRIGHT'] return track -def downloadTrackObj(trackAPI, settings, overwriteBitrate=False, extraTrack=None): +def downloadTrackObj(dz, trackAPI, settings, overwriteBitrate=False, extraTrack=None): result = {} # Get the metadata if extraTrack: track = extraTrack else: - track = getTrackData( + track = getTrackData(dz, trackAPI_gw = trackAPI, trackAPI = trackAPI['_EXTRA_TRACK'] if '_EXTRA_TRACK' in trackAPI else None, albumAPI = trackAPI['_EXTRA_ALBUM'] if '_EXTRA_ALBUM' in trackAPI else None @@ -315,14 +315,14 @@ def downloadTrackObj(trackAPI, settings, overwriteBitrate=False, extraTrack=None if track['selectedFormat'] == 9: print("Track not available in flac, trying mp3") track['filesize']['flac'] = 0 - return downloadTrackObj(trackAPI, settings, extraTrack=track) + return downloadTrackObj(dz, trackAPI, settings, extraTrack=track) elif track['fallbackId'] != 0: print("Track not available, using fallback id") trackNew = dz.get_track_gw(track['fallbackId']) if not 'MD5_ORIGIN' in trackNew: trackNew['MD5_ORIGIN'] = dz.get_track_md5(trackNew['SNG_ID']) track = parseEssentialTrackData(track, trackNew) - return downloadTrackObj(trackNew, settings, extraTrack=track) + return downloadTrackObj(dz, trackNew, settings, extraTrack=track) else: print("ERROR: Track not available on deezer's servers!") return False @@ -333,13 +333,13 @@ def downloadTrackObj(trackAPI, settings, overwriteBitrate=False, extraTrack=None print("Done!") return result -def download_track(id, settings, overwriteBitrate=False): +def download_track(dz, id, settings, overwriteBitrate=False): trackAPI = dz.get_track_gw(id) trackAPI['FILENAME_TEMPLATE'] = settings['tracknameTemplate'] trackAPI['SINGLE_TRACK'] = True - downloadTrackObj(trackAPI, settings, overwriteBitrate) + downloadTrackObj(dz, trackAPI, settings, overwriteBitrate) -def download_album(id, settings, overwriteBitrate=False): +def download_album(dz, id, settings, overwriteBitrate=False): albumAPI = dz.get_album(id) albumAPI_gw = dz.get_album_gw(id) albumAPI['nb_disk'] = albumAPI_gw['NUMBER_DISK'] @@ -349,7 +349,7 @@ def download_album(id, settings, overwriteBitrate=False): trackAPI['_EXTRA_ALBUM'] = albumAPI trackAPI['FILENAME_TEMPLATE'] = settings['tracknameTemplate'] trackAPI['SINGLE_TRACK'] = True - downloadTrackObj(trackAPI, settings, overwriteBitrate) + downloadTrackObj(dz, trackAPI, settings, overwriteBitrate) else: tracksArray = dz.get_album_tracks_gw(id) playlist = [None] * len(tracksArray) @@ -358,7 +358,7 @@ def download_album(id, settings, overwriteBitrate=False): trackAPI['_EXTRA_ALBUM'] = albumAPI trackAPI['POSITION'] = pos trackAPI['FILENAME_TEMPLATE'] = settings['albumTracknameTemplate'] - playlist[pos-1] = executor.submit(downloadTrackObj, trackAPI, settings, overwriteBitrate) + playlist[pos-1] = executor.submit(downloadTrackObj, dz, trackAPI, settings, overwriteBitrate) executor.shutdown(wait=True) extrasPath = None for index in range(len(playlist)): @@ -376,8 +376,13 @@ def download_album(id, settings, overwriteBitrate=False): for line in playlist: f.write(line+"\n") +def download_artist(dz, id, settings, overwriteBitrate=False): + artistAPI = dz.get_artist_albums(id) + for album in artistAPI['data']: + print(f"Album: {album['title']}") + download_album(dz, album['id'], settings, overwriteBitrate) -def download_playlist(id, settings, overwriteBitrate=False): +def download_playlist(dz, id, settings, overwriteBitrate=False): playlistAPI = dz.get_playlist(id) playlistTracksAPI = dz.get_playlist_tracks_gw(id) playlist = [None] * len(playlistTracksAPI) @@ -386,7 +391,7 @@ def download_playlist(id, settings, overwriteBitrate=False): trackAPI['_EXTRA_PLAYLIST'] = playlistAPI trackAPI['POSITION'] = pos trackAPI['FILENAME_TEMPLATE'] = settings['playlistTracknameTemplate'] - playlist[pos-1] = executor.submit(downloadTrackObj, trackAPI, settings, overwriteBitrate) + playlist[pos-1] = executor.submit(downloadTrackObj, dz, trackAPI, settings, overwriteBitrate) executor.shutdown(wait=True) extrasPath = None for index in range(len(playlist)): diff --git a/deemix/app/main.py b/deemix/app/main.py new file mode 100644 index 0000000..d657dbc --- /dev/null +++ b/deemix/app/main.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +from deemix.api.deezer import Deezer +from deemix.utils.misc import getIDFromLink, getTypeFromLink, getBitrateInt +from deemix.app.downloader import download_track, download_album, download_playlist, download_artist + +dz = Deezer() + +def downloadLink(url, settings, bitrate=None): + forcedBitrate = getBitrateInt(bitrate) + type = getTypeFromLink(url) + id = getIDFromLink(url, type) + if type == None or id == None: + print("URL not recognized") + if type == "track": + download_track(dz, id, settings, forcedBitrate) + elif type == "album": + download_album(dz, id, settings, forcedBitrate) + elif type == "playlist": + download_playlist(dz, id, settings, forcedBitrate) + elif type == "artist": + download_artist(dz, id, settings, forcedBitrate) + else: + print("URL not supported yet")