thumbrella-client
Python client for Thumbrella, a fast thumbnail server for images, video, documents, and more.
The client git repository also has packages for other languages and environments. See Typescript, Rust, and more coming soon.
Features
- Client defaults to synchronous requests with requests
- Async support via
thumbrella-client[async]using aiohttp - Single call efficiently processes multiple thumbnails in parallel
- Persistent client caching integrates with server and HTTP
- Placeholders for failures, even if disconnected or misconfigured
- Typed results with simple media metadata
- Load easily into
PIL,Qt,Pygame, and others - Thumbrella server supports 100+ formats
Quickstart
Install with your package manager of choice using thumbrella-client or thumbrella-client[async].
uv add thumbrella-client
pip install thumbrella-client
import thumbrella
# Client() reads $TBR_CONNECT from the environment.
# verify() checks the server is reachable and auth is valid.
tbr = thumbrella.Client().verify()
# Single URL — returns a Result with the thumbnail JPEG.
result = tbr.thumb("https://www.pygame.org/docs/_images/pygame_lofi.png")
if result.is_success():
print(len(result.media.thumbnail), "bytes")
# Batch many URLs at once.
results = tbr.batch([
"https://www.python.org/static/img/python-logo-large.png",
"https://web.mit.edu/18.417/doc/pydocs/ref.pdf",
])
for r in results:
print(r.url, r.status, r.media.kind)
# Stream results as the server completes each thumbnail (requires aiohttp).
import asyncio
async def stream_example():
tbr = thumbrella.Client()
async for r in tbr.stream([
"https://www.python.org/static/img/python-logo-large.png",
"https://web.mit.edu/18.417/doc/pydocs/ref.pdf",
]):
print(r.url, r.status)
asyncio.run(stream_example())
How It Works
Create a Client with server configuration and optional caches. Call verify()
to confirm connectivity. Then use thumb(), batch(), or stream() to
generate thumbnails.
Every URL gets a Result — even failures produce a result with a placeholder
image and an error message. Use result.verify() to raise an exception on
failure, or check result.is_success() for inline handling.
Connect Strings
The client reads $TBR_CONNECT by default. Pass a connect string to override:
# Local dev server (no auth)
thumbrella.Client("http://localhost:3114")
# Cloud service with auth token
thumbrella.Client("tbr_e_3QnzBcWx7KpRmYT2000example")
The connect string can also define custom headers. Thumbrella servers can define an additional handshake token to prevent unwanted users. The documentation describes these in more detail at, https://thumbrella.dev/docs/client/#connect
The Client object defines a requests.Session attribute which can be
further customized for proxies, TLS certificates, cookies, or other HTTP-level
configuration.
Result
result.url # str — the requested URL
result.status # "success" | "failed" | "overloaded" | "intermediate" | ...
result.source # "render" | "cache" | "fallback" | "placeholder" | ...
result.media # Media | None — None when thumbnail could not be generated
result.duration # float — server processing time (ms)
result.message # str — error or informational message
result.pin # str | None — reusable url to fetch thumbnail contents
result.is_success() # True for SUCCESS or INTERMEDIATE
result.is_fresh() # True when the server freshly rendered (not from cache)
result.verify() # returns self on success, raises ThumbError on failure
All the result properties are documented at, https://thumbrella.dev/docs/client/#result
Media
media.url # str — the original media URL
media.mime # "image/jpeg" | "application/pdf" | ...
media.kind # "image" | "video" | "document" | "vector" | "geometry" | ...
media.file_size # int — original file size in bytes
media.thumbnail # EncodedJpeg — the thumbnail JPEG bytes
All the result properties are documented at, https://thumbrella.dev/docs/client/#media
EncodedJpeg
jpeg.bytes # bytes — decoded JPEG bytes (lazy, cached)
jpeg.io # _BytesIO — file-like object, compatible with PIL and numpy
len(jpeg) # int — byte count
jpeg.key # str — content hash, useful for deduplication
PIL integration:
from PIL import Image
img = Image.open(result.media.thumbnail.io)
The source comes with several starting point examples. See the client documentation for more details and examples.
examples/basic.pyDownload a thumbnail from a single url.examples/stream.pyStream multiple thumbnails as they render.examples/collage.pyAssemble thumbnails from multiple sources into a single grid image.
Servers
This client works with any self-hosted Thumbrella server and also the online
Thumbrella Cloud service. Both are configured using the $TBR_CONNECT
environment variable. Alternatively, a connect string can be passed to the
Client constructor.
Thumbrella provides a demo gallery and server that can be used for free with no account and no signup.
License
Apache-2.0. See LICENSE.
Metadata
Release files for thumbrella-client 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| thumbrella_client-2.0.0.tar.gz | 28.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| thumbrella_client-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 52.8 kB
Release files / thumbrella_client-2.0.0.tar.gz
| Download URL | thumbrella_client-2.0.0.tar.gz |
|---|---|
| Size | 28.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bbe41ce77576a09a53381064933f507004330cf12fa077be12fe6e886007f930
|
|
BLAKE2b-256 checksum How to use checksums |
ff851b0ce1b56847ebabf8aac481281ce68f6cfbdad3786e95a4e8af78ed9756
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency logRelease files / thumbrella_client-2.0.0-py3-none-any.whl
| Download URL | thumbrella_client-2.0.0-py3-none-any.whl |
|---|---|
| Size | 24.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d7b9a61ae4a4c7977aaa832eb0f9427db6ec333b382cee3985992f94c8edb138
|
|
BLAKE2b-256 checksum How to use checksums |
608bae8e36cf900478170707230ba5ffc840b31159c314394989529f61445475
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency log