diff --git a/README.md b/README.md index 4a89610..78db746 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,6 @@ Run `python -m deemix` to run the app # TODO Find all dependencies and add them to requirements.txt
+Making the download work in multi-threading
+Add the settings in the GUI
Finish porting all features diff --git a/deemix/app/__init__.py b/deemix/app/__init__.py new file mode 100644 index 0000000..9d389f1 --- /dev/null +++ b/deemix/app/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# Empty File diff --git a/deemix/app/default.json b/deemix/app/default.json new file mode 100644 index 0000000..d663eaa --- /dev/null +++ b/deemix/app/default.json @@ -0,0 +1,36 @@ +{ + "pathSettings": { + "downloadLocation": "" + }, + "appSettings": { + "maxBitrate": 3 + }, + "taggingSettings": { + "artworkSize": 800, + "tags": { + "title": true, + "artist": true, + "album": true, + "cover": true, + "trackNumber": true, + "trackTotal": false, + "discNumber": true, + "discTotal": false, + "albumArtist": true, + "genre": true, + "year": true, + "date": true, + "explicit": false, + "isrc": true, + "length": false, + "barcode": false, + "bpm": true, + "replayGain": false, + "label": true, + "lyrics": false, + "copyright": false, + "composer": false, + "involvedPeople": false + } + } +} diff --git a/deemix/app/downloader.py b/deemix/app/downloader.py new file mode 100644 index 0000000..78b88b9 --- /dev/null +++ b/deemix/app/downloader.py @@ -0,0 +1,252 @@ +#!/usr/bin/env python3 +from deemix.api.deezer import Deezer, APIError +from deemix.utils.taggers import tagID3, tagFLAC +import os.path + +dz = Deezer() + +extensions = { + 9: '.flac', + 3: '.mp3', + 1: '.mp3', + 8: '.mp3', + 15: '.mp4', + 14: '.mp4', + 13: '.mp4' +} + +def getTrackData(trackAPI): + if not 'MD5_ORIGIN' in trackAPI: + trackAPI['MD5_ORIGIN'] = dz.get_track_md5(trackAPI['SNG_ID']) + + track = {} + track['id'] = trackAPI['SNG_ID'] + track['title'] = trackAPI['SNG_TITLE'] + if trackAPI['VERSION']: + track['title'] += " " + trackAPI['VERSION'] + track['duration'] = trackAPI['DURATION'] + track['MD5'] = trackAPI['MD5_ORIGIN'] + track['mediaVersion'] = trackAPI['MEDIA_VERSION'] + + if int(track['id']) < 0: + track['filesize'] = trackAPI['FILESIZE'] + track['album'] = {} + track['album']['id'] = 0 + track['album']['title'] = trackAPI['ALB_TITLE'] + if 'ALB_PICTURE' in trackAPI: + track['album']['pic'] = trackAPI['ALB_PICTURE'] + track['mainArtist'] = {} + track['mainArtist']['id'] = 0 + track['mainArtist']['name'] = trackAPI['ART_NAME'] + track['artistArray'] = [trackAPI['ART_NAME']] + track['date'] = { + 'day': 0, + 'month': 0, + 'year': 0 + } + track['localTrack'] = True + return track + + track['filesize'] = {} + track['filesize']['default'] = int(trackAPI['FILESIZE']) if 'FILESIZE' in trackAPI else None + track['filesize']['mp3_128'] = int(trackAPI['FILESIZE_MP3_128']) if 'FILESIZE_MP3_128' in trackAPI else None + track['filesize']['mp3_320'] = int(trackAPI['FILESIZE_MP3_320']) if 'FILESIZE_MP3_320' in trackAPI else None + track['filesize']['flac'] = int(trackAPI['FILESIZE_FLAC']) if 'FILESIZE_FLAC' in trackAPI else None + track['filesize']['mp4_ra1'] = int(trackAPI['FILESIZE_MP4_RA1']) if 'FILESIZE_MP4_RA1' in trackAPI else None + track['filesize']['mp4_ra2'] = int(trackAPI['FILESIZE_MP4_RA2']) if 'FILESIZE_MP4_RA2' in trackAPI else None + track['filesize']['mp4_ra3'] = int(trackAPI['FILESIZE_MP4_RA3']) if 'FILESIZE_MP4_RA3' in trackAPI else None + + if 'DISK_NUMBER' in trackAPI: + track['discNumber'] = trackAPI['DISK_NUMBER'] + if 'EXPLICIT_LYRICS' in trackAPI: + track['explicit'] = trackAPI['EXPLICIT_LYRICS'] != "0" + if 'COPYRIGHT' in trackAPI: + track['copyright'] = trackAPI['COPYRIGHT'] + track['replayGain'] = "{0:.2f} dB".format((float(trackAPI['GAIN']) + 18.4) * -1) + track['ISRC'] = trackAPI['ISRC'] + track['trackNumber'] = trackAPI['TRACK_NUMBER'] + if 'FALLBACK' in trackAPI: + track['fallbackId'] = trackAPI['FALLBACK']['SNG_ID'] + else: + track['fallbackId'] = 0 + track['contributors'] = trackAPI['SNG_CONTRIBUTORS'] + + track['lyrics'] = {} + if 'LYRICS_ID' in trackAPI: + track['lyrics']['id'] = trackAPI['LYRICS_ID'] + if "LYRICS" in trackAPI: + if "LYRICS_TEXT" in trackAPI["LYRICS"]: + track['lyrics']['unsync'] = trackAPI["LYRICS"]["LYRICS_TEXT"] + if "LYRICS_SYNC_JSON" in trackAPI["LYRICS"]: + track['lyrics']['sync'] = "" + for i in range(len(trackAPI["LYRICS"]["LYRICS_SYNC_JSON"])): + if "lrc_timestamp" in trackAPI["LYRICS"]["LYRICS_SYNC_JSON"][i]: + track['lyrics']['sync'] += trackAPI["LYRICS"]["LYRICS_SYNC_JSON"][i]["lrc_timestamp"] + \ + trackAPI["LYRICS"]["LYRICS_SYNC_JSON"][i]["line"] + "\r\n" + elif i + 1 < len(trackAPI["LYRICS"]["LYRICS_SYNC_JSON"]): + track['lyrics']['sync'] += trackAPI["LYRICS"]["LYRICS_SYNC_JSON"][i + 1]["lrc_timestamp"] + \ + trackAPI["LYRICS"]["LYRICS_SYNC_JSON"][i]["line"] + "\r\n" + + track['mainArtist'] = {} + track['mainArtist']['id'] = trackAPI['ART_ID'] + track['mainArtist']['name'] = trackAPI['ART_NAME'] + if 'ART_PICTURE' in trackAPI: + track['mainArtist']['pic'] = trackAPI['ART_PICTURE'] + + if 'PHYSICAL_RELEASE_DATE' in trackAPI: + track['date'] = { + 'day': trackAPI["PHYSICAL_RELEASE_DATE"][8:10], + 'month': trackAPI["PHYSICAL_RELEASE_DATE"][5:7], + 'year': trackAPI["PHYSICAL_RELEASE_DATE"][0:4] + } + + track['album'] = {} + track['album']['id'] = trackAPI['ALB_ID'] + track['album']['title'] = trackAPI['ALB_TITLE'] + if 'ALB_PICTURE' in trackAPI: + track['album']['pic'] = trackAPI['ALB_PICTURE'] + + try: + if 'ALBUM_EXTRA' in trackAPI: + albumAPI = trackAPI['ALBUM_EXTRA'] + else: + albumAPI = dz.get_album(track['album']['id']) + track['album']['artist'] = { + 'id': albumAPI['artist']['id'], + 'name': albumAPI['artist']['name'], + 'pic': albumAPI['artist']['picture_small'][46:-24] + } + track['album']['trackTotal'] = albumAPI['nb_tracks'] + track['album']['recordType'] = albumAPI['record_type'] + track['album']['barcode'] = albumAPI['upc'] if 'upc' in albumAPI else None + track['album']['label'] = albumAPI['label'] if 'label' in albumAPI else None + if not 'pic' in track['album']: + track['album']['pic'] = albumAPI['cover_small'][43:-24] + if 'release_date' in albumAPI: + track['date'] = { + 'day': albumAPI["release_date"][8:10], + 'month': albumAPI["release_date"][5:7], + 'year': albumAPI["release_date"][0:4] + } + track['album']['discTotal'] = albumAPI['nb_disk'] if 'nb_disk' in albumAPI else None + track['copyright'] = albumAPI['copyright'] if 'copyright' in albumAPI else None + track['album']['genre'] = [] + if 'genres' in albumAPI and 'data' in albumAPI['genres'] and len(albumAPI['genres']['data']) > 0: + for genre in albumAPI['genres']['data']: + track['album']['genre'].append(genre['name']) + except APIError: + albumAPI = dz.get_album_gw(track['album']['id']) + track['album']['artist'] = { + 'id': albumAPI['ART_ID'], + 'name': albumAPI['ART_NAME'] + } + track['album']['trackTotal'] = albumAPI['NUMBER_TRACK'] + track['album']['discTotal'] = albumAPI['NUMBER_DISK'] + track['album']['recordType'] = trackAPI['TYPE'] + track['album']['barcode'] = None + track['album']['label'] = albumAPI['LABEL_NAME'] if 'LABEL_NAME' in albumAPI else None + if not 'pic' in track['album']: + track['album']['pic'] = albumAPI['ALB_PICTURE'] + if 'PHYSICAL_RELEASE_DATE' in albumAPI: + track['date'] = { + 'day': albumAPI["PHYSICAL_RELEASE_DATE"][8:10], + 'month': albumAPI["PHYSICAL_RELEASE_DATE"][5:7], + 'year': albumAPI["PHYSICAL_RELEASE_DATE"][0:4] + } + track['album']['genre'] = [] + + trackAPI2 = dz.get_track(track['id']) + track['bpm'] = trackAPI2['bpm'] + if not 'replayGain' in track: + track['replayGain'] = "{0:.2f} dB".format((float(trackAPI2['gain']) + 18.4) * -1) + if not 'explicit' in track: + track['explicit'] = trackAPI2['explicit_lyrics'] + track['artist'] = {} + track['artists'] = [] + for artist in trackAPI2['contributors']: + track['artists'].append(artist['name']) + if not artist['role'] in track['artist']: + track['artist'][artist['role']] = [] + track['artist'][artist['role']].append(artist['name']) + + if not 'discTotal' in track['album']: + albumAPI2 = dz.get_album_gw(track['album']['id']) + track['album']['discTotal'] = albumAPI2['NUMBER_DISK'] + if not 'copyright' in track: + if not albumAPI2: + albumAPI2 = dz.get_album_gw(track['album']['id']) + track['copyright'] = albumAPI2['COPYRIGHT'] + return track + + +def downloadTrackObj(trackAPI, settings, overwriteBitrate=False): + # Get the metadata + track = getTrackData(trackAPI) + print('Downloading: {} - {}'.format(track['mainArtist']['name'], track['title'])) + + # Get the selected bitrate + if overwriteBitrate: + bitrate = overwriteBitrate + else: + bitrate = settings['appSettings']['maxBitrate'] + bitrateFound = False; + if int(bitrate) == 9: + track['selectedFormat'] = 9 + track['selectedFilesize'] = track['filesize']['flac'] + if track['filesize']['flac'] > 0: + bitrateFound = True + else: + bitrateFound = False + bitrate = 3 + if int(bitrate) == 3: + track['selectedFormat'] = 3 + track['selectedFilesize'] = track['filesize']['mp3_320'] + if track['filesize']['mp3_320'] > 0: + bitrateFound = True + else: + bitrateFound = False + bitrate = 1 + if int(bitrate) == 1: + track['selectedFormat'] = 3 + track['selectedFilesize'] = track['filesize']['mp3_320'] + if track['filesize']['mp3_320'] > 0: + bitrateFound = True + else: + bitrateFound = False + if not bitrateFound: + track['selectedFormat'] = 8 + track['selectedFilesize'] = track['filesize']['default'] + track['album']['bitrate'] = track['selectedFormat'] + + # Create the filename + filename = "{artist} - {title}".format(title=track['title'], artist=track['mainArtist']['name']) + extensions[ + track['selectedFormat']] + writepath = os.path.join(settings['pathSettings']['downloadLocation'], filename) + + track['downloadUrl'] = dz.get_track_stream_url(track['id'], track['MD5'], track['mediaVersion'], + track['selectedFormat']) + with open(writepath, 'wb') as stream: + dz.stream_track(track['id'], track['downloadUrl'], stream) + if track['selectedFormat'] in [3, 1, 8]: + tagID3(writepath, track) + elif track['selectedFormat'] == 9: + tagFLAC(writepath, track) + +def download_track(id, settings, overwriteBitrate=False): + trackAPI = dz.get_track_gw(id) + downloadTrackObj(trackAPI, settings, overwriteBitrate) + +def download_album(id, settings, overwriteBitrate=False): + albumAPI = dz.get_album(id) + albumAPI2 = dz.get_album_gw(id) + albumAPI['nb_disk'] = albumAPI2['NUMBER_DISK'] + albumAPI['copyright'] = albumAPI2['COPYRIGHT'] + if albumAPI['nb_tracks'] == 1: + trackAPI = dz.get_track_gw(albumAPI['tracks']['data'][0]['id']) + trackAPI['ALBUM_EXTRA'] = albumAPI + downloadTrackObj(trackAPI, settings, overwriteBitrate) + else: + tracksArray = dz.get_album_tracks_gw(id) + for trackAPI in tracksArray: + trackAPI['ALBUM_EXTRA'] = albumAPI + downloadTrackObj(trackAPI, settings, overwriteBitrate) diff --git a/deemix/app/functions.py b/deemix/app/functions.py index 589d7e9..bad7bf6 100644 --- a/deemix/app/functions.py +++ b/deemix/app/functions.py @@ -1,22 +1,6 @@ #!/usr/bin/env python3 import re -from deemix.api.deezer import Deezer, APIError -from deemix.utils.taggers import tagID3, tagFLAC - -extensions = { - 9: '.flac', - 3: '.mp3', - 1: '.mp3', - 8: '.mp3', - 15: '.mp4', - 14: '.mp4', - 13: '.mp4' -} - -dz = Deezer() - - def getIDFromLink(link, type): if '?' in link: link = link[:link.find('?')] @@ -63,210 +47,3 @@ def getTypeFromLink(link): elif '/artist' in link: type = 'artist' return type - - -def getTrackData(id): - if not id: - return None - trackAPI = dz.get_track_gw(id) - if not 'MD5_ORIGIN' in trackAPI: - trackAPI['MD5_ORIGIN'] = dz.get_track_md5(id) - - track = {} - track['id'] = trackAPI['SNG_ID'] - track['title'] = trackAPI['SNG_TITLE'] - if trackAPI['VERSION']: - track['title'] += " " + trackAPI['VERSION'] - track['duration'] = trackAPI['DURATION'] - track['MD5'] = trackAPI['MD5_ORIGIN'] - track['mediaVersion'] = trackAPI['MEDIA_VERSION'] - - if int(track['id']) < 0: - track['filesize'] = trackAPI['FILESIZE'] - track['album'] = {} - track['album']['id'] = 0 - track['album']['title'] = trackAPI['ALB_TITLE'] - if 'ALB_PICTURE' in trackAPI: - track['album']['pic'] = trackAPI['ALB_PICTURE'] - track['mainArtist'] = {} - track['mainArtist']['id'] = 0 - track['mainArtist']['name'] = trackAPI['ART_NAME'] - track['artistArray'] = [trackAPI['ART_NAME']] - track['date'] = { - 'day': 0, - 'month': 0, - 'year': 0 - } - track['localTrack'] = True - return track - - track['filesize'] = {} - track['filesize']['default'] = int(trackAPI['FILESIZE']) if 'FILESIZE' in trackAPI else None - track['filesize']['mp3_128'] = int(trackAPI['FILESIZE_MP3_128']) if 'FILESIZE_MP3_128' in trackAPI else None - track['filesize']['mp3_320'] = int(trackAPI['FILESIZE_MP3_320']) if 'FILESIZE_MP3_320' in trackAPI else None - track['filesize']['flac'] = int(trackAPI['FILESIZE_FLAC']) if 'FILESIZE_FLAC' in trackAPI else None - track['filesize']['mp4_ra1'] = int(trackAPI['FILESIZE_MP4_RA1']) if 'FILESIZE_MP4_RA1' in trackAPI else None - track['filesize']['mp4_ra2'] = int(trackAPI['FILESIZE_MP4_RA2']) if 'FILESIZE_MP4_RA2' in trackAPI else None - track['filesize']['mp4_ra3'] = int(trackAPI['FILESIZE_MP4_RA3']) if 'FILESIZE_MP4_RA3' in trackAPI else None - - if 'DISK_NUMBER' in trackAPI: - track['discNumber'] = trackAPI['DISK_NUMBER'] - if 'EXPLICIT_LYRICS' in trackAPI: - track['explicit'] = trackAPI['EXPLICIT_LYRICS'] != "0" - if 'COPYRIGHT' in trackAPI: - track['copyright'] = trackAPI['COPYRIGHT'] - track['replayGain'] = "{0:.2f} dB".format((float(trackAPI['GAIN']) + 18.4) * -1) - track['ISRC'] = trackAPI['ISRC'] - track['trackNumber'] = trackAPI['TRACK_NUMBER'] - if 'FALLBACK' in trackAPI: - track['fallbackId'] = trackAPI['FALLBACK']['SNG_ID'] - else: - track['fallbackId'] = 0 - track['contributors'] = trackAPI['SNG_CONTRIBUTORS'] - - track['lyrics'] = {} - if 'LYRICS_ID' in trackAPI: - track['lyrics']['id'] = trackAPI['LYRICS_ID'] - if "LYRICS" in trackAPI: - if "LYRICS_TEXT" in trackAPI["LYRICS"]: - track['lyrics']['unsync'] = trackAPI["LYRICS"]["LYRICS_TEXT"] - if "LYRICS_SYNC_JSON" in trackAPI["LYRICS"]: - track['lyrics']['sync'] = "" - for i in range(len(trackAPI["LYRICS"]["LYRICS_SYNC_JSON"])): - if "lrc_timestamp" in trackAPI["LYRICS"]["LYRICS_SYNC_JSON"][i]: - track['lyrics']['sync'] += trackAPI["LYRICS"]["LYRICS_SYNC_JSON"][i]["lrc_timestamp"] + \ - trackAPI["LYRICS"]["LYRICS_SYNC_JSON"][i]["line"] + "\r\n" - elif i + 1 < len(trackAPI["LYRICS"]["LYRICS_SYNC_JSON"]): - track['lyrics']['sync'] += trackAPI["LYRICS"]["LYRICS_SYNC_JSON"][i + 1]["lrc_timestamp"] + \ - trackAPI["LYRICS"]["LYRICS_SYNC_JSON"][i]["line"] + "\r\n" - - track['mainArtist'] = {} - track['mainArtist']['id'] = trackAPI['ART_ID'] - track['mainArtist']['name'] = trackAPI['ART_NAME'] - if 'ART_PICTURE' in trackAPI: - track['mainArtist']['pic'] = trackAPI['ART_PICTURE'] - - if 'PHYSICAL_RELEASE_DATE' in trackAPI: - track['date'] = { - 'day': trackAPI["PHYSICAL_RELEASE_DATE"][8:10], - 'month': trackAPI["PHYSICAL_RELEASE_DATE"][5:7], - 'year': trackAPI["PHYSICAL_RELEASE_DATE"][0:4] - } - - track['album'] = {} - track['album']['id'] = trackAPI['ALB_ID'] - track['album']['title'] = trackAPI['ALB_TITLE'] - if 'ALB_PICTURE' in trackAPI: - track['album']['pic'] = trackAPI['ALB_PICTURE'] - - try: - albumAPI = dz.get_album(track['album']['id']) - track['album']['artist'] = { - 'id': albumAPI['artist']['id'], - 'name': albumAPI['artist']['name'], - 'pic': albumAPI['artist']['picture_small'][46:-24] - } - track['album']['trackTotal'] = albumAPI['nb_tracks'] - track['album']['recordType'] = albumAPI['record_type'] - track['album']['barcode'] = albumAPI['upc'] if 'upc' in albumAPI else None - track['album']['label'] = albumAPI['label'] if 'label' in albumAPI else None - if not 'pic' in track['album']: - track['album']['pic'] = albumAPI['cover_small'][43:-24] - if 'release_date' in albumAPI: - track['date'] = { - 'day': albumAPI["release_date"][8:10], - 'month': albumAPI["release_date"][5:7], - 'year': albumAPI["release_date"][0:4] - } - track['album']['genre'] = [] - if 'genres' in albumAPI and 'data' in albumAPI['genres'] and len(albumAPI['genres']['data']) > 0: - for genre in albumAPI['genres']['data']: - track['album']['genre'].append(genre['name']) - except APIError: - albumAPI = dz.get_album_gw(track['album']['id']) - track['album']['artist'] = { - 'id': albumAPI['ART_ID'], - 'name': albumAPI['ART_NAME'] - } - track['album']['trackTotal'] = albumAPI['NUMBER_TRACK'] - track['album']['discTotal'] = albumAPI['NUMBER_DISK'] - track['album']['recordType'] = trackAPI['TYPE'] - track['album']['barcode'] = None - track['album']['label'] = albumAPI['LABEL_NAME'] if 'LABEL_NAME' in albumAPI else None - if not 'pic' in track['album']: - track['album']['pic'] = albumAPI['ALB_PICTURE'] - if 'PHYSICAL_RELEASE_DATE' in albumAPI: - track['date'] = { - 'day': albumAPI["PHYSICAL_RELEASE_DATE"][8:10], - 'month': albumAPI["PHYSICAL_RELEASE_DATE"][5:7], - 'year': albumAPI["PHYSICAL_RELEASE_DATE"][0:4] - } - track['album']['genre'] = [] - - trackAPI2 = dz.get_track(track['id']) - track['bpm'] = trackAPI2['bpm'] - if not 'replayGain' in track: - track['replayGain'] = "{0:.2f} dB".format((float(trackAPI2['gain']) + 18.4) * -1) - if not 'explicit' in track: - track['explicit'] = trackAPI2['explicit_lyrics'] - track['artist'] = {} - track['artists'] = [] - for artist in trackAPI2['contributors']: - track['artists'].append(artist['name']) - if not artist['role'] in track['artist']: - track['artist'][artist['role']] = [] - track['artist'][artist['role']].append(artist['name']) - - if not 'discTotal' in track['album']: - albumAPI2 = dz.get_album_gw(track['album']['id']) - track['album']['discTotal'] = albumAPI2['NUMBER_DISK'] - return track - - -def downloadTrack(id, bitrate): - # Get the metadata - track = getTrackData(id) - - # Get the selected bitrate - bitrateFound = False; - if int(bitrate) == 9: - track['selectedFormat'] = 9 - track['selectedFilesize'] = track['filesize']['flac'] - if track['filesize']['flac'] > 0: - bitrateFound = True - else: - bitrateFound = False - bitrate = 3 - if int(bitrate) == 3: - track['selectedFormat'] = 3 - track['selectedFilesize'] = track['filesize']['mp3_320'] - if track['filesize']['mp3_320'] > 0: - bitrateFound = True - else: - bitrateFound = False - bitrate = 1 - if int(bitrate) == 1: - track['selectedFormat'] = 3 - track['selectedFilesize'] = track['filesize']['mp3_320'] - if track['filesize']['mp3_320'] > 0: - bitrateFound = True - else: - bitrateFound = False - if not bitrateFound: - track['selectedFormat'] = 8 - track['selectedFilesize'] = track['filesize']['default'] - track['album']['bitrate'] = track['selectedFormat'] - - # Create the filename - filename = "{artist} - {title}".format(title=track['title'], artist=track['mainArtist']['name']) + extensions[ - track['selectedFormat']] - print(filename) - - track['downloadUrl'] = dz.get_track_stream_url(track['id'], track['MD5'], track['mediaVersion'], - track['selectedFormat']) - with open(filename, 'wb') as stream: - dz.stream_track(track['id'], track['downloadUrl'], stream) - if track['selectedFormat'] in [3, 1, 8]: - tagID3(filename, track) - elif track['selectedFormat'] == 9: - tagFLAC(filename, track) diff --git a/deemix/app/settings.py b/deemix/app/settings.py new file mode 100644 index 0000000..077c8bd --- /dev/null +++ b/deemix/app/settings.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +import os.path as path +from os import mkdir, rmdir +import json + +import deemix.utils.localpaths as localpaths + +settings = {} + +def initSettings(): + global settings + currentFolder = path.abspath(path.dirname(__file__)) + if not path.isdir(localpaths.getConfigFolder()): + mkdir(localpaths.getConfigFolder()) + configFolder = localpaths.getConfigFolder() + if not path.isfile(path.join(configFolder, 'config.json')): + with open(path.join(configFolder, 'config.json'), 'w') as f: + with open(path.join(currentFolder, 'default.json'), 'r') as d: + f.write(d.read()) + with open(path.join(configFolder, 'config.json'), 'r') as configFile: + settings = json.load(configFile) + if settings['pathSettings']['downloadLocation'] == "": + settings['pathSettings']['downloadLocation'] = path.join(localpaths.getHomeFolder(), 'deemix Music') + saveSettings(settings) + if not path.isdir(settings['pathSettings']['downloadLocation']): + mkdir(settings['pathSettings']['downloadLocation']) + return settings + +def getSettings(): + global settings + return settings + +def saveSettings(newSettings): + global settings + settings = newSettings + with open(path.join(localpaths.getConfigFolder(), 'config.json'), 'w') as configFile: + json.dump(settings, configFile) + return True diff --git a/deemix/ui/MainFrame.py b/deemix/ui/MainFrame.py index 4e1bb2e..6dd3505 100644 --- a/deemix/ui/MainFrame.py +++ b/deemix/ui/MainFrame.py @@ -2,7 +2,9 @@ import wx from deemix.ui.SettingsDialog import SettingsDialog -from deemix.app.functions import downloadTrack, getIDFromLink, getTypeFromLink +from deemix.app.functions import getIDFromLink, getTypeFromLink +from deemix.app.downloader import download_track, download_album +from deemix.app.settings import initSettings menuIDs = { "SETTINGS": 1 @@ -13,7 +15,7 @@ class MainFrame(wx.Frame): super().__init__(parent=None, title='deemix') panel = wx.Panel(self) - self.settings = {} + self.settings = initSettings() # Menubar menubar = wx.MenuBar() @@ -47,7 +49,9 @@ class MainFrame(wx.Frame): id = getIDFromLink(value, type) print(type, id) if type == "track": - downloadTrack(id, 9) + download_track(id, self.settings) + elif type == "album": + download_album(id, self.settings) self.text_ctrl.SetValue("") def close_app(self, event): diff --git a/deemix/utils/localpaths.py b/deemix/utils/localpaths.py new file mode 100644 index 0000000..f2fbbe8 --- /dev/null +++ b/deemix/utils/localpaths.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +import sys +import os.path as path +from os import getenv + +userdata = "" +homedata = path.expanduser("~") + +if getenv("APPDATA"): + userdata = getenv("APPDATA") + path.sep + "deemix" + path.sep +elif sys.platform.startswith('darwin'): + userdata = homedata + '/Library/Application Support/deemix/' +elif getenv("XDG_CONFIG_HOME"): + userdata = getenv("XDG_CONFIG_HOME") + '/deemix/'; +else: + userdata = homedata + '/.config/deemix/'; + +def getHomeFolder(): + return homedata +def getConfigFolder(): + return userdata