2021-06-27 20:29:41 +00:00
|
|
|
import json
|
2021-10-07 14:18:50 +00:00
|
|
|
from copy import deepcopy
|
2021-06-27 20:29:41 +00:00
|
|
|
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),
|
2021-12-19 16:27:01 +00:00
|
|
|
"fallbackBitrate": False,
|
2021-06-27 20:29:41 +00:00
|
|
|
"fallbackSearch": 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",
|
2021-12-19 16:27:01 +00:00
|
|
|
"jpegImageQuality": 90,
|
2021-06-27 20:29:41 +00:00
|
|
|
"dateFormat": "Y-M-D",
|
|
|
|
"albumVariousArtists": True,
|
|
|
|
"removeAlbumVersion": False,
|
2021-12-19 16:27:01 +00:00
|
|
|
"removeDuplicateArtists": True,
|
2021-06-27 20:29:41 +00:00
|
|
|
"featuredToTitle": FeaturesOption.NO_CHANGE,
|
|
|
|
"titleCasing": "nothing",
|
|
|
|
"artistCasing": "nothing",
|
|
|
|
"executeCommand": "",
|
|
|
|
"tags": {
|
|
|
|
"title": True,
|
|
|
|
"artist": True,
|
2021-12-19 16:28:56 +00:00
|
|
|
"artists": True,
|
2021-06-27 20:29:41 +00:00
|
|
|
"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,
|
2021-08-04 18:39:51 +00:00
|
|
|
"rating": False,
|
2021-06-27 20:29:41 +00:00
|
|
|
"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
|
|
|
|
|
2021-12-21 11:40:35 +00:00
|
|
|
with open(configFolder / 'config.json', 'w', encoding="utf-8") as configFile:
|
2021-06-27 20:29:41 +00:00
|
|
|
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
|
2021-12-21 11:40:35 +00:00
|
|
|
with open(configFolder / 'config.json', 'r', encoding="utf-8") as configFile:
|
2021-10-07 14:18:50 +00:00
|
|
|
try:
|
|
|
|
settings = json.load(configFile)
|
|
|
|
except json.decoder.JSONDecodeError:
|
|
|
|
save(DEFAULTS, configFolder)
|
|
|
|
settings = deepcopy(DEFAULTS)
|
|
|
|
except Exception:
|
|
|
|
settings = deepcopy(DEFAULTS)
|
2021-06-27 20:29:41 +00:00
|
|
|
|
|
|
|
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
|