Skip to content

Merge

MCP tools for HDR, panorama and HDR panorama merges.

Merge to HDR or panorama. Merge groups of RAW photos to HDR, panorama or HDR panorama, one group after another, as Image › Merge does: each result is a new EXR photo stacked on its photos, in their collections, starting from the reference photo’s edits. Each merge takes about a minute or more. Remove from Catalog takes a result out; its file stays. Returns a job: follow it with get_jobs; a group that fails is listed and the others go on.

Bridge method: merge.start

Parameter Type Required Details
groups array of object yes The merges: each group’s photo ids, in order (an hdr_pano group holds every bracket of the panorama). Not empty, at most 100 items.
kind string yes One of hdr, pano, hdr_pano.
settings object The merge window’s settings by name; left out, DarkRay’s merge preferences and the window’s defaults. Each kind takes only its own. Fields: reference, wb_photo, align, deghost, bracket_size, projection, yaw, pitch, roll, auto_crop, boundary_warp, gain_compensation, seams, lens_override, stack.
catalog string A catalog from list_catalogs; omitted, the one DarkRay shows.

Python: app.merge_photos(…)

from darkray_bridge import DarkRay
with DarkRay.connect() as app:
ids = [photo.id for photo in app.iter_photos("type:raw date:2026-08-21")]
brackets = app.find_brackets(ids)["brackets"]
# One HDR merge per bracket, one after another. Each takes a minute or more.
job = app.merge_photos([{"ids": b["ids"]} for b in brackets], kind="hdr",
settings={"deghost": "medium", "stack": True})
job.wait(progress=lambda j: print(f"merged {j.done} of {j.total}"))
for merged in job.result["merged"]:
print(merged["id"], merged["file"])
for failed in job.result["failed"]:
print(f"group {failed['group']} failed: {failed['reason']}")