Connect to the caller's voice channel when the bot is not in voice, and
move to the caller's channel if the bot is currently in a different one
(via Player.move_to). Previously it only connected when the bot had no
voice state, so it would not follow the user between channels.
Post a status message on play and live-edit it with the download
percentage via a throttled yt-dlp progress_hook (max one edit/sec,
scheduled onto the event loop from the executor thread). Shows
Downloading (N%), then Converting to mp3, then Now playing. Removed all
emoji and em-dashes from user-facing strings and comments.
The Minecraft cog already registers top-level 'join' and 'leave', which
caused a CommandRegistrationError. Namespace these two commands under a
yt-prefix (ytjoin, ytleave, alias ytdc).
Use the shared Red-Lavalink client directly instead of depending on
redbot.cogs.audio: import lavalink; connect via lavalink.connect();
gate WebUI playback on lavalink.get_all_nodes() instead of
get_cog('Audio'). Playback (get_player pause/save/restore) unchanged.
The lavalink client is now owned by the YTAudio cog.
Standalone cog that owns the Red-Lavalink client connection
(initialize on startup, close on unload) and plays YouTube/yt-dlp
sources by downloading audio, transcoding to mp3, and playing through
Lavalink's local source. Per-guild queues, multi-VC capable. Commands:
play, skip, stop, pause, resume, queue, nowplaying, volume, join, leave.
Make the API base URL configurable (new global config base_url, default to the
local Ollama OpenAI-compatible endpoint http://127.0.0.1:11434/v1 on gpu1).
Local endpoints (127.0.0.1/localhost) need no API key: the on_message, _chat,
and models guards allow a missing key when local, and the Authorization header
is only sent when a key is set. Default guild model is now
llama3.2:3b-instruct-q4_K_M with a humor-focused system prompt. Adds
[p]assistant baseurl to switch endpoints (omit to reset to local), shows the
backend in settings, and raises the request timeout to 120s for local
inference. GreenPT remains usable as a fallback by setting the base URL back to
it and providing a key.
Note: Llama-3.2-3B-Instruct is text-only; the vision path needs a
vision-capable model (e.g. a local llava/llama3.2-vision) or GreenPT.
The dectalk, morshu, and vox servers are managed entirely by systemd now, so
the bot no longer needs to inspect or manage them. Removed the stop and status
commands for all three, the unused dectalk_auto_start config, and the dead
server directory and process attributes. The cog keeps only the fixed ports it
uses to reach the services over HTTP.
Drop the dectalkstart, dectalkinstall, dectalkautotoggle, morshustart, and
voxstart commands along with the orphaned _start/_stop/_install helper methods
and the dectalk mode-switch auto-start path. The three TTS servers run as
independent systemd services; the stop and status commands now point at
systemctl.
The dectalk, morshu, and vox TTS servers now run as independent systemd
services on their fixed ports (33001/33002/33003). The cog no longer spawns
or kills them: start/stop helpers became reachability checks and no-ops, the
cog_load auto-start and cog_unload teardown were removed, and the start/stop/
status commands now point at systemctl. The HTTP client calls are unchanged.
- drop bundled Flask webui (now lives in scrapyard-website TtsToy)
- _take_pending_state_updates: pop pending commands/posts + refresh user
info under cross-process lock, matching the webui-side producer
user_guild_map was only written when a login token was consumed on the
webui login page. Users on stale session cookies never re-login, so
their jobs carried empty guild_id and TTS was posted to whatever global
channel happened to match instead of the server they logged in from.
Persist the guild as soon as the bot registers the token so
_resolve_guild_id() falls back to the correct login guild.
The bot posts job-status updates and login-token registration to the
public webui URL (ttstoy.kingstons-scrapyard.net) with a 5s timeout.
Under load, that WAN hop times out and jobs stay stuck 'pending' even
though audio was generated. Since the webui runs as a child process of
the bot on the same host, use http://127.0.0.1:8098 for these
server-to-server callbacks instead.
Images are named using the message text as the filename (type tags for
WebTable card decks). Single image = text.ext, multiple = text_1.ext,
text_2.ext, etc. Falls back to messageID.ext when no text is present.
- New vox-server/server.py (HTTP API matching morshu-server pattern)
- Added voxstart/voxstop/voxstatus commands to ttstoy cog
- WebUI /api/tts/generate and /api/mc/tts now support VOX mode
- Cog_unload stops VOX server automatically