mirror of
https://github.com/Dvorinka/swingmusic-extended.git
synced 2026-06-03 20:13:02 +00:00
Refactor artistSplitIgnoreList to load from files
+ improving configuration management. + Update JSON serialization for sets in settings.
This commit is contained in:
@@ -95,10 +95,16 @@ def get_all_settings():
|
|||||||
Get all settings
|
Get all settings
|
||||||
"""
|
"""
|
||||||
config = asdict(UserConfig())
|
config = asdict(UserConfig())
|
||||||
|
|
||||||
|
# Convert sets to lists for JSON serialization
|
||||||
|
for key, value in config.items():
|
||||||
|
if isinstance(value, set):
|
||||||
|
config[key] = sorted(list(value))
|
||||||
|
|
||||||
config["plugins"] = [p for p in PluginTable.get_all()]
|
config["plugins"] = [p for p in PluginTable.get_all()]
|
||||||
config["version"] = Info.SWINGMUSIC_APP_VERSION
|
config["version"] = Info.SWINGMUSIC_APP_VERSION
|
||||||
|
|
||||||
# hide lastfmSessionKeys for other users
|
# only return lastfmSessionKey for the current user
|
||||||
current_user = get_current_userid()
|
current_user = get_current_userid()
|
||||||
config["lastfmSessionKey"] = config["lastfmSessionKeys"].get(str(current_user), "")
|
config["lastfmSessionKey"] = config["lastfmSessionKeys"].get(str(current_user), "")
|
||||||
del config["lastfmSessionKeys"]
|
del config["lastfmSessionKeys"]
|
||||||
|
|||||||
+40
-16
@@ -1,12 +1,43 @@
|
|||||||
from dataclasses import dataclass, asdict, field
|
from dataclasses import dataclass, asdict, field
|
||||||
import json
|
import json
|
||||||
import os
|
from pathlib import Path
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from .settings import Paths
|
from .settings import Paths
|
||||||
|
|
||||||
# TODO: Publish this on PyPi
|
# TODO: Publish this on PyPi
|
||||||
|
|
||||||
|
|
||||||
|
def load_artist_ignore_list_from_file(filepath: Path) -> set[str]:
|
||||||
|
"""
|
||||||
|
Loads artist names from a text file.
|
||||||
|
Returns an empty set if the file doesn't exist.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
return {
|
||||||
|
line.strip() for line in filepath.read_text().splitlines() if line.strip()
|
||||||
|
}
|
||||||
|
except FileNotFoundError:
|
||||||
|
return set()
|
||||||
|
|
||||||
|
|
||||||
|
def load_default_artist_ignore_list() -> set[str]:
|
||||||
|
"""
|
||||||
|
Loads the default artist ignore list from the text file.
|
||||||
|
Returns an empty set if the file doesn't exist.
|
||||||
|
"""
|
||||||
|
default_file = Path(__file__).parent / "data" / "artist_split_ignore.txt"
|
||||||
|
return load_artist_ignore_list_from_file(default_file)
|
||||||
|
|
||||||
|
|
||||||
|
def load_user_artist_ignore_list() -> set[str]:
|
||||||
|
"""
|
||||||
|
Loads the user-defined artist ignore list from the config directory.
|
||||||
|
Returns an empty set if the file doesn't exist.
|
||||||
|
"""
|
||||||
|
user_file = Path(Paths.get_config_file_path()).parent / "artist_split_ignore.txt"
|
||||||
|
return load_artist_ignore_list_from_file(user_file)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class UserConfig:
|
class UserConfig:
|
||||||
_config_path: str = ""
|
_config_path: str = ""
|
||||||
@@ -23,17 +54,9 @@ class UserConfig:
|
|||||||
excludeDirs: list[str] = field(default_factory=list)
|
excludeDirs: list[str] = field(default_factory=list)
|
||||||
artistSeparators: set[str] = field(default_factory=lambda: {";", "/"})
|
artistSeparators: set[str] = field(default_factory=lambda: {";", "/"})
|
||||||
artistSplitIgnoreList: set[str] = field(
|
artistSplitIgnoreList: set[str] = field(
|
||||||
default_factory=lambda: {
|
default_factory=lambda: load_default_artist_ignore_list().union(
|
||||||
"AC/DC",
|
load_user_artist_ignore_list()
|
||||||
"Bob marley & the wailers",
|
)
|
||||||
"Crosby, Stills, Nash & Young",
|
|
||||||
"Smith & Thell",
|
|
||||||
"Peter, Paul & Mary",
|
|
||||||
"Simon & Garfunkel",
|
|
||||||
"Judy & Mary",
|
|
||||||
"Belle & Sebastian",
|
|
||||||
"Florence & The Machine",
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
genreSeparators: set[str] = field(default_factory=lambda: {"/", ";", "&"})
|
genreSeparators: set[str] = field(default_factory=lambda: {"/", ";", "&"})
|
||||||
|
|
||||||
@@ -75,9 +98,10 @@ class UserConfig:
|
|||||||
# loop through the config file and set the values
|
# loop through the config file and set the values
|
||||||
for key, value in config.items():
|
for key, value in config.items():
|
||||||
if key == "artistSplitIgnoreList":
|
if key == "artistSplitIgnoreList":
|
||||||
# Merge with default values instead of overwriting
|
# Merge with default values and user file values instead of overwriting
|
||||||
default_values = self.artistSplitIgnoreList
|
default_values = load_default_artist_ignore_list()
|
||||||
setattr(self, key, default_values.union(value))
|
user_values = load_user_artist_ignore_list()
|
||||||
|
setattr(self, key, default_values.union(user_values).union(value))
|
||||||
else:
|
else:
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
|
|
||||||
@@ -90,7 +114,7 @@ class UserConfig:
|
|||||||
if it doesn't exist
|
if it doesn't exist
|
||||||
"""
|
"""
|
||||||
# if not exists, create the config file
|
# if not exists, create the config file
|
||||||
if not os.path.exists(self._config_path):
|
if not Path(self._config_path).exists():
|
||||||
self.write_to_file(asdict(self))
|
self.write_to_file(asdict(self))
|
||||||
|
|
||||||
def load_config(self, path: str) -> dict[str, Any]:
|
def load_config(self, path: str) -> dict[str, Any]:
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
AC/DC
|
||||||
|
Bob marley & the wailers
|
||||||
|
Crosby, Stills, Nash & Young
|
||||||
|
Smith & Thell
|
||||||
|
Peter, Paul & Mary
|
||||||
|
Simon & Garfunkel
|
||||||
|
Judy & Mary
|
||||||
|
Florence & The Machine
|
||||||
Reference in New Issue
Block a user