improved cache logic

This commit is contained in:
Nick
2025-10-27 20:19:10 +01:00
parent 0ed2435536
commit 9b5fecd400
3 changed files with 79 additions and 42 deletions

View File

@@ -11,21 +11,21 @@
"channel": 2,
"name": "Gelato",
"on": true,
"level_db": -6.25,
"level_db": -0.25,
"pan": 0
},
"3": {
"channel": 3,
"name": "Talkback",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"4": {
"channel": 4,
"name": "Sconosciuto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"5": {
@@ -46,91 +46,91 @@
"channel": 7,
"name": "Basso",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"8": {
"channel": 8,
"name": "Sconosciuto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"9": {
"channel": 9,
"name": "Kick",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"10": {
"channel": 10,
"name": "Snare",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"11": {
"channel": 11,
"name": "Tom 1",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"12": {
"channel": 12,
"name": "Tom 2",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"13": {
"channel": 13,
"name": "Tom3",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"14": {
"channel": 14,
"name": "Pan SX",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"15": {
"channel": 15,
"name": "Pan dx",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"16": {
"channel": 16,
"name": "Sconosciuto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"17": {
"channel": 17,
"name": "Sconosciuto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"18": {
"channel": 18,
"name": "Archetto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"19": {
"channel": 19,
"name": "Vox 5",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"20": {
@@ -144,14 +144,14 @@
"channel": 21,
"name": "Sconosciuto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"22": {
"channel": 22,
"name": "Sconosciuto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"23": {
@@ -179,7 +179,7 @@
"channel": 26,
"name": "Sconosciuto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"27": {
@@ -193,35 +193,35 @@
"channel": 28,
"name": "Sconosciuto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"29": {
"channel": 29,
"name": "Pad",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"30": {
"channel": 30,
"name": "Sconosciuto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"31": {
"channel": 31,
"name": "Sconosciuto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"32": {
"channel": 32,
"name": "Sconosciuto",
"on": false,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"33": {
@@ -242,42 +242,42 @@
"channel": 35,
"name": "ch35",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"36": {
"channel": 36,
"name": "ch36",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"37": {
"channel": 37,
"name": "ch37",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"38": {
"channel": 38,
"name": "ch38",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"39": {
"channel": 39,
"name": "ch39",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
},
"40": {
"channel": 40,
"name": "ch40",
"on": true,
"level_db": -Infinity,
"level_db": null,
"pan": 0
}
},
@@ -286,7 +286,7 @@
"mix": 1,
"name": "Sinistro",
"on": true,
"level_db": -Infinity
"level_db": null
},
"2": {
"mix": 2,
@@ -310,7 +310,7 @@
"mix": 5,
"name": "batteria",
"on": true,
"level_db": 1.35
"level_db": 1.1
},
"6": {
"mix": 6,
@@ -403,5 +403,5 @@
"level_db": 6.0
}
},
"timestamp": 1761592356.5132928
"timestamp": 1761592662.917339
}

View File

@@ -63,7 +63,7 @@ class TF5MixerController:
except socket.error as e:
print(f'Errore di connessione dopo {max_retries} tentativi: {e}')
self._disconnect() # Forza riconnessione al prossimo tentativo
self._disconnect()
if attempt < max_retries - 1:
time.sleep(0.1)
@@ -98,13 +98,30 @@ class TF5MixerController:
return {"channels": {}, "mixes": {}, "timestamp": 0}
def _save_cache(self):
"""Salva la cache nel file."""
"""Salva la cache nel file, convertendo -inf in null."""
try:
# Crea una copia della cache per la serializzazione
cache_to_save = self._prepare_cache_for_json(self._cache)
with open(CACHE_FILE, 'w', encoding='utf-8') as f:
json.dump(self._cache, f, indent=2, ensure_ascii=False)
json.dump(cache_to_save, f, indent=2, ensure_ascii=False)
except Exception as e:
print(f"⚠️ Errore nel salvataggio della cache: {e}")
def _prepare_cache_for_json(self, obj):
"""Converte ricorsivamente -inf in null per la serializzazione JSON."""
if isinstance(obj, dict):
return {k: self._prepare_cache_for_json(v) for k, v in obj.items()}
elif isinstance(obj, list):
return [self._prepare_cache_for_json(item) for item in obj]
elif isinstance(obj, float):
# Converti -inf in null per JSON
if obj == float('-inf'):
return None
return obj
else:
return obj
def _is_cache_valid(self) -> bool:
"""Verifica se la cache è ancora valida."""
if not self._cache.get("channels"):
@@ -112,6 +129,12 @@ class TF5MixerController:
cache_age = time.time() - self._cache.get("timestamp", 0)
return cache_age < CACHE_DURATION
def _normalize_level_from_cache(self, level_value):
"""Normalizza il valore del livello dalla cache (gestisce None come -inf)."""
if level_value is None:
return float('-inf')
return level_value
def _update_channel_cache(self, channel: int):
"""Aggiorna la cache per un singolo canale leggendo dal mixer.
@@ -555,10 +578,16 @@ class TF5MixerController:
if not force_refresh and self._is_cache_valid():
cached_data = self._cache.get("channels", {}).get(str(channel))
if cached_data:
# Normalizza level_db (None -> -inf)
level_db = self._normalize_level_from_cache(cached_data.get("level_db"))
return {
"status": "success",
"source": "cache",
**cached_data
"channel": cached_data["channel"],
"name": cached_data["name"],
"on": cached_data["on"],
"level_db": level_db,
"pan": cached_data.get("pan")
}
# Altrimenti leggi dal mixer
@@ -613,10 +642,15 @@ class TF5MixerController:
if not force_refresh and self._is_cache_valid():
cached_data = self._cache.get("mixes", {}).get(str(mix_number))
if cached_data:
# Normalizza level_db (None -> -inf)
level_db = self._normalize_level_from_cache(cached_data.get("level_db"))
return {
"status": "success",
"source": "cache",
**cached_data
"mix": cached_data["mix"],
"name": cached_data["name"],
"on": cached_data["on"],
"level_db": level_db
}
# Altrimenti leggi dal mixer
@@ -664,11 +698,13 @@ class TF5MixerController:
for ch_str, info in self._cache.get("channels", {}).items():
if search_lower in info.get("name", "").lower():
# Normalizza level_db quando restituisci i risultati
level_db = self._normalize_level_from_cache(info.get("level_db"))
found_channels.append({
"channel": info["channel"],
"name": info["name"],
"on": info["on"],
"level_db": info["level_db"]
"level_db": level_db
})
# Ordina per numero canale
@@ -701,11 +737,13 @@ class TF5MixerController:
for mix_str, info in self._cache.get("mixes", {}).items():
if search_lower in info.get("name", "").lower():
# Normalizza level_db quando restituisci i risultati
level_db = self._normalize_level_from_cache(info.get("level_db"))
found_mixes.append({
"mix": info["mix"],
"name": info["name"],
"on": info["on"],
"level_db": info["level_db"]
"level_db": level_db
})
# Ordina per numero mix
@@ -782,4 +820,3 @@ class TF5MixerController:
"cache_age_seconds": int(cache_age),
"message": f"Riepilogo di {len(mixes)} mix (cache: {int(cache_age)}s fa)"
}