Add 'Post to Discord' checkbox for Generate Only mode

This commit is contained in:
2026-06-05 16:58:53 -05:00
parent d262115dab
commit 97475d9a5d
3 changed files with 17 additions and 9 deletions
+9 -7
View File
@@ -2972,8 +2972,9 @@ class TtsToy(Cog):
mode_override = payload.get("mode_override") # per-request mode from web UI mode_override = payload.get("mode_override") # per-request mode from web UI
voice_override = payload.get("voice_override") # per-request voice from web UI voice_override = payload.get("voice_override") # per-request voice from web UI
skip_vc = payload.get("skip_vc", False) skip_vc = payload.get("skip_vc", False)
skip_post = payload.get("skip_post", False)
guild_id_str = payload.get("guild_id", "") guild_id_str = payload.get("guild_id", "")
log.info(f"[WebUI] speak_in_vc: user={user} job={job_id} guild={guild_id_str} mode_override={mode_override} voice_override={voice_override} skip_vc={skip_vc} text={text[:60]!r}") log.info(f"[WebUI] speak_in_vc: user={user} job={job_id} guild={guild_id_str} mode_override={mode_override} voice_override={voice_override} skip_vc={skip_vc} skip_post={skip_post} text={text[:60]!r}")
webui_url = self._get_webui_url() webui_url = self._get_webui_url()
secret = self._get_internal_secret() secret = self._get_internal_secret()
@@ -3085,13 +3086,14 @@ class TtsToy(Cog):
log.exception(f"[WebUI] VC playback failed for job {job_id}: {e}") log.exception(f"[WebUI] VC playback failed for job {job_id}: {e}")
# Post transcript to Discord channel and mark job done # Post transcript to Discord channel and mark job done
# Resolve the best guild ID for posting: login guild > VC guild > empty # Post transcript to Discord channel (unless skip_post)
post_guild_id = guild_id_str or (str(member_guild.id) if member_guild else "") post_guild_id = guild_id_str or (str(member_guild.id) if member_guild else "")
await self._handle_webui_post({ if not skip_post:
"job_id": job_id, "path": audio_path, await self._handle_webui_post({
"text": text, "user": discord_name, "engine": mode, "job_id": job_id, "path": audio_path,
"guild_id": post_guild_id, "text": text, "user": discord_name, "engine": mode,
}) "guild_id": post_guild_id,
})
await asyncio.to_thread(_update_job, "done", path=audio_path) await asyncio.to_thread(_update_job, "done", path=audio_path)
async def _handle_webui_post(self, post: dict): async def _handle_webui_post(self, post: dict):
+2
View File
@@ -401,6 +401,7 @@ def api_tts_generate():
mode = data.get("mode") or user_mode_overrides.get(str(user_id), global_mode) mode = data.get("mode") or user_mode_overrides.get(str(user_id), global_mode)
voice = data.get("voice") or None voice = data.get("voice") or None
post_to_discord = data.get("post_to_discord", True)
job_id = str(uuid.uuid4()) job_id = str(uuid.uuid4())
_tts_jobs[job_id] = {"status": "pending", "text": text, "user": discord_name, "engine": mode} _tts_jobs[job_id] = {"status": "pending", "text": text, "user": discord_name, "engine": mode}
@@ -411,6 +412,7 @@ def api_tts_generate():
"mode_override": mode, "mode_override": mode,
"voice_override": voice, "voice_override": voice,
"skip_vc": True, "skip_vc": True,
"skip_post": not post_to_discord,
"guild_id": _resolve_guild_id(), "guild_id": _resolve_guild_id(),
}) })
+6 -2
View File
@@ -117,6 +117,9 @@
<button class="btn btn-secondary" id="gen-only-btn" onclick="generateOnly()" style="display:none;"> <button class="btn btn-secondary" id="gen-only-btn" onclick="generateOnly()" style="display:none;">
<span id="gen-spinner" class="spin" style="display:none;"></span> Generate Only <span id="gen-spinner" class="spin" style="display:none;"></span> Generate Only
</button> </button>
<label style="display:inline-flex;align-items:center;gap:0.3rem;margin-left:0.75rem;cursor:pointer;">
<input type="checkbox" id="post-to-discord" checked> <span class="muted" style="font-size:0.85rem;">Post to Discord</span>
</label>
<span id="tts-status" class="muted"></span> <span id="tts-status" class="muted"></span>
</div> </div>
<div id="tts-result" style="margin-top:0.75rem;display:none;"> <div id="tts-result" style="margin-top:0.75rem;display:none;">
@@ -315,13 +318,14 @@ async function generateOnly() {
if (!text) return; if (!text) return;
const mode = document.getElementById('tts-mode-select').value; const mode = document.getElementById('tts-mode-select').value;
const voice = document.getElementById('tts-voice-select').value || null; const voice = document.getElementById('tts-voice-select').value || null;
const post_to_discord = document.getElementById('post-to-discord').checked;
const spinner = document.getElementById('gen-spinner'); const spinner = document.getElementById('gen-spinner');
const status = document.getElementById('tts-status'); const status = document.getElementById('tts-status');
const result = document.getElementById('tts-result'); const result = document.getElementById('tts-result');
spinner.style.display = 'inline-block'; spinner.style.display = 'inline-block';
status.textContent = 'Generating audio...'; status.textContent = 'Generating audio...';
result.style.display = 'none'; result.style.display = 'none';
const r = await apiFetch('/api/tts/generate', {method:'POST', body: JSON.stringify({text, mode, voice})}); const r = await apiFetch('/api/tts/generate', {method:'POST', body: JSON.stringify({text, mode, voice, post_to_discord})});
const {job_id, error} = await r.json(); const {job_id, error} = await r.json();
if (error) { spinner.style.display='none'; status.textContent = 'Error: ' + error; return; } if (error) { spinner.style.display='none'; status.textContent = 'Error: ' + error; return; }
const poll = setInterval(async () => { const poll = setInterval(async () => {
@@ -330,7 +334,7 @@ async function generateOnly() {
if (job.status === 'done') { if (job.status === 'done') {
clearInterval(poll); clearInterval(poll);
spinner.style.display = 'none'; spinner.style.display = 'none';
status.textContent = 'Audio ready — posted to Discord channel.'; status.textContent = post_to_discord ? 'Audio ready — posted to Discord channel.' : 'Audio ready.';
document.getElementById('tts-audio').src = `/api/tts/${job_id}/audio`; document.getElementById('tts-audio').src = `/api/tts/${job_id}/audio`;
result.style.display = 'block'; result.style.display = 'block';
} else if (job.status === 'error') { } else if (job.status === 'error') {