fixed -inf
This commit is contained in:
@@ -9,9 +9,9 @@
|
|||||||
},
|
},
|
||||||
"2": {
|
"2": {
|
||||||
"channel": 2,
|
"channel": 2,
|
||||||
"name": "Gelato",
|
"name": "0.00",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": 0
|
||||||
},
|
},
|
||||||
"3": {
|
"3": {
|
||||||
|
|||||||
Binary file not shown.
@@ -1,87 +1,135 @@
|
|||||||
{
|
{
|
||||||
"user_id": 4762864,
|
"user_id": 4762864,
|
||||||
"username": "unnikked",
|
"username": "unnikked",
|
||||||
"last_updated": 1762194065.7709692,
|
"last_updated": 1762194931.602051,
|
||||||
"last_updated_str": "2025-11-03 19:21:05",
|
"last_updated_str": "2025-11-03 19:35:31",
|
||||||
"message_count": 13,
|
"message_count": 21,
|
||||||
"history": [
|
"history": [
|
||||||
|
{
|
||||||
|
"role": "assistant",
|
||||||
|
"content": "Fatto! Il canale \"Gelato\" dovrebbe essere acceso ora. Fammi sapere se è tutto ok! 🍦✅",
|
||||||
|
"timestamp": 1762194705.2052844,
|
||||||
|
"timestamp_str": "2025-11-03 19:31:45"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Me lo spegni il gelato",
|
"content": "Alzami un po' il gelato",
|
||||||
"timestamp": 1761595234.0849943,
|
"timestamp": 1762194720.6919649,
|
||||||
"timestamp_str": "2025-10-27 21:00:34"
|
"timestamp_str": "2025-11-03 19:32:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Fatto! Canale \"Gelato\" spento. ✅",
|
"content": "Ho alzato un po' il volume del \"Gelato\" a -11.3 dB. 🍦🔊 Fammi sapere se va meglio così!",
|
||||||
"timestamp": 1761595239.1608367,
|
"timestamp": 1762194727.1430511,
|
||||||
"timestamp_str": "2025-10-27 21:00:39"
|
"timestamp_str": "2025-11-03 19:32:07"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Mi accendi il gelato.",
|
"content": "Alza ancora il gelato",
|
||||||
"timestamp": 1761595383.8880353,
|
"timestamp": 1762194746.9937618,
|
||||||
"timestamp_str": "2025-10-27 21:03:03"
|
"timestamp_str": "2025-11-03 19:32:26"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Certo! Gelato acceso! 🍦✅",
|
"content": "Ancora un po' su per il \"Gelato\"! Ora è a -11.3 dB. 🍦🔊",
|
||||||
"timestamp": 1761595387.27931,
|
"timestamp": 1762194751.8532023,
|
||||||
"timestamp_str": "2025-10-27 21:03:07"
|
"timestamp_str": "2025-11-03 19:32:31"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Apaga el helado. Cappuccino.",
|
"content": "Alzami tutto il gelato",
|
||||||
"timestamp": 1761595426.0112157,
|
"timestamp": 1762194765.1222134,
|
||||||
"timestamp_str": "2025-10-27 21:03:46"
|
"timestamp_str": "2025-11-03 19:32:45"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Gelato spento! ✅\nNon ho trovato nessun canale chiamato \"Cappuccino\", sei sicuro del nome? 🤔",
|
"content": "Non riesco a trovare un canale chiamato \"Gelato\" in questo momento. È possibile che il nome sia cambiato o che non sia più disponibile. Potresti darmi il numero del canale o un altro nome per favore? 🤔",
|
||||||
"timestamp": 1761595431.5373232,
|
"timestamp": 1762194785.8956504,
|
||||||
"timestamp_str": "2025-10-27 21:03:51"
|
"timestamp_str": "2025-11-03 19:33:05"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Okay, aprimi il gelato allora!",
|
"content": "Riprovarci",
|
||||||
"timestamp": 1762193935.418264,
|
"timestamp": 1762194813.0377226,
|
||||||
"timestamp_str": "2025-11-03 19:18:55"
|
"timestamp_str": "2025-11-03 19:33:33"
|
||||||
},
|
|
||||||
{
|
|
||||||
"role": "user",
|
|
||||||
"content": "Gli alzi il gelato?",
|
|
||||||
"timestamp": 1762193958.1497903,
|
|
||||||
"timestamp_str": "2025-11-03 19:19:18"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"role": "user",
|
|
||||||
"content": "Aprimi il giubbotto.",
|
|
||||||
"timestamp": 1762194045.3195145,
|
|
||||||
"timestamp_str": "2025-11-03 19:20:45"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Non posso aprirti il giubbotto, non è un canale o un mix del mixer! 😄\n\nPosso aiutarti con i canali audio, i microfoni o i monitor, se vuoi.",
|
"content": "Mi dispiace, ho provato di nuovo ma non riesco ancora a trovare nessun canale chiamato \"Gelato\". 🤔\n\nSe il nome è cambiato o se c'è un numero di canale, potresti dirmelo? Così posso aiutarti!",
|
||||||
"timestamp": 1762194046.8080468,
|
"timestamp": 1762194819.4210932,
|
||||||
"timestamp_str": "2025-11-03 19:20:46"
|
"timestamp_str": "2025-11-03 19:33:39"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Aprimi il gelato",
|
"content": "Ch2",
|
||||||
"timestamp": 1762194053.0858698,
|
"timestamp": 1762194830.624848,
|
||||||
"timestamp_str": "2025-11-03 19:20:53"
|
"timestamp_str": "2025-11-03 19:33:50"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Certo! Gelato acceso! 🍦✅",
|
"content": "Ok, ho alzato il canale 2 al massimo (+10 dB)! 🔊 Fammi sapere se va bene così!",
|
||||||
"timestamp": 1762194054.6322277,
|
"timestamp": 1762194834.0072317,
|
||||||
"timestamp_str": "2025-11-03 19:20:54"
|
"timestamp_str": "2025-11-03 19:33:54"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "È ancora chiuso",
|
"content": "Portalo a zero db",
|
||||||
"timestamp": 1762194065.7709692,
|
"timestamp": 1762194846.3105323,
|
||||||
"timestamp_str": "2025-11-03 19:21:05"
|
"timestamp_str": "2025-11-03 19:34:06"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "assistant",
|
||||||
|
"content": "Perfetto! Ho riportato il canale 2 a 0 dB. ✅🔊",
|
||||||
|
"timestamp": 1762194848.8269963,
|
||||||
|
"timestamp_str": "2025-11-03 19:34:08"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": "Analizzami l'equilibrio del mix diretta, che suggerimenti dai?",
|
||||||
|
"timestamp": 1762194868.3175187,
|
||||||
|
"timestamp_str": "2025-11-03 19:34:28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "assistant",
|
||||||
|
"content": "Mi dispiace, ma non posso analizzare l'equilibrio del mix o darti suggerimenti su come suona. Sono un assistente per controllare il mixer, posso modificare i volumi, i pan, accendere/spegnere i canali e i mix, ma non ho \"orecchie\" per ascoltare e valutare il suono. 😅\n\nPosso aiutarti a regolare i livelli o il pan se mi dici cosa vuoi cambiare!",
|
||||||
|
"timestamp": 1762194871.190547,
|
||||||
|
"timestamp_str": "2025-11-03 19:34:31"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": "E sì sui volumi",
|
||||||
|
"timestamp": 1762194884.4026275,
|
||||||
|
"timestamp_str": "2025-11-03 19:34:44"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "assistant",
|
||||||
|
"content": "Capito! Sui volumi posso agire, ma non posso dirti io cosa suona bene o male, non ho le \"orecchie\" per quello. 😅\n\nSe mi dici quale canale o mix vuoi alzare o abbassare, e di quanto, lo faccio subito! Dimmi tu cosa vuoi cambiare. 🔊",
|
||||||
|
"timestamp": 1762194886.4130292,
|
||||||
|
"timestamp_str": "2025-11-03 19:34:46"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": "Non preoccuparti, dammi un giudizio sui valori se torna tutto",
|
||||||
|
"timestamp": 1762194903.6934974,
|
||||||
|
"timestamp_str": "2025-11-03 19:35:03"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "assistant",
|
||||||
|
"content": "Mi dispiace, ma non posso darti un giudizio sui valori o dirti se \"torna tutto\" a livello di suono. Non ho la capacità di ascoltare e valutare l'audio come farebbe una persona. 😅\n\nPosso solo eseguire i comandi che mi dai per modificare i volumi, il pan o accendere/spegnere i canali e i mix. Se mi dici cosa vuoi cambiare, lo faccio subito!",
|
||||||
|
"timestamp": 1762194906.4559038,
|
||||||
|
"timestamp_str": "2025-11-03 19:35:06"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": "Potresti gentilmente farmi questa caspita di analisi? Poi ti dico io cosa fare",
|
||||||
|
"timestamp": 1762194928.5493388,
|
||||||
|
"timestamp_str": "2025-11-03 19:35:28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "assistant",
|
||||||
|
"content": "Mi dispiace davvero, ma non posso fare questa \"caspita di analisi\" che mi chiedi. 😔 Non ho le orecchie per ascoltare il suono e darti un giudizio su come sta andando il mix o se i valori \"tornano\". Sono un assistente per controllare il mixer, posso solo eseguire i comandi che mi dai per modificare i parametri.\n\nSe mi dici:\n- \"Alza il canale 5\"\n- \"Abbassa il mix 3\"\n- \"Metti il pan del canale 10 a sinistra\"\n- \"Accendi il microfono del cantante\"\n\n...allora posso aiutarti subito! Ma non posso dirti io cosa suona bene o male. Dimmi tu cosa vuoi cambiare sui volumi o sul bilanciamento! 🔊",
|
||||||
|
"timestamp": 1762194931.602051,
|
||||||
|
"timestamp_str": "2025-11-03 19:35:31"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
import socket
|
import socket
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
|
import math
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
from google import genai
|
from google import genai
|
||||||
@@ -22,6 +25,22 @@ class TF5MixerController:
|
|||||||
self._ensure_cache_dir()
|
self._ensure_cache_dir()
|
||||||
self._cache = self._load_cache()
|
self._cache = self._load_cache()
|
||||||
|
|
||||||
|
def _sanitize_value(self, value):
|
||||||
|
"""
|
||||||
|
Sanitizza i valori per renderli JSON-safe.
|
||||||
|
Converte -Infinity in -120 (silenzio pratico).
|
||||||
|
"""
|
||||||
|
if value is None:
|
||||||
|
return -120.0
|
||||||
|
if value == float('-inf') or (isinstance(value, float) and math.isinf(value) and value < 0):
|
||||||
|
return -120.0 # Valore molto basso ma valido
|
||||||
|
elif value == float('inf') or (isinstance(value, float) and math.isinf(value) and value > 0):
|
||||||
|
return 10.0 # Massimo pratico
|
||||||
|
elif isinstance(value, float) and math.isnan(value):
|
||||||
|
return 0.0 # Default a 0 se NaN
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
def _connect(self):
|
def _connect(self):
|
||||||
"""Stabilisce la connessione se non già connesso."""
|
"""Stabilisce la connessione se non già connesso."""
|
||||||
if self.socket is None:
|
if self.socket is None:
|
||||||
@@ -580,13 +599,14 @@ class TF5MixerController:
|
|||||||
if cached_data:
|
if cached_data:
|
||||||
# Normalizza level_db (None -> -inf)
|
# Normalizza level_db (None -> -inf)
|
||||||
level_db = self._normalize_level_from_cache(cached_data.get("level_db"))
|
level_db = self._normalize_level_from_cache(cached_data.get("level_db"))
|
||||||
|
sanitized_level_db = self._sanitize_value(level_db)
|
||||||
return {
|
return {
|
||||||
"status": "success",
|
"status": "success",
|
||||||
"source": "cache",
|
"source": "cache",
|
||||||
"channel": cached_data["channel"],
|
"channel": cached_data["channel"],
|
||||||
"name": cached_data["name"],
|
"name": cached_data["name"],
|
||||||
"on": cached_data["on"],
|
"on": cached_data["on"],
|
||||||
"level_db": level_db,
|
"level_db": sanitized_level_db,
|
||||||
"pan": cached_data.get("pan")
|
"pan": cached_data.get("pan")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -614,13 +634,14 @@ class TF5MixerController:
|
|||||||
except:
|
except:
|
||||||
pan_value = None
|
pan_value = None
|
||||||
|
|
||||||
|
sanitized_level_db = self._sanitize_value(level_db)
|
||||||
return {
|
return {
|
||||||
"status": "success",
|
"status": "success",
|
||||||
"source": "mixer",
|
"source": "mixer",
|
||||||
"channel": channel,
|
"channel": channel,
|
||||||
"name": name,
|
"name": name,
|
||||||
"on": is_on,
|
"on": is_on,
|
||||||
"level_db": level_db,
|
"level_db": sanitized_level_db,
|
||||||
"pan": pan_value
|
"pan": pan_value
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -644,13 +665,14 @@ class TF5MixerController:
|
|||||||
if cached_data:
|
if cached_data:
|
||||||
# Normalizza level_db (None -> -inf)
|
# Normalizza level_db (None -> -inf)
|
||||||
level_db = self._normalize_level_from_cache(cached_data.get("level_db"))
|
level_db = self._normalize_level_from_cache(cached_data.get("level_db"))
|
||||||
|
sanitized_level_db = self._sanitize_value(level_db)
|
||||||
return {
|
return {
|
||||||
"status": "success",
|
"status": "success",
|
||||||
"source": "cache",
|
"source": "cache",
|
||||||
"mix": cached_data["mix"],
|
"mix": cached_data["mix"],
|
||||||
"name": cached_data["name"],
|
"name": cached_data["name"],
|
||||||
"on": cached_data["on"],
|
"on": cached_data["on"],
|
||||||
"level_db": level_db
|
"level_db": sanitized_level_db
|
||||||
}
|
}
|
||||||
|
|
||||||
# Altrimenti leggi dal mixer
|
# Altrimenti leggi dal mixer
|
||||||
@@ -670,13 +692,14 @@ class TF5MixerController:
|
|||||||
except:
|
except:
|
||||||
level_db = None
|
level_db = None
|
||||||
|
|
||||||
|
sanitized_level_db = self._sanitize_value(level_db)
|
||||||
return {
|
return {
|
||||||
"status": "success",
|
"status": "success",
|
||||||
"source": "mixer",
|
"source": "mixer",
|
||||||
"mix": mix_number,
|
"mix": mix_number,
|
||||||
"name": name,
|
"name": name,
|
||||||
"on": is_on,
|
"on": is_on,
|
||||||
"level_db": level_db
|
"level_db": sanitized_level_db
|
||||||
}
|
}
|
||||||
|
|
||||||
def search_channels_by_name(self, search_term: str) -> dict:
|
def search_channels_by_name(self, search_term: str) -> dict:
|
||||||
@@ -700,11 +723,12 @@ class TF5MixerController:
|
|||||||
if search_lower in info.get("name", "").lower():
|
if search_lower in info.get("name", "").lower():
|
||||||
# Normalizza level_db quando restituisci i risultati
|
# Normalizza level_db quando restituisci i risultati
|
||||||
level_db = self._normalize_level_from_cache(info.get("level_db"))
|
level_db = self._normalize_level_from_cache(info.get("level_db"))
|
||||||
|
sanitized_level_db = self._sanitize_value(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": level_db
|
"level_db": sanitized_level_db
|
||||||
})
|
})
|
||||||
|
|
||||||
# Ordina per numero canale
|
# Ordina per numero canale
|
||||||
@@ -739,11 +763,12 @@ class TF5MixerController:
|
|||||||
if search_lower in info.get("name", "").lower():
|
if search_lower in info.get("name", "").lower():
|
||||||
# Normalizza level_db quando restituisci i risultati
|
# Normalizza level_db quando restituisci i risultati
|
||||||
level_db = self._normalize_level_from_cache(info.get("level_db"))
|
level_db = self._normalize_level_from_cache(info.get("level_db"))
|
||||||
|
sanitized_level_db = self._sanitize_value(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": level_db
|
"level_db": sanitized_level_db
|
||||||
})
|
})
|
||||||
|
|
||||||
# Ordina per numero mix
|
# Ordina per numero mix
|
||||||
@@ -770,10 +795,13 @@ class TF5MixerController:
|
|||||||
|
|
||||||
channels = []
|
channels = []
|
||||||
for ch_str, info in self._cache.get("channels", {}).items():
|
for ch_str, info in self._cache.get("channels", {}).items():
|
||||||
|
level_db = self._normalize_level_from_cache(info.get("level_db"))
|
||||||
|
sanitized_level_db = self._sanitize_value(level_db)
|
||||||
channels.append({
|
channels.append({
|
||||||
"channel": info["channel"],
|
"channel": info["channel"],
|
||||||
"name": info["name"],
|
"name": info["name"],
|
||||||
"on": info["on"]
|
"on": info["on"],
|
||||||
|
"level_db": sanitized_level_db
|
||||||
})
|
})
|
||||||
|
|
||||||
# Ordina per numero canale
|
# Ordina per numero canale
|
||||||
@@ -802,10 +830,13 @@ class TF5MixerController:
|
|||||||
|
|
||||||
mixes = []
|
mixes = []
|
||||||
for mix_str, info in self._cache.get("mixes", {}).items():
|
for mix_str, info in self._cache.get("mixes", {}).items():
|
||||||
|
level_db = self._normalize_level_from_cache(info.get("level_db"))
|
||||||
|
sanitized_level_db = self._sanitize_value(level_db)
|
||||||
mixes.append({
|
mixes.append({
|
||||||
"mix": info["mix"],
|
"mix": info["mix"],
|
||||||
"name": info["name"],
|
"name": info["name"],
|
||||||
"on": info["on"]
|
"on": info["on"],
|
||||||
|
"level_db": sanitized_level_db
|
||||||
})
|
})
|
||||||
|
|
||||||
# Ordina per numero mix
|
# Ordina per numero mix
|
||||||
@@ -908,11 +939,13 @@ class TF5MixerController:
|
|||||||
resp_on = self._send_command(f"get MIXER:Current/InCh/ToMix/On {ch_idx} {mix_idx}")
|
resp_on = self._send_command(f"get MIXER:Current/InCh/ToMix/On {ch_idx} {mix_idx}")
|
||||||
is_on = self._parse_value(resp_on) == "1"
|
is_on = self._parse_value(resp_on) == "1"
|
||||||
|
|
||||||
|
sanitized_level_db = self._sanitize_value(level_db)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"status": "success",
|
"status": "success",
|
||||||
"channel": channel,
|
"channel": channel,
|
||||||
"mix": mix_number,
|
"mix": mix_number,
|
||||||
"on": is_on,
|
"on": is_on,
|
||||||
"level_db": level_db,
|
"send_level_db": sanitized_level_db,
|
||||||
"message": f"Canale {channel} → Mix {mix_number}: {level_db:+.1f} dB ({'ON' if is_on else 'OFF'})"
|
"message": f"Canale {channel} → Mix {mix_number}: {sanitized_level_db:+.1f} dB ({'ON' if is_on else 'OFF'})"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user