Skip to content

Version 0.5.0a1

Released January 18th, 2026

Added

  • New utils module. Adds the following:
    1. YouTube object:
      • search: Searches YouTube with a provided query and limit and returns each video's metadata.
  • New autoplay parameter to AudioPlayer.add_queue. Sets if that queued audio should play if no audio is loaded.
  • Warning issued if attempting to record incoming audio while the bot is deaf.

Breaking Changes

  • future property and wait_for_url method removed from YouTubeAudioSource in favor of resolve_metadata and resolve_media methods.
  • Event system changes:
    1. Renamed AudioSecondEvent to AudioElapsedEvent; second attribute renamed to seconds. New minutes and hours attributes.
    2. Renamed BotJoinVoiceEvent and BotLeaveVoiceEvent to BotJoinEvent and BotLeaveEvent.
    3. Renamed MemberJoinVoiceEvent, MemberLeaveVoiceEvent, and MemberMoveVoiceEvent to MemberJoinEvent, MemberLeaveEvent, and MemberMoveEvent. The MemberMoveEvent new_channel_id has been renamed to channel_id.

Changed

  • Player performance improvements.
  • FFmpeg errors cleaned up.
  • FFmpeg module refactor for readability.
  • Frame storage buffer refactor for asynchronous performance.
  • Enhanced type annotations.
  • Removed undocumented voice gateway operation codes; debug logs sent when received.
  • Heavy gateway connection refactor; easier to maintain and read.

Fixed

  • Player history and queue system (unreliably populated via different methods).
  • Player frame counter inconsistently reset, leading timestamp-based properties to be inaccurate on source change.
  • Player now correctly resumes audio playback where it was paused without attempting to "catch up".
  • Dramatically enhanced performance of internal audio buffer when clearing/switching sources.
  • Player now plays previous audio if requested on IDLE.
  • Incorrect annotated type of MemberSpeechEvent.audio (bytes -> list[bytes]).
  • Stale FFmpeg audio leaking into buffer after switching from a long source.
  • FFmpeg no longer remains active after connection is severed (wasn't an issue unless using long sources).
  • Disconnected if bot state changed other than channel deallocation.