Source code for xanax.sources._base
"""
Base protocols for all xanax media sources.
Every source client — Wallhaven, Unsplash, Reddit, etc. — satisfies
these protocols. This allows duck-typed multi-source code without
requiring inheritance.
Example:
from xanax.sources._base import MediaSource
def download_all(source: MediaSource, params: Any) -> list[bytes]:
return [source.download(item) for item in source.iter_media(params)]
"""
from collections.abc import AsyncIterator, Iterator
from pathlib import Path
from typing import Any, Protocol, runtime_checkable
[docs]
@runtime_checkable
class MediaSource(Protocol):
"""
Protocol satisfied by all synchronous media source clients.
Any object implementing ``download`` and ``iter_media`` satisfies
this protocol, enabling interchangeable multi-source code without
coupling to a specific client class.
"""
[docs]
def download(self, media: Any, path: str | Path | None = None) -> bytes:
"""
Download raw bytes for the given media item.
Args:
media: Source-specific media object.
path: Optional path to write the file to disk.
Returns:
Raw bytes.
"""
...
[docs]
def iter_media(self, params: Any) -> Iterator[Any]:
"""
Iterate over media items matching the given parameters.
Args:
params: Source-specific search/filter parameters.
Yields:
Source-specific media objects.
"""
...
[docs]
@runtime_checkable
class AsyncMediaSource(Protocol):
"""
Protocol satisfied by all asynchronous media source clients.
The async counterpart to :class:`MediaSource`. Implement
``download`` and ``aiter_media`` to satisfy this protocol.
"""
[docs]
async def download(self, media: Any, path: str | Path | None = None) -> bytes:
"""
Download raw bytes for the given media item.
Args:
media: Source-specific media object.
path: Optional path to write the file to disk.
Returns:
Raw bytes.
"""
...
[docs]
async def aiter_media(self, params: Any) -> AsyncIterator[Any]:
"""
Async-iterate over media items matching the given parameters.
Args:
params: Source-specific search/filter parameters.
Yields:
Source-specific media objects.
"""
...