- Add protobuf (required for google.protobuf in mumble_pb2.py)
- Add pycryptodome (required for Crypto in crypto.py)
- These were lost when pymumble was integrated into the project
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace audioop module (removed in Python 3.13) with NumPy
- Implement _apply_volume() method using NumPy for volume adjustment
- Update RMS calculation in ducking_sound_received() to use NumPy
- Add numpy to requirements.txt
- Add silent flag to CachedItemWrapper for join sounds
- Join sounds now play without channel announcements
- Regular playlist items still respect announce_current_music config
- Update CLAUDE.md to document changes
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added bounded queue protection to prevent infinite memory growth during
high-latency audio processing. Limits queue to 250 frames (~5 seconds)
with conservative frame dropping to minimize stuttering while preventing
runaway memory usage that was causing 4GB+ leaks and system freezes.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Improve sentence structure, general grammar, consistency and
correct some incorrect setting names. Also wrap lines at roughly
82 columns for easier viewing.
* Fix `ytsearch -n' next page issue (#373)
Fix an issue which caused the `ytsearch' to improperly fill the shortlist when used with `-p' to query the next search page.
* Fix code syntax
Add empty line removed in the previous commit.
* Add bots option to exclude other bot users from autoplay logic
* Refactor get_user_count_in_channel to make it more readable
* Remove commandline option and rename config key for "bots"
* Remove --bots from argparse
* Correct when_nobody_in_channel_ignore config read typo
* Fix when_nobody_in_channel_ignore configuration read order
As of now, the update command fails with an IndexError using current
versions of pip. If a package is already of the latest version, there is
no "Requirement already up-to-date" line present anymore. And since
nothing is installed, there is no "Successfully installed" string
either, so it fails later. So now it checks, that "Collecting yt-dlp"
line is missing instead. This works in older versions of pip as well.
Another issue is that since botamusique uses yt-dlp now instead of
youtube-dl, it was trying to update the wrong package. So the package
name was extracted as a constant and was changed to yt-dlp.
Additional minor fix in the output message. Before there was no spacing
between the botamusique version message and the YouTube package one. Now
it starts on a separate line.
Both the current version and the last startup version can be unparsable.
Hence we now just catch the resulting exception and reset the version
to the new version, which may or may not be parsable, which we'll find
out on the next start up. But either way this prevents crashes from
unparsable versions in the database.