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

View File

@@ -63,7 +63,7 @@ class TF5MixerController:
except socket.error as e: except socket.error as e:
print(f'Errore di connessione dopo {max_retries} tentativi: {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: if attempt < max_retries - 1:
time.sleep(0.1) time.sleep(0.1)
@@ -98,13 +98,30 @@ class TF5MixerController:
return {"channels": {}, "mixes": {}, "timestamp": 0} return {"channels": {}, "mixes": {}, "timestamp": 0}
def _save_cache(self): def _save_cache(self):
"""Salva la cache nel file.""" """Salva la cache nel file, convertendo -inf in null."""
try: 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: 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: except Exception as e:
print(f"⚠️ Errore nel salvataggio della cache: {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: def _is_cache_valid(self) -> bool:
"""Verifica se la cache è ancora valida.""" """Verifica se la cache è ancora valida."""
if not self._cache.get("channels"): if not self._cache.get("channels"):
@@ -112,6 +129,12 @@ class TF5MixerController:
cache_age = time.time() - self._cache.get("timestamp", 0) cache_age = time.time() - self._cache.get("timestamp", 0)
return cache_age < CACHE_DURATION 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): def _update_channel_cache(self, channel: int):
"""Aggiorna la cache per un singolo canale leggendo dal mixer. """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(): if not force_refresh and self._is_cache_valid():
cached_data = self._cache.get("channels", {}).get(str(channel)) cached_data = self._cache.get("channels", {}).get(str(channel))
if cached_data: if cached_data:
# Normalizza level_db (None -> -inf)
level_db = self._normalize_level_from_cache(cached_data.get("level_db"))
return { return {
"status": "success", "status": "success",
"source": "cache", "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 # Altrimenti leggi dal mixer
@@ -613,10 +642,15 @@ class TF5MixerController:
if not force_refresh and self._is_cache_valid(): if not force_refresh and self._is_cache_valid():
cached_data = self._cache.get("mixes", {}).get(str(mix_number)) cached_data = self._cache.get("mixes", {}).get(str(mix_number))
if cached_data: if cached_data:
# Normalizza level_db (None -> -inf)
level_db = self._normalize_level_from_cache(cached_data.get("level_db"))
return { return {
"status": "success", "status": "success",
"source": "cache", "source": "cache",
**cached_data "mix": cached_data["mix"],
"name": cached_data["name"],
"on": cached_data["on"],
"level_db": level_db
} }
# Altrimenti leggi dal mixer # Altrimenti leggi dal mixer
@@ -664,11 +698,13 @@ class TF5MixerController:
for ch_str, info in self._cache.get("channels", {}).items(): for ch_str, info in self._cache.get("channels", {}).items():
if search_lower in info.get("name", "").lower(): 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({ found_channels.append({
"channel": info["channel"], "channel": info["channel"],
"name": info["name"], "name": info["name"],
"on": info["on"], "on": info["on"],
"level_db": info["level_db"] "level_db": level_db
}) })
# Ordina per numero canale # Ordina per numero canale
@@ -701,11 +737,13 @@ class TF5MixerController:
for mix_str, info in self._cache.get("mixes", {}).items(): for mix_str, info in self._cache.get("mixes", {}).items():
if search_lower in info.get("name", "").lower(): 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({ found_mixes.append({
"mix": info["mix"], "mix": info["mix"],
"name": info["name"], "name": info["name"],
"on": info["on"], "on": info["on"],
"level_db": info["level_db"] "level_db": level_db
}) })
# Ordina per numero mix # Ordina per numero mix
@@ -782,4 +820,3 @@ class TF5MixerController:
"cache_age_seconds": int(cache_age), "cache_age_seconds": int(cache_age),
"message": f"Riepilogo di {len(mixes)} mix (cache: {int(cache_age)}s fa)" "message": f"Riepilogo di {len(mixes)} mix (cache: {int(cache_age)}s fa)"
} }