Metadata-Version: 2.4
Name: revvlink
Version: 1.0.1
Summary: A robust and powerful, fully asynchronous Lavalink wrapper built for discord.py in Python.
Project-URL: Homepage, https://github.com/JustNixx/RevvLink
Author-email: "@JustNixx and @IamGroot" <nksmay13@gmail.com>
License: MIT
License-File: LICENSE
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: English
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Internet
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Utilities
Requires-Python: >=3.10
Requires-Dist: aiohttp<4,>=3.9.0
Requires-Dist: async-timeout; python_version < '3.11'
Requires-Dist: discord-py>=2.4.0
Requires-Dist: typing-extensions>=4.5.0
Requires-Dist: yarl>=1.9.4
Provides-Extra: dave
Requires-Dist: davey>=1.0.0; extra == 'dave'
Provides-Extra: dev
Requires-Dist: aioresponses; extra == 'dev'
Requires-Dist: coverage; extra == 'dev'
Requires-Dist: pre-commit; extra == 'dev'
Requires-Dist: pyright; extra == 'dev'
Requires-Dist: pytest-asyncio; extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Requires-Dist: ruff; extra == 'dev'
Provides-Extra: docs
Requires-Dist: mkdocs-material; extra == 'docs'
Requires-Dist: mkdocs<2.0.0; extra == 'docs'
Requires-Dist: mkdocstrings; extra == 'docs'
Provides-Extra: hikari
Requires-Dist: hikari>=2.0; extra == 'hikari'
Provides-Extra: redis
Requires-Dist: aioredis>=2; extra == 'redis'
Description-Content-Type: text/markdown

# RevvLink

<div align="center">

![RevvLink Banner](.antigravity/revvlink_banner.png)

**The most powerful, modern, and fully asynchronous Lavalink wrapper for Python.**

[![](https://img.shields.io/pypi/v/revvlink.svg?style=for-the-badge&logoColor=white&color=blue)](https://pypi.org/project/revvlink/)
[![](https://img.shields.io/pypi/pyversions/revvlink.svg?style=for-the-badge&logoColor=white&color=blue)](https://pypi.org/project/revvlink/)
[![](https://img.shields.io/github/license/JustNixx/RevvLink.svg?style=for-the-badge&logoColor=white&color=blue)](LICENSE)
[![](https://img.shields.io/badge/Lavalink-v4.0%2B-FB7713?style=for-the-badge&logoColor=white)](https://lavalink.dev)

---

Built with ❤️ by **[@JustNixx](https://github.com/JustNixx)** and **[@IamGroot](https://github.com/IamGroot)**

[Documentation](https://revvlink.dev) | [Examples](examples/) | [Support Server](https://discord.gg/placeholder)

</div>

---

## 🚀 Why RevvLink?

RevvLink isn't just another wrapper; it's a high-performance audio routing engine designed for professional Discord bots. Built from the ground up for **discord.py 2.0+**, it prioritizes type safety, performance, and cutting-edge feature support.

### ✨ Key Features
- **🔒 DAVE Protocol (E2EE)**: Native support for Discord's new end-to-end encryption for voice.
- **📈 Advanced AutoPlay**: Smart recommendation engine based on your play history and dynamic seeds.
- **🧩 Native Plugin Support**: Built-in support for LavaSrc (Spotify, Apple Music, Deezer), SponsorBlock, and more.
- **🛡️ Pyright Strict**: 100% type-annotated codebase for the best developer experience.
- **⚡ High Performance**: Fully asynchronous execution with optimized memory usage.

---

c

## 🛠️ Installation

```bash
# Standard installation
pip install revvlink

# With E2EE (DAVE) support
pip install "revvlink[dave]"

# Development version
pip install git+https://github.com/JustNixx/RevvLink.git
```

---

## ⚡ Quick Start

```python
import discord
import revvlink
from discord.ext import commands

class Bot(commands.Bot):
    def __init__(self):
        super().__init__(command_prefix='!', intents=discord.Intents.all())

    async def setup_hook(self):
        # Connect to your Lavalink Node
        nodes = [revvlink.Node(uri='http://localhost:2333', password='youshallnotpass')]
        await revvlink.Pool.connect(nodes=nodes, client=self)

bot = Bot()

@bot.command()
async def play(ctx: commands.Context, *, query: str):
    # Join voice channel
    if not ctx.voice_client:
        player: revvlink.Player = await ctx.author.voice.channel.connect(cls=revvlink.Player)
    else:
        player: revvlink.Player = ctx.voice_client

    # Search and play
    tracks = await revvlink.Playable.search(query)
    if not tracks:
        return await ctx.send("No results found.")

    track = tracks[0]
    await player.play(track)
    await ctx.send(f"Now playing: **{track.title}**")

bot.run('YOUR_TOKEN')
```

---

## 🤝 Contributing

We welcome contributions! Please check our [Contribution Guidelines](CONTRIBUTING.md) and [Rules](.antigravity/rules.md) for more information.

## 📄 License

This project is licensed under the **MIT License**. Check the [LICENSE](LICENSE) file for more details.
