diff --git a/src/CanvasPaintings/CanvasPaintings.sln b/src/CanvasPaintings/CanvasPaintings.sln new file mode 100644 index 00000000..4d08ffad --- /dev/null +++ b/src/CanvasPaintings/CanvasPaintings.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34316.72 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mapper", "Mapper\Mapper.csproj", "{0CC956B6-71A8-4F1E-9523-E635CCE5EAD6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Demo", "Demo\Demo.csproj", "{2D31098F-B19B-4EE0-AE3F-106A73D61147}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IIIF", "..\..\..\..\digirati-co-uk\iiif-net\src\IIIF\IIIF\IIIF.csproj", "{83E719F3-C797-43A4-B191-48D9536962E1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0CC956B6-71A8-4F1E-9523-E635CCE5EAD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0CC956B6-71A8-4F1E-9523-E635CCE5EAD6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CC956B6-71A8-4F1E-9523-E635CCE5EAD6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0CC956B6-71A8-4F1E-9523-E635CCE5EAD6}.Release|Any CPU.Build.0 = Release|Any CPU + {2D31098F-B19B-4EE0-AE3F-106A73D61147}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D31098F-B19B-4EE0-AE3F-106A73D61147}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D31098F-B19B-4EE0-AE3F-106A73D61147}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D31098F-B19B-4EE0-AE3F-106A73D61147}.Release|Any CPU.Build.0 = Release|Any CPU + {83E719F3-C797-43A4-B191-48D9536962E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {83E719F3-C797-43A4-B191-48D9536962E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {83E719F3-C797-43A4-B191-48D9536962E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {83E719F3-C797-43A4-B191-48D9536962E1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2095B719-DBE7-42FD-AC13-9E57B93488DD} + EndGlobalSection +EndGlobal diff --git a/src/CanvasPaintings/Demo/Demo.csproj b/src/CanvasPaintings/Demo/Demo.csproj new file mode 100644 index 00000000..c3bd9b3e --- /dev/null +++ b/src/CanvasPaintings/Demo/Demo.csproj @@ -0,0 +1,19 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + + + + diff --git a/src/CanvasPaintings/Demo/Program.cs b/src/CanvasPaintings/Demo/Program.cs new file mode 100644 index 00000000..56172df9 --- /dev/null +++ b/src/CanvasPaintings/Demo/Program.cs @@ -0,0 +1,127 @@ + +using Demo; +using IIIF.Presentation.V3; +using IIIF.Presentation.V3.Strings; +using IIIF.Serialisation; +using Mapper; +using Mapper.DlcsApi; +using System.Text; +using System.Text.Json; + +if (args.Length == 0) +{ + Console.WriteLine("Supply Manifest file path or URL as arg"); + return; +} + +var sb = new StringBuilder(); + +if (args[0] == "cookbook") +{ + sb.AppendAndWriteLine("# Cookbook recipes"); + sb.AppendAndWriteLine(); + + var httpClient = new HttpClient(); + var theseusColl = await httpClient.GetStringAsync("https://theseus-viewer.netlify.app/cookbook-collection.json"); + var coll = theseusColl.FromJson(); + var skip = new List + { + "https://iiif.io/api/cookbook/recipe/0219-using-caption-file/manifest.json" + }; + + AddSomeExtrasToCookbook(coll); + foreach (var item in coll.Items ?? []) + { + if(item is Manifest manifest) + { + if(skip.Contains(manifest.Id!)) + { + continue; + } + sb.AppendAndWriteLine(); + sb.AppendAndWriteLine("## " + manifest.Label!["en"][0].TrimStart('✅').TrimStart(' ')); + sb.AppendAndWriteLine(manifest.Id); + sb.AppendAndWriteLine(); + var s = await httpClient.GetStringAsync(manifest.Id); + ParseManifest(s, sb); + sb.AppendAndWriteLine(); + } + } + File.WriteAllText("..\\.\\..\\..\\output.md", sb.ToString()); + return; +} + + +if (args[0].StartsWith("http")) +{ + var httpClient = new HttpClient(); + sb.AppendAndWriteLine("Fetching Manifest JSON from " + args[0]); + var s = await httpClient.GetStringAsync(args[0]); + ParseManifest(s, sb); +} +else +{ + sb.AppendAndWriteLine("Loading Manifest JSON from " + args[0]); + var s = File.ReadAllText(args[0]); + ParseManifest(s, sb); +} + + +static void ParseManifest(string manifestJson, StringBuilder sb) +{ + var parser = new Parser(); + var manifest = manifestJson.FromJson(); + TweakForTesting(manifest); + var entities = parser.ParseManifest(manifest); + sb.AppendAndWriteLine(); + sb.AppendAndWriteLine("### canvas_painting rows"); + sb.AppendAndWriteLine(); + sb.AppendAndWriteLine(entities.ToMarkdownTable()); + sb.AppendAndWriteLine(); + sb.AppendAndWriteLine(); + + var pseudoManifest = new PseudoManifest + { + Id = "https://dlc.services/iiif/99/manifests/" + entities[0].ManifestId, + PaintedResources = parser.GetPaintedResources(entities) + }; + var json = JsonSerializer.Serialize(pseudoManifest, + new JsonSerializerOptions() + { + WriteIndented = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull + }); + sb.AppendAndWriteLine("### paintedResources property in DLCS Manifest"); + sb.AppendAndWriteLine(); + sb.AppendAndWriteLine("```json"); + sb.AppendAndWriteLine(json); + sb.AppendAndWriteLine("```"); + sb.AppendAndWriteLine(); + sb.AppendAndWriteLine(); +} + +static void TweakForTesting(Manifest? manifest) +{ + if (manifest!.Id == "https://iiif.io/api/cookbook/recipe/0434-choice-av/manifest.json") + { + // add a label to the Canvas to test CanvasLabel + manifest.Items![0].Label = LangMap("Pick one of these formats"); + } + if(manifest!.Id == "https://iiif.io/api/cookbook/recipe/0040-image-rotation-service/manifest-service.json") + { + manifest.Id = manifest.Id.TrimEnd(); + } +} + + +void AddSomeExtrasToCookbook(Collection coll) +{ + // coll.Items!.Add(new Manifest { Id = "https://iiif.wellcomecollection.org/presentation/b18035723", Label = LangMap("Wunder external") }); + coll.Items!.Add(new Manifest { Id = "https://dlcs.io/iiif-resource/wellcome/preview/5/b18035723", Label = LangMap("Wunder internal") }); +} + +static LanguageMap LangMap(string s) +{ + return new LanguageMap("en", s); +} \ No newline at end of file diff --git a/src/CanvasPaintings/Demo/Properties/launchSettings.json b/src/CanvasPaintings/Demo/Properties/launchSettings.json new file mode 100644 index 00000000..b187ad25 --- /dev/null +++ b/src/CanvasPaintings/Demo/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "Demo": { + "commandName": "Project", + "commandLineArgs": "cookbook" + } + } +} \ No newline at end of file diff --git a/src/CanvasPaintings/Demo/StringBufferX.cs b/src/CanvasPaintings/Demo/StringBufferX.cs new file mode 100644 index 00000000..02807848 --- /dev/null +++ b/src/CanvasPaintings/Demo/StringBufferX.cs @@ -0,0 +1,21 @@ +using System.Text; + +namespace Demo +{ + internal static class StringBuilderX + { + public static void AppendAndWriteLine(this StringBuilder sb, string? s = null) + { + if(string.IsNullOrWhiteSpace(s)) + { + sb.AppendLine(); + Console.WriteLine(); + } + else + { + sb.AppendLine(s); + Console.WriteLine(s); + } + } + } +} diff --git a/src/CanvasPaintings/Demo/examples.bat b/src/CanvasPaintings/Demo/examples.bat new file mode 100644 index 00000000..0a767e14 --- /dev/null +++ b/src/CanvasPaintings/Demo/examples.bat @@ -0,0 +1 @@ +https://dlcs.io/iiif-resource/wellcome/preview/5/b18035723 \ No newline at end of file diff --git a/src/CanvasPaintings/Demo/output.md b/src/CanvasPaintings/Demo/output.md new file mode 100644 index 00000000..d581a817 --- /dev/null +++ b/src/CanvasPaintings/Demo/output.md @@ -0,0 +1,3258 @@ +# Cookbook recipes + + +## Simple Manifest - Image +https://iiif.io/api/cookbook/recipe/0001-mvm-image/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------ | ----------- | ----------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | gmzvbvev | | 0 | https://iiif.io/api/cookbook/recipe/0001-mvm-image/canvas/p1 | | http://iiif.io/api/presentation/2.1/example/fixtures/resources/page1-full.png | | b49x77xs | 1800 | 1200 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/b49x77xs", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "gmzvbvev", + "canvasOrder": 0, + "externalAssetId": "http://iiif.io/api/presentation/2.1/example/fixtures/resources/page1-full.png" + } + } + ] +} +``` + + + + +## Simple Manifest - Audio +https://iiif.io/api/cookbook/recipe/0002-mvm-audio/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | meb983yx | | 0 | https://iiif.io/api/cookbook/recipe/0002-mvm-audio/canvas | | https://fixtures.iiif.io/audio/indiana/mahler-symphony-3/CD1/medium/128Kbps.mp4 | | uakqs4gg | | | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/uakqs4gg", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "meb983yx", + "canvasOrder": 0, + "externalAssetId": "https://fixtures.iiif.io/audio/indiana/mahler-symphony-3/CD1/medium/128Kbps.mp4" + } + } + ] +} +``` + + + + +## Simple Manifest - Video +https://iiif.io/api/cookbook/recipe/0003-mvm-video/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------ | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | s6p6vug7 | | 0 | https://iiif.io/api/cookbook/recipe/0003-mvm-video/canvas | | https://fixtures.iiif.io/video/indiana/lunchroom_manners/high/lunchroom_manners_1024kb.mp4 | | hd6uqysj | 360 | 480 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/hd6uqysj", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "s6p6vug7", + "canvasOrder": 0, + "externalAssetId": "https://fixtures.iiif.io/video/indiana/lunchroom_manners/high/lunchroom_manners_1024kb.mp4" + } + } + ] +} +``` + + + + +## Image and Canvas with Differing Dimensions +https://iiif.io/api/cookbook/recipe/0004-canvas-size/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | -------------------------------------------------------------- | ----------- | -------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | yzj3fpjq | | 0 | https://iiif.io/api/cookbook/recipe/0004-canvas-size/canvas/p1 | | https://fixtures.iiif.io/video/indiana/donizetti-elixir/act1-thumbnail.png | | w44jscje | 360 | 640 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/w44jscje", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "yzj3fpjq", + "canvasOrder": 0, + "externalAssetId": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/act1-thumbnail.png" + } + } + ] +} +``` + + + + +## Support Deep Viewing with Basic Use of a IIIF Image Service +https://iiif.io/api/cookbook/recipe/0005-image-service/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------- | ------------------------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | bxqsv2t4 | | 0 | https://iiif.io/api/cookbook/recipe/0005-image-service/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | Canvas with a single IIIF image | xcahk3zw | 3024 | 4032 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/xcahk3zw", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "bxqsv2t4", + "canvasOrder": 0, + "label": { + "en": [ + "Canvas with a single IIIF image" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Internationalization and Multi-language Values +https://iiif.io/api/cookbook/recipe/0006-text-language/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------ | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | vn5fvuxt | | 0 | https://iiif.io/api/cookbook/recipe/0006-text-language/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Whistlers_Mother/full/max/0/default.jpg | | cqtvesc7 | 991 | 1114 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/cqtvesc7", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "vn5fvuxt", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Whistlers_Mother/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Displaying Multiple Values with Language Maps +https://iiif.io/api/cookbook/recipe/0118-multivalue/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | qn5rbgfg | | 0 | https://iiif.io/api/cookbook/recipe/0118-multivalue/canvas/1 | | https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Whistlers_Mother_high_res.jpg/1114px-Whistlers_Mother_high_res.jpg | | p7p76pwx | | | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/p7p76pwx", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "qn5rbgfg", + "canvasOrder": 0, + "externalAssetId": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Whistlers_Mother_high_res.jpg/1114px-Whistlers_Mother_high_res.jpg" + } + } + ] +} +``` + + + + +## Metadata on any Resource +https://iiif.io/api/cookbook/recipe/0029-metadata-anywhere/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | -------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | wwrqqyjm | | 0 | https://iiif.io/api/cookbook/recipe/0029-metadata-anywhere/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-natural/full/max/0/default.jpg | Painting under natural light | cf9hua55 | 1271 | 2000 | | | +| | j9w2qdv6 | | 1 | https://iiif.io/api/cookbook/recipe/0029-metadata-anywhere/canvas/p2 | | https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-xray/full/max/0/default.jpg | X-ray view of painting | cf9hua55 | 1271 | 2000 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/cf9hua55", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "wwrqqyjm", + "canvasOrder": 0, + "label": { + "en": [ + "Painting under natural light" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-natural/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "j9w2qdv6", + "canvasOrder": 1, + "label": { + "en": [ + "X-ray view of painting" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-xray/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Linking to Structured Metadata +https://iiif.io/api/cookbook/recipe/0053-seeAlso/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------ | ----------- | ---------- | ------------ | ----------- | ------ | --------- | +| | b65g4dka | | 0 | https://iiif.io/api/cookbook/recipe/0053-seeAlso/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001/full/max/0/default.jpg | front cover | mx79qyfq | 4823 | 3497 | | | +| | qrd7btgd | | 1 | https://iiif.io/api/cookbook/recipe/0053-seeAlso/canvas/p2 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_002/full/max/0/default.jpg | pages 1–2 | mx79qyfq | 4804 | 6062 | | | +| | m8kw5k2p | | 2 | https://iiif.io/api/cookbook/recipe/0053-seeAlso/canvas/p3 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_003/full/max/0/default.jpg | pages 3–4 | mx79qyfq | 4776 | 6127 | | | +| | hhjzyj9r | | 3 | https://iiif.io/api/cookbook/recipe/0053-seeAlso/canvas/p4 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_004/full/max/0/default.jpg | pages 5–6 | mx79qyfq | 4751 | 6124 | | | +| | gwqxjmb3 | | 4 | https://iiif.io/api/cookbook/recipe/0053-seeAlso/canvas/p5 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_005/full/max/0/default.jpg | back cover | mx79qyfq | 4808 | 3510 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/mx79qyfq", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "b65g4dka", + "canvasOrder": 0, + "label": { + "en": [ + "front cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "qrd7btgd", + "canvasOrder": 1, + "label": { + "en": [ + "pages 1\u20132" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_002/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "m8kw5k2p", + "canvasOrder": 2, + "label": { + "en": [ + "pages 3\u20134" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_003/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "hhjzyj9r", + "canvasOrder": 3, + "label": { + "en": [ + "pages 5\u20136" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_004/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "gwqxjmb3", + "canvasOrder": 4, + "label": { + "en": [ + "back cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_005/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Providing Alternative Representations +https://iiif.io/api/cookbook/recipe/0046-rendering/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------ | ----------- | ---------- | ------------ | ----------- | ------ | --------- | +| | s2apt3xc | | 0 | https://iiif.io/api/cookbook/recipe/0046-rendering/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001/full/max/0/default.jpg | front cover | zvpzxv96 | 4823 | 3497 | | | +| | pwy8hjhp | | 1 | https://iiif.io/api/cookbook/recipe/0046-rendering/canvas/p2 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_002/full/max/0/default.jpg | pages 1–2 | zvpzxv96 | 4804 | 6062 | | | +| | ms7yxdjq | | 2 | https://iiif.io/api/cookbook/recipe/0046-rendering/canvas/p3 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_003/full/max/0/default.jpg | pages 3–4 | zvpzxv96 | 4776 | 6127 | | | +| | kypz577q | | 3 | https://iiif.io/api/cookbook/recipe/0046-rendering/canvas/p4 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_004/full/max/0/default.jpg | pages 5–6 | zvpzxv96 | 4751 | 6124 | | | +| | c497xbam | | 4 | https://iiif.io/api/cookbook/recipe/0046-rendering/canvas/p5 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_005/full/max/0/default.jpg | back cover | zvpzxv96 | 4808 | 3510 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/zvpzxv96", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "s2apt3xc", + "canvasOrder": 0, + "label": { + "en": [ + "front cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "pwy8hjhp", + "canvasOrder": 1, + "label": { + "en": [ + "pages 1\u20132" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_002/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "ms7yxdjq", + "canvasOrder": 2, + "label": { + "en": [ + "pages 3\u20134" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_003/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "kypz577q", + "canvasOrder": 3, + "label": { + "en": [ + "pages 5\u20136" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_004/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "c497xbam", + "canvasOrder": 4, + "label": { + "en": [ + "back cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_005/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Image in Annotations +https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | uzqm3m7b | | 0 | https://iiif.io/api/cookbook/recipe/0377-image-in-annotation/canvas-1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | | q5xq48dh | 3024 | 4032 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/q5xq48dh", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "uzqm3m7b", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Begin playback at a specific point - Time-based media +https://iiif.io/api/cookbook/recipe/0015-start/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | -------------------------------------------------------------- | ----------- | --------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | ga7678gj | | 0 | https://iiif.io/api/cookbook/recipe/0015-start/canvas/segment1 | | https://fixtures.iiif.io/video/indiana/30-minute-clock/medium/30-minute-clock.mp4 | | auczxcxz | | | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/auczxcxz", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "ga7678gj", + "canvasOrder": 0, + "externalAssetId": "https://fixtures.iiif.io/video/indiana/30-minute-clock/medium/30-minute-clock.mp4" + } + } + ] +} +``` + + + + +## Audio Presentation with Accompanying Image +https://iiif.io/api/cookbook/recipe/0014-accompanyingcanvas/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------- | ----------------------------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | pcdkxs9a | | 0 | https://iiif.io/api/cookbook/recipe/0014-accompanyingcanvas/canvas/p1 | | https://fixtures.iiif.io/audio/indiana/mahler-symphony-3/CD1/medium/128Kbps.mp4 | Gustav Mahler, Symphony No. 3, CD 1 | pt5paz78 | | | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/pt5paz78", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "pcdkxs9a", + "canvasOrder": 0, + "label": { + "en": [ + "Gustav Mahler, Symphony No. 3, CD 1" + ] + }, + "externalAssetId": "https://fixtures.iiif.io/audio/indiana/mahler-symphony-3/CD1/medium/128Kbps.mp4" + } + } + ] +} +``` + + + + +## Simplest Annotation +https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------------------ | ----------- | ----------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | p6ns44xc | | 0 | https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | | ug322g6r | 3024 | 4032 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/ug322g6r", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "p6ns44xc", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Using Caption and Subtitle Files in Multiple Languages with Video Content +https://iiif.io/api/cookbook/recipe/0074-multiple-language-captions/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | -------------------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | gg54hhta | | 0 | https://iiif.io/api/cookbook/recipe/0074-multiple-language-captions/canvas | | https://fixtures.iiif.io/video/europeana/Per_voi_signore_Modelli_francesi.mp4 | | uwaqg2nf | 384 | 288 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/uwaqg2nf", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "gg54hhta", + "canvasOrder": 0, + "externalAssetId": "https://fixtures.iiif.io/video/europeana/Per_voi_signore_Modelli_francesi.mp4" + } + } + ] +} +``` + + + + +## Addressing a Spatial Region +https://iiif.io/api/cookbook/recipe/0299-region/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | a9f2gksd | | 0 | https://iiif.io/api/cookbook/recipe/0299-region/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p2/full/max/0/default.jpg | | g26xea2t | 4999 | 3536 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/g26xea2t", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "a9f2gksd", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p2/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Multiple Volumes in a Single Bound Volume +https://iiif.io/api/cookbook/recipe/0031-bound-multivolume/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | -------------------------------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | yp8qz3m2 | | 0 | https://iiif.io/api/cookbook/recipe/0031-bound-multivolume/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-1_frontcover/full/max/0/default.jpg | Front cover | qhwpycaj | 7230 | 5428 | | | +| | n5dgvy85 | | 1 | https://iiif.io/api/cookbook/recipe/0031-bound-multivolume/canvas/p2 | | https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-2_insidefrontcover/full/max/0/default.jpg | Inside front cover | qhwpycaj | 7230 | 5428 | | | +| | x94sc4hd | | 2 | https://iiif.io/api/cookbook/recipe/0031-bound-multivolume/canvas/p3 | | https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-3_titlepage1/full/max/0/default.jpg | Vol. 1 title page | qhwpycaj | 7230 | 5428 | | | +| | cbzydye3 | | 3 | https://iiif.io/api/cookbook/recipe/0031-bound-multivolume/canvas/p4 | | https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-4_titlepage1_verso/full/max/0/default.jpg | Vol. 1 title page (verso) | qhwpycaj | 7230 | 5428 | | | +| | rjpde5ez | | 4 | https://iiif.io/api/cookbook/recipe/0031-bound-multivolume/canvas/p5 | | https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-5_titlepage2/max/full/0/default.jpg | Vol. 2 title page | qhwpycaj | 7230 | 5428 | | | +| | jvpnvqqn | | 5 | https://iiif.io/api/cookbook/recipe/0031-bound-multivolume/canvas/p6 | | https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-6_titlepage2_verso/max/full/0/default.jpg | Vol. 2 title page (verso) | qhwpycaj | 7230 | 5428 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/qhwpycaj", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "yp8qz3m2", + "canvasOrder": 0, + "label": { + "en": [ + "Front cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-1_frontcover/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "n5dgvy85", + "canvasOrder": 1, + "label": { + "en": [ + "Inside front cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-2_insidefrontcover/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "x94sc4hd", + "canvasOrder": 2, + "label": { + "en": [ + "Vol. 1 title page" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-3_titlepage1/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "cbzydye3", + "canvasOrder": 3, + "label": { + "en": [ + "Vol. 1 title page (verso)" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-4_titlepage1_verso/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "rjpde5ez", + "canvasOrder": 4, + "label": { + "en": [ + "Vol. 2 title page" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-5_titlepage2/max/full/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "jvpnvqqn", + "canvasOrder": 5, + "label": { + "en": [ + "Vol. 2 title page (verso)" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/15f769d62ca9a3a2deca390efed75d73-6_titlepage2_verso/max/full/0/default.jpg" + } + } + ] +} +``` + + + + +## Locate a Manifest on a Web Map +https://iiif.io/api/cookbook/recipe/0154-geo-extension/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------------- | ----------- | --------------------------------------------------------------------------------------------------------------- | --------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | q2vea8az | | 0 | https://iiif.io/api/cookbook/recipe/0154-geo-extension/canvas/1 | | https://iiif.io/api/image/3.0/example/reference/28473c77da3deebe4375c3a50572d9d3-laocoon/full/max/0/default.jpg | Front of Bronze | jqgh6yeu | 3000 | 2315 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/jqgh6yeu", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "q2vea8az", + "canvasOrder": 0, + "label": { + "en": [ + "Front of Bronze" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/28473c77da3deebe4375c3a50572d9d3-laocoon/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Composition from Multiple Images +https://iiif.io/api/cookbook/recipe/0036-composition-from-multiple-images/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ------------------------------------------------------------------------ | ----------- | ----------------------------------------------------------------------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | ---------- | ------------ | ----------- | ----------------------------------------------------------------------------------------------------------- | --------- | +| | ay3cftyt | | 0 | https://iiif.io/api/cookbook/recipe/0036-composition-from-multiple-images/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/899da506920824588764bc12b10fc800-bnf_chateauroux/full/max/0/default.jpg | f. 033v-034r [Chilpéric Ier tue Galswinthe, se remarie et est assassiné] | kn7dz8hb | 5412 | 7216 | | | +| | ay3cftyt | f. 033v-034r [Chilpéric Ier tue Galswinthe, se remarie et est assassiné] | 1 | https://iiif.io/api/cookbook/recipe/0036-composition-from-multiple-images/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/899da506920824588764bc12b10fc800-bnf_chateauroux_miniature/full/max/0/default.jpg | Miniature [Chilpéric Ier tue Galswinthe, se remarie et est assassiné] | kn7dz8hb | 2414 | 2138 | https://iiif.io/api/cookbook/recipe/0036-composition-from-multiple-images/canvas/p1#xywh=3949,994,1091,1232 | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/kn7dz8hb", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "ay3cftyt", + "canvasOrder": 0, + "label": { + "none": [ + "f. 033v-034r [Chilp\u00E9ric Ier tue Galswinthe, se remarie et est assassin\u00E9]" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/899da506920824588764bc12b10fc800-bnf_chateauroux/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "ay3cftyt", + "canvasOrder": 1, + "label": { + "fr": [ + "Miniature [Chilp\u00E9ric Ier tue Galswinthe, se remarie et est assassin\u00E9]" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/899da506920824588764bc12b10fc800-bnf_chateauroux_miniature/full/max/0/default.jpg", + "canvasLabel": { + "none": [ + "f. 033v-034r [Chilp\u00E9ric Ier tue Galswinthe, se remarie et est assassin\u00E9]" + ] + } + } + } + ] +} +``` + + + + +## Providing Access to Transcript Files of A/V Content +https://iiif.io/api/cookbook/recipe/0017-transcription-av/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------ | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | kxkq4wmy | | 0 | https://iiif.io/api/cookbook/recipe/0017-transcription-av/canvas | | https://fixtures.iiif.io/video/indiana/volleyball/high/volleyball-for-boys.mp4 | | srrcvy3f | 1080 | 1920 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/srrcvy3f", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "kxkq4wmy", + "canvasOrder": 0, + "externalAssetId": "https://fixtures.iiif.io/video/indiana/volleyball/high/volleyball-for-boys.mp4" + } + } + ] +} +``` + + + + +## Table of Contents for Multiple A/V Files on Multiple Canvases +https://iiif.io/api/cookbook/recipe/0065-opera-multiple-canvases/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------------- | ------------ | ---------- | ------------ | ----------- | ------ | --------- | +| | wd7bg89x | | 0 | https://iiif.io/api/cookbook/recipe/0065-opera-multiple-canvases/canvas/1 | | https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_1.mp4 | Atto Primo | dygj3mf5 | 1080 | 1920 | | | +| | zwdhf69t | | 1 | https://iiif.io/api/cookbook/recipe/0065-opera-multiple-canvases/canvas/2 | | https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_2.mp4 | Atto Secondo | dygj3mf5 | 1080 | 1920 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/dygj3mf5", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "wd7bg89x", + "canvasOrder": 0, + "label": { + "en": [ + "Atto Primo" + ] + }, + "externalAssetId": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_1.mp4" + } + }, + { + "canvasPainting": { + "canvas": "zwdhf69t", + "canvasOrder": 1, + "label": { + "en": [ + "Atto Secondo" + ] + }, + "externalAssetId": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_2.mp4" + } + } + ] +} +``` + + + + +## Table of Contents for A/V Content +https://iiif.io/api/cookbook/recipe/0026-toc-opera/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ----------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | dgz862cu | | 0 | https://iiif.io/api/cookbook/recipe/0026-toc-opera/canvas/1 | | https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low.mp4 | | gay322wf | 1080 | 1920 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/gay322wf", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "dgz862cu", + "canvasOrder": 0, + "externalAssetId": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low.mp4" + } + } + ] +} +``` + + + + +## Table of Contents for Book Chapters +https://iiif.io/api/cookbook/recipe/0024-book-4-toc/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | hj89cgr6 | | 0 | https://iiif.io/api/cookbook/recipe/0024-book-4-toc/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-1-21198-zz001d8m41_774608_master/full/max/0/default.jpg | f. 1r | vau8dhp9 | 2504 | 1768 | | | +| | cbktaf55 | | 1 | https://iiif.io/api/cookbook/recipe/0024-book-4-toc/canvas/p2 | | https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-2-21198-zz001d8m5j_774612_master/full/max/0/default.jpg | f. 1v | vau8dhp9 | 2512 | 1792 | | | +| | w6ww5syy | | 2 | https://iiif.io/api/cookbook/recipe/0024-book-4-toc/canvas/p3 | | https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-3-21198-zz001d8tm5_775004_master/full/max/0/default.jpg | f. 2r | vau8dhp9 | 2456 | 1792 | | | +| | x8fr2kd9 | | 3 | https://iiif.io/api/cookbook/recipe/0024-book-4-toc/canvas/p4 | | https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-4-21198-zz001d8tnp_775007_master/full/max/0/default.jpg | f. 2v | vau8dhp9 | 2440 | 1760 | | | +| | cbhugcs8 | | 4 | https://iiif.io/api/cookbook/recipe/0024-book-4-toc/canvas/p5 | | https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-5-21198-zz001d8v6f_775077_master/full/max/0/default.jpg | f. 3r | vau8dhp9 | 2416 | 1776 | | | +| | q5mgq35y | | 5 | https://iiif.io/api/cookbook/recipe/0024-book-4-toc/canvas/p6 | | https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-6-21198-zz001d8v7z_775085_master/full/max/0/default.jpg | f. 3v | vau8dhp9 | 2416 | 1776 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/vau8dhp9", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "hj89cgr6", + "canvasOrder": 0, + "label": { + "en": [ + "f. 1r" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-1-21198-zz001d8m41_774608_master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "cbktaf55", + "canvasOrder": 1, + "label": { + "en": [ + "f. 1v" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-2-21198-zz001d8m5j_774612_master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "w6ww5syy", + "canvasOrder": 2, + "label": { + "en": [ + "f. 2r" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-3-21198-zz001d8tm5_775004_master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "x8fr2kd9", + "canvasOrder": 3, + "label": { + "en": [ + "f. 2v" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-4-21198-zz001d8tnp_775007_master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "cbhugcs8", + "canvasOrder": 4, + "label": { + "en": [ + "f. 3r" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-5-21198-zz001d8v6f_775077_master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "q5mgq35y", + "canvasOrder": 5, + "label": { + "en": [ + "f. 3v" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-6-21198-zz001d8v7z_775085_master/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Locate Multiple Canvases on a Web Map +https://iiif.io/api/cookbook/recipe/0240-navPlace-on-canvases/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------- | --------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | gcrg4ufr | | 0 | https://iiif.io/api/cookbook/recipe/0240-navPlace-on-canvases/canvas/1 | | https://iiif.io/api/image/3.0/example/reference/28473c77da3deebe4375c3a50572d9d3-laocoon/full/max/0/default.jpg | Front of Bronze | z34wurvx | 3000 | 2315 | | | +| | wjw4bkxb | | 1 | https://iiif.io/api/cookbook/recipe/0240-navPlace-on-canvases/canvas/2 | | https://iiif.io/api/image/3.0/example/reference/58763298b61c2a99f78ff94d8364c639-laocoon_1946_18_1/full/max/0/default.jpg | Painting | z34wurvx | 3259 | 4096 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/z34wurvx", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "gcrg4ufr", + "canvasOrder": 0, + "label": { + "en": [ + "Front of Bronze" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/28473c77da3deebe4375c3a50572d9d3-laocoon/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "wjw4bkxb", + "canvasOrder": 1, + "label": { + "en": [ + "Painting" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/58763298b61c2a99f78ff94d8364c639-laocoon_1946_18_1/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Simple Annotation — Tagging +https://iiif.io/api/cookbook/recipe/0021-tagging/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | zwex88nk | | 0 | https://iiif.io/api/cookbook/recipe/0021-tagging/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | | n54p5584 | 3024 | 4032 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/n54p5584", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "zwex88nk", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Annotating a specific point of an image +https://iiif.io/api/cookbook/recipe/0135-annotating-point-in-canvas/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | q9j9ryx6 | | 0 | https://iiif.io/api/cookbook/recipe/0135-annotating-point-in-canvas/canvas.json | | https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-88695674/full/max/0/default.jpg | Chesapeake and Ohio Canal Pamphlet | rdqkk5yk | 7072 | 5212 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/rdqkk5yk", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "q9j9ryx6", + "canvasOrder": 0, + "label": { + "en": [ + "Chesapeake and Ohio Canal Pamphlet" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-88695674/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Embedded or referenced Annotations +https://iiif.io/api/cookbook/recipe/0269-embedded-or-referenced-annotations/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------------------------------ | ----------- | ----------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | sctgj4m6 | | 0 | https://iiif.io/api/cookbook/recipe/0269-embedded-or-referenced-annotations/canvas-1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | | eqkaqy6g | 3024 | 4032 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/eqkaqy6g", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "sctgj4m6", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Missing Images in a Sequence +https://iiif.io/api/cookbook/recipe/0283-missing-image/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | t5jqj6xq | | 0 | https://iiif.io/api/cookbook/recipe/0283-missing-image/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-1-21198-zz001d8m41_774608_master/full/max/0/default.jpg | f. 1r | e4zn99ax | 2504 | 1768 | | | +| | pz9dyasb | | 1 | https://iiif.io/api/cookbook/recipe/0283-missing-image/canvas/p3 | | https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-3-21198-zz001d8tm5_775004_master/full/max/0/default.jpg | f. 2r | e4zn99ax | 2456 | 1792 | | | +| | mpzkpg7b | | 2 | https://iiif.io/api/cookbook/recipe/0283-missing-image/canvas/p4 | | https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-4-21198-zz001d8tnp_775007_master/full/max/0/default.jpg | f. 2v | e4zn99ax | 2440 | 1760 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/e4zn99ax", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "t5jqj6xq", + "canvasOrder": 0, + "label": { + "en": [ + "f. 1r" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-1-21198-zz001d8m41_774608_master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "pz9dyasb", + "canvasOrder": 1, + "label": { + "en": [ + "f. 2r" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-3-21198-zz001d8tm5_775004_master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "mpzkpg7b", + "canvasOrder": 2, + "label": { + "en": [ + "f. 2v" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/d3bbf5397c6df6b894c5991195c912ab-4-21198-zz001d8tnp_775007_master/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Load a Preview Image Before the Main Content +https://iiif.io/api/cookbook/recipe/0013-placeholderCanvas/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | k5xffet6 | | 0 | https://iiif.io/api/cookbook/recipe/0013-placeholderCanvas/canvas/donizetti | | https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low.mp4 | | x3bqymu2 | 360 | 640 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/x3bqymu2", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "k5xffet6", + "canvasOrder": 0, + "externalAssetId": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low.mp4" + } + } + ] +} +``` + + + + +## Simple Manifest - Book +https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ---------- | ------------ | ----------- | ------ | --------- | +| | k9dmdamz | | 0 | https://iiif.io/api/cookbook/recipe/0009-book-1/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f18/full/max/0/default.jpg | Blank page | n5pebw5j | 4613 | 3204 | | | +| | h3tv22ua | | 1 | https://iiif.io/api/cookbook/recipe/0009-book-1/canvas/p2 | | https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f19/full/max/0/default.jpg | Frontispiece | n5pebw5j | 4612 | 3186 | | | +| | gqkgakev | | 2 | https://iiif.io/api/cookbook/recipe/0009-book-1/canvas/p3 | | https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f20/full/max/0/default.jpg | Title page | n5pebw5j | 4613 | 3204 | | | +| | y5ak58c2 | | 3 | https://iiif.io/api/cookbook/recipe/0009-book-1/canvas/p4 | | https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f21/full/max/0/default.jpg | Blank page | n5pebw5j | 4578 | 3174 | | | +| | c7b7u2sr | | 4 | https://iiif.io/api/cookbook/recipe/0009-book-1/canvas/p5 | | https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f22/full/max/0/default.jpg | Bookplate | n5pebw5j | 4632 | 3198 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/n5pebw5j", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "k9dmdamz", + "canvasOrder": 0, + "label": { + "en": [ + "Blank page" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f18/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "h3tv22ua", + "canvasOrder": 1, + "label": { + "en": [ + "Frontispiece" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f19/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "gqkgakev", + "canvasOrder": 2, + "label": { + "en": [ + "Title page" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f20/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "y5ak58c2", + "canvasOrder": 3, + "label": { + "en": [ + "Blank page" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f21/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "c7b7u2sr", + "canvasOrder": 4, + "label": { + "en": [ + "Bookplate" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f22/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## HTML in Annotations +https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | ukmuwnt4 | | 0 | https://iiif.io/api/cookbook/recipe/0019-html-in-annotations/canvas-1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | | fkehde4t | 3024 | 4032 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/fkehde4t", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "ukmuwnt4", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Linking to Web Page of an Object +https://iiif.io/api/cookbook/recipe/0047-homepage/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | rr4zcwzw | | 0 | https://iiif.io/api/cookbook/recipe/0047-homepage/canvas/1 | | https://iiif.io/api/image/3.0/example/reference/28473c77da3deebe4375c3a50572d9d3-laocoon/full/!500,500/0/default.jpg | Front | ax2g3wge | 3000 | 2315 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/ax2g3wge", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "rr4zcwzw", + "canvasOrder": 0, + "label": { + "none": [ + "Front" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/28473c77da3deebe4375c3a50572d9d3-laocoon/full/!500,500/0/default.jpg" + } + } + ] +} +``` + + + + +## Rights statement +https://iiif.io/api/cookbook/recipe/0008-rights/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | upz2j3ce | | 0 | https://iiif.io/api/cookbook/recipe/0008-rights/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | | k5swf7mg | 3024 | 4032 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/k5swf7mg", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "upz2j3ce", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Acknowledge Content Contributors +https://iiif.io/api/cookbook/recipe/0234-provider/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ----------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | phbret57 | | 0 | https://iiif.io/api/cookbook/recipe/0234-provider/canvas/p0 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001_full/full/max/0/default.jpg | front cover with color bar | zu9vtszz | 5312 | 4520 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/zu9vtszz", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "phbret57", + "canvasOrder": 0, + "label": { + "en": [ + "front cover with color bar" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001_full/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Redirecting from one Canvas to another resource (Hotspot linking) +https://iiif.io/api/cookbook/recipe/0022-linking-with-a-hotspot/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | jfbx5cgw | | 0 | https://iiif.io/api/cookbook/recipe/0022-linking-with-a-hotspot/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | | ugpjgndv | 3024 | 4032 | | | +| | uv6zdbk7 | | 1 | https://iiif.io/api/cookbook/recipe/0022-linking-with-a-hotspot/canvas/p2 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-fountain/full/max/0/default.jpg | | ugpjgndv | 4032 | 3024 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/ugpjgndv", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "jfbx5cgw", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "uv6zdbk7", + "canvasOrder": 1, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-fountain/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Table of Contents for Multiple A/V Files on a Single Canvas +https://iiif.io/api/cookbook/recipe/0064-opera-one-canvas/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------------ | ----------- | ---------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------------------------------------------------------------------------------ | --------- | +| | neezc3y4 | | 0 | https://iiif.io/api/cookbook/recipe/0064-opera-one-canvas/canvas/1 | | https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_1.mp4 | | j8ndptxe | 1080 | 1920 | https://iiif.io/api/cookbook/recipe/0064-opera-one-canvas/canvas/1#t=0,3971.24 | | +| | neezc3y4 | | 1 | https://iiif.io/api/cookbook/recipe/0064-opera-one-canvas/canvas/1 | | https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_2.mp4 | | j8ndptxe | 1080 | 1920 | https://iiif.io/api/cookbook/recipe/0064-opera-one-canvas/canvas/1#t=3971.24 | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/j8ndptxe", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "neezc3y4", + "canvasOrder": 0, + "externalAssetId": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_1.mp4" + } + }, + { + "canvasPainting": { + "canvas": "neezc3y4", + "canvasOrder": 1, + "externalAssetId": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_2.mp4" + } + } + ] +} +``` + + + + +## Multiple Choice of Images in a Single View (Canvas) +https://iiif.io/api/cookbook/recipe/0033-choice/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------- | ------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | aknd24ma | | 0 | https://iiif.io/api/cookbook/recipe/0033-choice/canvas/p1 | 1 | https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-natural/full/max/0/default.jpg | Natural Light | t2vwdmbn | 1271 | 2000 | | | +| | aknd24ma | | 0 | https://iiif.io/api/cookbook/recipe/0033-choice/canvas/p1 | 2 | https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-xray/full/max/0/default.jpg | X-Ray | t2vwdmbn | 1271 | 2000 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/t2vwdmbn", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "aknd24ma", + "canvasOrder": 0, + "choiceOrder": 1, + "label": { + "en": [ + "Natural Light" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-natural/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "aknd24ma", + "canvasOrder": 0, + "choiceOrder": 2, + "label": { + "en": [ + "X-Ray" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-xray/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Foldouts, Flaps, and Maps +https://iiif.io/api/cookbook/recipe/0035-foldouts/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------- | ----------------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | bmpq42h4 | | 0 | https://iiif.io/api/cookbook/recipe/0035-foldouts/canvas/1 | | https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-1_frontcover/full/max/0/default.jpg | Front cover | b873x2qy | 4429 | 2533 | | | +| | cs7fkget | | 1 | https://iiif.io/api/cookbook/recipe/0035-foldouts/canvas/2 | | https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-2_insidefrontcover/full/max/0/default.jpg | Inside front cover | b873x2qy | 4315 | 2490 | | | +| | gjhhas76 | | 2 | https://iiif.io/api/cookbook/recipe/0035-foldouts/canvas/3 | | https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-3_foldout-folded/full/max/0/default.jpg | Foldout, folded | b873x2qy | 4278 | 2197 | | | +| | r7yppr8s | | 3 | https://iiif.io/api/cookbook/recipe/0035-foldouts/canvas/4 | | https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-4_foldout/full/max/0/default.jpg | Foldout, unfolded | b873x2qy | 1968 | 3688 | | | +| | hjcwsq3n | | 4 | https://iiif.io/api/cookbook/recipe/0035-foldouts/canvas/5 | | https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-3_foldout-rotated/full/max/0/default.jpg | Foldout, folded (recto) | b873x2qy | 1968 | 3688 | | | +| | x3fdfxn4 | | 5 | https://iiif.io/api/cookbook/recipe/0035-foldouts/canvas/6 | | https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-5_titlepage/full/max/0/default.jpg | Title page | b873x2qy | 4315 | 2490 | | | +| | tvm9kmts | | 6 | https://iiif.io/api/cookbook/recipe/0035-foldouts/canvas/7 | | https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-6_titlepage-recto/full/max/0/default.jpg | Back of title page | b873x2qy | 4315 | 2490 | | | +| | qe5bzwpg | | 7 | https://iiif.io/api/cookbook/recipe/0035-foldouts/canvas/8 | | https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-8_insidebackcover/full/max/0/default.jpg | Inside back cover | b873x2qy | 4315 | 2490 | | | +| | nvurzczf | | 8 | https://iiif.io/api/cookbook/recipe/0035-foldouts/canvas/9 | | https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-9_backcover/full/max/0/default.jpg | Back cover | b873x2qy | 4315 | 2490 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/b873x2qy", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "bmpq42h4", + "canvasOrder": 0, + "label": { + "en": [ + "Front cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-1_frontcover/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "cs7fkget", + "canvasOrder": 1, + "label": { + "en": [ + "Inside front cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-2_insidefrontcover/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "gjhhas76", + "canvasOrder": 2, + "label": { + "en": [ + "Foldout, folded" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-3_foldout-folded/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "r7yppr8s", + "canvasOrder": 3, + "label": { + "en": [ + "Foldout, unfolded" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-4_foldout/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "hjcwsq3n", + "canvasOrder": 4, + "label": { + "en": [ + "Foldout, folded (recto)" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-3_foldout-rotated/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "x3fdfxn4", + "canvasOrder": 5, + "label": { + "en": [ + "Title page" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-5_titlepage/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "tvm9kmts", + "canvasOrder": 6, + "label": { + "en": [ + "Back of title page" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-6_titlepage-recto/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "qe5bzwpg", + "canvasOrder": 7, + "label": { + "en": [ + "Inside back cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-8_insidebackcover/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "nvurzczf", + "canvasOrder": 8, + "label": { + "en": [ + "Back cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/0a469c27256eda739d43124cc448a3ba-9_backcover/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Tagging with an External Resource +https://iiif.io/api/cookbook/recipe/0258-tagging-external-resource/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | d9y5zz85 | | 0 | https://iiif.io/api/cookbook/recipe/0258-tagging-external-resource/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | | ewz2pcwz | 3024 | 4032 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/ewz2pcwz", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "d9y5zz85", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Annotate specific images or layers +https://iiif.io/api/cookbook/recipe/0326-annotating-image-layer/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------- | ------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | cyxgmsx7 | | 0 | https://iiif.io/api/cookbook/recipe/0326-annotating-image-layer/canvas/p1 | 1 | https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-natural/full/max/0/default.jpg | Natural Light | j5qrtyvs | 1271 | 2000 | | | +| | cyxgmsx7 | | 0 | https://iiif.io/api/cookbook/recipe/0326-annotating-image-layer/canvas/p1 | 2 | https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-xray/full/2000,1271/0/default.jpg | X-ray | j5qrtyvs | 1271 | 2000 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/j5qrtyvs", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "cyxgmsx7", + "canvasOrder": 0, + "choiceOrder": 1, + "label": { + "en": [ + "Natural Light" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-natural/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "cyxgmsx7", + "canvasOrder": 0, + "choiceOrder": 2, + "label": { + "en": [ + "X-ray" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-xray/full/2000,1271/0/default.jpg" + } + } + ] +} +``` + + + + +## Annotation with a Non-Rectangular Polygon +https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ----------------------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | pbv5gqea | | 0 | https://iiif.io/api/cookbook/recipe/0261-non-rectangular-commenting/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | | q9q3rqub | 3024 | 4032 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/q9q3rqub", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "pbv5gqea", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Viewing direction and Its Effect on Navigation +https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/manifest-rtl.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------ | ----------- | ---------- | ------------ | ----------- | ------ | --------- | +| | bk3rn2at | | 0 | https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001/full/max/0/default.jpg | front cover | k8gmfcxu | 4823 | 3497 | | | +| | db7t7y78 | | 1 | https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/canvas/p2 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_002/full/max/0/default.jpg | pages 1–2 | k8gmfcxu | 4804 | 6062 | | | +| | r7txjw3h | | 2 | https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/canvas/p3 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_003/full/max/0/default.jpg | pages 3–4 | k8gmfcxu | 4776 | 6127 | | | +| | eb2etyj2 | | 3 | https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/canvas/p4 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_004/full/max/0/default.jpg | pages 5–6 | k8gmfcxu | 4751 | 6124 | | | +| | qkxcxakx | | 4 | https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/canvas/p5 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_005/full/max/0/default.jpg | back cover | k8gmfcxu | 4808 | 3510 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/k8gmfcxu", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "bk3rn2at", + "canvasOrder": 0, + "label": { + "en": [ + "front cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "db7t7y78", + "canvasOrder": 1, + "label": { + "en": [ + "pages 1\u20132" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_002/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "r7txjw3h", + "canvasOrder": 2, + "label": { + "en": [ + "pages 3\u20134" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_003/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "eb2etyj2", + "canvasOrder": 3, + "label": { + "en": [ + "pages 5\u20136" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_004/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "qkxcxakx", + "canvasOrder": 4, + "label": { + "en": [ + "back cover" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_005/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Image Thumbnail for Manifest +https://iiif.io/api/cookbook/recipe/0117-add-image-thumbnail/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | pssau5jh | | 0 | https://iiif.io/api/cookbook/recipe/0117-add-image-thumbnail/canvas/p0 | | https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001_full/full/max/0/default.jpg | front cover with color bar | j94e68kr | 5312 | 4520 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/j94e68kr", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "pssau5jh", + "canvasOrder": 0, + "label": { + "en": [ + "front cover with color bar" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001_full/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Load Manifest Beginning with a Specific Canvas +https://iiif.io/api/cookbook/recipe/0202-start-canvas/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ---------- | ------------ | ----------- | ------ | --------- | +| | h4ruy2q3 | | 0 | https://iiif.io/api/cookbook/recipe/0202-start-canvas/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f18/full/max/0/default.jpg | Blank page | f4r2axb9 | 4613 | 3204 | | | +| | faep376h | | 1 | https://iiif.io/api/cookbook/recipe/0202-start-canvas/canvas/p2 | | https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f19/full/max/0/default.jpg | Frontispiece | f4r2axb9 | 4612 | 3186 | | | +| | xzab23n4 | | 2 | https://iiif.io/api/cookbook/recipe/0202-start-canvas/canvas/p3 | | https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f20/full/max/0/default.jpg | Title page | f4r2axb9 | 4613 | 3204 | | | +| | qyr5vcbp | | 3 | https://iiif.io/api/cookbook/recipe/0202-start-canvas/canvas/p4 | | https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f21/full/max/0/default.jpg | Blank page | f4r2axb9 | 4578 | 3174 | | | +| | ck559g9e | | 4 | https://iiif.io/api/cookbook/recipe/0202-start-canvas/canvas/p5 | | https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f22/full/max/0/default.jpg | Bookplate | f4r2axb9 | 4632 | 3198 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/f4r2axb9", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "h4ruy2q3", + "canvasOrder": 0, + "label": { + "en": [ + "Blank page" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f18/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "faep376h", + "canvasOrder": 1, + "label": { + "en": [ + "Frontispiece" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f19/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "xzab23n4", + "canvasOrder": 2, + "label": { + "en": [ + "Title page" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f20/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "qyr5vcbp", + "canvasOrder": 3, + "label": { + "en": [ + "Blank page" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f21/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "ck559g9e", + "canvasOrder": 4, + "label": { + "en": [ + "Bookplate" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/59d09e6773341f28ea166e9f3c1e674f-gallica_ark_12148_bpt6k1526005v_f22/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Represent Canvas Fragment as a Geographic Area in a Web Mapping Client +https://iiif.io/api/cookbook/recipe/0139-geolocate-canvas-fragment/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------------------------ | ----------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | hz7u68j8 | | 0 | https://iiif.io/api/cookbook/recipe/0139-geolocate-canvas-fragment/canvas.json | | https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-88695674/full/max/0/default.jpg | Chesapeake and Ohio Canal Pamphlet | x8jcp39g | 7072 | 5212 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/x8jcp39g", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "hz7u68j8", + "canvasOrder": 0, + "label": { + "en": [ + "Chesapeake and Ohio Canal Pamphlet" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-88695674/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Multiple Choice of Audio Formats in a Single View (Canvas) +https://iiif.io/api/cookbook/recipe/0434-choice-av/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ------------------------- | ----------- | ----------------------------------------------------------- | ----------- | -------------------------------------------------------- | -------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | a56avyyq | Pick one of these formats | 0 | https://iiif.io/api/cookbook/recipe/0434-choice-av/canvas/1 | 1 | https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.m4a | ALAC | t64nmv9f | | | | | +| | a56avyyq | | 0 | https://iiif.io/api/cookbook/recipe/0434-choice-av/canvas/1 | 2 | https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.mp3 | MP3 | t64nmv9f | | | | | +| | a56avyyq | | 0 | https://iiif.io/api/cookbook/recipe/0434-choice-av/canvas/1 | 3 | https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.flac | FLAC | t64nmv9f | | | | | +| | a56avyyq | | 0 | https://iiif.io/api/cookbook/recipe/0434-choice-av/canvas/1 | 4 | https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.ogg | OGG Vorbis OGG | t64nmv9f | | | | | +| | a56avyyq | | 0 | https://iiif.io/api/cookbook/recipe/0434-choice-av/canvas/1 | 5 | https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.mpeg | MPEG2 | t64nmv9f | | | | | +| | a56avyyq | | 0 | https://iiif.io/api/cookbook/recipe/0434-choice-av/canvas/1 | 6 | https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.wav | WAV | t64nmv9f | | | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/t64nmv9f", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "a56avyyq", + "canvasOrder": 0, + "choiceOrder": 1, + "label": { + "en": [ + "ALAC" + ] + }, + "externalAssetId": "https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.m4a", + "canvasLabel": { + "en": [ + "Pick one of these formats" + ] + } + } + }, + { + "canvasPainting": { + "canvas": "a56avyyq", + "canvasOrder": 0, + "choiceOrder": 2, + "label": { + "en": [ + "MP3" + ] + }, + "externalAssetId": "https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.mp3" + } + }, + { + "canvasPainting": { + "canvas": "a56avyyq", + "canvasOrder": 0, + "choiceOrder": 3, + "label": { + "en": [ + "FLAC" + ] + }, + "externalAssetId": "https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.flac" + } + }, + { + "canvasPainting": { + "canvas": "a56avyyq", + "canvasOrder": 0, + "choiceOrder": 4, + "label": { + "en": [ + "OGG Vorbis OGG" + ] + }, + "externalAssetId": "https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.ogg" + } + }, + { + "canvasPainting": { + "canvas": "a56avyyq", + "canvasOrder": 0, + "choiceOrder": 5, + "label": { + "en": [ + "MPEG2" + ] + }, + "externalAssetId": "https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.mpeg" + } + }, + { + "canvasPainting": { + "canvas": "a56avyyq", + "canvasOrder": 0, + "choiceOrder": 6, + "label": { + "en": [ + "WAV" + ] + }, + "externalAssetId": "https://fixtures.iiif.io/audio/ucla/egbe-iyawo-ucla.wav" + } + } + ] +} +``` + + + + +## Book 'behavior' Variations (continuous, individuals) +https://iiif.io/api/cookbook/recipe/0011-book-3-behavior/manifest-continuous.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------------ | ----------- | --------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | mvbvf68p | | 0 | https://iiif.io/api/cookbook/recipe/0011-book-3-behavior/canvas/s1 | | https://iiif.io/api/image/3.0/example/reference/8c169124171e6b2253b698a22a938f07-21198-zz001hbmd9_1300412_master/full/max/0/default.jpg | Section 1 [Recto] | x26g5d58 | 1592 | 11368 | | | +| | rph3k8e5 | | 1 | https://iiif.io/api/cookbook/recipe/0011-book-3-behavior/canvas/s2 | | https://iiif.io/api/image/3.0/example/reference/8c169124171e6b2253b698a22a938f07-21198-zz001hbmft_1300418_master/full/max/0/default.jpg | Section 2 [Recto] | x26g5d58 | 1536 | 11608 | | | +| | j623nb2b | | 2 | https://iiif.io/api/cookbook/recipe/0011-book-3-behavior/canvas/s3 | | https://iiif.io/api/image/3.0/example/reference/8c169124171e6b2253b698a22a938f07-21198-zz001hbmgb_1300426_master/full/max/0/default.jpg | Section 3 [Recto] | x26g5d58 | 1504 | 10576 | | | +| | bcctpqwr | | 3 | https://iiif.io/api/cookbook/recipe/0011-book-3-behavior/canvas/s4 | | https://iiif.io/api/image/3.0/example/reference/8c169124171e6b2253b698a22a938f07-21198-zz001hbmhv_1300436_master/full/max/0/default.jpg | Section 4 [Recto] | x26g5d58 | 1464 | 2488 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/x26g5d58", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "mvbvf68p", + "canvasOrder": 0, + "label": { + "en": [ + "Section 1 [Recto]" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/8c169124171e6b2253b698a22a938f07-21198-zz001hbmd9_1300412_master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "rph3k8e5", + "canvasOrder": 1, + "label": { + "en": [ + "Section 2 [Recto]" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/8c169124171e6b2253b698a22a938f07-21198-zz001hbmft_1300418_master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "j623nb2b", + "canvasOrder": 2, + "label": { + "en": [ + "Section 3 [Recto]" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/8c169124171e6b2253b698a22a938f07-21198-zz001hbmgb_1300426_master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "bcctpqwr", + "canvasOrder": 3, + "label": { + "en": [ + "Section 4 [Recto]" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/8c169124171e6b2253b698a22a938f07-21198-zz001hbmhv_1300436_master/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Image Rotation Two Ways +https://iiif.io/api/cookbook/recipe/0040-image-rotation-service/manifest-service.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | gmpxk9nb | | 0 | https://iiif.io/api/cookbook/recipe/0040-image-rotation-service/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-0-21198-zz00022840-1-page1/full/max/0/default.jpg | inside cover; 1r | p4672jqy | 2105 | 1523 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/p4672jqy", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "gmpxk9nb", + "canvasOrder": 0, + "label": { + "en": [ + "inside cover; 1r" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-0-21198-zz00022840-1-page1/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Embedding HTML in descriptive properties +https://iiif.io/api/cookbook/recipe/0007-string-formats/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ----------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | mkj4uj8r | | 0 | https://iiif.io/api/cookbook/recipe/0007-string-formats/canvas/p1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | | vpybm597 | 3024 | 4032 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/vpybm597", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "mkj4uj8r", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Linking external Annotations targeting a Canvas to a Manifest +https://iiif.io/api/cookbook/recipe/0306-linking-annotations-to-manifests/manifest.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ---------------------------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------- | ----- | ---------- | ------------ | ----------- | ------ | --------- | +| | c5e5znsa | | 0 | https://iiif.io/api/cookbook/recipe/0306-linking-annotations-to-manifests/canvas-1 | | https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg | | tz3ygmuv | 3024 | 4032 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/tz3ygmuv", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "c5e5znsa", + "canvasOrder": 0, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Viewing direction and Its Effect on Navigation +https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/manifest-ttb.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | --------------------------------------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------- | ------- | ---------- | ------------ | ----------- | ------ | --------- | +| | apgke53v | | 0 | https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/canvas/v1 | | https://iiif.io/api/image/3.0/example/reference/9ee11092dfd2782634f5e8e2c87c16d5-uclamss_1841_diary_07_02/full/max/0/default.jpg | image 1 | mqx9gv5g | 3152 | 2251 | | | +| | qjsby8fe | | 1 | https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/canvas/v2 | | https://iiif.io/api/image/3.0/example/reference/9ee11092dfd2782634f5e8e2c87c16d5-uclamss_1841_diary_07_03/full/max/0/default.jpg | image 2 | mqx9gv5g | 3135 | 2268 | | | +| | pkbdan7n | | 2 | https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/canvas/v3 | | https://iiif.io/api/image/3.0/example/reference/9ee11092dfd2782634f5e8e2c87c16d5-uclamss_1841_diary_07_04/full/max/0/default.jpg | image 3 | mqx9gv5g | 3135 | 2274 | | | +| | jbs7ryp2 | | 3 | https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/canvas/v4 | | https://iiif.io/api/image/3.0/example/reference/9ee11092dfd2782634f5e8e2c87c16d5-uclamss_1841_diary_07_05/full/max/0/default.jpg | image 4 | mqx9gv5g | 3135 | 2268 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/mqx9gv5g", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "apgke53v", + "canvasOrder": 0, + "label": { + "en": [ + "image 1" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/9ee11092dfd2782634f5e8e2c87c16d5-uclamss_1841_diary_07_02/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "qjsby8fe", + "canvasOrder": 1, + "label": { + "en": [ + "image 2" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/9ee11092dfd2782634f5e8e2c87c16d5-uclamss_1841_diary_07_03/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "pkbdan7n", + "canvasOrder": 2, + "label": { + "en": [ + "image 3" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/9ee11092dfd2782634f5e8e2c87c16d5-uclamss_1841_diary_07_04/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "jbs7ryp2", + "canvasOrder": 3, + "label": { + "en": [ + "image 4" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/9ee11092dfd2782634f5e8e2c87c16d5-uclamss_1841_diary_07_05/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Book 'behavior' Variations (continuous, individuals) +https://iiif.io/api/cookbook/recipe/0011-book-3-behavior/manifest-individuals.json + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ------- | -------- | ----------- | ----------- | ------------------------------------------------------------------ | ----------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ---------- | ------------ | ----------- | ------ | --------- | +| | budzre9h | | 0 | https://iiif.io/api/cookbook/recipe/0011-book-3-behavior/canvas/v1 | | https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-0-21198-zz00022840-1-master/full/max/0/default.jpg | inside cover; 1r | ryxfge2g | 2250 | 3375 | | | +| | j92qvmxr | | 1 | https://iiif.io/api/cookbook/recipe/0011-book-3-behavior/canvas/v2 | | https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-1-21198-zz00022882-1-master/full/max/0/default.jpg | 2v, 3r | ryxfge2g | 2250 | 3375 | | | +| | kd7cud8v | | 2 | https://iiif.io/api/cookbook/recipe/0011-book-3-behavior/canvas/v3 | | https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-2-21198-zz000228b3-1-master/full/max/0/default.jpg | 3v, 4r | ryxfge2g | 2250 | 3375 | | | +| | utee4774 | | 3 | https://iiif.io/api/cookbook/recipe/0011-book-3-behavior/canvas/v4 | | https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-3-21198-zz000228d4-1-master/full/max/0/default.jpg | 4v, 5r | ryxfge2g | 2250 | 3375 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/ryxfge2g", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "budzre9h", + "canvasOrder": 0, + "label": { + "en": [ + "inside cover; 1r" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-0-21198-zz00022840-1-master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "j92qvmxr", + "canvasOrder": 1, + "label": { + "en": [ + "2v, 3r" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-1-21198-zz00022882-1-master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "kd7cud8v", + "canvasOrder": 2, + "label": { + "en": [ + "3v, 4r" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-2-21198-zz000228b3-1-master/full/max/0/default.jpg" + } + }, + { + "canvasPainting": { + "canvas": "utee4774", + "canvasOrder": 3, + "label": { + "en": [ + "4v, 5r" + ] + }, + "externalAssetId": "https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-3-21198-zz000228d4-1-master/full/max/0/default.jpg" + } + } + ] +} +``` + + + + +## Wunder internal +https://dlcs.io/iiif-resource/wellcome/preview/5/b18035723 + + +### canvas_painting rows + +| AssetId | CanvasId | CanvasLabel | CanvasOrder | CanvasOriginalId | ChoiceOrder | ExternalAssetId | Label | ManifestId | StaticHeight | StaticWidth | Target | Thumbnail | +| ---------------------- | -------- | ----------- | ----------- | ----------------------------------------------------------- | ----------- | --------------- | --------- | ---------- | ------------ | ----------- | ------ | --------- | +| 2/5/b18035723_0001.JP2 | jmkcg3s4 | | 0 | https://dlcs.io/iiif-img/2/5/b18035723_0001.JP2/canvas/c/1 | | | Canvas 1 | faahqndv | 1024 | 742 | | | +| 2/5/b18035723_0002.JP2 | zqwdyvez | | 1 | https://dlcs.io/iiif-img/2/5/b18035723_0002.JP2/canvas/c/2 | | | Canvas 2 | faahqndv | 1024 | 751 | | | +| 2/5/b18035723_0003.JP2 | y739jy99 | | 2 | https://dlcs.io/iiif-img/2/5/b18035723_0003.JP2/canvas/c/3 | | | Canvas 3 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0004.JP2 | k958s3kh | | 3 | https://dlcs.io/iiif-img/2/5/b18035723_0004.JP2/canvas/c/4 | | | Canvas 4 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0005.JP2 | d5hpss4t | | 4 | https://dlcs.io/iiif-img/2/5/b18035723_0005.JP2/canvas/c/5 | | | Canvas 5 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0006.JP2 | g357b4we | | 5 | https://dlcs.io/iiif-img/2/5/b18035723_0006.JP2/canvas/c/6 | | | Canvas 6 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0007.JP2 | aa7ektzy | | 6 | https://dlcs.io/iiif-img/2/5/b18035723_0007.JP2/canvas/c/7 | | | Canvas 7 | faahqndv | 1024 | 752 | | | +| 2/5/b18035723_0008.JP2 | rv7wcb2e | | 7 | https://dlcs.io/iiif-img/2/5/b18035723_0008.JP2/canvas/c/8 | | | Canvas 8 | faahqndv | 1024 | 750 | | | +| 2/5/b18035723_0009.JP2 | w3tqrx3s | | 8 | https://dlcs.io/iiif-img/2/5/b18035723_0009.JP2/canvas/c/9 | | | Canvas 9 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0010.JP2 | su4b6y9f | | 9 | https://dlcs.io/iiif-img/2/5/b18035723_0010.JP2/canvas/c/10 | | | Canvas 10 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0011.JP2 | r868r98y | | 10 | https://dlcs.io/iiif-img/2/5/b18035723_0011.JP2/canvas/c/11 | | | Canvas 11 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0012.JP2 | nzf57mrn | | 11 | https://dlcs.io/iiif-img/2/5/b18035723_0012.JP2/canvas/c/12 | | | Canvas 12 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0013.JP2 | kw7rebjz | | 12 | https://dlcs.io/iiif-img/2/5/b18035723_0013.JP2/canvas/c/13 | | | Canvas 13 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0014.JP2 | mbs6wkpu | | 13 | https://dlcs.io/iiif-img/2/5/b18035723_0014.JP2/canvas/c/14 | | | Canvas 14 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0015.JP2 | c7z8txks | | 14 | https://dlcs.io/iiif-img/2/5/b18035723_0015.JP2/canvas/c/15 | | | Canvas 15 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0016.JP2 | xa57vq7t | | 15 | https://dlcs.io/iiif-img/2/5/b18035723_0016.JP2/canvas/c/16 | | | Canvas 16 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0017.JP2 | jmnhcf49 | | 16 | https://dlcs.io/iiif-img/2/5/b18035723_0017.JP2/canvas/c/17 | | | Canvas 17 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0018.JP2 | b2tvjhyj | | 17 | https://dlcs.io/iiif-img/2/5/b18035723_0018.JP2/canvas/c/18 | | | Canvas 18 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0019.JP2 | uc57htnk | | 18 | https://dlcs.io/iiif-img/2/5/b18035723_0019.JP2/canvas/c/19 | | | Canvas 19 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0020.JP2 | az3f2jxq | | 19 | https://dlcs.io/iiif-img/2/5/b18035723_0020.JP2/canvas/c/20 | | | Canvas 20 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0021.JP2 | v9zshwzm | | 20 | https://dlcs.io/iiif-img/2/5/b18035723_0021.JP2/canvas/c/21 | | | Canvas 21 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0022.JP2 | hcbp23w4 | | 21 | https://dlcs.io/iiif-img/2/5/b18035723_0022.JP2/canvas/c/22 | | | Canvas 22 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0023.JP2 | e6qvbf6j | | 22 | https://dlcs.io/iiif-img/2/5/b18035723_0023.JP2/canvas/c/23 | | | Canvas 23 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0024.JP2 | j68fhrkc | | 23 | https://dlcs.io/iiif-img/2/5/b18035723_0024.JP2/canvas/c/24 | | | Canvas 24 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0025.JP2 | r59v26f2 | | 24 | https://dlcs.io/iiif-img/2/5/b18035723_0025.JP2/canvas/c/25 | | | Canvas 25 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0026.JP2 | rfpdcerv | | 25 | https://dlcs.io/iiif-img/2/5/b18035723_0026.JP2/canvas/c/26 | | | Canvas 26 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0027.JP2 | m63ry8vd | | 26 | https://dlcs.io/iiif-img/2/5/b18035723_0027.JP2/canvas/c/27 | | | Canvas 27 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0028.JP2 | rmjcqwa9 | | 27 | https://dlcs.io/iiif-img/2/5/b18035723_0028.JP2/canvas/c/28 | | | Canvas 28 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0029.JP2 | cfdwx5f9 | | 28 | https://dlcs.io/iiif-img/2/5/b18035723_0029.JP2/canvas/c/29 | | | Canvas 29 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0030.JP2 | k7bk3mq5 | | 29 | https://dlcs.io/iiif-img/2/5/b18035723_0030.JP2/canvas/c/30 | | | Canvas 30 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0031.JP2 | cakfphvs | | 30 | https://dlcs.io/iiif-img/2/5/b18035723_0031.JP2/canvas/c/31 | | | Canvas 31 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0032.JP2 | su87uqvn | | 31 | https://dlcs.io/iiif-img/2/5/b18035723_0032.JP2/canvas/c/32 | | | Canvas 32 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0033.JP2 | mtsvw95b | | 32 | https://dlcs.io/iiif-img/2/5/b18035723_0033.JP2/canvas/c/33 | | | Canvas 33 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0034.JP2 | t556bt2k | | 33 | https://dlcs.io/iiif-img/2/5/b18035723_0034.JP2/canvas/c/34 | | | Canvas 34 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0035.JP2 | watv7f62 | | 34 | https://dlcs.io/iiif-img/2/5/b18035723_0035.JP2/canvas/c/35 | | | Canvas 35 | faahqndv | 1024 | 732 | | | +| 2/5/b18035723_0036.JP2 | na7hs4cy | | 35 | https://dlcs.io/iiif-img/2/5/b18035723_0036.JP2/canvas/c/36 | | | Canvas 36 | faahqndv | 1024 | 732 | | | + + +### paintedResources property in DLCS Manifest + +```json +{ + "id": "https://dlc.services/iiif/99/manifests/faahqndv", + "type": "Manifest", + "paintedResources": [ + { + "canvasPainting": { + "canvas": "jmkcg3s4", + "canvasOrder": 0, + "label": { + "en": [ + "Canvas 1" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0001.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "zqwdyvez", + "canvasOrder": 1, + "label": { + "en": [ + "Canvas 2" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0002.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "y739jy99", + "canvasOrder": 2, + "label": { + "en": [ + "Canvas 3" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0003.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "k958s3kh", + "canvasOrder": 3, + "label": { + "en": [ + "Canvas 4" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0004.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "d5hpss4t", + "canvasOrder": 4, + "label": { + "en": [ + "Canvas 5" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0005.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "g357b4we", + "canvasOrder": 5, + "label": { + "en": [ + "Canvas 6" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0006.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "aa7ektzy", + "canvasOrder": 6, + "label": { + "en": [ + "Canvas 7" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0007.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "rv7wcb2e", + "canvasOrder": 7, + "label": { + "en": [ + "Canvas 8" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0008.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "w3tqrx3s", + "canvasOrder": 8, + "label": { + "en": [ + "Canvas 9" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0009.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "su4b6y9f", + "canvasOrder": 9, + "label": { + "en": [ + "Canvas 10" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0010.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "r868r98y", + "canvasOrder": 10, + "label": { + "en": [ + "Canvas 11" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0011.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "nzf57mrn", + "canvasOrder": 11, + "label": { + "en": [ + "Canvas 12" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0012.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "kw7rebjz", + "canvasOrder": 12, + "label": { + "en": [ + "Canvas 13" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0013.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "mbs6wkpu", + "canvasOrder": 13, + "label": { + "en": [ + "Canvas 14" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0014.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "c7z8txks", + "canvasOrder": 14, + "label": { + "en": [ + "Canvas 15" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0015.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "xa57vq7t", + "canvasOrder": 15, + "label": { + "en": [ + "Canvas 16" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0016.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "jmnhcf49", + "canvasOrder": 16, + "label": { + "en": [ + "Canvas 17" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0017.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "b2tvjhyj", + "canvasOrder": 17, + "label": { + "en": [ + "Canvas 18" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0018.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "uc57htnk", + "canvasOrder": 18, + "label": { + "en": [ + "Canvas 19" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0019.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "az3f2jxq", + "canvasOrder": 19, + "label": { + "en": [ + "Canvas 20" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0020.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "v9zshwzm", + "canvasOrder": 20, + "label": { + "en": [ + "Canvas 21" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0021.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "hcbp23w4", + "canvasOrder": 21, + "label": { + "en": [ + "Canvas 22" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0022.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "e6qvbf6j", + "canvasOrder": 22, + "label": { + "en": [ + "Canvas 23" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0023.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "j68fhrkc", + "canvasOrder": 23, + "label": { + "en": [ + "Canvas 24" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0024.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "r59v26f2", + "canvasOrder": 24, + "label": { + "en": [ + "Canvas 25" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0025.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "rfpdcerv", + "canvasOrder": 25, + "label": { + "en": [ + "Canvas 26" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0026.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "m63ry8vd", + "canvasOrder": 26, + "label": { + "en": [ + "Canvas 27" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0027.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "rmjcqwa9", + "canvasOrder": 27, + "label": { + "en": [ + "Canvas 28" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0028.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "cfdwx5f9", + "canvasOrder": 28, + "label": { + "en": [ + "Canvas 29" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0029.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "k7bk3mq5", + "canvasOrder": 29, + "label": { + "en": [ + "Canvas 30" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0030.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "cakfphvs", + "canvasOrder": 30, + "label": { + "en": [ + "Canvas 31" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0031.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "su87uqvn", + "canvasOrder": 31, + "label": { + "en": [ + "Canvas 32" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0032.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "mtsvw95b", + "canvasOrder": 32, + "label": { + "en": [ + "Canvas 33" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0033.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "t556bt2k", + "canvasOrder": 33, + "label": { + "en": [ + "Canvas 34" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0034.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "watv7f62", + "canvasOrder": 34, + "label": { + "en": [ + "Canvas 35" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0035.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + }, + { + "canvasPainting": { + "canvas": "na7hs4cy", + "canvasOrder": 35, + "label": { + "en": [ + "Canvas 36" + ] + } + }, + "asset": { + "id": "2/5/b18035723_0036.JP2", + "mediaType": "example/contentType", + "origin": "s3://bucket/key" + } + } + ] +} +``` + + + diff --git a/src/CanvasPaintings/Mapper/DlcsApi/Asset.cs b/src/CanvasPaintings/Mapper/DlcsApi/Asset.cs new file mode 100644 index 00000000..0436f4d5 --- /dev/null +++ b/src/CanvasPaintings/Mapper/DlcsApi/Asset.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mapper.DlcsApi +{ + /// + /// In this demo this is a stand-in for DLCS Hydra Image (Asset) + /// + public class Asset + { + public required string Id { get; set; } + public required string MediaType { get; set; } + public required string Origin { get; set; } + } +} diff --git a/src/CanvasPaintings/Mapper/DlcsApi/CanvasPainting.cs b/src/CanvasPaintings/Mapper/DlcsApi/CanvasPainting.cs new file mode 100644 index 00000000..92473748 --- /dev/null +++ b/src/CanvasPaintings/Mapper/DlcsApi/CanvasPainting.cs @@ -0,0 +1,14 @@ +using IIIF.Presentation.V3.Strings; + +namespace Mapper.DlcsApi +{ + public class CanvasPainting + { + public required string Canvas { get; set; } + public int CanvasOrder { get; set; } + public int? ChoiceOrder { get; set; } + public LanguageMap? Label { get; set; } + public string? ExternalAssetId { get; set; } + public LanguageMap? CanvasLabel { get; internal set; } + } +} diff --git a/src/CanvasPaintings/Mapper/DlcsApi/PaintedResource.cs b/src/CanvasPaintings/Mapper/DlcsApi/PaintedResource.cs new file mode 100644 index 00000000..33c4b0a9 --- /dev/null +++ b/src/CanvasPaintings/Mapper/DlcsApi/PaintedResource.cs @@ -0,0 +1,9 @@ + +namespace Mapper.DlcsApi +{ + public class PaintedResource + { + public required CanvasPainting CanvasPainting { get; set; } + public Asset? Asset { get; set; } + } +} diff --git a/src/CanvasPaintings/Mapper/DlcsApi/PseudoManifest.cs b/src/CanvasPaintings/Mapper/DlcsApi/PseudoManifest.cs new file mode 100644 index 00000000..aca8fd5e --- /dev/null +++ b/src/CanvasPaintings/Mapper/DlcsApi/PseudoManifest.cs @@ -0,0 +1,10 @@ +namespace Mapper.DlcsApi +{ + public class PseudoManifest + { + public required string Id { get; set; } + public string Type => "Manifest"; + + public List PaintedResources { get; set; } = []; + } +} diff --git a/src/CanvasPaintings/Mapper/Entities/DBCanvasPainting.cs b/src/CanvasPaintings/Mapper/Entities/DBCanvasPainting.cs new file mode 100644 index 00000000..6ea17be9 --- /dev/null +++ b/src/CanvasPaintings/Mapper/Entities/DBCanvasPainting.cs @@ -0,0 +1,95 @@ +using IIIF.Presentation.V3.Strings; + +namespace Mapper.Entities +{ + public class DBCanvasPainting + { + /// + /// Alphanumeric flat id from the manifests table: associates an asset with a manifest + /// + public required string ManifestId { get; set; } + + /// + /// Canvases in Manifests always use a flat id, something like https://dlcs.io/iiif/canvases/ae4567rd, + /// rather than anything path-based. If requested directly, IIIF-CS returns canvas from this table with + /// partOf pointing at manifest(s). canvas_id might not be unique within this table if the asset is + /// painted in more than one Manifest + /// + public required string CanvasId { get; set; } + + /// + /// A fully qualified external URL used when canvas_id is not managed; e.g., manifest was made externally. + /// + public string? CanvasOriginalId { get; set; } + + /// + /// Canvas sequence order within a Manifest. This keeps incrementing for successive paintings + /// on the same canvas, it is always >= number of canvases in the manifest. For most manifests, + /// the number of rows equals the highest value of this. It stays the same for successive content + /// resources within a Choice (see choice_order). It gets recalculated on a Manifest save by + /// walking through the manifest.items, incrementing as we go. + /// + public int CanvasOrder { get; set; } + + /// + /// Normally null; a positive integer indicates that the asset is part of a Choice body. + /// Multiple choice bodies share same value of order. When the successive content resources + /// are items in a Choice body, canvas_order holds constant and this row increments. + /// + public int? ChoiceOrder { get; set; } + + /// + /// Platform asset ID (cust/space/id) to be painted on the canvas - may be null if external. + /// This is the resource that is the body (or one of the choice items), which may have further + /// services, adjuncts that the platform knows about. But we don't store the body JSON here, + /// and if it's not a platform asset, we don't have any record of the body - JSON is king. + /// + public string? AssetId { get; set; } + + /// + /// If the painting annotation is not a platform-managed asset in this instance of the DLCS, + /// store the Asset ID here. + /// This may well be a parameterisation of an image service, but we'll just record it as an + /// asset. The information is available for interrogation in the JSON. + /// + public string? ExternalAssetId { get; set; } + + /// + /// As with manifest - URI of a 100px thumb. Could be derived from asset id though? + /// So may be null most of the time. + /// + public string? Thumbnail { get; set; } + + /// + /// Stored language map, is the same as the on the canvas, may be null where it is not + /// contributing to the canvas, should be used for choice, multiples etc. + /// (becomes JSON column in the DB) + /// + public LanguageMap? Label { get; set; } + + /// + /// Only needed if the canvas label is not to be the first asset label; + /// multiple assets on a canvas use the first. + /// + public LanguageMap? CanvasLabel { get; set; } + + /// + /// null if fills whole canvas, otherwise a parseable IIIF selector (fragment or JSON) + /// + public string? Target { get; set; } + + /// + /// For images, the width of the image in the Manifest for which the IIIF API is a service. + /// This and static_height next two default to 0 in which case the largest thumbnail size + /// is used - which may be a secret thumbnail. + /// + public int? StaticWidth { get; set; } + + /// + /// For images, the height of the image in the Manifest for which the IIIF API is a service. + /// + public int? StaticHeight { get; set; } + + + } +} diff --git a/src/CanvasPaintings/Mapper/Identity/Identifiable.cs b/src/CanvasPaintings/Mapper/Identity/Identifiable.cs new file mode 100644 index 00000000..b3567bee --- /dev/null +++ b/src/CanvasPaintings/Mapper/Identity/Identifiable.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mapper.Identity +{ + public class Identifiable + { + private static readonly char[] Numbers = "23456789".ToCharArray(); // not 1, 0 + private static readonly char[] Letters = "abcdefghjkmnpqrstuvwxyz".ToCharArray(); // not i, l, o + private static readonly char[] All = [.. Numbers, .. Letters]; + + public static string Generate(int length = 8, bool letterFirst = true) + { + Random random = new Random(); + var sb = new StringBuilder(length); + for (int i = 0; i < length; i++) + { + if (letterFirst && i == 0) + { + sb.Append(Letters[random.Next(Letters.Length)]); + } + else + { + sb.Append(All[random.Next(All.Length)]); + } + } + return sb.ToString(); + } + } +} diff --git a/src/CanvasPaintings/Mapper/Mapper.csproj b/src/CanvasPaintings/Mapper/Mapper.csproj new file mode 100644 index 00000000..0fce2372 --- /dev/null +++ b/src/CanvasPaintings/Mapper/Mapper.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/src/CanvasPaintings/Mapper/Parser.cs b/src/CanvasPaintings/Mapper/Parser.cs new file mode 100644 index 00000000..c069489f --- /dev/null +++ b/src/CanvasPaintings/Mapper/Parser.cs @@ -0,0 +1,224 @@ +using IIIF.Presentation.V3; +using IIIF.Presentation.V3.Annotation; +using IIIF.Presentation.V3.Content; +using IIIF.Serialisation; +using Mapper.DlcsApi; +using Mapper.Entities; +using Mapper.Identity; + +namespace Mapper +{ + public class Parser + { + public List ParseManifest(Manifest manifest) + { + var canvasPaintings = new List(); + + // We're only doing this because we're not simulating a Manifests table. + // IRL this will be known and fixed. + var manifestId = Identifiable.Generate(8); + int canvasOrder = 0; + + foreach(var canvas in manifest.Items ?? []) + { + // similarly, we only do this when saving a Manifest for the first time, + // or if we see a new Canvas in the incoming manifest. + // Otherwise, we identify the incoming Canvas from its `id`, + // which we match to either the canvas_id field OR the original_canvas_id field. + var canvasId = Identifiable.Generate(8); + bool canvasLabelHasBeenSet = false; + + foreach(var annoPage in canvas.Items ?? []) + { + foreach (var anno in annoPage.Items ?? []) + { + if(anno is PaintingAnnotation painting) + { + var target = painting.Target; + var body = painting.Body; + if (body is PaintingChoice choice) + { + int constCanvasOrder = canvasOrder; + bool first = true; + int choiceOrder = 1; // (not -1; "a positive integer indicates that the asset is part of a Choice body.") + + foreach (var choiceItem in choice.Items ?? []) + { + var resource = choiceItem as ResourceBase; + if (resource is SpecificResource specificResource) + { + resource = specificResource.Source as ResourceBase; + } + if (resource is Image || resource is Video || resource is Sound) + { + var cp = GetEntity(resource, manifestId, canvasId, canvas.Id!, constCanvasOrder, choiceOrder, target, canvas); + if (cp != null) + { + choiceOrder++; + if (first) + { + canvasOrder++; + first = false; + } + target = null; // don't apply it to subsequent members of the choice + canvasPaintings.Add(cp); + + + // can't do this as PaintingChoice is not a Resourcebase - maybe it should be? + // choiceCP.Label = resource?.Label ?? choice.Label ?? painting.Label ?? canvas.Label; + cp.Label = resource?.Label ?? painting.Label ?? canvas.Label; + if (!canvasLabelHasBeenSet && canvas.Label != null && canvas.Label != cp.Label) + { + cp.CanvasLabel = canvas.Label; + canvasLabelHasBeenSet = true; + } + } + else + { + // body could be a Canvas - will need to handle that eventually but not right now + // It is handled by unpacking the canvas into another loop through this + throw new NotImplementedException("Not yet support canvases as painting anno bodies"); + } + } + } + } + else + { + var resource = body as ResourceBase; + if (resource is SpecificResource specificResource) + { + resource = specificResource.Source as ResourceBase; + } + if (resource == null) + { + throw new NotImplementedException("Body type " + body + " Not yet supported as painting anno body."); + } + var cp = GetEntity(resource, manifestId, canvasId, canvas.Id!, canvasOrder, null, target, canvas); + if (cp != null) + { + canvasOrder++; + canvasPaintings.Add(cp); + cp.Label = resource?.Label ?? painting.Label ?? canvas.Label; + if (!canvasLabelHasBeenSet && canvas.Label != null && canvas.Label != cp.Label) + { + cp.CanvasLabel = canvas.Label; + canvasLabelHasBeenSet = true; + } + } + } + } + } + } + } + + return canvasPaintings; + } + + private DBCanvasPainting GetEntity( + ResourceBase resource, + string manifestId, + string canvasId, + string canvasOriginalId, + int canvasOrder, + int? choiceOrder, + IStructuralLocation? target, + Canvas currentCanvas) + { + var cp = new DBCanvasPainting + { + ManifestId = manifestId, + CanvasId = canvasId, + CanvasOriginalId = canvasOriginalId, // do we always set this? + CanvasOrder = canvasOrder, + ChoiceOrder = choiceOrder, + Target = TargetAsString(target, currentCanvas) + }; + if (resource is ISpatial spatial) + { + cp.StaticWidth = spatial.Width; + cp.StaticHeight = spatial.Height; + } + AssignAssetId(resource, cp); + return cp; + } + + private void AssignAssetId(ResourceBase resource, DBCanvasPainting cp) + { + // obviously this is not hardcoded IRL + const string DlcServices = "https://dlc.services/"; + const string DlcsIo = "https://dlcs.io/"; + + if (resource is Image || resource is Video || resource is Sound) + { + // How can we tell it's one of ours? + // This logic may change in future, and we need to deal with rewritten assets. + // We're going to assume that if the body path matches one of our derivative routes, + // then it's ours, without checking to see if there's a service. + // We also need to extend this for born digital Wellcome pattern. + if(resource.Id != null) + { + if(resource.Id.StartsWith(DlcServices) || resource.Id.StartsWith(DlcsIo)) + { + // Is in an assetty path? + var parts = resource.Id.Split('/', StringSplitOptions.RemoveEmptyEntries); + if (parts.Length >= 6 && (parts[2] == "iiif-img" || parts[2] == "iiif-av" || parts[2] == "file")) + { + cp.AssetId = $"{parts[3]}/{parts[4]}/{parts[5]}"; + return; + } + } + } + cp.ExternalAssetId = resource.Id; + } + } + + private string? TargetAsString(IStructuralLocation? target, Canvas currentCanvas) + { + if (target == null) return null; + if(target is Canvas canvas) + { + if(currentCanvas.Id == canvas.Id) + { + // This indicates that we are targetting the whole canvas + return null; + } + return canvas.Id; + } + if(target is SpecificResource specificResource) + { + return specificResource.AsJson(); + } + return null; + } + + public List GetPaintedResources(List entities) + { + var paintedResources = new List(); + foreach (var entity in entities) + { + var cp = new CanvasPainting + { + Canvas = entity.CanvasId, + CanvasOrder = entity.CanvasOrder, + ChoiceOrder = entity.ChoiceOrder, + Label = entity.Label, + CanvasLabel = entity.CanvasLabel, + ExternalAssetId = entity.ExternalAssetId + }; + var pr = new PaintedResource { CanvasPainting = cp }; + if (entity.AssetId != null) + { + pr.Asset = new Asset + { + // Just an example of joining the AssetID to the asset table. + Id = entity.AssetId, + MediaType = "example/contentType", + Origin = "s3://bucket/key" + }; + } + paintedResources.Add(pr); + } + return paintedResources; + } + } +}