Skip to main content

Infra-agnostic IIIF Image API 3.0 server built with FastAPI

Project description

SanF

A IIIF Image API 3.0 server implementation built with FastAPI, supporting up to Level 2 compliance. It can be used as a standalone server or embedded as a package within an existing FastAPI application.

Features

  • GET /iiif/{identifier}/info.json
  • GET /iiif/{identifier}/{region}/{size}/{rotation}/{quality}.{format}
  • 303 redirect from GET /iiif/{identifier} to info.json
  • Level 2 parameters:
    • region: full, square, x,y,w,h, pct:x,y,w,h
    • size: max, w,, ,h, pct:n, w,h, !w,h
    • rotation: 0, 90, 180, 270 (and arbitrary non-negative angles)
    • quality: default
    • format: jpg, png
  • CORS enabled (when using create_app, default *)

Installation

pip install sanf

Development Setup

python3.12 -m venv .venv
source .venv/bin/activate
pip install -e .

Running as a Standalone Server

Source images are loaded from ./images by default.

uvicorn sanf.main:create_app --factory --reload

The root directory for the local file connector can be changed via the IIIF_SOURCE_ROOT environment variable.

IIIF_SOURCE_ROOT=/path/to/images uvicorn sanf.main:create_app --factory --reload

Using as a Package

Public API

Symbol Purpose
IIIFServerSettings Settings dataclass
create_app(settings) Creates a standalone FastAPI application
create_iiif_router(settings) Creates an APIRouter for embedding into an existing application
ImageSourceConnector Protocol definition for connectors
LocalFileConnector Connector for local filesystem images
ConnectorError / ImageNotFoundError Connector exceptions

IIIFServerSettings

from sanf import IIIFServerSettings, LocalFileConnector
from pathlib import Path

settings = IIIFServerSettings(
    connector=LocalFileConnector(root=Path("./images")),
    cors_origins=["https://example.com"],   # default: ["*"]
    jpeg_quality=85,                         # default: 85
    max_width=4096,                          # default: None (no limit)
    max_height=4096,                         # default: None (no limit)
)

create_app — Standalone Application

Returns a complete FastAPI instance including CORS middleware.

from sanf import create_app, IIIFServerSettings, LocalFileConnector
from pathlib import Path

settings = IIIFServerSettings(connector=LocalFileConnector(root=Path("./images")))
app = create_app(settings)

create_iiif_router — Embedding into an Existing Application

Returns an APIRouter without CORS. CORS should be managed by the calling application.

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from sanf import create_iiif_router, IIIFServerSettings, LocalFileConnector
from pathlib import Path

settings = IIIFServerSettings(connector=LocalFileConnector(root=Path("./images")))

app = FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["GET"])
app.include_router(create_iiif_router(settings), prefix="/iiif")

Custom Connectors

Any storage backend can be connected by implementing a class that conforms to the ImageSourceConnector protocol.

class MyS3Connector:
    def fetch_image_bytes(self, identifier: str) -> bytes:
        # Return image bytes from S3 or any other backend
        ...
  • Raise ImageNotFoundError when the identifier does not exist
  • Raise ConnectorError for backend failures
  • The identifier is received as a URL-decoded string

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sanf-1.1.0.tar.gz (9.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sanf-1.1.0-py3-none-any.whl (8.5 kB view details)

Uploaded Python 3

File details

Details for the file sanf-1.1.0.tar.gz.

File metadata

  • Download URL: sanf-1.1.0.tar.gz
  • Upload date:
  • Size: 9.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.11

File hashes

Hashes for sanf-1.1.0.tar.gz
Algorithm Hash digest
SHA256 83e495bfeffc15cfefba514c8fa0f756fe69c52e5fe944e5caec79e191a7b3b1
MD5 d5267f2aee021937845ad1ded6e01691
BLAKE2b-256 d7f51bde2f703cb8ced4b5e76800b10bd13161a176bfedd481d6d443f4d59701

See more details on using hashes here.

File details

Details for the file sanf-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: sanf-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 8.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.11

File hashes

Hashes for sanf-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 928bf18d1b76a430e886d356672cc4729d6fe281225ee625969e6d31757f74ea
MD5 ac9b5979000f3c3ee9281a13337921a5
BLAKE2b-256 581a0dc6a2213b92809ee8867352269865bb60ce47a2d359cc9b3525f06b6baa

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page