2.4 KiB
2.4 KiB
🟣 OxideTwitch
OxideTwitch is a specialized Twitch API client built on the 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 Requestseven 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:
uv add oxidetwitch
🛠 Quick Start
Basic User Lookup
OxideTwitch automatically handles the base_url and header injection for you.
import asyncio
from oxidetwitch.api import TwitchAPIClient
async def main():
async with TwitchAPIClient(
client_id="your_id",
client_secret="your_client_secret",
redirect_uri="https://example.com",
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.
async def poll_streams(channels):
async with TwitchAPIClient(...) as twitch:
# These will be executed as fast as the rate limiter allows
tasks = [twitch.get_streams(..., user_login=name) for name in channels]
streams = await asyncio.gather(*tasks)
⚙️ Advanced: Using with uv and Gitea
Since OxideTwitch depends on OxideHTTP, ensure your pyproject.toml is configured to find both in your private registry:
[[tool.uv.index]]
name = "OxideTwitch"
url = "https://git.miwory.dev/api/packages/OxideHTTP/pypi/simple"