A full-featured Python Lavalink client for Discord music bots
Project description
Sonora
A full-featured, production-ready Python Lavalink client for building music-capable Discord bots. Equivalent to Riffy but in Python.
Features
- Async-first Python library compatible with Python 3.11+
- Full Lavalink protocol support (v3 & v4)
- Integrations for discord.py, py-cord, and nextcord
- Plugin system for platform adapters (YouTube, Spotify, SoundCloud)
- Voice connection management, track loading, queue management, player controls
- Node pooling & reconnection, autoplay, per-guild voice state resumption
- Clean high-level API + low-level control
- Well-documented with MkDocs
- Thoroughly tested (coverage >= 85%)
- Packaged for PyPI, CI/CD with GitHub Actions, Docker support
Installation
pip install sonora-musicpy
Quickstart
First, set up your environment variables:
cp .env.example .env
# Edit .env with your Lavalink server details and Discord token
Minimal Discord Bot Example
import discord
from discord.ext import commands
from sonora import SonoraClient
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)
sonora = SonoraClient(
lavalink_nodes=[{"host": "127.0.0.1", "port": 2333, "password": "youshallnotpass"}],
node_pooling=True,
reconnect_policy={"max_retries": 5, "backoff": "exponential"}
)
@bot.event
async def on_ready():
await sonora.start()
print(f'Logged in as {bot.user}')
@bot.command()
async def join(ctx):
if ctx.author.voice:
await ctx.author.voice.channel.connect()
player = await sonora.get_player(ctx.guild.id)
await ctx.send("Joined voice channel!")
else:
await ctx.send("You need to be in a voice channel!")
@bot.command()
async def play(ctx, *, query):
player = await sonora.get_player(ctx.guild.id)
track = await player.play(query)
await ctx.send(f"Now playing: {track.title}")
bot.run(os.getenv('DISCORD_TOKEN'))
For more examples, see the examples/ directory.
Configuration
Sonora supports configuration via environment variables:
LAVALINK_HOST: Lavalink server host (default: 127.0.0.1)LAVALINK_PORT: Lavalink server port (default: 2333)LAVALINK_PASSWORD: Lavalink server passwordDISCORD_TOKEN: Your Discord bot token
See .env.example for a full list.
Documentation
Full documentation is available at https://code-xon.github.io/sonora/.
Development
Prerequisites
- Python 3.11+
- A Lavalink server (see examples/docker-compose.yml for local setup)
Setup
git clone https://github.com/code-xon/sonora.git
cd sonora
pip install -e .[dev]
pre-commit install
Testing
pytest
Building Docs
mkdocs serve
Contributing
See CONTRIBUTING.md for details.
License
MIT License - see LICENSE for details.
Contact
- Lead Developer: Ramkrishna
- Email: ramkrishna@code-xon.fun
- Issues: GitHub Issues
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file py_sonora-1.1.0.tar.gz.
File metadata
- Download URL: py_sonora-1.1.0.tar.gz
- Upload date:
- Size: 34.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f80fdeeb7f37a62f4198c1264456e6da5787086efeba8f8538b56669a65ba2f5
|
|
| MD5 |
e04de0f630d41a724ffea212edfd847a
|
|
| BLAKE2b-256 |
443e322ca52006c79317157788611936bee76ec27d7889c6f616dd230d73f17c
|
File details
Details for the file py_sonora-1.1.0-py3-none-any.whl.
File metadata
- Download URL: py_sonora-1.1.0-py3-none-any.whl
- Upload date:
- Size: 21.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f986cdd33b93dde9619a965650ee6504ab8b70c75829fd7f8cbb5362f04acf31
|
|
| MD5 |
2733e81306e95a78a7e1b0270b9c7d23
|
|
| BLAKE2b-256 |
7e2b607294f2adda5b9fda0e4b17a5550de5a8ea0dfe87fab506598b06a893c6
|