Miwory d80d97bb9b
All checks were successful
Build And Publish Package / publish (push) Successful in 36s
Merge pull request '1.2.3' (#5) from dev into latest
Reviewed-on: #5
2026-03-08 18:05:57 +03:00
2026-02-25 09:53:19 +03:00
2026-02-25 09:53:19 +03:00
2026-02-25 09:53:19 +03:00
2026-02-26 17:57:07 +03:00

🟣 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 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:

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"


Description
Client for Twitch API
Readme 56 KiB
Languages
Python 100%