Change Discovery¶
The Change Discovery API lets a repository
publish a stream of what changed — created, updated, and deleted resources — as a
W3C Activity Streams OrderedCollection. iiisight consumes that stream so a
harvester can find changed resources and re-fetch them.
Activities are ordered oldest → newest across the (usually paged) collection. iiisight walks the pages for you.
Iterating activities¶
iter_activities yields Activity objects across all pages. By
default it walks newest-first (from last backwards) — the common “what
changed recently” case:
async with iiisight.AsyncClient() as client:
async for activity in client.iter_activities("https://example.org/activity/all-changes"):
print(activity.end_time, activity.type, activity.object.id)
if activity.type != "Delete":
doc = await client.resolve(activity.reference) # re-fetch the changed resource
with iiisight.Client() as client:
for activity in client.iter_activities("https://example.org/activity/all-changes"):
print(activity.end_time, activity.type, activity.object.id)
if activity.type != "Delete":
doc = client.resolve(activity.reference)
Each Activity has a type (Create / Update / Delete /
Move / Add / Remove / Refresh), an object (a Reference
to the changed resource), an end_time, and an optional actor. Its
.reference plugs straight into client.resolve(...).
Incremental harvesting with since¶
Pass since (an endTime string) to process only newer activities — and, walking
newest-first, iteration stops as soon as it reaches activities at or before
since, so you never page further back than you need:
async for activity in client.iter_activities(url, since="2024-01-01T00:00:00Z"):
...
For a full oldest-first sync, pass newest_first=False (walks from first
forwards via next).
Note
since is compared against endTime as a string, so timestamps should be
ISO 8601 in a consistent form (UTC Z), which is what Change Discovery uses.
Fetching the collection directly¶
collection = await client.fetch_changes(url) # a ChangeCollection
collection.total_items
collection.first, collection.last # page URLs
From the command line¶
$ iiisight changes https://example.org/activity/all-changes --limit 20
2024-03-01T09:00:00Z Update https://example.org/iiif/book1/manifest
2024-02-28T12:30:00Z Create https://example.org/iiif/book2/manifest
...
--since <endTime> limits to newer activities; --limit N stops after N.