Ajoute pmocovers

This commit is contained in:
2025-10-07 08:33:06 +02:00
parent adb6555aa6
commit ff2d6b23bd
21 changed files with 2844 additions and 54 deletions

View File

@@ -40,10 +40,13 @@ impl Clone for Config {
}
impl Config {
pub fn load_config(filename: &str) -> Result<Self> {
let mut path = filename.to_string();
let mut data: Option<Vec<u8>> = None;
let mut default_value: Value = serde_yaml::from_str(DEFAULT_CONFIG)?;
// Essayer de charger depuis différents emplacements
if !filename.is_empty() {
info!(config_file=%path, "Trying to load config");
@@ -97,8 +100,11 @@ impl Config {
DEFAULT_CONFIG.as_bytes().to_vec()
};
let mut config_value: Value = serde_yaml::from_slice(&yaml_data)?;
config_value = Self::lower_keys_value(config_value);
let external_value: Value = serde_yaml::from_slice(&yaml_data)?;
merge_yaml(&mut default_value, &external_value);
let mut config_value = Self::lower_keys_value(default_value);
Self::apply_env_overrides(&mut config_value);
if path.is_empty() || !Self::is_writable(&path) {
@@ -175,8 +181,10 @@ impl Config {
fn get_value_internal(data: &Value, path: &[&str]) -> Result<Value> {
let mut current = data;
for (i, key) in path.iter().enumerate() {
if let Value::Mapping(map) = current {
let key = key.to_lowercase();
if let Some(next) = map.get(&Value::String(key)) {
current = next;
} else {
@@ -317,3 +325,17 @@ impl Config {
pub fn get_config() -> Arc<Config> {
CONFIG.clone()
}
fn merge_yaml(default: &mut Value, external: &Value) {
match (default, external) {
(Value::Mapping(dmap), Value::Mapping(emap)) => {
for (k, v) in emap {
match dmap.get_mut(k) {
Some(dv) => merge_yaml(dv, v),
None => { dmap.insert(k.clone(), v.clone()); }
}
}
}
(d, e) => *d = e.clone(), // pour les scalaires ou séquences, on remplace
}
}

View File

@@ -1,6 +1,6 @@
host:
http_port: "8080"
cover_cache:
cover_cache:
directory: "./.pmomusic_covers"
size: 2000
devices: