Artsy Tiled Image Downloader
Download high-resolution tiled artwork images from Artsy artwork pages for personal study and technical research.
Features
- Uses a reusable HTTPX async client with connection pooling and HTTP/2 support.
- Validates input URL/slug, metadata fields, tile dimensions, output size limits, retry counts, timeouts, and concurrency.
- Uses a bounded download window and overlaps network I/O with parallel tile decoding, while serializing canvas writes for deterministic, thread-safe assembly.
- Streams every response through configurable byte limits and keeps tile memory bounded by concurrency instead of retaining the entire compressed tile set.
- Writes final files with an atomic temporary file in the output directory, so a failed save does not leave a partial image at the final path.
- Splits CLI, metadata parsing, downloading, image assembly, paths, config, and exceptions into testable modules.
Installation
Install from PyPI:
pip install artsy-tiled-image-downloader
The installed console command is:
artsy-downloader [artsy-artwork-url]
For local development:
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
Usage
python -m artsy_tiled_image_downloader [artsy-artwork-url]
After installation, the same CLI is also available as:
artsy-downloader [artsy-artwork-url]
Example:
python -m artsy_tiled_image_downloader https://www.artsy.net/artwork/yayoi-kusama-stars-11
Useful options:
python -m artsy_tiled_image_downloader --metadata-only https://www.artsy.net/artwork/yayoi-kusama-stars-11
python -m artsy_tiled_image_downloader --output-dir ~/Downloads --concurrency 24 --timeout 30 [url]
python -m artsy_tiled_image_downloader --skip-direct [url]
python -m artsy_tiled_image_downloader --png-compression 1 [url]
Sample output:
URL: https://www.artsy.net/artwork/yayoi-kusama-stars-11
Fetching metadata...
Images: 1
Image 1/1: 2547x3543, 7x5 (35 tiles)
Downloading...
Saved: /Users/you/Downloads/output_yayoi-kusama-stars-11_0.jpg (direct)
Elapsed: 1.0s
Testing
pip install -e ".[dev]"
pytest
pytest --cov --cov-report=term-missing
ruff check .
The test suite covers URL and limit validation, metadata parsing, filename safety,
Deep Zoom boundary math, retry and response-size behavior, bounded concurrency,
pipelined assembly, direct-image fallback, packaging, and a local HTTP end-to-end CLI run.
See TEST_REPORT.md and
QUALITY_CHECKLIST.md for the release evidence.
PyPI Release
Package name: artsy-tiled-image-downloader
Build and validate the release artifacts:
rm -rf build dist *.egg-info
python -m pip install -e ".[dev]"
python -m build
python -m twine check --strict dist/*
Upload with a PyPI project or account token:
TWINE_USERNAME=__token__ TWINE_PASSWORD=pypi-... python -m twine upload dist/*
This repository also includes .github/workflows/publish.yml for PyPI Trusted
Publishing. Configure the pypi environment as a trusted publisher for this
repository. Publishing a vX.Y.Z GitHub release then checks that the tag exactly
matches the package version before building and uploading both the wheel and sdist.
Temporary Data
The downloader does not store tiles in a process-wide temporary directory. Only a concurrency-bounded set of compressed and decoded tiles is held while the download/decode/stitch pipeline is active. Decoded images are closed immediately after they are pasted. The only temporary files are short-lived files created beside the final output for atomic replacement.
If a future very-large-image mode needs disk-backed tile caching, prefer tempfile.TemporaryDirectory() as a scoped context manager rather than a fixed folder under ~/Downloads.
Disclaimer
This project is independent and is not affiliated with Artsy.
Use it only for personal learning, interoperability research, and lawful technical analysis. You are responsible for respecting Artsy's terms of use, robots policies, copyright restrictions, and any applicable laws. Do not use this project for commercial redistribution, copyright infringement, abusive automation, or any unauthorized access.
The software is provided as-is, without warranty. The maintainers are not responsible for misuse or for any direct or indirect loss caused by using this tool.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file artsy_tiled_image_downloader-2.1.0.tar.gz.
File metadata
- Download URL: artsy_tiled_image_downloader-2.1.0.tar.gz
- Upload date:
- Size: 35.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
479f96ad806e1b66e48e4172609fa1ac0c760842f7a62ec79ae4c882a90d2c7c
|
|
| MD5 |
abb974840be92fa5fbdae90e6d1e269a
|
|
| BLAKE2b-256 |
1df577cfc263cf29ff35885ba29730f63ff580226fdb4da8636a8c588c5071d5
|
Provenance
The following attestation bundles were made for artsy_tiled_image_downloader-2.1.0.tar.gz:
Publisher:
publish.yml on inostarlin-passion/ArtsyTiledImageDownloader
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
artsy_tiled_image_downloader-2.1.0.tar.gz -
Subject digest:
479f96ad806e1b66e48e4172609fa1ac0c760842f7a62ec79ae4c882a90d2c7c - Sigstore transparency entry: 2171607736
- Sigstore integration time:
-
Permalink:
inostarlin-passion/ArtsyTiledImageDownloader@1d89bc6bb7630163389c840e1a16a06f7b3883be -
Branch / Tag:
refs/heads/main - Owner: https://github.com/inostarlin-passion
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1d89bc6bb7630163389c840e1a16a06f7b3883be -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file artsy_tiled_image_downloader-2.1.0-py3-none-any.whl.
File metadata
- Download URL: artsy_tiled_image_downloader-2.1.0-py3-none-any.whl
- Upload date:
- Size: 21.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7280b62367cfc989531a6827b3c9e3fb3cc63bb38e98632c213523c2c5f1c03d
|
|
| MD5 |
023ba582ba42dd0a2fec6be4be208190
|
|
| BLAKE2b-256 |
5cf89399d6fbb519b2eb023cc7fd87c2fcda33f5bd96ccd178b75b82066a8f72
|
Provenance
The following attestation bundles were made for artsy_tiled_image_downloader-2.1.0-py3-none-any.whl:
Publisher:
publish.yml on inostarlin-passion/ArtsyTiledImageDownloader
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
artsy_tiled_image_downloader-2.1.0-py3-none-any.whl -
Subject digest:
7280b62367cfc989531a6827b3c9e3fb3cc63bb38e98632c213523c2c5f1c03d - Sigstore transparency entry: 2171607746
- Sigstore integration time:
-
Permalink:
inostarlin-passion/ArtsyTiledImageDownloader@1d89bc6bb7630163389c840e1a16a06f7b3883be -
Branch / Tag:
refs/heads/main - Owner: https://github.com/inostarlin-passion
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1d89bc6bb7630163389c840e1a16a06f7b3883be -
Trigger Event:
workflow_dispatch
-
Statement type: