import json from copy import deepcopy from pathlib import Path from os import makedirs from deezer import TrackFormats import deemix.utils.localpaths as localpaths class OverwriteOption(): """Should the lib overwrite files?""" OVERWRITE = 'y' # Yes, overwrite the file DONT_OVERWRITE = 'n' # No, don't overwrite the file DONT_CHECK_EXT = 'e' # No, and don't check for extensions KEEP_BOTH = 'b' # No, and keep both files ONLY_TAGS = 't' # Overwrite only the tags class FeaturesOption(): """What should I do with featured artists?""" NO_CHANGE = "0" # Do nothing REMOVE_TITLE = "1" # Remove from track title REMOVE_TITLE_ALBUM = "3" # Remove from track title and album title MOVE_TITLE = "2" # Move to track title DEFAULTS = { "downloadLocation": str(localpaths.getMusicFolder()), "tracknameTemplate": "%artist% - %title%", "albumTracknameTemplate": "%tracknumber% - %title%", "playlistTracknameTemplate": "%position% - %artist% - %title%", "createPlaylistFolder": True, "playlistNameTemplate": "%playlist%", "createArtistFolder": False, "artistNameTemplate": "%artist%", "createAlbumFolder": True, "albumNameTemplate": "%artist% - %album%", "createCDFolder": True, "createStructurePlaylist": False, "createSingleFolder": False, "padTracks": True, "paddingSize": "0", "illegalCharacterReplacer": "_", "queueConcurrency": 3, "maxBitrate": str(TrackFormats.MP3_320), "feelingLucky": False, "fallbackBitrate": False, "fallbackSearch": False, "fallbackISRC": False, "logErrors": True, "logSearched": False, "overwriteFile": OverwriteOption.DONT_OVERWRITE, "createM3U8File": False, "playlistFilenameTemplate": "playlist", "syncedLyrics": False, "embeddedArtworkSize": 800, "embeddedArtworkPNG": False, "localArtworkSize": 1400, "localArtworkFormat": "jpg", "saveArtwork": True, "coverImageTemplate": "cover", "saveArtworkArtist": False, "artistImageTemplate": "folder", "jpegImageQuality": 90, "dateFormat": "Y-M-D", "albumVariousArtists": True, "removeAlbumVersion": False, "removeDuplicateArtists": True, "featuredToTitle": FeaturesOption.NO_CHANGE, "titleCasing": "nothing", "artistCasing": "nothing", "executeCommand": "", "tags": { "title": True, "artist": True, "artists": 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": True, "barcode": True, "bpm": True, "replayGain": False, "label": True, "lyrics": False, "syncedLyrics": False, "copyright": False, "composer": False, "involvedPeople": False, "source": False, "rating": False, "savePlaylistAsCompilation": False, "useNullSeparator": False, "saveID3v1": True, "multiArtistSeparator": "default", "singleAlbumArtist": False, "coverDescriptionUTF8": False } } def save(settings, configFolder=None): configFolder = Path(configFolder or localpaths.getConfigFolder()) makedirs(configFolder, exist_ok=True) # Create config folder if it doesn't exsist with open(configFolder / 'config.json', 'w', encoding="utf-8") as configFile: json.dump(settings, configFile, indent=2) def load(configFolder=None): configFolder = Path(configFolder or localpaths.getConfigFolder()) makedirs(configFolder, exist_ok=True) # Create config folder if it doesn't exsist if not (configFolder / 'config.json').is_file(): save(DEFAULTS, configFolder) # Create config file if it doesn't exsist # Read config file with open(configFolder / 'config.json', 'r', encoding="utf-8") as configFile: try: settings = json.load(configFile) except json.decoder.JSONDecodeError: save(DEFAULTS, configFolder) settings = deepcopy(DEFAULTS) except Exception: settings = deepcopy(DEFAULTS) if check(settings) > 0: save(settings, configFolder) # Check the settings and save them if something changed return settings def check(settings): changes = 0 for i_set in DEFAULTS: if not i_set in settings or not isinstance(settings[i_set], type(DEFAULTS[i_set])): settings[i_set] = DEFAULTS[i_set] changes += 1 for i_set in DEFAULTS['tags']: if not i_set in settings['tags'] or not isinstance(settings['tags'][i_set], type(DEFAULTS['tags'][i_set])): settings['tags'][i_set] = DEFAULTS['tags'][i_set] changes += 1 if settings['downloadLocation'] == "": settings['downloadLocation'] = DEFAULTS['downloadLocation'] changes += 1 for template in ['tracknameTemplate', 'albumTracknameTemplate', 'playlistTracknameTemplate', 'playlistNameTemplate', 'artistNameTemplate', 'albumNameTemplate', 'playlistFilenameTemplate', 'coverImageTemplate', 'artistImageTemplate', 'paddingSize']: if settings[template] == "": settings[template] = DEFAULTS[template] changes += 1 return changes