Pydantic models for OPDS 2.0, RWPM, ODL, LCP, and Palace Project extensions.
Project description
palace-opds
Pydantic models for the OPDS and Readium family of specifications used in digital-library publishing — read, validate, and emit feed and license documents with type-safe Python objects.
What's covered
- OPDS 2.0 publication and feed documents, including facets, navigation groups, and publication groups.
- Readium Web Publication Manifest (RWPM) — link models, presentation hints, encryption metadata.
- OPDS for Distributors / Authentication for OPDS 1.0 — authentication documents and link relations.
- ODL 1.0 (Open Distribution to Libraries) — license metadata, terms, protection, loan/checkout status.
- LCP (Readium Licensed Content Protection) — license documents and loan-status (LSD) documents.
- W3C accessibility metadata and schema.org publication vocabulary for the slices that OPDS feeds reference.
- Palace-specific extensions to the publication metadata vocabulary (under
palace.opds.palace) — these can be safely ignored if you don't need them.
Installation
pip install palace-opds # or: uv add palace-opds
Requires Python 3.12+.
Quick example
from palace.opds.opds2 import PublicationFeed
feed = PublicationFeed.model_validate_json(raw_feed_bytes)
for publication in feed.publications:
print(publication.metadata.title, publication.metadata.identifier)
Models live under the palace.opds namespace and follow Pydantic v2 conventions, so they
serialize to/from JSON and dictionaries with .model_dump() / .model_validate().
Design
- Spec-faithful, not opinionated. Where the OPDS / Readium specs allow flexibility, the models accept it; we don't impose application-specific constraints.
- Lean dependencies. Only the validation and serialization libraries the models actually
need (
pydantic,pycountry,uritemplate) — no web framework, ORM, or cloud SDK is pulled in transitively. - Stable, documented breakage. Breaking changes follow semver and are called out in release notes; minor releases are additive.
Project context
palace-opds is developed and maintained as part of the Palace
Project, where it powers OPDS ingestion and feed generation
for the Palace Manager digital-library
backend. It's published as a standalone package because the OPDS specs are widely shared —
other library systems, ingestion pipelines, or research tools that work with OPDS feeds can
use these models without taking on Palace Manager as a dependency.
Outside contributions and bug reports are welcome via the
ThePalaceProject/circulation repository,
where this package is developed as a uv
workspace member.
License
Apache 2.0.
Project details
Release history Release notifications | RSS feed
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 palace_opds-41.0.0.tar.gz.
File metadata
- Download URL: palace_opds-41.0.0.tar.gz
- Upload date:
- Size: 23.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 |
269d3940b065faff6de402381c9204fac9ddea81d3310692e6eb593d78f4dc51
|
|
| MD5 |
c9f9bc709ef453e5271f4306eb12011a
|
|
| BLAKE2b-256 |
e345810e90325cee38a9e6e700fbf41435f892191cddd8b3a5e373f4fbf797f6
|
Provenance
The following attestation bundles were made for palace_opds-41.0.0.tar.gz:
Publisher:
publish-pypi.yml on ThePalaceProject/circulation
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
palace_opds-41.0.0.tar.gz -
Subject digest:
269d3940b065faff6de402381c9204fac9ddea81d3310692e6eb593d78f4dc51 - Sigstore transparency entry: 1309709876
- Sigstore integration time:
-
Permalink:
ThePalaceProject/circulation@8dc14ae4cc4e7499eb07dbe4e3172aa4b1a0985c -
Branch / Tag:
refs/tags/v41.0.0 - Owner: https://github.com/ThePalaceProject
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@8dc14ae4cc4e7499eb07dbe4e3172aa4b1a0985c -
Trigger Event:
release
-
Statement type:
File details
Details for the file palace_opds-41.0.0-py3-none-any.whl.
File metadata
- Download URL: palace_opds-41.0.0-py3-none-any.whl
- Upload date:
- Size: 32.3 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 |
7e17a8f4ed6dbfe2000e13ce8866900df79dac2a33b4038399f48843c4d91d2d
|
|
| MD5 |
027d29799c2e37c2409c45b7a85687e5
|
|
| BLAKE2b-256 |
0536c3d3e29249cea887560f50bfaa9d19906c7a6f490c001f973ad6dcc6aee7
|
Provenance
The following attestation bundles were made for palace_opds-41.0.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on ThePalaceProject/circulation
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
palace_opds-41.0.0-py3-none-any.whl -
Subject digest:
7e17a8f4ed6dbfe2000e13ce8866900df79dac2a33b4038399f48843c4d91d2d - Sigstore transparency entry: 1309709945
- Sigstore integration time:
-
Permalink:
ThePalaceProject/circulation@8dc14ae4cc4e7499eb07dbe4e3172aa4b1a0985c -
Branch / Tag:
refs/tags/v41.0.0 - Owner: https://github.com/ThePalaceProject
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@8dc14ae4cc4e7499eb07dbe4e3172aa4b1a0985c -
Trigger Event:
release
-
Statement type: