This commit is contained in:
81
README.md
Normal file
81
README.md
Normal file
@ -0,0 +1,81 @@
|
||||
# 🟣 OxideTwitch
|
||||
|
||||
**OxideTwitch** is a specialized Twitch API client built on the [OxideHTTP](https://git.miwory.dev/OxideHTTP/OxideHTTP) core. It combines the speed of Rust with an easy-to-use Pythonic interface, specifically tuned for the rigors of the Twitch Developer ecosystem.
|
||||
|
||||
---
|
||||
|
||||
## 🔥 Why OxideTwitch?
|
||||
|
||||
Twitch's API has strict rate limits and requires constant token management. OxideTwitch handles the heavy lifting for you:
|
||||
|
||||
* **⚡ Oxide Core:** Uses `pyreqwest` (Rust) for underlying HTTP calls.
|
||||
* **🛡️ Distributed Rate Limiting:** Uses your OxideHTTP Redis integration to ensure your bot never hits a `429 Too Many Requests` even across multiple instances.
|
||||
* **💾 Intelligent Caching:** Automatically caches common lookups (like User IDs or Stream Status) to save your API quota.
|
||||
* **🏗️ Type-Safe Models:** Fully validated responses using Pydantic models.
|
||||
|
||||
---
|
||||
|
||||
## 📦 Installation
|
||||
|
||||
Ensure you have your Gitea index configured in `uv`, then run:
|
||||
|
||||
```bash
|
||||
uv add oxidetwitch
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Quick Start
|
||||
|
||||
### Basic User Lookup
|
||||
|
||||
OxideTwitch automatically handles the `base_url` and header injection for you.
|
||||
|
||||
```python
|
||||
import asyncio
|
||||
from oxidetwitch.api import TwitchAPIClient
|
||||
|
||||
async def main():
|
||||
async with TwitchClient(
|
||||
client_id="your_id",
|
||||
client_secret="your_client_secret",
|
||||
redis_url="redis://localhost:6379",
|
||||
) as twitch:
|
||||
# Get user data (automatically cached if configured)
|
||||
users = await twitch.get_users(access_token="access_token", login="Miwowy")
|
||||
user = users.data[0]
|
||||
print(f"User ID: {user.id} | Description: {user.description}")
|
||||
|
||||
asyncio.run(main())
|
||||
|
||||
```
|
||||
|
||||
### Handling Streams with Rate Limiting
|
||||
|
||||
If you are polling 100+ streams, OxideTwitch spaces out the requests using the **GCRA algorithm** to keep your token healthy.
|
||||
|
||||
```python
|
||||
async def poll_streams(channels):
|
||||
async with TwitchClient(...) as twitch:
|
||||
# These will be executed as fast as the rate limiter allows
|
||||
tasks = [twitch.get_stream(user_login=name) for name in channels]
|
||||
streams = await asyncio.gather(*tasks)
|
||||
return [s for s in streams if s.is_live]
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Advanced: Using with `uv` and Gitea
|
||||
|
||||
Since **OxideTwitch** depends on **OxideHTTP**, ensure your `pyproject.toml` is configured to find both in your private registry:
|
||||
|
||||
```toml
|
||||
[[tool.uv.index]]
|
||||
name = "OxideTwitch"
|
||||
url = "https://git.miwory.dev/api/packages/OxideHTTP/pypi/simple"
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user