diff --git a/party/management/commands/tts_warm.py b/party/management/commands/tts_warm.py index 81f4032..0c96961 100644 --- a/party/management/commands/tts_warm.py +++ b/party/management/commands/tts_warm.py @@ -24,8 +24,10 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument("--budget", type=int, default=0, help="højst så mange nye tegn ud over de faste replikker") + parser.add_argument("--reserve", type=int, default=40000, + help="rør ikke de sidste så mange credits i perioden (de skal bruges til spil)") - def handle(self, *args, budget, **opts): + def handle(self, *args, budget, reserve, **opts): if not tts.enabled(): self.stdout.write("ElevenLabs er ikke sat op (ELEVENLABS_API_KEY/ELEVENLABS_VOICE_ID). Springer over.") return @@ -36,6 +38,12 @@ class Command(BaseCommand): self.stdout.write(self.style.SUCCESS(f"{ok} af {len(static)} faste replikker ligger i cachen.")) if budget <= 0: return + left = tts.credits_left() + if left is not None: + budget = min(budget, max(0, left - reserve)) + self.stdout.write(f"{left} credits tilbage i perioden; reserve {reserve}; budget i nat {budget} tegn.") + if budget <= 0: + return # Spørgsmålene i den rækkefølge, spillet vælger dem (mindst brugte først), skiftevis med # kategori-replikkerne, så begge dele bliver dækket over et par nætter. diff --git a/party/static/party/sfx/music_think_danmark.mp3 b/party/static/party/sfx/music_think_danmark.mp3 new file mode 100644 index 0000000..ed21923 Binary files /dev/null and b/party/static/party/sfx/music_think_danmark.mp3 differ diff --git a/party/static/party/sfx/music_think_dyreriget.mp3 b/party/static/party/sfx/music_think_dyreriget.mp3 new file mode 100644 index 0000000..ee77c34 Binary files /dev/null and b/party/static/party/sfx/music_think_dyreriget.mp3 differ diff --git a/party/static/party/sfx/music_think_geografi.mp3 b/party/static/party/sfx/music_think_geografi.mp3 new file mode 100644 index 0000000..daf583c Binary files /dev/null and b/party/static/party/sfx/music_think_geografi.mp3 differ diff --git a/party/static/party/sfx/music_think_historie.mp3 b/party/static/party/sfx/music_think_historie.mp3 new file mode 100644 index 0000000..3b2b636 Binary files /dev/null and b/party/static/party/sfx/music_think_historie.mp3 differ diff --git a/party/static/party/sfx/music_think_kroppen.mp3 b/party/static/party/sfx/music_think_kroppen.mp3 new file mode 100644 index 0000000..f93fc7a Binary files /dev/null and b/party/static/party/sfx/music_think_kroppen.mp3 differ diff --git a/party/static/party/sfx/music_think_mad_og_drikke.mp3 b/party/static/party/sfx/music_think_mad_og_drikke.mp3 new file mode 100644 index 0000000..b9a73a8 Binary files /dev/null and b/party/static/party/sfx/music_think_mad_og_drikke.mp3 differ diff --git a/party/static/party/sfx/music_think_opfindelser.mp3 b/party/static/party/sfx/music_think_opfindelser.mp3 new file mode 100644 index 0000000..04aea3f Binary files /dev/null and b/party/static/party/sfx/music_think_opfindelser.mp3 differ diff --git a/party/static/party/sfx/music_think_rummet_og_naturen.mp3 b/party/static/party/sfx/music_think_rummet_og_naturen.mp3 new file mode 100644 index 0000000..a73802a Binary files /dev/null and b/party/static/party/sfx/music_think_rummet_og_naturen.mp3 differ diff --git a/party/static/party/sfx/music_think_sport.mp3 b/party/static/party/sfx/music_think_sport.mp3 new file mode 100644 index 0000000..92fa89a Binary files /dev/null and b/party/static/party/sfx/music_think_sport.mp3 differ diff --git a/party/static/party/sfx/music_think_sprog_og_ord.mp3 b/party/static/party/sfx/music_think_sprog_og_ord.mp3 new file mode 100644 index 0000000..cb63788 Binary files /dev/null and b/party/static/party/sfx/music_think_sprog_og_ord.mp3 differ diff --git a/party/tts.py b/party/tts.py index e6fb0e6..155351b 100644 --- a/party/tts.py +++ b/party/tts.py @@ -64,6 +64,19 @@ def _fetch(text: str, path: Path) -> None: tmp.replace(path) +def credits_left() -> int | None: + """Resterende ElevenLabs-credits i denne periode, eller None hvis nøglen ikke må læse det (user_read).""" + req = urllib.request.Request("https://api.elevenlabs.io/v1/user/subscription", + headers={"xi-api-key": settings.ELEVENLABS_API_KEY}) + try: + with urllib.request.urlopen(req, timeout=15) as resp: + d = json.load(resp) + return int(d["character_limit"]) - int(d["character_count"]) + except Exception as e: # noqa: BLE001 + log.info("Kunne ikke læse ElevenLabs-saldoen: %s", _describe(e)) + return None + + def is_cached(text: str) -> bool: return bool(text.strip()) and cache_path(_digest(text)).exists()