Skip to content

Table of Contents for Multiple A/V Files on Multiple Canvases

Cookbook URLs
Recipe: https://iiif.io/api/cookbook/recipe/0065-opera-multiple-canvases/
JSON-LD: https://iiif.io/api/cookbook/recipe/0065-opera-multiple-canvases/manifest.json

Method 1

from iiif_prezi3 import (Manifest, Canvas, AnnotationBody, AnnotationPage,
                        Annotation, CanvasRef, KeyValueString, config)

config.configs['helpers.auto_fields.AutoLang'].auto_lang = "en"
base_url = "https://iiif.io/api/cookbook/recipe/0065-opera-multiple-canvases"

manifest = Manifest(
    id=f"{base_url}/manifest.json",
    label="The Elixir of Love",
    metadata=[
        KeyValueString(
            label="Date Issued",
            value="2019",
        ),
        KeyValueString(
            label="Publisher",
            value="Indiana University Jacobs School of Music",
        ),
    ],
)
manifest.add_label("L'Elisir D'Amore", "it")

# Canvas data: (canvas_id, label, video_file, duration, thumbnail)
canvas_data = [
    ("1", "Atto Primo", "vae0637_accessH264_low_act_1.mp4", 3971.24, "act1-thumbnail.png"),
    ("2", "Atto Secondo", "vae0637_accessH264_low_act_2.mp4", 3307.22, "act2-thumbnail.png"),
]

video_base = "https://fixtures.iiif.io/video/indiana/donizetti-elixir"

for canvas_id, label, video_file, duration, thumb_file in canvas_data:
    canvas = Canvas(
        id=f"{base_url}/canvas/{canvas_id}",
        width=1920,
        height=1080,
        duration=duration,
        label=label,
    )

    body = AnnotationBody(
        id=f"{video_base}/{video_file}",
        type="Video",
        format="video/mp4",
        height=1080,
        width=1920,
    )
    body.duration = duration

    anno_page = AnnotationPage(id=f"{base_url}/canvas/{canvas_id}/annotation_page/1")
    anno_page.add_item(
        Annotation(
            id=f"{base_url}/canvas/{canvas_id}/annotation_page/1/annotation/1",
            motivation="painting",
            target=f"{base_url}/canvas/{canvas_id}",
            body=body,
        )
    )
    canvas.add_item(anno_page)
    canvas.add_thumbnail(f"{video_base}/{thumb_file}")
    manifest.add_item(canvas)

top_range = manifest.make_range(
    id=f"{base_url}/range/1",
)
top_range.add_label("Gaetano Donizetti, L'Elisir D'Amore", "it")

range_atto1 = top_range.make_range(
    id=f"{base_url}/range/2",
    label="Atto Primo",
)

range_preludio = range_atto1.make_range(
    id=f"{base_url}/range/3",
)
range_preludio.add_label("Preludio e Coro d'introduzione \u2013 Bel conforto al mietitore", "it")
range_preludio.add_item(
    CanvasRef(id=f"{base_url}/canvas/1#t=0,302.05", type="Canvas")
)

range_remainder = range_atto1.make_range(
    id=f"{base_url}/range/4",
    label="Remainder of Atto Primo",
)
range_remainder.add_item(
    CanvasRef(id=f"{base_url}/canvas/1#t=302.05,3971.24", type="Canvas")
)

range_atto2 = top_range.make_range(
    id=f"{base_url}/range/5",
    label="Atto Secondo",
)
range_atto2.add_item(
    CanvasRef(id=f"{base_url}/canvas/2#t=0,3307.22", type="Canvas")
)

print(manifest.json(indent=2))