Skip to main content

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 64-request download window by default and overlaps network I/O with parallel tile decoding, while serializing canvas writes for deterministic, thread-safe assembly.
  • Downloads up to four images from one artwork concurrently while sharing the same request budget; use --image-concurrency to tune that limit.
  • Streams image and metadata response bodies through configurable byte limits. Requests identity content encoding and rejects HTTP content encodings such as gzip.
  • Limits concurrent full-image pixel buffers with --max-canvas-bytes (2.5 GiB by default). Tile buffers and codec overhead are separate. The metadata response limit defaults to 8 MiB and can be set with --max-metadata-bytes.
  • 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 64 --image-concurrency 4 --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. The current download-time optimization evidence is in reports/technical_design_document.md, reports/test_case_specification.md, and reports/test_completion_report.md.

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.

Metadata

Release files for artsy-tiled-image-downloader 2.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for artsy-tiled-image-downloader 2.1.2
File Size Uploaded Provenance Actions
artsy_tiled_image_downloader-2.1.2.tar.gz 46.9 kB With provenance Details for artsy_tiled_image_downloader-2.1.2.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for artsy-tiled-image-downloader 2.1.2
File Interpreter ABI Platform Actions
artsy_tiled_image_downloader-2.1.2-py3-none-any.whl Python 3 none any Details for artsy_tiled_image_downloader-2.1.2-py3-none-any.whl

Total release size: 71.2 kB

Release files / artsy_tiled_image_downloader-2.1.2.tar.gz

Download URL artsy_tiled_image_downloader-2.1.2.tar.gz
Size 46.9 kB
Tags Source
SHA-256 checksum
How to use checksums
be693890c1edce907e163a43e4f4d14611440ec141c180861f9c3e12dc93a8af
BLAKE2b-256 checksum
How to use checksums
0934be33dff61624d76413066030c1803a7eae7cca202e811e057c73fc392c72
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / artsy_tiled_image_downloader-2.1.2-py3-none-any.whl

Download URL artsy_tiled_image_downloader-2.1.2-py3-none-any.whl
Size 24.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ca116c75a0f652116a49af56bdae52f4ca37603bb7b271fb4dd57b617ad4e7db
BLAKE2b-256 checksum
How to use checksums
3e2a9badd03015afedd929c711dd067e339fe7fdc5200486e5e4aaa36b4365f8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Security for artsy-tiled-image-downloader 2.1.2

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for artsy_tiled_image_downloader-2.1.2.tar.gz

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 Nov 4, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page