improved cache logic
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
Binary file not shown.
@@ -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)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user