├── .ruby-version ├── recipe ├── 0068-newspaper │ ├── .gitignore │ └── newspaper_title-collection.json ├── 0035-foldouts │ ├── foldout.png │ ├── layout_example1.jpg │ └── index.md ├── 0033-choice │ ├── choice-flap.png │ ├── image_registration.png │ └── manifest.json ├── 0485-contentstate-canvas-region │ ├── page.jpg │ └── annotation.json ├── 0309-annotation-collection │ ├── diagram-309.png │ ├── diagram-309.graffle │ └── anno_coll.json ├── 0561-text-on-image │ ├── image_visible_text.png │ └── manifest.json ├── 0326-annotating-image-layer │ └── layerannotation.png ├── 0036-composition-from-multiple-images │ ├── combined.png │ ├── detail.png │ ├── chateauroux.jpg │ └── manifest.json ├── 0139-geolocate-canvas-fragment │ └── images │ │ ├── piece2.png │ │ └── leaflet_example.png ├── 0540-link-for-opening-multiple-canvases │ ├── canvases_sides_by_side.jpeg │ ├── annotation.json │ ├── manifest-2.json │ └── manifest.json ├── 0000_template │ ├── manifest.json │ └── index.md ├── 0045-css │ └── style.css ├── 0032-collection │ ├── collection.json │ ├── manifest-02.json │ └── manifest-01.json ├── 0030-multi-volume │ └── collection.json ├── 0269-embedded-or-referenced-annotations │ ├── annotationpage.json │ └── manifest.json ├── all.md ├── 0002-mvm-audio │ ├── manifest.json │ └── index.md ├── 0306-linking-annotations-to-manifests │ ├── annotationpage.json │ ├── manifest.json │ └── index.md ├── 0001-mvm-image │ └── manifest.json ├── 0057-publishing-v2-and-v3 │ ├── manifest-v3.json │ └── manifest-v2.json ├── 0004-canvas-size │ ├── manifest.json │ └── index.md ├── 0003-mvm-video │ ├── manifest.json │ └── index.md ├── 0005-image-service │ └── manifest.json ├── 0230-navdate │ ├── navdate-collection.json │ ├── navdate_map_1-manifest.json │ └── navdate_map_2-manifest.json ├── 0017-transcription-av │ ├── manifest.json │ └── index.md ├── 0047-homepage │ ├── manifest.json │ └── index.md ├── 0118-multivalue │ ├── manifest.json │ └── index.md ├── 0299-region │ └── manifest.json ├── 0154-geo-extension │ └── manifest.json ├── 0074-multiple-language-captions │ ├── Per_voi_signore_Modelli_francesi_en.vtt │ └── Per_voi_signore_Modelli_francesi_it.vtt ├── 0015-start │ ├── manifest.json │ └── index.md ├── 0021-tagging │ ├── manifest.json │ └── index.md ├── 0065-opera-multiple-canvases │ └── index.md ├── 0219-using-caption-file │ ├── manifest.json │ └── index.md ├── 0008-rights │ └── manifest.json ├── 0135-annotating-point-in-canvas │ ├── index.md │ └── manifest.json ├── 0103-poetry-reading-annotations │ ├── index.md │ └── manifest.json ├── 0258-tagging-external-resource │ ├── manifest.json │ └── index.md ├── 0266-full-canvas-annotation │ └── manifest.json ├── 0014-accompanyingcanvas │ ├── manifest.json │ └── index.md ├── 0040-image-rotation-service │ ├── manifest-css.json │ └── manifest-service.json ├── 0007-string-formats │ ├── manifest.json │ └── index.md ├── 0013-placeholderCanvas │ ├── manifest.json │ └── index.md ├── 0064-opera-one-canvas │ └── index.md ├── 0346-multilingual-annotation-body │ └── manifest.json ├── 0202-start-canvas │ └── index.md ├── 0019-html-in-annotations │ └── manifest.json ├── 0318-navPlace-navDate │ ├── manifest-2.json │ ├── manifest-1.json │ ├── manifest-4.json │ ├── manifest-5.json │ ├── manifest-3.json │ └── index.md ├── 0006-text-language │ └── manifest.json ├── 0377-image-in-annotation │ ├── manifest.json │ └── index.md ├── 0560-resources-on-a-timeline │ └── manifest.json ├── 0261-non-rectangular-commenting │ └── manifest.json ├── 0026-toc-opera │ ├── manifest.json │ └── index.md ├── 0466-link-for-loading-manifest │ └── index.md ├── 0232-image-thumbnail-canvas │ └── manifest-av.json ├── 0024-book-4-toc │ └── index.md ├── 0029-metadata-anywhere │ └── index.md ├── 0117-add-image-thumbnail │ ├── manifest.json │ └── index.md ├── 0027-alternative-page-order │ └── index.md └── 0464-reuse-manifest │ └── manifest.json ├── .github ├── bin │ └── addURL.sh └── ISSUE_TEMPLATE │ ├── recipe-correction.md │ └── recipe-issue-template.md ├── _includes ├── acronyms.md ├── jsonviewer.html ├── code_link.html ├── code_links.html ├── manifest_links.html └── content-state-viewers.html ├── favicon.ico ├── scripts ├── requirements.txt └── validate.sh ├── .gitignore ├── _data ├── viewer_ignore.yml ├── navigation.yml ├── organization.yml └── topics.yml ├── assets └── images │ └── icons │ ├── no.png │ ├── yes.png │ ├── optional.png │ └── partial.png ├── Rakefile ├── Gemfile ├── _layouts └── recipe.md ├── _config.yml └── css └── style.css /.ruby-version: -------------------------------------------------------------------------------- 1 | 3.1.0 2 | -------------------------------------------------------------------------------- /recipe/0068-newspaper/.gitignore: -------------------------------------------------------------------------------- 1 | /.project 2 | -------------------------------------------------------------------------------- /.github/bin/addURL.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "url: $URL" >> _config.yml 4 | -------------------------------------------------------------------------------- /_includes/acronyms.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/favicon.ico -------------------------------------------------------------------------------- /scripts/requirements.txt: -------------------------------------------------------------------------------- 1 | jsonschema 2 | requests 3 | jsonpath_rw 4 | python-frontmatter 5 | pyyaml 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | *.swp 3 | presentation-validator 4 | scripts/schema 5 | .jekyll-cache 6 | vendor 7 | -------------------------------------------------------------------------------- /_data/viewer_ignore.yml: -------------------------------------------------------------------------------- 1 | - 0068-newspaper 2 | - 0232-image-thumbnail-canvas 3 | - 0231-transcript-meta-recipe 4 | -------------------------------------------------------------------------------- /assets/images/icons/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/assets/images/icons/no.png -------------------------------------------------------------------------------- /assets/images/icons/yes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/assets/images/icons/yes.png -------------------------------------------------------------------------------- /assets/images/icons/optional.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/assets/images/icons/optional.png -------------------------------------------------------------------------------- /assets/images/icons/partial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/assets/images/icons/partial.png -------------------------------------------------------------------------------- /recipe/0035-foldouts/foldout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0035-foldouts/foldout.png -------------------------------------------------------------------------------- /recipe/0033-choice/choice-flap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0033-choice/choice-flap.png -------------------------------------------------------------------------------- /recipe/0033-choice/image_registration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0033-choice/image_registration.png -------------------------------------------------------------------------------- /recipe/0035-foldouts/layout_example1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0035-foldouts/layout_example1.jpg -------------------------------------------------------------------------------- /recipe/0485-contentstate-canvas-region/page.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0485-contentstate-canvas-region/page.jpg -------------------------------------------------------------------------------- /recipe/0309-annotation-collection/diagram-309.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0309-annotation-collection/diagram-309.png -------------------------------------------------------------------------------- /recipe/0561-text-on-image/image_visible_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0561-text-on-image/image_visible_text.png -------------------------------------------------------------------------------- /recipe/0309-annotation-collection/diagram-309.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0309-annotation-collection/diagram-309.graffle -------------------------------------------------------------------------------- /recipe/0326-annotating-image-layer/layerannotation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0326-annotating-image-layer/layerannotation.png -------------------------------------------------------------------------------- /recipe/0036-composition-from-multiple-images/combined.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0036-composition-from-multiple-images/combined.png -------------------------------------------------------------------------------- /recipe/0036-composition-from-multiple-images/detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0036-composition-from-multiple-images/detail.png -------------------------------------------------------------------------------- /recipe/0139-geolocate-canvas-fragment/images/piece2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0139-geolocate-canvas-fragment/images/piece2.png -------------------------------------------------------------------------------- /_includes/jsonviewer.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /recipe/0036-composition-from-multiple-images/chateauroux.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0036-composition-from-multiple-images/chateauroux.jpg -------------------------------------------------------------------------------- /recipe/0139-geolocate-canvas-fragment/images/leaflet_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0139-geolocate-canvas-fragment/images/leaflet_example.png -------------------------------------------------------------------------------- /_includes/code_link.html: -------------------------------------------------------------------------------- 1 | {% if include.library | strip == "iiif-prezi3" %}Python: iiif-prezi3{% endif %} 2 | -------------------------------------------------------------------------------- /recipe/0540-link-for-opening-multiple-canvases/canvases_sides_by_side.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/cookbook-recipes/master/recipe/0540-link-for-opening-multiple-canvases/canvases_sides_by_side.jpeg -------------------------------------------------------------------------------- /recipe/0000_template/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": [ "http://iiif.io/api/presentation/3/context.json" ], 3 | "id": "{{ id.url }} ", 4 | "type": "Manifest", 5 | "label": { 6 | "none": [""] 7 | }, 8 | "items": [] 9 | } 10 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/recipe-correction.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Recipe correction template 3 | about: Use this template if you find an issue with a recipe 4 | title: '' 5 | labels: 'meta: correction' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Recipe info: 11 | 12 | * Name: 13 | * link: 14 | 15 | ## Correction request 16 | -------------------------------------------------------------------------------- /_data/navigation.yml: -------------------------------------------------------------------------------- 1 | - 2 | name: About 3 | url: /about/ 4 | - 5 | name: Technical Details 6 | url: /technical-details/ 7 | - 8 | name: "Apps & Demos" 9 | url: /apps-demos/ 10 | - 11 | name: Community 12 | url: /community/ 13 | - 14 | name: Events 15 | url: /event/ 16 | - 17 | name: News 18 | url: /news/ 19 | -------------------------------------------------------------------------------- /_data/organization.yml: -------------------------------------------------------------------------------- 1 | name: "IIIF | International Image Interoperability Framework" 2 | description: "International Image Interoperability Framework: A community driven image framework with well defined APIs for making the world’s image repositories interoperable and accessible" 3 | email: "iiif-discuss@googlegroups.com" 4 | url: https://iiif.io 5 | -------------------------------------------------------------------------------- /recipe/0045-css/style.css: -------------------------------------------------------------------------------- 1 | .author1note { 2 | color: #f00; 3 | background-color: #fff; 4 | border-color: #f00; 5 | } 6 | 7 | .author1highlight { 8 | color: #f00; 9 | border-color: #f00; 10 | } 11 | 12 | .author2note { 13 | color: #1a1; 14 | background-color: #fff; 15 | border-color: #0f0; 16 | } 17 | 18 | .author1highlight { 19 | color: #0f0; 20 | border-color: #0f0; 21 | } 22 | -------------------------------------------------------------------------------- /recipe/0309-annotation-collection/anno_coll.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "AnnotationCollection", 5 | "label": { 6 | "en": [ 7 | "Newspaper layout markup" 8 | ] 9 | }, 10 | "total": 8, 11 | "first": "{{ id.path }}/anno_p1.json", 12 | "last": "{{ id.path }}/anno_p2.json" 13 | } 14 | -------------------------------------------------------------------------------- /_includes/code_links.html: -------------------------------------------------------------------------------- 1 | {% capture recipe_id %}{{ page.url | replace: "/recipe/","" | replace: "/",""}}{% endcapture %} 2 | 3 | {% capture libraries %} 4 | {% if include.libraries %} 5 | {{include.libraries}} 6 | {% else %} 7 | {{ page.code }} 8 | {% endif %} 9 | {% endcapture %} 10 | 11 | Code samples: {% for library in libraries %}{% include code_link.html library=library %}{% unless forloop.last %}|{% endunless -%}{% endfor %} 12 | 13 | -------------------------------------------------------------------------------- /_includes/manifest_links.html: -------------------------------------------------------------------------------- 1 | {% if include.viewers %} 2 | {% assign viewers = include.viewers | split: "," %} 3 | {% else %} 4 | {% assign viewers = page.viewers %} 5 | {% endif %} 6 | [JSON-LD]({{ include.manifest }}) {% for viewerTxt in viewers %}{% assign viewer = viewerTxt | strip %}| {% include viewer_link.html type=viewer manifest=include.manifest annotationurl=include.annotationurl %}{% endfor %} 7 | 8 | {% if page.code %} 9 | {% include code_links.html %} 10 | {% endif %} 11 | -------------------------------------------------------------------------------- /_data/topics.yml: -------------------------------------------------------------------------------- 1 | basic: 2 | label: Basic Recipes 3 | property: 4 | label: IIIF Properties 5 | note: 6 | label: Implementation Notes 7 | structure: 8 | label: Structuring Resources 9 | annotation: 10 | label: Annotation Recipes 11 | image: 12 | label: Image Recipes 13 | AV: 14 | label: Audio/Visual Recipes 15 | realWorldObject: 16 | label: Real World Object Recipes 17 | geo-recipes: 18 | label: Geo Recipes 19 | content-state: 20 | label: Recipes involving Content State 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/recipe-issue-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Recipe issue template 3 | about: Provides the minimum required information for a recipe 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Recipe Name 11 | (this will usually be the same as the issue name) 12 | 13 | ## Use case 14 | (This might be the same text as the use case section of the issue, if your recipe is already well understood. Or it might require development in the issue discussion and be more provisional in nature). 15 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | spec = Gem::Specification.find_by_name 'iiifc-theme' 2 | Dir.glob("#{spec.gem_dir}/lib/tasks/*.rake").each { |r| load r } 3 | 4 | # configure default task 5 | task ci: 'cookbook:ci' 6 | task default: :ci 7 | 8 | namespace :cookbook do 9 | desc 'run cookbook tests' 10 | desc 'Build CI site, run html-proofer and spec tests' 11 | task :ci do 12 | Rake::Task['build:ci'].invoke 13 | Rake::Task['test:html'].invoke 14 | Rake::Task['test:links:internal'].invoke 15 | Rake::Task['test:links:iiif'].invoke 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /recipe/0032-collection/collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Collection", 5 | "label": { "en": [ "Simple Collection Example" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/manifest-01.json", 9 | "type": "Manifest", 10 | "label": { "en": [ "The Gulf Stream" ] } 11 | }, 12 | { 13 | "id": "{{ id.path }}/manifest-02.json", 14 | "type": "Manifest", 15 | "label": { "en": [ "Northeaster" ] } 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /recipe/0485-contentstate-canvas-region/annotation.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "https://example.org/import/1", 4 | "type": "Annotation", 5 | "motivation": ["contentState"], 6 | "target": { 7 | "id": "https://iiif.io/api/cookbook/recipe/0009-book-1/canvas/p2#xywh=1528,3024,344,408", 8 | "type": "Canvas", 9 | "partOf": [{ 10 | "id": "https://iiif.io/api/cookbook/recipe/0009-book-1/manifest.json", 11 | "type": "Manifest" 12 | }] 13 | } 14 | } -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'jekyll', '~> 4.1.1' 4 | 5 | # for local development, clone theme + use path loader 6 | # gem 'iiifc-theme', path: 'iiifc-theme' 7 | gem 'iiifc-theme', github: 'iiif/iiifc-theme', branch: 'ignore-font-awsome' 8 | 9 | # For open graph and Twitter Card elements 10 | gem 'jekyll-seo-tag' 11 | 12 | gem "webrick", "~> 1.7" 13 | 14 | # Pining jekyll-liquify as 0.0.3 is broken 15 | gem "jekyll-liquify", "0.0.2" 16 | 17 | group :development, :test do 18 | gem 'html-proofer', "3.19.0" 19 | gem 'rspec' 20 | gem 'rake' 21 | end 22 | -------------------------------------------------------------------------------- /recipe/0030-multi-volume/collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Collection", 5 | "label": { "jp": [ "青楼絵本年中行事 [Seirō ehon nenjū gyōji]" ] }, 6 | "behavior": ["multi-part"], 7 | 8 | "items": [ 9 | { 10 | "id": "{{ id.path }}/manifest_v1.json", 11 | "type": "Manifest", 12 | "label": { "jp": [ "巻 1 [Vol. 1]" ] } 13 | }, 14 | { 15 | "id": "{{ id.path }}/manifest_v2.json", 16 | "type": "Manifest", 17 | "label": { "jp": [ "巻 2 [Vol. 2]" ] } 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /recipe/0269-embedded-or-referenced-annotations/annotationpage.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "AnnotationPage", 5 | "items": [ 6 | { 7 | "id": "{{ id.path }}/canvas-1/annopage-2/anno-1", 8 | "type": "Annotation", 9 | "motivation": "commenting", 10 | "body": { 11 | "type": "TextualBody", 12 | "language": "de", 13 | "format": "text/plain", 14 | "value": "Göttinger Marktplatz mit Gänseliesel Brunnen" 15 | }, 16 | "target": "{{ id.path }}/canvas-1" 17 | } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /_layouts/recipe.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | hero: 4 | image: "https://ids.si.edu/ids/iiif/NMAH-AC0396-0000007/131,1118,1840,1011/1500,/0/default.jpg" 5 | breadcrumbs: 6 | - label: IIIF Cookbook 7 | link: index.html 8 | 9 | --- 10 | 11 | 12 | 13 | {{ content }} 14 | 15 | 16 | 21 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: iiifc-theme 2 | permalink: pretty 3 | 4 | cookbook_url: '' 5 | 6 | plugins: 7 | - jekyll-data 8 | - jekyll-gzip 9 | - jekyll-redirect-from 10 | - jekyll-liquify 11 | - jekyll-seo-tag 12 | # - jekyll-last-modified-at 13 | 14 | highlighter: none 15 | 16 | webrick: 17 | headers: 18 | Access-Control-Allow-Origin: "*" 19 | 20 | exclude: ["Rakefile", "scripts", "Gemfile", "Gemfile.lock", "node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"] 21 | 22 | # notification: 23 | # enabled: true 24 | # title: This website design is in pre-beta. 25 | # subtitle: Lorem ipsum dolor sit amet, consectetur adipiscing elit. 26 | # link: '#' 27 | # link_label: This is a test link 28 | -------------------------------------------------------------------------------- /scripts/validate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ ! -d "scripts/schema" ]; then 4 | git clone https://github.com/IIIF/presentation-validator.git presentation-validator 5 | # cd presentation-validator 6 | # git checkout issue-154 7 | # cd .. 8 | mv presentation-validator/schema scripts 9 | rm -rf presentation-validator 10 | fi 11 | 12 | cd scripts 13 | python3 ./validate.py 14 | if [ $? -eq 1 ];then 15 | echo "Failed to run validator script" 16 | exit 1 17 | fi 18 | 19 | cd .. 20 | echo "Looking for incorrect jpg mime types:" 21 | grep -R "image/jpg" recipe/* 22 | if [ $? -eq 0 ]; then 23 | echo "Mime type for a jpeg files should be 'image/jpeg' not 'image/jpg' in:" 24 | grep -lR "image/jpg" recipe/* 25 | exit 1 26 | fi -------------------------------------------------------------------------------- /recipe/all.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Full recipe list 3 | layout: page 4 | breadcrumbs: 5 | - label: Cookbook Home 6 | link: index.html 7 | --- 8 | 9 | 25 | -------------------------------------------------------------------------------- /recipe/0540-link-for-opening-multiple-canvases/annotation.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Annotation", 5 | "motivation": ["contentState"], 6 | "target": [ 7 | { 8 | "id": "{{ id.path }}/canvas/2", 9 | "type": "Canvas", 10 | "partOf": [ 11 | { 12 | "id": "{{ id.path }}/manifest-2.json", 13 | "type": "Manifest" 14 | } 15 | ] 16 | }, 17 | { 18 | "id": "{{ id.path }}/canvas/p2", 19 | "type": "Canvas", 20 | "partOf": [ 21 | { 22 | "id": "{{ id.path }}/manifest.json", 23 | "type": "Manifest" 24 | } 25 | ] 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | .limit-height { 2 | max-height: 30em; 3 | } 4 | .compact-list + ol { 5 | margin: 0px 0px 0px 0px; 6 | } 7 | 8 | code { 9 | color: black; 10 | font-size: .875em; 11 | font-weight: normal; 12 | background-color: #f2f2f2; 13 | padding: 1px 4px; 14 | border-radius: 3px; 15 | } 16 | 17 | .token.prism-number { 18 | color: #905; 19 | } 20 | 21 | #use-case { 22 | margin-top: 0px; 23 | } 24 | 25 | .code-toolbar { 26 | width: 70vw; 27 | } 28 | 29 | .viewer { 30 | width: 100% !important; 31 | max-width: 800px !important; 32 | display: table !important; 33 | overflow-x: unset !important; 34 | border-width: 0 0 1px !important; 35 | } 36 | 37 | .viewer tr { 38 | border-bottom:1px solid #dbdbdb !important; 39 | } 40 | 41 | .viewer td { 42 | border: none !important; 43 | text-align: center !important; 44 | } 45 | 46 | .scrolling-header { 47 | position: sticky; 48 | top: 0px; 49 | background-color: white; 50 | box-shadow: inset 0 -1px 0 #dbdbdb; 51 | } -------------------------------------------------------------------------------- /recipe/0002-mvm-audio/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "Simplest Audio Example 1" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas", 9 | "type": "Canvas", 10 | "duration": 1985.024, 11 | "items": [ 12 | { 13 | "id": "{{ id.path }}/canvas/page", 14 | "type": "AnnotationPage", 15 | "items": [ 16 | { 17 | "id": "{{ id.path }}/canvas/page/annotation", 18 | "type": "Annotation", 19 | "motivation": "painting", 20 | "body": { 21 | "id": "https://fixtures.iiif.io/audio/indiana/mahler-symphony-3/CD1/medium/128Kbps.mp4", 22 | "type": "Sound", 23 | "format": "audio/mp4", 24 | "duration": 1985.024 25 | }, 26 | "target": "{{ id.path }}/canvas" 27 | } 28 | ] 29 | } 30 | ] 31 | } 32 | ] 33 | } 34 | -------------------------------------------------------------------------------- /recipe/0306-linking-annotations-to-manifests/annotationpage.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "AnnotationPage", 5 | "items": [ 6 | { 7 | "id": "{{ id.path }}/canvas-1/annopage-2/anno-1", 8 | "type": "Annotation", 9 | "motivation": "commenting", 10 | "body": { 11 | "type": "TextualBody", 12 | "language": "de", 13 | "format": "text/plain", 14 | "value": "Der Gänseliesel-Brunnen" 15 | }, 16 | "target": { 17 | "type": "SpecificResource", 18 | "source": { 19 | "id": "{{ id.path }}/canvas-1", 20 | "type": "Canvas", 21 | "partOf": [{ 22 | "id": "{{ id.path }}/manifest.json", 23 | "type": "Manifest" 24 | }] 25 | }, 26 | "selector": { 27 | "type": "FragmentSelector", 28 | "conformsTo": "http://www.w3.org/TR/media-frags/", 29 | "value": "xywh=300,800,1200,1200" 30 | } 31 | } 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /recipe/0001-mvm-image/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "Single Image Example" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas/p1", 9 | "type": "Canvas", 10 | "height": 1800, 11 | "width": 1200, 12 | "items": [ 13 | { 14 | "id": "{{ id.path }}/page/p1/1", 15 | "type": "AnnotationPage", 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/annotation/p0001-image", 19 | "type": "Annotation", 20 | "motivation": "painting", 21 | "body": { 22 | "id": "http://iiif.io/api/presentation/2.1/example/fixtures/resources/page1-full.png", 23 | "type": "Image", 24 | "format": "image/png", 25 | "height": 1800, 26 | "width": 1200 27 | }, 28 | "target": "{{ id.path }}/canvas/p1" 29 | } 30 | ] 31 | } 32 | ] 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /recipe/0057-publishing-v2-and-v3/manifest-v3.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "https://iiif.io/api/cookbook/recipe/0057-publishing-v2-and-v3/manifest.json", 4 | "type": "Manifest", 5 | "label": { "en": [ "IIIF Presentation Version 3 Minimum Viable Manifest" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas/p1", 9 | "type": "Canvas", 10 | "height": 1800, 11 | "width": 1200, 12 | "items": [ 13 | { 14 | "id": "{{ id.path }}/page/p1/1", 15 | "type": "AnnotationPage", 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/annotation/p0001-image", 19 | "type": "Annotation", 20 | "motivation": "painting", 21 | "body": { 22 | "id": "https://iiif.io/api/presentation/2.1/example/fixtures/resources/page1-full.png", 23 | "type": "Image", 24 | "format": "image/png", 25 | "height": 1800, 26 | "width": 1200 27 | }, 28 | "target": "{{ id.path }}/canvas/p1" 29 | } 30 | ] 31 | } 32 | ] 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /recipe/0004-canvas-size/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": ["Still image from an opera performance at Indiana University" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas/p1", 9 | "type": "Canvas", 10 | "height": 1080, 11 | "width": 1920, 12 | "items": [ 13 | { 14 | "id": "{{ id.path }}/page/p1/1", 15 | "type": "AnnotationPage", 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/annotation/p0001-image", 19 | "type": "Annotation", 20 | "motivation": "painting", 21 | "body": { 22 | "id": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/act1-thumbnail.png", 23 | "type": "Image", 24 | "format": "image/png", 25 | "height": 360, 26 | "width": 640 27 | }, 28 | "target": "{{ id.path }}/canvas/p1" 29 | } 30 | ] 31 | } 32 | ] 33 | } 34 | ] 35 | } 36 | 37 | -------------------------------------------------------------------------------- /recipe/0003-mvm-video/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "Video Example 3" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas", 9 | "type": "Canvas", 10 | "height": 360, 11 | "width": 480, 12 | "duration": 572.034, 13 | "items": [ 14 | { 15 | "id": "{{ id.path }}/canvas/page", 16 | "type": "AnnotationPage", 17 | "items": [ 18 | { 19 | "id": "{{ id.path }}/canvas/page/annotation", 20 | "type": "Annotation", 21 | "motivation": "painting", 22 | "body": { 23 | "id": "https://fixtures.iiif.io/video/indiana/lunchroom_manners/high/lunchroom_manners_1024kb.mp4", 24 | "type": "Video", 25 | "height": 360, 26 | "width": 480, 27 | "duration": 572.034, 28 | "format": "video/mp4" 29 | }, 30 | "target": "{{ id.path }}/canvas" 31 | } 32 | ] 33 | } 34 | ] 35 | } 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /recipe/0057-publishing-v2-and-v3/manifest-v2.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/2/context.json", 3 | "@id": "https://iiif.io/api/cookbook/recipe/0057-publishing-v2-and-v3/manifest.json", 4 | "@type": "sc:Manifest", 5 | "label": "IIIF Presentation Version 3 Minimum Viable Manifest", 6 | "sequences": [ 7 | { 8 | "@id": "{{ id.path }}/sequences/s1", 9 | "@type": "sc:Sequence", 10 | "label": "Default", 11 | "canvases": [ 12 | { 13 | "@id": "{{ id.path }}/canvas/p1", 14 | "@type": "sc:Canvas", 15 | "height": 1800, 16 | "width": 1200, 17 | "images": [ 18 | { 19 | "@id": "{{ id.path }}/annotation/p0001-image", 20 | "@type": "oa:Annotation", 21 | "motivation": "sc:painting", 22 | "resource": { 23 | "@id": "https://iiif.io/api/presentation/2.1/example/fixtures/resources/page1-full.png", 24 | "@type": "dctypes:Image", 25 | "format": "image/png", 26 | "height": 1800, 27 | "width": 1200 28 | }, 29 | "on": "{{ id.path }}/canvas/p1" 30 | } 31 | ] 32 | } 33 | ] 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /recipe/0000_template/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Name of Recipe 3 | id: -1 4 | layout: recipe 5 | tags: [tbc] 6 | summary: "tbc" 7 | viewers: 8 | topic: 9 | - basic 10 | --- 11 | 12 | ## Use Case 13 | 14 | Describe the use case that the pattern is intended to solve. 15 | Why is this pattern important? 16 | 17 | ## Implementation Notes 18 | 19 | What do you need to know to use this pattern? 20 | How do you implement the pattern? 21 | 22 | ## Restrictions 23 | 24 | When is this pattern is usable / not usable? Is it deprecated? If it uses multiple specifications, which versions are needed, etc.? 25 | 26 | Delete this section if it is not needed. 27 | If you don't know what the restrictions might be initially, just leave the following line: 28 | **Unknown - Help Needed** 29 | 30 | ## Example 31 | 32 | Describe the solution in prose and provide an example. 33 | The example json document must be an external document, and imported with the following: 34 | 35 | {% include manifest_links.html viewers="UV, Mirador, Annona, Clover, Ramp, Aviary, Glycerine, Theseus, TIFY" manifest="manifest.json" %} 36 | 37 | {% include jsonviewer.html src="manifest.json" %} 38 | 39 | The direct link to the fixture is a useful convenience. 40 | 41 | ## Related Recipes 42 | 43 | Provide a bulleted list of related recipes and why they are relevant. 44 | 45 | {% include acronyms.md %} 46 | {% include links.md %} 47 | -------------------------------------------------------------------------------- /recipe/0005-image-service/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "Picture of Göttingen taken during the 2019 IIIF Conference" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas/p1", 9 | "type": "Canvas", 10 | "label": { "en": [ "Canvas with a single IIIF image" ] }, 11 | "height": 3024, 12 | "width": 4032, 13 | "items": [ 14 | { 15 | "id": "{{ id.path }}/page/p1/1", 16 | "type": "AnnotationPage", 17 | "items": [ 18 | { 19 | "id": "{{ id.path }}/annotation/p0001-image", 20 | "type": "Annotation", 21 | "motivation": "painting", 22 | "body": { 23 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 24 | "type": "Image", 25 | "format": "image/jpeg", 26 | "height": 3024, 27 | "width": 4032, 28 | "service": [ 29 | { 30 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 31 | "profile": "level1", 32 | "type": "ImageService3" 33 | } 34 | ] 35 | }, 36 | "target": "{{ id.path }}/canvas/p1" 37 | } 38 | ] 39 | } 40 | ] 41 | } 42 | ] 43 | } 44 | -------------------------------------------------------------------------------- /recipe/0230-navdate/navdate-collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Collection", 5 | "label": { 6 | "en": [ 7 | "Chesapeake and Ohio Canal map and guide pamphlets" 8 | ] 9 | }, 10 | "thumbnail": [ 11 | { 12 | "id": "https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-88695674/full/max/0/default.jpg", 13 | "type": "Image", 14 | "format": "image/jpeg", 15 | "height": 300, 16 | "width": 221, 17 | "service": [ 18 | { 19 | "id": "https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-88695674", 20 | "profile": "level1", 21 | "type": "ImageService3" 22 | } 23 | ] 24 | } 25 | ], 26 | "items": [ 27 | { 28 | "id": "{{ id.path }}/navdate_map_2-manifest.json", 29 | "type": "Manifest", 30 | "label": { 31 | "en": [ 32 | "1986 Chesapeake and Ohio Canal, Washington, D.C., Maryland, West Virginia, official map and guide" 33 | ] 34 | }, 35 | "navDate": "1986-01-01T00:00:00+00:00" 36 | }, 37 | { 38 | "id": "{{ id.path }}/navdate_map_1-manifest.json", 39 | "type": "Manifest", 40 | "label": { 41 | "en": [ 42 | "1987 Chesapeake and Ohio Canal, Washington, D.C., Maryland, West Virginia, official map and guide" 43 | ] 44 | }, 45 | "navDate": "1987-01-01T00:00:00+00:00" 46 | } 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /recipe/0017-transcription-av/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Volleyball for Boys" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas", 13 | "type": "Canvas", 14 | "height": 1080, 15 | "width": 1920, 16 | "duration": 662.037, 17 | "items": [ 18 | { 19 | "id": "{{ id.path }}/canvas/page", 20 | "type": "AnnotationPage", 21 | "items": [ 22 | { 23 | "id": "{{ id.path }}/canvas/page/annotation", 24 | "type": "Annotation", 25 | "motivation": "painting", 26 | "target": "{{ id.path }}/canvas", 27 | "body": { 28 | "id": "https://fixtures.iiif.io/video/indiana/volleyball/high/volleyball-for-boys.mp4", 29 | "type": "Video", 30 | "format": "video/mp4", 31 | "height": 1080, 32 | "width": 1920, 33 | "duration": 662.037 34 | } 35 | } 36 | ] 37 | } 38 | ], 39 | "rendering": [ 40 | { 41 | "id": "https://fixtures.iiif.io/video/indiana/volleyball/volleyball.txt", 42 | "type": "Text", 43 | "label": { 44 | "en": [ 45 | "Transcript" 46 | ] 47 | }, 48 | "format": "text/plain" 49 | } 50 | ] 51 | } 52 | ] 53 | } 54 | -------------------------------------------------------------------------------- /recipe/0540-link-for-opening-multiple-canvases/manifest-2.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}/manifest-2.json", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "The Colosseum" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas/2", 13 | "type": "Canvas", 14 | "height": 1529, 15 | "width": 2048, 16 | "label": { 17 | "en": [ 18 | "The Colosseum" 19 | ] 20 | }, 21 | "items": [ 22 | { 23 | "id": "{{ id.path }}/anno-page/2", 24 | "type": "AnnotationPage", 25 | "items": [ 26 | { 27 | "id": "{{ id.path }}/anno/2", 28 | "type": "Annotation", 29 | "motivation": "painting", 30 | "body": { 31 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-The_Colosseum/full/max/0/default.jpg", 32 | "type": "Image", 33 | "format": "image/jpeg", 34 | "height": 1529, 35 | "width": 2048, 36 | "service": [ 37 | { 38 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-The_Colosseum", 39 | "profile": "level1", 40 | "type": "ImageService3" 41 | } 42 | ] 43 | }, 44 | "target": "{{ id.path }}/canvas/2" 45 | } 46 | ] 47 | } 48 | ] 49 | } 50 | ] 51 | } -------------------------------------------------------------------------------- /_includes/content-state-viewers.html: -------------------------------------------------------------------------------- 1 | {% if include.viewers %} 2 | {% assign viewers = include.viewers | split: "," %} 3 | {% else %} 4 | {% assign viewers = page.viewers %} 5 | {% endif %} 6 | [JSON-LD]({{ include.iiif-content }}) {% for viewerTxt in viewers %}{% assign viewer = viewerTxt | strip %}| {% include viewer_link.html type=viewer manifest=include.iiif-content class="content-state" %}{% endfor %} 7 | 8 | {% if page.code %} 9 | {% include code_links.html %} 10 | {% endif %} 11 | 12 | -------------------------------------------------------------------------------- /recipe/0306-linking-annotations-to-manifests/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Picture of Göttingen taken during the 2019 IIIF Conference" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas-1", 13 | "type": "Canvas", 14 | "height": 3024, 15 | "width": 4032, 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/canvas-1/annopage-1", 19 | "type": "AnnotationPage", 20 | "items": [ 21 | { 22 | "id": "{{ id.path }}/canvas-1/annopage-1/anno-1", 23 | "type": "Annotation", 24 | "motivation": "painting", 25 | "body": { 26 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 27 | "type": "Image", 28 | "format": "image/jpeg", 29 | "height": 3024, 30 | "width": 4032, 31 | "service": [ 32 | { 33 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 34 | "profile": "level1", 35 | "type": "ImageService3" 36 | } 37 | ] 38 | }, 39 | "target": "{{ id.path }}/canvas-1" 40 | } 41 | ] 42 | } 43 | ], 44 | "annotations": [ 45 | { 46 | "id": "{{ id.path }}/annotationpage.json", 47 | "type": "AnnotationPage" 48 | } 49 | ] 50 | } 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /recipe/0269-embedded-or-referenced-annotations/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Picture of Göttingen taken during the 2019 IIIF Conference" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas-1", 13 | "type": "Canvas", 14 | "height": 3024, 15 | "width": 4032, 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/canvas-1/annopage-1", 19 | "type": "AnnotationPage", 20 | "items": [ 21 | { 22 | "id": "{{ id.path }}/canvas-1/annopage-1/anno-1", 23 | "type": "Annotation", 24 | "motivation": "painting", 25 | "body": { 26 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 27 | "type": "Image", 28 | "format": "image/jpeg", 29 | "height": 3024, 30 | "width": 4032, 31 | "service": [ 32 | { 33 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 34 | "profile": "level1", 35 | "type": "ImageService3" 36 | } 37 | ] 38 | }, 39 | "target": "{{ id.path }}/canvas-1" 40 | } 41 | ] 42 | } 43 | ], 44 | "annotations": [ 45 | { 46 | "id": "{{ id.path }}/annotationpage.json", 47 | "type": "AnnotationPage" 48 | } 49 | ] 50 | } 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /recipe/0002-mvm-audio/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Simplest Manifest - Audio 3 | id: 2 4 | layout: recipe 5 | tags: [audio, presentation] 6 | summary: "The simplest viable manifest for audio content. This pattern presents a single audio file in a IIIF Presentation resource." 7 | viewers: 8 | - Mirador 9 | - UV 10 | - Clover 11 | - Ramp 12 | - Aviary 13 | - Theseus 14 | - Glycerine Viewer 15 | - TIFY 16 | topic: 17 | - basic 18 | - AV 19 | code: 20 | - iiif-prezi3 21 | --- 22 | 23 | 24 | ## Use Case 25 | 26 | The simplest viable manifest for audio content. This pattern presents a single audio file in a IIIF Presentation resource. 27 | 28 | ## Implementation Notes 29 | 30 | The implementation is identical to the [image example][0001], except that the content is audio and the canvas has the `duration` property instead of the `height` and `width` properties. The value of the `duration` property [must be a floating point number](https://iiif.io/api/presentation/3.0/#duration). If the duration value you have is an integer, it therefore needs to be written with at least a decimal point and a trailing zero: `1985.0` rather than `1985`. 31 | 32 | ## Example 33 | 34 | This example shows a Manifest with a single Canvas that lasts for 1985.024 seconds. It has a single audio file (audio-sample.mp4) which is associated with it. The mp4 also has a duration of 1985.024 seconds. 35 | 36 | {% include manifest_links.html viewers="UV, Mirador, Clover, Ramp, Aviary, Theseus, Glycerine Viewer, TIFY" manifest="manifest.json" %} 37 | 38 | {% include jsonviewer.html src="manifest.json" %} 39 | 40 | ## Related Recipes 41 | 42 | * [Simplest Manifest - Image][0001] and [Simplest Manifest - Video][0003] are equivalent to this example. 43 | 44 | {% include acronyms.md %} 45 | {% include links.md %} 46 | -------------------------------------------------------------------------------- /recipe/0230-navdate/navdate_map_1-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "1987 Chesapeake and Ohio Canal, Washington, D.C., Maryland, West Virginia, official map and guide" 8 | ] 9 | }, 10 | "navDate": "1987-01-01T00:00:00+00:00", 11 | "items": [ 12 | { 13 | "id": "{{ id.path }}/canvas/p1", 14 | "type": "Canvas", 15 | "label": { 16 | "en": [ 17 | "1987 Map, recto and verso, with a date of publication" 18 | ] 19 | }, 20 | "height": 7072, 21 | "width": 5212, 22 | "items": [ 23 | { 24 | "id": "{{ id.path }}/page/p1/1", 25 | "type": "AnnotationPage", 26 | "items": [ 27 | { 28 | "id": "{{ id.path }}/annotation/p0001-image", 29 | "type": "Annotation", 30 | "motivation": "painting", 31 | "body": { 32 | "id": "https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-88695674/full/max/0/default.jpg", 33 | "type": "Image", 34 | "format": "image/jpeg", 35 | "height": 7072, 36 | "width": 5212, 37 | "service": [ 38 | { 39 | "id": "https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-88695674/", 40 | "profile": "level1", 41 | "type": "ImageService3" 42 | } 43 | ] 44 | }, 45 | "target": "{{ id.path }}/canvas/p1" 46 | } 47 | ] 48 | } 49 | ] 50 | } 51 | ] 52 | } -------------------------------------------------------------------------------- /recipe/0230-navdate/navdate_map_2-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "1986 Chesapeake and Ohio Canal, Washington, D.C., Maryland, West Virginia, official map and guide" 8 | ] 9 | }, 10 | "navDate": "1986-01-01T00:00:00+00:00", 11 | "items": [ 12 | { 13 | "id": "{{ id.path }}/canvas/p1", 14 | "type": "Canvas", 15 | "label": { 16 | "en": [ 17 | "1986 Map, recto and verso, with a date of publication" 18 | ] 19 | }, 20 | "height": 1765, 21 | "width": 1286, 22 | "items": [ 23 | { 24 | "id": "{{ id.path }}/page/p1/1", 25 | "type": "AnnotationPage", 26 | "items": [ 27 | { 28 | "id": "{{ id.path }}/annotation/p0001-image", 29 | "type": "Annotation", 30 | "motivation": "painting", 31 | "body": { 32 | "id": "https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-87691274-1986/full/max/0/default.jpg", 33 | "type": "Image", 34 | "format": "image/jpeg", 35 | "height": 1765, 36 | "width": 1286, 37 | "service": [ 38 | { 39 | "id": "https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-87691274-1986/", 40 | "profile": "level1", 41 | "type": "ImageService3" 42 | } 43 | ] 44 | }, 45 | "target": "{{ id.path }}/canvas/p1" 46 | } 47 | ] 48 | } 49 | ] 50 | } 51 | ] 52 | } -------------------------------------------------------------------------------- /recipe/0003-mvm-video/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Simplest Manifest - Video 3 | id: 3 4 | layout: recipe 5 | tags: [video, presentation] 6 | summary: "The simplest viable manifest for video content. This pattern presents a single video file in a IIIF Presentation resource." 7 | viewers: 8 | - Mirador 9 | - UV 10 | - Clover 11 | - Ramp 12 | - Aviary 13 | - Theseus 14 | - Glycerine Viewer 15 | - TIFY 16 | topic: 17 | - basic 18 | - AV 19 | code: 20 | - iiif-prezi3 21 | --- 22 | 23 | 24 | ## Use Case 25 | 26 | The simplest viable manifest for video content. This pattern presents a single video file in a IIIF Presentation resource. 27 | 28 | ## Implementation Notes 29 | 30 | The implementation is identical to the [image example][0001], except that the content is video and the canvas has the `duration` property instead of the `height` and `width` properties. The value of the `duration` property [must be a floating point number](https://iiif.io/api/presentation/3.0/#duration). If the duration value you have is an integer, it therefore needs to be written with at least a decimal point and a trailing zero: `1985.0` rather than `1985`. 31 | 32 | ## Example 33 | 34 | This example shows a Manifest with a single Canvas that lasts for 572 seconds, or just under 10 minutes. It has a single video file (lunchroom_manners_1024kb.mp4) which is associated with it. The mp4 also has a duration of 572 seconds. 35 | 36 | {% include manifest_links.html viewers="UV, Mirador, Clover, Ramp, Aviary, Theseus, Glycerine Viewer, TIFY" manifest="manifest.json" %} 37 | 38 | {% include jsonviewer.html src="manifest.json" %} 39 | 40 | # Related Recipes 41 | 42 | * [Simplest Manifest - Image][0001] and [Simplest Manifest - Audio][0002] are equivalent to this example. 43 | 44 | {% include acronyms.md %} 45 | {% include links.md %} 46 | -------------------------------------------------------------------------------- /recipe/0032-collection/manifest-02.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "Northeaster" ] }, 6 | "metadata": [ 7 | { 8 | "label": { "en": [ "Artist" ] }, 9 | "value": { "en": [ "Winslow Homer (1836–1910)" ] } 10 | }, 11 | { 12 | "label": { "en": [ "Date" ] }, 13 | "value": { "en": [ "1895" ] } 14 | } 15 | ], 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/manifest/2/canvas/p1", 19 | "type": "Canvas", 20 | "height": 2572, 21 | "width": 3764, 22 | "items": [ 23 | { 24 | "id": "{{ id.path }}/manifest/2/page/p1/1", 25 | "type": "AnnotationPage", 26 | "items": [ 27 | { 28 | "id": "{{ id.path }}/manifest/2/annotation/p0001-image", 29 | "type": "Annotation", 30 | "motivation": "painting", 31 | "body": { 32 | "id": "https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Northeaster_by_Winslow_Homer_1895/full/max/0/default.jpg", 33 | "type": "Image", 34 | "format": "image/jpeg", 35 | "height": 2572, 36 | "width": 3764, 37 | "service": [ 38 | { 39 | "id": "https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Northeaster_by_Winslow_Homer_1895", 40 | "profile": "level1", 41 | "type": "ImageService3" 42 | } 43 | ] 44 | }, 45 | "target": "{{ id.path }}/manifest/2/canvas/p1" 46 | } 47 | ] 48 | } 49 | ] 50 | } 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /recipe/0047-homepage/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "none": ["Laocöon"] 7 | }, 8 | "homepage": [ 9 | { 10 | "id": "https://www.getty.edu/art/collection/object/103RQQ", 11 | "type": "Text", 12 | "label": { 13 | "en": ["Home page at the Getty Museum Collection"] 14 | }, 15 | "format": "text/html", 16 | "language": ["en"] 17 | } 18 | ], 19 | "items": [ 20 | { 21 | "id": "{{ id.path }}/canvas/1", 22 | "type": "Canvas", 23 | "label": { 24 | "none": ["Front"] 25 | }, 26 | "height": 3000, 27 | "width": 2315, 28 | "items": [ 29 | { 30 | "id": "{{ id.path }}/canvas/1/page/1", 31 | "type": "AnnotationPage", 32 | "items": [ 33 | { 34 | "id": "{{ id.path }}/canvas/1/page/1/annotation/1", 35 | "type": "Annotation", 36 | "motivation": "painting", 37 | "body": { 38 | "id": "https://iiif.io/api/image/3.0/example/reference/28473c77da3deebe4375c3a50572d9d3-laocoon/full/!500,500/0/default.jpg", 39 | "type": "Image", 40 | "format": "image/jpeg", 41 | "service": [ 42 | { 43 | "id": "https://iiif.io/api/image/3.0/example/reference/28473c77da3deebe4375c3a50572d9d3-laocoon", 44 | "type": "ImageService3", 45 | "profile": "level1" 46 | } 47 | ], 48 | "height": 3000, 49 | "width": 2315 50 | }, 51 | "target": "{{ id.path }}/canvas/1" 52 | } 53 | ] 54 | } 55 | ] 56 | } 57 | ] 58 | } 59 | -------------------------------------------------------------------------------- /recipe/0118-multivalue/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "fr": [ 7 | "Arrangement en gris et noir no 1" 8 | ] 9 | }, 10 | "metadata": [ 11 | { 12 | "label": { 13 | "en": [ 14 | "Alternative titles" 15 | ] 16 | }, 17 | "value": { 18 | "en": [ 19 | "Whistler's Mother", 20 | "Arrangement in Grey and Black No. 1" 21 | ], 22 | "fr": [ 23 | "Portrait de la mère de l'artiste", 24 | "La Mère de Whistler" 25 | ] 26 | } 27 | } 28 | ], 29 | "summary": { 30 | "en": [ 31 | "A painting in oil on canvas created by the American-born painter James McNeill Whistler, in 1871." 32 | ] 33 | }, 34 | "items": [ 35 | { 36 | "id": "{{ id.path }}/canvas/1", 37 | "type": "Canvas", 38 | "width": 1114, 39 | "height": 991, 40 | "items": [ 41 | { 42 | "id": "{{ id.path }}/canvas/1/page/1", 43 | "type": "AnnotationPage", 44 | "items": [ 45 | { 46 | "id": "{{ id.path }}/canvas/1/page/1/annotation/1", 47 | "type": "Annotation", 48 | "motivation": "painting", 49 | "body": { 50 | "id": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Whistlers_Mother_high_res.jpg/1114px-Whistlers_Mother_high_res.jpg", 51 | "type": "Image", 52 | "format": "image/jpeg" 53 | }, 54 | "target": "{{ id.path }}/canvas/1" 55 | } 56 | ] 57 | } 58 | ] 59 | } 60 | ] 61 | } 62 | -------------------------------------------------------------------------------- /recipe/0032-collection/manifest-01.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "The Gulf Stream" ] }, 6 | "metadata": [ 7 | { 8 | "label": { "en": [ "Artist" ] }, 9 | "value": { "en": [ "Winslow Homer (1836–1910)" ] } 10 | }, 11 | { 12 | "label": { "en": [ "Date" ] }, 13 | "value": { "en": [ "1899" ] } 14 | } 15 | ], 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/manifest/1/canvas/p1", 19 | "type": "Canvas", 20 | "height": 3540, 21 | "width": 5886, 22 | "items": [ 23 | { 24 | "id": "{{ id.path }}/manifest/1/page/p1/1", 25 | "type": "AnnotationPage", 26 | "items": [ 27 | { 28 | "id": "{{ id.path }}/manifest/1/annotation/p0001-image", 29 | "type": "Annotation", 30 | "motivation": "painting", 31 | "body": { 32 | "id": "https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Winslow_Homer_-_The_Gulf_Stream_-_Metropolitan_Museum_of_Art/full/max/0/default.jpg", 33 | "type": "Image", 34 | "format": "image/jpeg", 35 | "height": 3540, 36 | "width": 5886, 37 | "service": [ 38 | { 39 | "id": "https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Winslow_Homer_-_The_Gulf_Stream_-_Metropolitan_Museum_of_Art", 40 | "profile": "level1", 41 | "type": "ImageService3" 42 | } 43 | ] 44 | }, 45 | "target": "{{ id.path }}/manifest/1/canvas/p1" 46 | } 47 | ] 48 | } 49 | ] 50 | } 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /recipe/0299-region/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Berliner Tageblatt article, 'Ein neuer Sicherungsplan?'" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas/p1", 13 | "type": "Canvas", 14 | "height": 2080, 15 | "width": 1768, 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/page/p1/1", 19 | "type": "AnnotationPage", 20 | "items": [ 21 | { 22 | "id": "{{ id.path }}/annotation/p0001-image", 23 | "type": "Annotation", 24 | "motivation": "painting", 25 | "body": { 26 | "id": "{{ id.path }}/body/b1", 27 | "type": "SpecificResource", 28 | "source": { 29 | "id": "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p2/full/max/0/default.jpg", 30 | "type": "Image", 31 | "format": "image/jpeg", 32 | "height": 4999, 33 | "width": 3536, 34 | "service": [ 35 | { 36 | "id": "https://iiif.io/api/image/3.0/example/reference/4ce82cef49fb16798f4c2440307c3d6f-newspaper-p2", 37 | "profile": "level1", 38 | "type": "ImageService3" 39 | } 40 | ] 41 | }, 42 | "selector": { 43 | "type": "ImageApiSelector", 44 | "region": "1768,2423,1768,2080" 45 | } 46 | }, 47 | "target": "{{ id.path }}/canvas/p1" 48 | } 49 | ] 50 | } 51 | ] 52 | } 53 | ] 54 | } 55 | -------------------------------------------------------------------------------- /recipe/0154-geo-extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context" : [ 3 | "http://iiif.io/api/extension/navplace/context.json", 4 | "http://iiif.io/api/presentation/3/context.json" 5 | ], 6 | "id" : "{{ id.url }}", 7 | "type" : "Manifest", 8 | "label" : { 9 | "it" : [ "Bronzo Laocoonte e i suoi figli" ] 10 | }, 11 | "navPlace" : { 12 | "id" : "{{ id.path }}/feature-collection/1", 13 | "type" : "FeatureCollection", 14 | "features" : [ { 15 | "id" : "{{ id.path }}/feature/1", 16 | "type" : "Feature", 17 | "properties" : { 18 | "label" : { 19 | "en" : [ "The Laocoön Bronze" ], 20 | "it" : [ "Bronzo Laocoonte e i suoi figli" ] 21 | } 22 | }, 23 | "geometry" : { 24 | "type" : "Point", 25 | "coordinates" : [ -118.4745559, 34.0776376 ] 26 | } 27 | } ] 28 | }, 29 | "items" : [ { 30 | "id": "{{ id.path }}/canvas/1", 31 | "type" : "Canvas", 32 | "height" : 3000, 33 | "width" : 2315, 34 | "label" : { 35 | "en" : [ "Front of Bronze" ] 36 | }, 37 | "items" : [ { 38 | "id" : "{{ id.path }}/anno-page/1", 39 | "type" : "AnnotationPage", 40 | "items" : [ { 41 | "id" : "{{ id.path }}/anno/1", 42 | "type" : "Annotation", 43 | "motivation" : "painting", 44 | "body" : { 45 | "id" : "https://iiif.io/api/image/3.0/example/reference/28473c77da3deebe4375c3a50572d9d3-laocoon/full/max/0/default.jpg", 46 | "type" : "Image", 47 | "format" : "image/jpeg", 48 | "height" : 3000, 49 | "width" : 2315, 50 | "service" : [ { 51 | "id" : "https://iiif.io/api/image/3.0/example/reference/28473c77da3deebe4375c3a50572d9d3-laocoon", 52 | "profile" : "level1", 53 | "type" : "ImageService3" 54 | } ] 55 | }, 56 | "target" : "{{ id.path }}/canvas/1" 57 | } ] 58 | } ] 59 | } ] 60 | } -------------------------------------------------------------------------------- /recipe/0074-multiple-language-captions/Per_voi_signore_Modelli_francesi_en.vtt: -------------------------------------------------------------------------------- 1 | WEBVTT 2 | 3 | 00:00:08.987 --> 00:00:10.749 4 | At the fashionable game Canasta. 5 | 6 | 00:00:10.793 --> 00:00:14.172 7 | Jacques Fath names this model in blue 8 | velvet "flight of a dove" 9 | 10 | 00:00:14.207 --> 00:00:15.363 11 | with green reflections. 12 | 13 | 00:00:15.396 --> 00:00:17.792 14 | A braid of the same fabric holds the robe. 15 | 16 | 00:00:18.309 --> 00:00:20.091 17 | Necklace under the diamond collar. 18 | 19 | 00:00:22.408 --> 00:00:24.815 20 | Light shades scale in this autumn collection. 21 | 22 | 00:00:24.847 --> 00:00:26.219 23 | White sequence. 24 | 25 | 00:00:26.389 --> 00:00:27.662 26 | Satin dress and cloak. 27 | 28 | 00:00:28.271 --> 00:00:30.470 29 | At the ball, it is the most imaginative as a line 30 | 31 | 00:00:30.491 --> 00:00:33.069 32 | as it narrows to an hourglass on the knee. 33 | 34 | 00:00:33.619 --> 00:00:34.536 35 | After the ball. 36 | 37 | 00:00:34.566 --> 00:00:38.052 38 | Satin of a tender light blue, 39 | Burgundy red velvet cloak. 40 | 41 | 00:00:40.029 --> 00:00:42.418 42 | Salome, again satin and again white 43 | 44 | 00:00:42.444 --> 00:00:46.039 45 | the fabric and the colour inspire the 46 | Parisian tailor's imagination this time. 47 | 48 | 00:00:46.248 --> 00:00:47.360 49 | Giselle, 50 | 51 | 00:00:47.467 --> 00:00:49.978 52 | novel heroine for young girls, 53 | white tulle. 54 | 55 | 00:00:50.172 --> 00:00:53.136 56 | The torso and the head emerge 57 | as from a rippled cloud. 58 | 59 | 00:00:54.620 --> 00:00:57.146 60 | The 7/8 cloak insists on these models. 61 | 62 | 00:00:57.183 --> 00:00:59.353 63 | Evening dresses stretched to the ground. 64 | 65 | 00:00:59.591 --> 00:01:02.668 66 | But the newer line is what Fath calls "column." 67 | 68 | 00:01:02.853 --> 00:01:04.858 69 | We see it in tight-fitting clothes 70 | 71 | 00:01:04.892 --> 00:01:08.058 72 | with at the end a brief 73 | commemoration of the trail. 74 | -------------------------------------------------------------------------------- /recipe/0015-start/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ "Video of a 30-minute digital clock" 7 | ] 8 | }, 9 | "start": { 10 | "id": "{{ id.path }}/canvas-start/segment1", 11 | "type": "SpecificResource", 12 | "source": "{{ id.path }}/canvas/segment1", 13 | "selector": { 14 | "type": "PointSelector", 15 | "t": 120.5 16 | } 17 | }, 18 | "rights": "http://creativecommons.org/licenses/by/3.0/", 19 | "requiredStatement": { 20 | "label": { 21 | "en": [ 22 | "Attribution" 23 | ] 24 | }, 25 | "value": { 26 | "en": [ 27 | "The video was created by DrLex1 and was released using a Creative Commons Attribution license" 28 | ] 29 | } 30 | }, 31 | "items": [ 32 | { 33 | "id": "{{ id.path }}/canvas/segment1", 34 | "type": "Canvas", 35 | "duration": 1801.055, 36 | "items": [ 37 | { 38 | "id": "{{ id.path }}/annotation/segment1/page", 39 | "type": "AnnotationPage", 40 | "items": [ 41 | { 42 | "id": "{{ id.path }}/annotation/segment1-video", 43 | "type": "Annotation", 44 | "motivation": "painting", 45 | "body": { 46 | "id": "https://fixtures.iiif.io/video/indiana/30-minute-clock/medium/30-minute-clock.mp4", 47 | "type": "Video", 48 | "duration": 1801.055, 49 | "format": "video/mp4" 50 | }, 51 | "target": "{{ id.path }}/canvas/segment1" 52 | } 53 | ] 54 | } 55 | ] 56 | } 57 | ] 58 | } 59 | -------------------------------------------------------------------------------- /recipe/0074-multiple-language-captions/Per_voi_signore_Modelli_francesi_it.vtt: -------------------------------------------------------------------------------- 1 | WEBVTT 2 | 3 | 00:00:08.987 --> 00:00:10.749 4 | Al gioco di moda la canasta. 5 | 6 | 00:00:10.793 --> 00:00:14.172 7 | Jacques Fath intitola questo modello in velluto blu volo di colomba 8 | 9 | 00:00:14.207 --> 00:00:15.363 10 | con riflessi verdi. 11 | 12 | 00:00:15.396 --> 00:00:17.792 13 | Una treccia dello stesso tessuto regge la veste. 14 | 15 | 00:00:18.309 --> 00:00:20.091 16 | Collana sotto il collare di diamanti. 17 | 18 | 00:00:22.408 --> 00:00:24.815 19 | Scala di toni chiari in questa collezione d'autunno. 20 | 21 | 00:00:24.847 --> 00:00:26.219 22 | Sequenza in bianco. 23 | 24 | 00:00:26.389 --> 00:00:27.662 25 | Veste e mantello di satin. 26 | 27 | 00:00:28.271 --> 00:00:30.470 28 | Al ballo è il più fantasioso come linea 29 | 30 | 00:00:30.491 --> 00:00:33.069 31 | col suo restringersi a clessidra sul ginocchio. 32 | 33 | 00:00:33.619 --> 00:00:34.536 34 | Dopo il ballo. 35 | 36 | 00:00:34.566 --> 00:00:38.052 37 | Satin di un tenero celeste, mantello di velluto rosso Borgogna. 38 | 39 | 00:00:40.029 --> 00:00:42.418 40 | Salomè, ancora satin e ancora bianco 41 | 42 | 00:00:42.444 --> 00:00:46.039 43 | sono il tessuto e il colore che ispirano stavolta la fantasia del sarto parigino. 44 | 45 | 00:00:46.248 --> 00:00:47.360 46 | Giselle, 47 | 48 | 00:00:47.467 --> 00:00:49.978 49 | eroina di romanzi per giovanette, tulle bianco. 50 | 51 | 00:00:50.172 --> 00:00:53.136 52 | Il busto e la testa emergono come da una nuvola increspata. 53 | 54 | 00:00:54.620 --> 00:00:57.146 55 | Insiste in questi modelli il mantello 7/8. 56 | 57 | 00:00:57.183 --> 00:00:59.353 58 | Gli abiti da sera si sono allungati fino a terra. 59 | 60 | 00:00:59.591 --> 00:01:02.668 61 | Ma linea più nuova è quella che Fath chiama "a colonna". 62 | 63 | 00:01:02.853 --> 00:01:04.858 64 | La vediamo nei vestiti fascianti 65 | 66 | 00:01:04.892 --> 00:01:08.058 67 | con in fondo una breve commemorazione dello strascico. 68 | -------------------------------------------------------------------------------- /recipe/0021-tagging/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Picture of Göttingen taken during the 2019 IIIF Conference" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas/p1", 13 | "type": "Canvas", 14 | "height": 3024, 15 | "width": 4032, 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/page/p1/1", 19 | "type": "AnnotationPage", 20 | "items": [ 21 | { 22 | "id": "{{ id.path }}/annotation/p0001-image", 23 | "type": "Annotation", 24 | "motivation": "painting", 25 | "body": { 26 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 27 | "type": "Image", 28 | "format": "image/jpeg", 29 | "height": 3024, 30 | "width": 4032, 31 | "service": [ 32 | { 33 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 34 | "profile": "level1", 35 | "type": "ImageService3" 36 | } 37 | ] 38 | }, 39 | "target": "{{ id.path }}/canvas/p1" 40 | } 41 | ] 42 | } 43 | ], 44 | "annotations": [ 45 | { 46 | "id": "{{ id.path }}/page/p2/1", 47 | "type": "AnnotationPage", 48 | "items": [ 49 | { 50 | "id": "{{ id.path }}/annotation/p0002-tag", 51 | "type": "Annotation", 52 | "motivation": "tagging", 53 | "body": { 54 | "type": "TextualBody", 55 | "value": "Gänseliesel-Brunnen", 56 | "language": "de", 57 | "format": "text/plain" 58 | }, 59 | "target": "{{ id.path }}/canvas/p1#xywh=265,661,1260,1239" 60 | } 61 | ] 62 | } 63 | ] 64 | } 65 | ] 66 | } -------------------------------------------------------------------------------- /recipe/0065-opera-multiple-canvases/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Table of Contents for Multiple A/V Files on Multiple Canvases 3 | id: 65 4 | layout: recipe 5 | tags: [video, presentation, opera] 6 | summary: "A real world example of an audio recording of an opera spread across multiple Canvases." 7 | viewers: 8 | - UV 9 | - Ramp 10 | - Theseus 11 | topic: AV 12 | --- 13 | 14 | ## Use Case 15 | 16 | An opera performance can be long and split across multiple physical tapes, reels, or cassettes. These may be digitized as one file per physical medium then mapped to one Canvas per file. This real world example shows how this can be modeled using multiple Canvases. 17 | 18 | ## Implementation Notes 19 | 20 | Implementation is identical to the [Table of Contents for multiple A/V Files on a Single Canvas][0064] recipe except that the two files, one for each act, each have their own Canvas and are referenced as such in the structures. With two Canvases the viewer will show the duration of only the file currently being played and the time will start at zero again when switching between files. This may be helpful when you have time references within files instead of the opera as a whole. 21 | 22 | ## Restrictions 23 | 24 | Given the need for the player to switch context when moving from one file to the next, the result is segmented playback. To ensure continuous playback, all files should be annotated onto one single Canvas as in the [Table of Contents for multiple A/V Files on a Single Canvas][0064] recipe. 25 | 26 | ## Example 27 | 28 | {% include manifest_links.html viewers="UV, Ramp, Theseus" manifest="manifest.json" %} 29 | {% include jsonviewer.html src="manifest.json" %} 30 | 31 | ## Related Recipes 32 | 33 | - [Simple Manifest - Video][0003] 34 | - [Thumbnails][0012] 35 | - [Table of Contents for A/V Content][0026] - Another example of using nested Ranges to represent an opera's table of contents. 36 | - [Table of Contents for Multiple A/V Files on a Single Canvas][0064] - The same opera from this example but in video format on one Canvas. 37 | 38 | {% include acronyms.md %} 39 | {% include links.md %} 40 | -------------------------------------------------------------------------------- /recipe/0219-using-caption-file/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Lunchroom Manners" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas", 13 | "type": "Canvas", 14 | "height": 360, 15 | "width": 480, 16 | "duration": 572.034, 17 | "items": [ 18 | { 19 | "id": "{{ id.path }}/canvas/page", 20 | "type": "AnnotationPage", 21 | "items": [ 22 | { 23 | "id": "{{ id.path }}/canvas/page/annotation1", 24 | "type": "Annotation", 25 | "motivation": "painting", 26 | "body": { 27 | "id": "https://fixtures.iiif.io/video/indiana/lunchroom_manners/high/lunchroom_manners_1024kb.mp4", 28 | "type": "Video", 29 | "height": 360, 30 | "width": 480, 31 | "duration": 572.034, 32 | "format": "video/mp4" 33 | }, 34 | "target": "{{ id.path }}/canvas" 35 | } 36 | ] 37 | } 38 | ], 39 | "annotations": [ 40 | { 41 | "id": "{{ id.path }}/canvas/page2", 42 | "type": "AnnotationPage", 43 | "items": [ 44 | { 45 | "id": "{{ id.path }}/canvas/page2/a1", 46 | "type": "Annotation", 47 | "motivation": "supplementing", 48 | "body": { 49 | "id": "https://fixtures.iiif.io/video/indiana/lunchroom_manners/lunchroom_manners.vtt", 50 | "type": "Text", 51 | "format": "text/vtt", 52 | "label": { 53 | "en": [ 54 | "Captions in WebVTT format" 55 | ] 56 | }, 57 | "language": "en" 58 | }, 59 | "target": "{{ id.path }}/canvas" 60 | } 61 | ] 62 | } 63 | ] 64 | } 65 | ] 66 | } 67 | -------------------------------------------------------------------------------- /recipe/0561-text-on-image/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "Visible Text Annotation" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas", 9 | "type": "Canvas", 10 | "height": 31722, 11 | "width": 70399, 12 | "items": [ 13 | { 14 | "id": "{{ id.path }}/page/p1/1", 15 | "type": "AnnotationPage", 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/annotation/p0001-image", 19 | "type": "Annotation", 20 | "motivation": "painting", 21 | "body": { 22 | "id": "https://iiif.io/api/image/3.0/example/reference/36ca0a3370db128ec984b33d71a1543d-100320001004/full/max/0/default.jpg", 23 | "type": "Image", 24 | "format": "image/jpeg", 25 | "height": 31722, 26 | "width": 70399, 27 | "service": [ 28 | { 29 | "id": "https://iiif.io/api/image/3.0/example/reference/36ca0a3370db128ec984b33d71a1543d-100320001004", 30 | "profile": "level1", 31 | "type": "ImageService3" 32 | } 33 | ] 34 | }, 35 | "target": "{{ id.path }}/canvas" 36 | }, 37 | { 38 | "id": "{{ id.path }}/annotation/p0001-text", 39 | "type": "Annotation", 40 | "motivation": "painting", 41 | "body": { 42 | "type": "TextualBody", 43 | "format": "text/html", 44 | "value": "

The koto is to the right, carried in a cloth wrapping.

", 45 | "language": "en" 46 | }, 47 | "target": "{{ id.path }}/canvas#xywh=5500,12200,8000,5000" 48 | } 49 | ] 50 | } 51 | ] 52 | } 53 | ] 54 | } 55 | -------------------------------------------------------------------------------- /recipe/0008-rights/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "Picture of Göttingen taken during the 2019 IIIF Conference" ] }, 6 | "summary": { "en": [ "

Picture taken by the IIIF Technical Coordinator

" ] }, 7 | "rights": "http://creativecommons.org/licenses/by-sa/3.0/", 8 | "requiredStatement": { 9 | "label": { "en": [ "Attribution" ] }, 10 | "value": { "en": [ "Glen Robson, IIIF Technical Coordinator. CC BY-SA 3.0 " ] } 11 | }, 12 | "items": [ 13 | { 14 | "id": "{{ id.path }}/canvas/p1", 15 | "type": "Canvas", 16 | "height": 3024, 17 | "width": 4032, 18 | "items": [ 19 | { 20 | "id": "{{ id.path }}/page/p1/1", 21 | "type": "AnnotationPage", 22 | "items": [ 23 | { 24 | "id": "{{ id.path }}/annotation/p0001-image", 25 | "type": "Annotation", 26 | "motivation": "painting", 27 | "body": { 28 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 29 | "type": "Image", 30 | "format": "image/jpeg", 31 | "height": 3024, 32 | "width": 4032, 33 | "service": [ 34 | { 35 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 36 | "profile": "level1", 37 | "type": "ImageService3" 38 | } 39 | ] 40 | }, 41 | "target": "{{ id.path }}/canvas/p1" 42 | } 43 | ] 44 | } 45 | ] 46 | } 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /recipe/0135-annotating-point-in-canvas/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Annotating a specific point of an image 3 | id: 15 4 | layout: recipe 5 | tags: image 6 | summary: "This recipe explains how to annotate a specific point of an image." 7 | viewers: 8 | - Glycerine Viewer 9 | - Theseus 10 | topic: 11 | - annotation 12 | --- 13 | 14 | ## Use Case 15 | You want to annotate a coordinate of the image rather than a region. You have a map with some locations that can be represented better by a single coordinate. You want to add some auxiliary data relative to a specific point of the image (e.g. some spectroscopic analysis made on a manuscript). 16 | 17 | ## Implementation notes 18 | 19 | This recipe, as [Simple Annotation — Tagging][0021] implements a method for annotating an image. Recipe [Begin playback at a specific point - Time-based media][0015] uses a Point Selector for selecting a specific time of a video, this recipe selects instead a specific point of the image. 20 | 21 | In this use case, the Annotation is inside an Annotation Page in the `annotations` list of the Manifest. The `motivation` of the Annotation is "tagging" and the target `source` points to the Canvas `id`. The `type` property is a Specific Resource while the Selector `type` property is a Point Selector that contains the coordinates `x` and `y` of the Canvas coordinates system as parameters. 22 | 23 | Viewers might consider implementing scale-independent point markers so that they are visible at every level of zoom. 24 | 25 | ## Example 26 | 27 | This example uses a leaflet with a map and a guide supplied by the Library of Congress Geography and Map Division, it shows how we can annotate some locations expressed in the map. 28 | 29 | {% include manifest_links.html viewers="Glycerine Viewer, Theseus" manifest="manifest.json" %} 30 | 31 | {% include jsonviewer.html src="manifest.json" config='data-line="69-76"' %} 32 | 33 | # Related recipes 34 | 35 | * [Begin playback at a specific point - Time-based media][0015] uses a Point Selector for selecting for starting the playback at a specific time. 36 | * [Simple Annotation — Tagging][0021] a simple annotation pointing to a region of an image. 37 | 38 | {% include acronyms.md %} 39 | {% include links.md %} 40 | -------------------------------------------------------------------------------- /recipe/0103-poetry-reading-annotations/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Scholarly Annotation of a Poetry Reading 3 | id: 103 4 | layout: recipe 5 | tags: [audio, presentation, annotation] 6 | summary: "Use annotations to indicate aspects of the performance of a particular poem." 7 | viewers: 8 | - Ramp 9 | - Aviary 10 | topic: 11 | - AV 12 | --- 13 | 14 | 15 | ## Use Case 16 | 17 | Scholars may wish to use annotations to indicate aspects of the performance of a particular poem. 18 | 19 | For a performance of a published text, transcribing the performance is of little use to the researcher annotating the performance. Rather, the annotations serve as commentary on the performance itself. 20 | 21 | A researcher might want to annotate the following types of information: 22 | * structural information (introduction, title, stanzas) 23 | * points where the performer takes a breath 24 | * repeated or emphasized phrases 25 | 26 | ## Implementation notes 27 | 28 | This implementation builds off of the [audio example][0002], but adds Web Annotations. We show annotation targeting using a simplified Media Fragment `#t=702.0,705.0` appended to the canvas URL. 29 | 30 | If you are targeting a single point, you should use a point selector. The [Begin playback at a specific point - Time-based media][0015] recipe demonstrates that approach. 31 | 32 | Because the annotations are pointing out features of the audio, rather than transcriptions, the `motivation` for each annotation is `commenting` not `supplementing`. If the annotations were transcriptions, their motivation would be `supplementing`. 33 | 34 | 35 | ## Example 36 | 37 | A manifest for a poetry reading by Canadian poet Daphne Marlatt in 2018 that includes an annotation describing environmental noise. The recording is 707 seconds long. 38 | {% include manifest_links.html manifest="manifest.json" %} 39 | 40 | {% include jsonviewer.html src="manifest.json" %} 41 | 42 | 43 | # Related recipes 44 | 45 | * [Simple Manifest - Audio][0002] 46 | * [Transformation - WebVTT or OHMS XML to Annotations][0079] 47 | * [Begin playback at a specific point - Time-based media][0015] 48 | * [Embedded or Referenced Annotations][0269] 49 | 50 | {% include acronyms.md %} 51 | {% include links.md %} 52 | 53 | -------------------------------------------------------------------------------- /recipe/0258-tagging-external-resource/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Picture of Göttingen taken during the 2019 IIIF Conference" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas/p1", 13 | "type": "Canvas", 14 | "height": 3024, 15 | "width": 4032, 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/page/p1/1", 19 | "type": "AnnotationPage", 20 | "items": [ 21 | { 22 | "id": "{{ id.path }}/annotation/p0001-image", 23 | "type": "Annotation", 24 | "motivation": "painting", 25 | "body": { 26 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 27 | "type": "Image", 28 | "format": "image/jpeg", 29 | "height": 3024, 30 | "width": 4032, 31 | "service": [ 32 | { 33 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 34 | "profile": "level1", 35 | "type": "ImageService3" 36 | } 37 | ] 38 | }, 39 | "target": "{{ id.path }}/canvas/p1" 40 | } 41 | ] 42 | } 43 | ], 44 | "annotations": [ 45 | { 46 | "id": "{{ id.path }}/page/p2/1", 47 | "type": "AnnotationPage", 48 | "items": [ 49 | { 50 | "id": "{{ id.path }}/annotation/anno/p0002-wikidata", 51 | "type": "Annotation", 52 | "motivation": "tagging", 53 | "body": [ 54 | { 55 | "type": "SpecificResource", 56 | "source": "http://www.wikidata.org/entity/Q18624915" 57 | }, 58 | { 59 | "type": "TextualBody", 60 | "value": "Gänseliesel-Brunnen", 61 | "format": "text/plain", 62 | "language": "de" 63 | } 64 | ], 65 | "target": "{{ id.path }}/canvas/p1#xywh=749,1054,338,460" 66 | } 67 | ] 68 | } 69 | ] 70 | } 71 | ] 72 | } -------------------------------------------------------------------------------- /recipe/0266-full-canvas-annotation/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Picture of Göttingen taken during the 2019 IIIF Conference" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas-1", 13 | "type": "Canvas", 14 | "height": 3024, 15 | "width": 4032, 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/canvas-1/annopage-1", 19 | "type": "AnnotationPage", 20 | "items": [ 21 | { 22 | "id": "{{ id.path }}/canvas-1/annopage-1/anno-1", 23 | "type": "Annotation", 24 | "motivation": "painting", 25 | "body": { 26 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 27 | "type": "Image", 28 | "format": "image/jpeg", 29 | "height": 3024, 30 | "width": 4032, 31 | "service": [ 32 | { 33 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 34 | "profile": "level1", 35 | "type": "ImageService3" 36 | } 37 | ] 38 | }, 39 | "target": "{{ id.path }}/canvas-1" 40 | } 41 | ] 42 | } 43 | ], 44 | "annotations": [ 45 | { 46 | "id": "{{ id.path }}/canvas-1/annopage-2", 47 | "type": "AnnotationPage", 48 | "items": [ 49 | { 50 | "id": "{{ id.path }}{{ id.path }}/canvas-1/annopage-2/anno-1", 51 | "type": "Annotation", 52 | "motivation": "commenting", 53 | "body": { 54 | "type": "TextualBody", 55 | "language": "de", 56 | "format": "text/plain", 57 | "value": "Göttinger Marktplatz mit Gänseliesel Brunnen" 58 | }, 59 | "target": "{{ id.path }}/canvas-1" 60 | } 61 | ] 62 | } 63 | ] 64 | } 65 | ] 66 | } 67 | -------------------------------------------------------------------------------- /recipe/0014-accompanyingcanvas/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": ["Partial audio recording of Gustav Mahler's _Symphony No. 3_"] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas/p1", 9 | "type": "Canvas", 10 | "label": { "en": [ "Gustav Mahler, Symphony No. 3, CD 1" ] }, 11 | "duration": 1985.024, 12 | "accompanyingCanvas": { 13 | "id": "{{ id.path }}/canvas/accompanying", 14 | "type": "Canvas", 15 | "label": { "en": [ "First page of score for Gustav Mahler, Symphony No. 3" ] }, 16 | "height": 998, 17 | "width": 772, 18 | "items": [ 19 | { 20 | "id": "{{ id.path }}/canvas/accompanying/annotation/page", 21 | "type": "AnnotationPage", 22 | "items": [ 23 | { 24 | "id": "{{ id.path }}/canvas/accompanying/annotation/image", 25 | "type": "Annotation", 26 | "motivation": "painting", 27 | "body": { 28 | "id": "https://iiif.io/api/image/3.0/example/reference/4b45bba3ea612ee46f5371ce84dbcd89-mahler-0/full/,998/0/default.jpg", 29 | "type": "Image", 30 | "format": "image/jpeg", 31 | "height": 998, 32 | "width": 772, 33 | "service": [ 34 | { 35 | "id": "https://iiif.io/api/image/3.0/example/reference/4b45bba3ea612ee46f5371ce84dbcd89-mahler-0", 36 | "type": "ImageService3", 37 | "profile": "level1" 38 | } 39 | ] 40 | }, 41 | "target": "{{ id.path }}/canvas/accompanying" 42 | } 43 | ] 44 | } 45 | ] 46 | }, 47 | "items": [ 48 | { 49 | "id": "{{ id.path }}/canvas/page/p1", 50 | "type": "AnnotationPage", 51 | "items": [ 52 | { 53 | "id": "{{ id.path }}/canvas/page/annotation/segment1-audio", 54 | "type": "Annotation", 55 | "motivation": "painting", 56 | "body": { 57 | "id": "https://fixtures.iiif.io/audio/indiana/mahler-symphony-3/CD1/medium/128Kbps.mp4", 58 | "type": "Sound", 59 | "duration": 1985.024, 60 | "format": "video/mp4" 61 | }, 62 | "target": "{{ id.path }}/canvas/p1" 63 | } 64 | ] 65 | } 66 | ] 67 | } 68 | ] 69 | } -------------------------------------------------------------------------------- /recipe/0040-image-rotation-service/manifest-css.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "ca": [ 7 | "[Conoximent de las orines] Ihesus, Ihesus. En nom de Deu et dela beneyeta sa mare e de tots los angels i archangels e de tots los sants e santes de paradis yo micer Johannes comense aquest libre de reseptes en l’ayn Mi 466." 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas/p1", 13 | "type": "Canvas", 14 | "label": { 15 | "en": [ 16 | "inside cover; 1r" 17 | ] 18 | }, 19 | "width": 2105, 20 | "height": 1523, 21 | "items": [ 22 | { 23 | "id": "{{ id.path }}/p1/1", 24 | "type": "AnnotationPage", 25 | "items": [ 26 | { 27 | "id": "{{ id.path }}/annotation/v0001-image", 28 | "type": "Annotation", 29 | "motivation": "painting", 30 | "stylesheet": { 31 | "type": "CssStylesheet", 32 | "value": ".rotated { transform-origin: 761px 1344px; transform: rotate(90deg) translateY(-582px); }" 33 | }, 34 | "body": { 35 | "id": "{{ id.path }}/body/sr1", 36 | "type": "SpecificResource", 37 | "styleClass": "rotated", 38 | "source": { 39 | "id": "https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-0-21198-zz00022840-1-page1/full/max/0/default.jpg", 40 | "type": "Image", 41 | "format": "image/jpeg", 42 | "width": 1523, 43 | "height": 2105, 44 | "service": [ 45 | { 46 | "id": "https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-0-21198-zz00022840-1-page1", 47 | "type": "ImageService3", 48 | "profile": "level1" 49 | } 50 | ] 51 | } 52 | }, 53 | "target": "{{ id.path }}/canvas/p1" 54 | } 55 | ] 56 | } 57 | ] 58 | } 59 | ] 60 | } -------------------------------------------------------------------------------- /recipe/0021-tagging/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Simple Annotation — Tagging 3 | id: 21 4 | layout: recipe 5 | tags: [annotation] 6 | summary: "Tagging as a basic Annotation" 7 | viewers: 8 | - Mirador 9 | - Annona 10 | - Glycerine Viewer 11 | - Theseus 12 | - liiive 13 | - TIFY 14 | topic: annotation 15 | code: 16 | - iiif-prezi3 17 | --- 18 | 19 | ## Use Case 20 | 21 | For a IIIF resource, you'd like to add a simple Annotation to the resource. This annotation might call out a particular element or feature of an image as a tag. Such a tag, as part of a Manifest for the resource, would become discoverable and potentially aggregated with other identical or similar tags across the IIIF resources of one or more institutions. 22 | 23 | ## Implementation Notes 24 | 25 | This recipe demonstrates a simple way to use an Annotation to tag a IIIF resource or a portion of a IIIF resource: an Annotation with a `motivation` property that has a value of `tagging`. The foundation of tags in IIIF is the [W3C Web Annotation Data Model](http://w3.org/TR/annotation-model/), which you are encouraged to consult. 26 | 27 | Though it is not demonstrated here, it's worth noting that Annotations such as tags are permitted to use the `behavior` property with a value of `hidden`. With that property so set, viewers and other consuming clients should not display the tag by default, but should allow the user to determine the tag's visibility. 28 | 29 | ## Restrictions 30 | 31 | None known. 32 | 33 | ## Example 34 | 35 | In this Manifest, we use a photograph of Göttingen from the 2019 IIIF annual conference, one that has provided the resource for some other basic recipes in this cookbook. We're introducing an Annotation to demonstrate tagging by calling out the statue on the top of a fountain, a notable landmark of its city. 36 | 37 | Because the statue is not the sole or dominant element of the photo, we've targeted the tag to a portion of the photo using fragment selector syntax. 38 | 39 | {% include manifest_links.html viewers="Mirador,Annona,Glycerine Viewer, Theseus, liiive, TIFY" manifest="manifest.json" %} 40 | 41 | {% include jsonviewer.html src="manifest.json" config='data-line="44-63"' %} 42 | 43 | ## Related Recipes 44 | 45 | * [Fragment Selectors][0020] 46 | 47 | {% include acronyms.md %} 48 | {% include links.md %} 49 | -------------------------------------------------------------------------------- /recipe/0007-string-formats/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "Picture of Göttingen taken during the 2019 IIIF Conference" ] }, 6 | "summary": { "en": [ "

Picture taken by the IIIF Technical Coordinator

" ] }, 7 | "metadata": [ 8 | { 9 | "label": { "en": [ "Author" ] }, 10 | "value": { "none": [ "Glen Robson" ] } 11 | } 12 | ], 13 | "rights": "http://creativecommons.org/licenses/by-sa/3.0/", 14 | "requiredStatement": { 15 | "label": { "en": [ "Attribution" ] }, 16 | "value": { "en": [ "Glen Robson, IIIF Technical Coordinator. CC BY-SA 3.0 " ] } 17 | }, 18 | "items": [ 19 | { 20 | "id": "{{ id.path }}/canvas/p1", 21 | "type": "Canvas", 22 | "height": 3024, 23 | "width": 4032, 24 | "items": [ 25 | { 26 | "id": "{{ id.path }}/page/p1/1", 27 | "type": "AnnotationPage", 28 | "items": [ 29 | { 30 | "id": "{{ id.path }}/annotation/p0001-image", 31 | "type": "Annotation", 32 | "motivation": "painting", 33 | "body": { 34 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 35 | "type": "Image", 36 | "format": "image/jpeg", 37 | "height": 3024, 38 | "width": 4032, 39 | "service": [ 40 | { 41 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 42 | "profile": "level1", 43 | "type": "ImageService3" 44 | } 45 | ] 46 | }, 47 | "target": "{{ id.path }}/canvas/p1" 48 | } 49 | ] 50 | } 51 | ] 52 | } 53 | ] 54 | } 55 | -------------------------------------------------------------------------------- /recipe/0013-placeholderCanvas/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "Video recording of Donizetti's _The Elixer of Love_" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas/donizetti", 9 | "type": "Canvas", 10 | "duration": 7278.466, 11 | "width": 640, 12 | "height": 360, 13 | "placeholderCanvas": { 14 | "id": "{{ id.path }}/canvas/donizetti/placeholder", 15 | "type": "Canvas", 16 | "width": 640, 17 | "height": 360, 18 | "items": [ 19 | { 20 | "id": "{{ id.path }}/canvas/donizetti/placeholder/1", 21 | "type": "AnnotationPage", 22 | "items": [ 23 | { 24 | "id": "{{ id.path }}/canvas/donizetti/placeholder/1-image", 25 | "type": "Annotation", 26 | "motivation": "painting", 27 | "body": { 28 | "id": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/act1-thumbnail.png", 29 | "type": "Image", 30 | "format": "image/png", 31 | "width": 640, 32 | "height": 360 33 | }, 34 | "target": "{{ id.path }}/canvas/donizetti/placeholder" 35 | } 36 | ] 37 | } 38 | ] 39 | }, 40 | "items": [ 41 | { 42 | "id": "{{ id.path }}/donizetti/1", 43 | "type": "AnnotationPage", 44 | "items": [ 45 | { 46 | "id": "{{ id.path }}/donizetti/1-video", 47 | "type": "Annotation", 48 | "motivation": "painting", 49 | "body": { 50 | "id": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low.mp4", 51 | "type": "Video", 52 | "duration": 7278.466, 53 | "width": 640, 54 | "height": 360, 55 | "format": "video/mp4" 56 | }, 57 | "target": "{{ id.path }}/canvas/donizetti" 58 | } 59 | ] 60 | } 61 | ] 62 | } 63 | ] 64 | } -------------------------------------------------------------------------------- /recipe/0064-opera-one-canvas/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Table of Contents for Multiple A/V Files on a Single Canvas 3 | id: 64 4 | layout: recipe 5 | tags: [video, presentation, opera] 6 | summary: "A video recording of an opera on one Canvas." 7 | viewers: 8 | - UV 9 | - Ramp 10 | - Theseus 11 | topic: AV 12 | property: start 13 | --- 14 | 15 | 16 | ## Use Case 17 | 18 | It is common to have A/V content split into multiple files. This recipe shows how to model such content using one single Canvas. The advantage of using one single Canvas is continuous playback across the files, with the viewer reporting the sum duration of the files, thus providing the user with a cohesive viewing/listening experience. 19 | 20 | ## Implementation Notes 21 | 22 | This implementation builds upon the [Table of Contents for A/V Content][0026] recipe but uses two video files, one for each act of the opera used as example, annotated onto the same Canvas: Atto Primo targets #t=0, and Atto Secondo targets #t=3971.24, right after the end of Atto Primo, thus ensuring continuous playback. Conceptually it makes more sense to include both acts as annotations on the same Annotation Page since they are both targeting the same Canvas. 23 | 24 | The opera covers the whole length of the Canvas and is divided into two Ranges for the two acts. Atto Primo has a Range for the prelude and first song and then a Range for the remainder of the act. Atto Secondo has not been subdivided into Ranges for simplicity of this example. 25 | 26 | Metadata and thumbnail properties have been added for more context. Implementation is similar to [Book Chapters][0024], but nesting may be deeper. 27 | 28 | ## Example 29 | 30 | {% include manifest_links.html viewers="UV, Ramp" manifest="manifest.json" %} 31 | {% include jsonviewer.html src="manifest.json" %} 32 | 33 | ## Related Recipes 34 | 35 | - [Text in Multiple Languages][0006] - Recipe explaining the use of multiple languages in text like in the label for this opera. 36 | - [Thumbnails][0012] 37 | - [Table of Contents for A/V Content][0026] - Another example of using nested Ranges to represent an opera's table of contents. 38 | - [Table of Contents for Multiple A/V Files on Multiple Canvases][0065] - The same opera from this example but in audio format split across multiple Canvases. 39 | 40 | {% include acronyms.md %} 41 | {% include links.md %} 42 | -------------------------------------------------------------------------------- /recipe/0017-transcription-av/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Providing Access to Transcript Files of A/V Content 3 | id: 17 4 | layout: recipe 5 | tags: [audio, video, presentation, transcript] 6 | summary: "Transcripts as alternative representation of A/V content" 7 | viewers: 8 | - Ramp 9 | - Aviary 10 | - Theseus 11 | topic: AV 12 | property: rendering 13 | code: 14 | - iiif-prezi3 15 | --- 16 | 17 | 18 | ## Use Case 19 | 20 | You have a transcription file for your A/V resource and want to allow users to download it. 21 | 22 | ## Implementation notes 23 | 24 | A transcription file is a text-based representation of an audio or video file, which may or may not be in a timed-text format. As an alternative representation of the main resource, a transcription is added to a resource via the linking property `rendering`. 25 | 26 | See [Using Annotations for Timed Text][0079] when the transcript is in a timed-text format and you want to take advantage of a client's ability to synchronize it with its A/V resource during playback. 27 | 28 | While transcripts, captions, and subtitles each present some text interpretation of the A/V content, the ways they are consumed by the users differ. For a more detailed discussion about these differences see [Transcripts, Captions, and Subtitles - General Considerations][0231]. 29 | 30 | ## Restrictions 31 | 32 | None. 33 | 34 | ## Example 35 | 36 | In this example, the Manifest is using a single A/V file; therefore, it is equivalent to link the transcript at the Manifest level or at the Canvas level and we do it at the Canvas level to complement the example in [Providing Alternative Representations][0046]. 37 | 38 | In Ramp, the transcript file is made available to download on the right of the player controls. Click the filename listed in the menu to download the transcript file. 39 | 40 | {% include manifest_links.html viewers="Ramp, Aviary, Theseus" manifest="manifest.json" %} 41 | 42 | {% include jsonviewer.html src="manifest.json" config='data-line="39-50"'%} 43 | 44 | # Related recipes 45 | 46 | - [Simplest Manifest - Video][0003] 47 | - [Providing Alternative Representations][0046] 48 | - [Using Annotations for Timed Text][0079] 49 | - [Transcripts, Captions, and Subtitles - General Considerations][0231] 50 | - [A side by side transcript of a video recording][0253] 51 | 52 | {% include acronyms.md %} 53 | {% include links.md %} 54 | -------------------------------------------------------------------------------- /recipe/0346-multilingual-annotation-body/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Koto, chess, calligraphy, and painting" 8 | ], 9 | "ja": [ 10 | "琴棋書画図屏風" 11 | ] 12 | }, 13 | "items": [ 14 | { 15 | "id": "{{ id.path }}/canvas/p1", 16 | "type": "Canvas", 17 | "height": 3966, 18 | "width": 8800, 19 | "items": [ 20 | { 21 | "id": "{{ id.path }}/page/p1/1", 22 | "type": "AnnotationPage", 23 | "items": [ 24 | { 25 | "id": "{{ id.path }}/annotation/p0001-image", 26 | "type": "Annotation", 27 | "motivation": "painting", 28 | "body": { 29 | "id": "https://iiif.io/api/image/3.0/example/reference/36ca0a3370db128ec984b33d71a1543d-100320001004/full/max/0/default.jpg", 30 | "type": "Image", 31 | "format": "image/jpeg", 32 | "height": 3966, 33 | "width": 8800, 34 | "service": [ 35 | { 36 | "id": "https://iiif.io/api/image/3.0/example/reference/36ca0a3370db128ec984b33d71a1543d-100320001004", 37 | "profile": "level1", 38 | "type": "ImageService3" 39 | } 40 | ] 41 | }, 42 | "target": "{{ id.path }}/canvas/p1" 43 | } 44 | ] 45 | } 46 | ], 47 | "annotations": [ 48 | { 49 | "id": "{{ id.path }}/page/p2/1", 50 | "type": "AnnotationPage", 51 | "items": [ 52 | { 53 | "id": "{{ id.path }}/annotation/p0001-comment", 54 | "type": "Annotation", 55 | "motivation": "commenting", 56 | "body": { 57 | "type": "Choice", 58 | "items": [ 59 | { 60 | "type": "TextualBody", 61 | "value": "Koto with a cover being carried", 62 | "language": "en", 63 | "format": "text/plain" 64 | }, 65 | { 66 | "type": "TextualBody", 67 | "value": "袋に収められた琴", 68 | "language": "ja", 69 | "format": "text/plain" 70 | } 71 | ] 72 | }, 73 | "target": "{{ id.path }}/canvas/p1#xywh=1650,1200,925,1250" 74 | } 75 | ] 76 | } 77 | ] 78 | } 79 | ] 80 | } 81 | -------------------------------------------------------------------------------- /recipe/0103-poetry-reading-annotations/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context":"http://iiif.io/api/presentation/3/context.json", 3 | "id":"{{ id.url }}", 4 | "type":"Manifest", 5 | "label":{ 6 | "en":[ 7 | "Mediation and Lived Experience - Daphne Marlatt Performs With Her Younger Self" 8 | ] 9 | }, 10 | "items":[ 11 | { 12 | "id":"{{ id.path }}/canvas/1", 13 | "type":"Canvas", 14 | "duration":707.81, 15 | "items":[ 16 | { 17 | "type":"AnnotationPage", 18 | "id":"{{ id.path }}/canvas/1/item_page/1", 19 | "items":[ 20 | { 21 | "id":"{{ id.path }}/canvas/1/painting/1", 22 | "type":"Annotation", 23 | "motivation":"painting", 24 | "body":{ 25 | "id":"https://fixtures.iiif.io/audio/ubc/Performing-the-Archive-Leaf-leafs-by-Daphne-Marlatt.mp3", 26 | "type":"Sound", 27 | "format":"audio/mpeg", 28 | "duration":707.81 29 | }, 30 | "target":"{{ id.path }}/canvas/1" 31 | } 32 | ] 33 | } 34 | ], 35 | "annotations":[ 36 | { 37 | "id":"{{ id.path }}/canvas/1/page1", 38 | "type":"AnnotationPage", 39 | "label":{ 40 | "en":[ 41 | "Environmental Noise" 42 | ] 43 | }, 44 | "items":[ 45 | { 46 | "type":"Annotation", 47 | "motivation":[ 48 | "commenting" 49 | ], 50 | "id":"{{ id.path }}/canvas/1/page1/anno2", 51 | "body":[ 52 | { 53 | "type":"TextualBody", 54 | "value":"Soft laughter, rustling", 55 | "format":"text/plain", 56 | "motivation":"commenting" 57 | } 58 | ], 59 | "target":"{{ id.path }}/canvas/1#t=702.0,705.0" 60 | } 61 | ] 62 | } 63 | ] 64 | } 65 | ] 66 | } 67 | -------------------------------------------------------------------------------- /recipe/0540-link-for-opening-multiple-canvases/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}/manifest.json", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Two monuments in Rome" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas/p1", 13 | "type": "Canvas", 14 | "label": { 15 | "en": [ 16 | "The Temple of Vesta Rome" 17 | ] 18 | }, 19 | "height": 1464, 20 | "width": 2048, 21 | "items": [ 22 | { 23 | "id": "{{ id.path }}/page/p1/1", 24 | "type": "AnnotationPage", 25 | "items": [ 26 | { 27 | "id": "{{ id.path }}/annotation/p0001-image", 28 | "type": "Annotation", 29 | "motivation": "painting", 30 | "body": { 31 | "id": "https://fixtures.iiif.io/images/Yale/ycba/The_Temple_of_Vesta_Rome.jpg", 32 | "type": "Image", 33 | "format": "image/jpeg", 34 | "height": 1464, 35 | "width": 2048 36 | }, 37 | "target": "{{ id.path }}/canvas/p1" 38 | } 39 | ] 40 | } 41 | ] 42 | }, 43 | { 44 | "id": "{{ id.path }}/canvas/p2", 45 | "type": "Canvas", 46 | "label": { 47 | "en": [ 48 | "The Colosseum" 49 | ] 50 | }, 51 | "height": 1302, 52 | "width": 2048, 53 | "items": [ 54 | { 55 | "id": "{{ id.path }}/page/p2/1", 56 | "type": "AnnotationPage", 57 | "items": [ 58 | { 59 | "id": "{{ id.path }}/annotation/p0002-image", 60 | "type": "Annotation", 61 | "motivation": "painting", 62 | "body": { 63 | "id": "https://fixtures.iiif.io/images/Yale/ycba/The_Colosseum_Rome2.jpg", 64 | "type": "Image", 65 | "format": "image/jpeg", 66 | "height": 1302, 67 | "width": 2048 68 | }, 69 | "target": "{{ id.path }}/canvas/p2" 70 | } 71 | ] 72 | } 73 | ] 74 | } 75 | ] 76 | } -------------------------------------------------------------------------------- /recipe/0007-string-formats/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Embedding HTML in descriptive properties 3 | id: 7 4 | layout: recipe 5 | tags: [text, presentation] 6 | summary: "You want to have more control on how your metadata is displayed. For example scientific names, and also links out to other sites. Also legacy systems that might include things like italic tags." 7 | viewers: 8 | - UV 9 | - Mirador 10 | - Annona 11 | - Clover 12 | - Glycerine Viewer 13 | - Theseus 14 | - Curation 15 | - liiive 16 | - TIFY 17 | topic: property 18 | property: label, summary, metadata, requiredStatement 19 | code: 20 | - iiif-prezi3 21 | --- 22 | 23 | ## Use Case 24 | 25 | You want to have more control on how your metadata is displayed by adding links or simple formatting instructions to selected text blocks. For example, scientific names might need special formatting and links out to other sites benefit from being activatable. Legacy systems may also include rudimentary formatting in their output. 26 | 27 | ## Implementation notes 28 | 29 | You may include minimal HTML markup only in the `summary` property and the `value` property in the `metadata` and `requiredStatement` objects. HTML is not permitted in `label` or other properties. Your HTML must be [well-formed XML](https://validator.w3.org/) and therefore must be wrapped in an element such as `p` or `span`. 30 | 31 | To alert a consuming application that your content is HTML, the first character in your string must be ‘<’ and the last character must be ‘>’. If your content is plain text but happens to start and end with angle brackets as described above, add an additional whitespace character to the end of the value. 32 | 33 | ## Restrictions 34 | 35 | For security reasons, clients are expected to allow only `a`, `b`, `br`, `i`, `img`, `p`, `small`, `span`, `sub`, and `sup` tags, and may remove any or all of those. For more details of permitted and prohibited markup, see [the specification](https://iiif.io/api/presentation/3.0/#45-html-markup-in-property-values). 36 | 37 | ## Example 38 | 39 | {% include manifest_links.html viewers="UV, Mirador, Annona, Clover, Glycerine Viewer, Theseus, Curation, liiive, TIFY" manifest="manifest.json" %} 40 | 41 | {% include jsonviewer.html src="manifest.json" config='data-line="7,12,24,38"' %} 42 | 43 | # Related recipes 44 | 45 | * [Simplest Manifest - Single Image File][0001] 46 | 47 | {% include acronyms.md %} 48 | {% include links.md %} 49 | -------------------------------------------------------------------------------- /recipe/0202-start-canvas/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Load Manifest Beginning with a Specific Canvas 3 | id: 202 4 | layout: recipe 5 | tags: [image] 6 | summary: "This manifest uses the 'start' property to specify which Canvas the client should display on initialization of the resource." 7 | viewers: 8 | - Mirador 9 | - Annona 10 | - Glycerine Viewer 11 | - Theseus 12 | - TIFY 13 | topic: 14 | - image 15 | - property 16 | property: start 17 | --- 18 | 19 | ## Use Case 20 | 21 | In some cases, a book object will have front matter that most users would like to skip, such as blank pages (or perhaps shots of the binding and other non-textual views or color calibration images). In this recipe, we demonstrate using the `start` property to tell the presentation client to skip the initial Canvas (a blank page) and instead display the second Canvas (where the content begins) when loading the resource. 22 | 23 | ## Implementation Notes 24 | 25 | This recipe extends [Multiple Related Images (Book, etc.)][0009] by adding the information required by a client to load the Manifest at a specific Canvas. This is done by adding the `start` property to the Manifest and specifying the Canvas the client should display on initialization. 26 | 27 | The target of `start` must be a JSON object with `id` and `type` properties, where `type` can be either a Canvas or a Specific Resource with a Selector. In this use case, the target type property is a Canvas (`"type": "Canvas"`). 28 | 29 | For an example of the `start` property using a Specific Resource with a Selector, see [Begin playback at a specific point - Time-based media][0015]. For more on the start property, see: [Start Property][prezi3-start]. 30 | 31 | ## Example 32 | 33 | This example shows a Manifest with multiple Canvases for a book object. The `start` property specifies loading the Manifest at the second Canvas. Note that all Canvases are still displayed in the viewer and the user is able to navigate back to the first Canvas using the viewer navigation controls. 34 | 35 | {% include manifest_links.html viewers="Mirador,Annona,Glycerine Viewer, Theseus, TIFY" manifest="manifest.json" %} 36 | 37 | {% include jsonviewer.html src="manifest.json" config='data-line="10-13"'%} 38 | 39 | ## Related Recipes 40 | 41 | * [Begin playback at a specific point - Time-based media][0015] 42 | * [Multiple Related Images (Book, etc.)][0009] 43 | 44 | {% include acronyms.md %} 45 | {% include links.md %} 46 | -------------------------------------------------------------------------------- /recipe/0019-html-in-annotations/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Picture of Göttingen taken during the 2019 IIIF Conference" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas-1", 13 | "type": "Canvas", 14 | "height": 3024, 15 | "width": 4032, 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/canvas-1/annopage-1", 19 | "type": "AnnotationPage", 20 | "items": [ 21 | { 22 | "id": "{{ id.path }}/canvas-1/annopage-1/anno-1", 23 | "type": "Annotation", 24 | "motivation": "painting", 25 | "body": { 26 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 27 | "type": "Image", 28 | "format": "image/jpeg", 29 | "height": 3024, 30 | "width": 4032, 31 | "service": [ 32 | { 33 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 34 | "profile": "level1", 35 | "type": "ImageService3" 36 | } 37 | ] 38 | }, 39 | "target": "{{ id.path }}/canvas-1" 40 | } 41 | ] 42 | } 43 | ], 44 | "annotations": [ 45 | { 46 | "id": "{{ id.path }}/canvas-1/annopage-2", 47 | "type": "AnnotationPage", 48 | "items": [ 49 | { 50 | "id": "{{ id.path }}/canvas-1/annopage-2/anno-1", 51 | "type": "Annotation", 52 | "motivation": "commenting", 53 | "body": { 54 | "type": "TextualBody", 55 | "language": "de", 56 | "format": "text/html", 57 | "value": "

Göttinger Marktplatz mit Gänseliesel Brunnen Wikipedia logo

" 58 | }, 59 | "target": "{{ id.path }}/canvas-1" 60 | } 61 | ] 62 | } 63 | ] 64 | } 65 | ] 66 | } 67 | -------------------------------------------------------------------------------- /recipe/0318-navPlace-navDate/manifest-2.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": [ 3 | "http://iiif.io/api/extension/navplace/context.json", 4 | "http://iiif.io/api/presentation/3/context.json" 5 | ], 6 | "id": "{{ id.url }}", 7 | "type": "Manifest", 8 | "label": { 9 | "en": [ 10 | "The Colosseum" 11 | ] 12 | }, 13 | "navDate": "1776-01-01T00:00:00+00:00", 14 | "navPlace": { 15 | "id": "{{ id.path }}/feature-collection/2", 16 | "type": "FeatureCollection", 17 | "features": [ 18 | { 19 | "id": "{{ id.path }}/feature/2", 20 | "type": "Feature", 21 | "properties": { 22 | "label": { 23 | "en": [ 24 | "The Colosseum" 25 | ] 26 | } 27 | }, 28 | "geometry": { 29 | "type": "Point", 30 | "coordinates": [ 31 | 12.492222, 32 | 41.890278 33 | ] 34 | } 35 | } 36 | ] 37 | }, 38 | "items": [ 39 | { 40 | "id": "{{ id.path }}/canvas/2", 41 | "type": "Canvas", 42 | "height": 1529, 43 | "width": 2048, 44 | "label": { 45 | "en": [ 46 | "The Colosseum" 47 | ] 48 | }, 49 | "items": [ 50 | { 51 | "id": "{{ id.path }}/anno-page/2", 52 | "type": "AnnotationPage", 53 | "items": [ 54 | { 55 | "id": "{{ id.path }}/anno/2", 56 | "type": "Annotation", 57 | "motivation": "painting", 58 | "body": { 59 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-The_Colosseum/full/max/0/default.jpg", 60 | "type": "Image", 61 | "format": "image/jpeg", 62 | "height": 1529, 63 | "width": 2048, 64 | "service": [ 65 | { 66 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-The_Colosseum", 67 | "profile": "level1", 68 | "type": "ImageService3" 69 | } 70 | ] 71 | }, 72 | "target": "{{ id.path }}/canvas/2" 73 | } 74 | ] 75 | } 76 | ] 77 | } 78 | ] 79 | } -------------------------------------------------------------------------------- /recipe/0318-navPlace-navDate/manifest-1.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": [ 3 | "http://iiif.io/api/extension/navplace/context.json", 4 | "http://iiif.io/api/presentation/3/context.json" 5 | ], 6 | "id": "{{ id.url }}", 7 | "type": "Manifest", 8 | "label": { 9 | "en": [ 10 | "Castel Sant'Angelo, Rome" 11 | ] 12 | }, 13 | "navDate": "1776-01-01T00:00:00+00:00", 14 | "navPlace": { 15 | "id": "{{ id.path }}/feature-collection/1", 16 | "type": "FeatureCollection", 17 | "features": [ 18 | { 19 | "id": "{{ id.path }}/feature/1", 20 | "type": "Feature", 21 | "properties": { 22 | "label": { 23 | "en": [ 24 | "Castel Sant'Angelo, Rome" 25 | ] 26 | } 27 | }, 28 | "geometry": { 29 | "type": "Point", 30 | "coordinates": [ 31 | 12.4663, 32 | 41.9031 33 | ] 34 | } 35 | } 36 | ] 37 | }, 38 | "items": [ 39 | { 40 | "id": "{{ id.path }}/canvas/1", 41 | "type": "Canvas", 42 | "height": 1516, 43 | "width": 2048, 44 | "label": { 45 | "en": [ 46 | "Castel Sant'Angelo, Rome" 47 | ] 48 | }, 49 | "items": [ 50 | { 51 | "id": "{{ id.path }}/anno-page/1", 52 | "type": "AnnotationPage", 53 | "items": [ 54 | { 55 | "id": "{{ id.path }}/anno/1", 56 | "type": "Annotation", 57 | "motivation": "painting", 58 | "body": { 59 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-Castel_Sant_Angelo_Rome/full/max/0/default.jpg", 60 | "type": "Image", 61 | "format": "image/jpeg", 62 | "height": 1516, 63 | "width": 2048, 64 | "service": [ 65 | { 66 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-Castel_Sant_Angelo_Rome", 67 | "profile": "level1", 68 | "type": "ImageService3" 69 | } 70 | ] 71 | }, 72 | "target": "{{ id.path }}/canvas/1" 73 | } 74 | ] 75 | } 76 | ] 77 | } 78 | ] 79 | } -------------------------------------------------------------------------------- /recipe/0006-text-language/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Whistler's Mother" 8 | ], 9 | "fr": [ 10 | "La Mère de Whistler" 11 | ] 12 | }, 13 | "metadata": [ 14 | { 15 | "label": { 16 | "en": ["Creator"], 17 | "fr": ["Auteur"] 18 | }, 19 | "value": { 20 | "none": ["Whistler, James Abbott McNeill"] 21 | } 22 | }, 23 | { 24 | "label": { 25 | "en": ["Subject"], 26 | "fr": ["Sujet"] 27 | }, 28 | "value": { 29 | "en": ["McNeill Anna Matilda, mother of Whistler (1804-1881)"], 30 | "fr": ["McNeill Anna Matilda, mère de Whistler (1804-1881)"] 31 | } 32 | } 33 | ], 34 | "summary": { 35 | "en": ["Arrangement in Grey and Black No. 1, also called Portrait of the Artist's Mother."], 36 | "fr": ["Arrangement en gris et noir n°1, also called Portrait de la mère de l'artiste."] 37 | }, 38 | "requiredStatement": { 39 | "label": { 40 | "en": [ "Held By" ], 41 | "fr": [ "Détenu par" ] 42 | }, 43 | "value": { 44 | "none": [ "Musée d'Orsay, Paris, France" ] 45 | } 46 | }, 47 | 48 | "items": [ 49 | { 50 | "id": "{{ id.path }}/canvas/p1", 51 | "type": "Canvas", 52 | "width": 1114, 53 | "height": 991, 54 | "items": [ 55 | { 56 | "id": "{{ id.path }}/page/p1/1", 57 | "type": "AnnotationPage", 58 | "items": [ 59 | { 60 | "id": "{{ id.path }}/annotation/p0001-image", 61 | "type": "Annotation", 62 | "motivation": "painting", 63 | "body": { 64 | "id": "https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Whistlers_Mother/full/max/0/default.jpg", 65 | "type": "Image", 66 | "format": "image/jpeg", 67 | "width": 1114, 68 | "height": 991, 69 | "service": [ 70 | { 71 | "id": "https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Whistlers_Mother", 72 | "profile": "level1", 73 | "type": "ImageService3" 74 | } 75 | ] 76 | }, 77 | "target": "{{ id.path }}/canvas/p1" 78 | } 79 | ] 80 | } 81 | ] 82 | } 83 | ] 84 | } 85 | -------------------------------------------------------------------------------- /recipe/0318-navPlace-navDate/manifest-4.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": [ 3 | "http://iiif.io/api/extension/navplace/context.json", 4 | "http://iiif.io/api/presentation/3/context.json" 5 | ], 6 | "id": "{{ id.url }}", 7 | "type": "Manifest", 8 | "label": { 9 | "en": [ 10 | "The Temple of Vesta, Rome, 1849" 11 | ] 12 | }, 13 | "navDate": "1849-01-01T00:00:00+00:00", 14 | "navPlace": { 15 | "id": "{{ id.path }}/feature-collection/4", 16 | "type": "FeatureCollection", 17 | "features": [ 18 | { 19 | "id": "{{ id.path }}/feature/4", 20 | "type": "Feature", 21 | "properties": { 22 | "label": { 23 | "en": [ 24 | "The Temple of Vesta, Rome, 1849" 25 | ] 26 | } 27 | }, 28 | "geometry": { 29 | "type": "Point", 30 | "coordinates": [ 31 | 12.4862, 32 | 41.8917 33 | ] 34 | } 35 | } 36 | ] 37 | }, 38 | "items": [ 39 | { 40 | "id": "{{ id.path }}/canvas/4", 41 | "type": "Canvas", 42 | "height": 2875, 43 | "width": 2048, 44 | "label": { 45 | "en": [ 46 | "The Temple of Vesta, Rome, 1849" 47 | ] 48 | }, 49 | "items": [ 50 | { 51 | "id": "{{ id.path }}/anno-page/4", 52 | "type": "AnnotationPage", 53 | "items": [ 54 | { 55 | "id": "{{ id.path }}/anno/4", 56 | "type": "Annotation", 57 | "motivation": "painting", 58 | "body": { 59 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-The_Temple_of_Vesta_Rome/full/max/0/default.jpg", 60 | "type": "Image", 61 | "format": "image/jpeg", 62 | "height": 2875, 63 | "width": 2048, 64 | "service": [ 65 | { 66 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-The_Temple_of_Vesta_Rome", 67 | "profile": "level1", 68 | "type": "ImageService3" 69 | } 70 | ] 71 | }, 72 | "target": "{{ id.path }}/canvas/4" 73 | } 74 | ] 75 | } 76 | ] 77 | } 78 | ] 79 | } -------------------------------------------------------------------------------- /recipe/0318-navPlace-navDate/manifest-5.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": [ 3 | "http://iiif.io/api/extension/navplace/context.json", 4 | "http://iiif.io/api/presentation/3/context.json" 5 | ], 6 | "id": "{{ id.url }}", 7 | "type": "Manifest", 8 | "label": { 9 | "en": [ 10 | "A View of Trajan's Forum, Rome, 1821" 11 | ] 12 | }, 13 | "navDate": "1821-01-01T00:00:00+00:00", 14 | "navPlace": { 15 | "id": "{{ id.path }}/feature-collection/5", 16 | "type": "FeatureCollection", 17 | "features": [ 18 | { 19 | "id": "{{ id.path }}/feature/5", 20 | "type": "Feature", 21 | "properties": { 22 | "label": { 23 | "en": [ 24 | "A View of Trajan's Forum, Rome, 1821" 25 | ] 26 | } 27 | }, 28 | "geometry": { 29 | "type": "Point", 30 | "coordinates": [ 31 | 12.485869, 32 | 41.895419 33 | ] 34 | } 35 | } 36 | ] 37 | }, 38 | "items": [ 39 | { 40 | "id": "{{ id.path }}/canvas/5", 41 | "type": "Canvas", 42 | "height": 3005, 43 | "width": 2048, 44 | "label": { 45 | "en": [ 46 | "A View of Trajan's Forum, Rome, 1821" 47 | ] 48 | }, 49 | "items": [ 50 | { 51 | "id": "{{ id.path }}/anno-page/5", 52 | "type": "AnnotationPage", 53 | "items": [ 54 | { 55 | "id": "{{ id.path }}/anno/5", 56 | "type": "Annotation", 57 | "motivation": "painting", 58 | "body": { 59 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-A_View_of_Trajans_Forum_Rome/full/max/0/default.jpg", 60 | "type": "Image", 61 | "format": "image/jpeg", 62 | "height": 3005, 63 | "width": 2048, 64 | "service": [ 65 | { 66 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-A_View_of_Trajans_Forum_Rome", 67 | "profile": "level1", 68 | "type": "ImageService3" 69 | } 70 | ] 71 | }, 72 | "target": "{{ id.path }}/canvas/5" 73 | } 74 | ] 75 | } 76 | ] 77 | } 78 | ] 79 | } -------------------------------------------------------------------------------- /recipe/0318-navPlace-navDate/manifest-3.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": [ 3 | "http://iiif.io/api/extension/navplace/context.json", 4 | "http://iiif.io/api/presentation/3/context.json" 5 | ], 6 | "id": "{{ id.url }}", 7 | "type": "Manifest", 8 | "label": { 9 | "en": [ 10 | "The Arch of Titus from the Forum, Rome, ca. 1725" 11 | ] 12 | }, 13 | "navDate": "1725-01-01T00:00:00+00:00", 14 | "navPlace": { 15 | "id": "{{ id.path }}/feature-collection/3", 16 | "type": "FeatureCollection", 17 | "features": [ 18 | { 19 | "id": "{{ id.path }}/feature/3", 20 | "type": "Feature", 21 | "properties": { 22 | "label": { 23 | "en": [ 24 | "The Arch of Titus from the Forum, Rome, ca. 1725" 25 | ] 26 | } 27 | }, 28 | "geometry": { 29 | "type": "Point", 30 | "coordinates": [ 31 | 12.488585, 32 | 41.890717 33 | ] 34 | } 35 | } 36 | ] 37 | }, 38 | "items": [ 39 | { 40 | "id": "{{ id.path }}/canvas/3", 41 | "type": "Canvas", 42 | "height": 2875, 43 | "width": 2048, 44 | "label": { 45 | "en": [ 46 | "The Arch of Titus from the Forum, Rome, ca. 1725" 47 | ] 48 | }, 49 | "items": [ 50 | { 51 | "id": "{{ id.path }}/anno-page/3", 52 | "type": "AnnotationPage", 53 | "items": [ 54 | { 55 | "id": "{{ id.path }}/anno/3", 56 | "type": "Annotation", 57 | "motivation": "painting", 58 | "body": { 59 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-The_Arch_of_Titus_from_the_Forum_Rome/full/max/0/default.jpg", 60 | "type": "Image", 61 | "format": "image/jpeg", 62 | "height": 2875, 63 | "width": 2048, 64 | "service": [ 65 | { 66 | "id": "https://iiif.io/api/image/3.0/example/reference/71b9228e087f15c75b628214cd9f647d-The_Arch_of_Titus_from_the_Forum_Rome", 67 | "profile": "level1", 68 | "type": "ImageService3" 69 | } 70 | ] 71 | }, 72 | "target": "{{ id.path }}/canvas/3" 73 | } 74 | ] 75 | } 76 | ] 77 | } 78 | ] 79 | } -------------------------------------------------------------------------------- /recipe/0377-image-in-annotation/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Picture of Göttingen taken during the 2019 IIIF Conference" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas-1", 13 | "type": "Canvas", 14 | "height": 3024, 15 | "width": 4032, 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/canvas-1/annopage-1", 19 | "type": "AnnotationPage", 20 | "items": [ 21 | { 22 | "id": "{{ id.path }}/canvas-1/annopage-1/anno-1", 23 | "type": "Annotation", 24 | "motivation": "painting", 25 | "body": { 26 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 27 | "type": "Image", 28 | "format": "image/jpeg", 29 | "height": 3024, 30 | "width": 4032, 31 | "service": [ 32 | { 33 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 34 | "profile": "level1", 35 | "type": "ImageService3" 36 | } 37 | ] 38 | }, 39 | "target": "{{ id.path }}/canvas-1" 40 | } 41 | ] 42 | } 43 | ], 44 | "annotations": [ 45 | { 46 | "id": "{{ id.path }}/canvas-1/annopage-2", 47 | "type": "AnnotationPage", 48 | "items": [ 49 | { 50 | "id": "{{ id.path }}/canvas-1/annopage-2/anno-1", 51 | "type": "Annotation", 52 | "motivation": "commenting", 53 | "body": [ 54 | { 55 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-fountain/full/300,/0/default.jpg", 56 | "type": "Image", 57 | "format": "image/jpeg" 58 | }, 59 | { 60 | "type": "TextualBody", 61 | "language": "en", 62 | "value": "Night picture of the Gänseliesel fountain in Göttingen taken during the 2019 IIIF Conference" 63 | } 64 | ], 65 | "target": "{{ id.path }}/canvas-1#xywh=138,550,1477,1710" 66 | } 67 | ] 68 | } 69 | ] 70 | } 71 | ] 72 | } 73 | -------------------------------------------------------------------------------- /recipe/0013-placeholderCanvas/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Load a Preview Image Before the Main Content" 3 | id: 13 4 | layout: recipe 5 | tags: video, audio, image, av 6 | summary: "Provide the user with something to look at before they choose to start interacting with the main content, and/or while they wait for it to load/buffer." 7 | viewers: 8 | - Clover 9 | - Ramp 10 | - Theseus 11 | - TIFY 12 | topic: 13 | - property 14 | - AV 15 | property: placeholderCanvas 16 | 17 | --- 18 | 19 | ## Use Case 20 | 21 | You have an exceptionally large video to present to site visitors. As each visitor's connection reliability and bandwidth are unknown and unpredictable, you want to show them a still image preview of the video (which will load more quickly) until the video has finished loading or has sufficiently buffered. 22 | 23 | ## Implementation notes 24 | 25 | Across a Manifest and its resources, you may use more than one `placeholderCanvas`, allowing you to have an authentic `placeholderCanvas` for each appropriate resource (Collection, Manifest, Canvas, and Range). 26 | 27 | The target of the Annotation of a `placeholderCanvas` should have as its value the id of the `placeholderCanvas`, not the id of the resource that has the `placeholderCanvas`. 28 | 29 | Always keep in mind the wide latitude given conforming clients: It is up to the client whether and in what sort of UI to display content you place in a `placeholderCanvas` property. Do not use this property for content that must be displayed. On the other hand, placing content in a `placeholderCanvas` does communicate to a conforming client that the content, if displayed, should be displayed before the resource to which it is attached. 30 | 31 | ## Restrictions 32 | 33 | Each instance of `placeholderCanvas` may only contain one Canvas, and as such may specifically not contain an additional `placeholderCanvas` or an `accompanyingCanvas`. 34 | 35 | ## Example 36 | 37 | In the example, the main content is a video of a performance of Donizetti's _L'elisir d'amore_ and the `placeholderCanvas` is a still frame from the video. For a site visitor with limited bandwidth, showing the still frame allows them to get an advance look at performance aspects such as costuming, staging, and set design. 38 | 39 | {% include manifest_links.html manifest="manifest.json" %} 40 | 41 | {% include jsonviewer.html src="manifest.json" config="data-line='17-43'"%} 42 | 43 | # Related recipes 44 | 45 | * [Simplest Manifest - Video][0003] 46 | * [Audio Presentation with Accompanying Image][0014], using `accompanyingCanvas` to present one resource simultaneously with another. 47 | 48 | {% include acronyms.md %} 49 | {% include links.md %} 50 | -------------------------------------------------------------------------------- /recipe/0068-newspaper/newspaper_title-collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": [ 3 | "http://iiif.io/api/presentation/3/context.json" 4 | ], 5 | "type": "Collection", 6 | "id": "{{ id.url }}", 7 | "label": { 8 | "de": [ 9 | "Berliner Tageblatt" 10 | ] 11 | }, 12 | "metadata": [ 13 | { 14 | "label": { 15 | "en": [ 16 | "type" 17 | ] 18 | }, 19 | "value": { 20 | "none": ["http://data.europeana.eu/concept/base/18"], 21 | "en": [ 22 | "Newspaper Title", 23 | "Serial" 24 | ] 25 | } 26 | }, 27 | { 28 | "label": { 29 | "en": [ 30 | "language" 31 | ] 32 | }, 33 | "value": { 34 | "none": ["de"], 35 | "en": [ 36 | "German" 37 | ] 38 | } 39 | } 40 | ], 41 | "rights": "http://creativecommons.org/publicdomain/mark/1.0/", 42 | "requiredStatement": { 43 | "label": { 44 | "en": [ 45 | "Attribution" 46 | ] 47 | }, 48 | "value": { 49 | "en": [ 50 | "

Berliner Tageblatt - Staatsbibliothek zu Berlin - Preußischer Kulturbesitz. Public Domain Mark - http://creativecommons.org/publicdomain/mark/1.0/

" 51 | ] 52 | } 53 | }, 54 | "provider": [{ 55 | "id": "https://www.europeana.eu/", 56 | "type": "Agent", 57 | "label": { "en": [ "Europeana" ] }, 58 | "logo": [ 59 | { 60 | "id": "https://style.europeana.eu/images/europeana-logo-default.png", 61 | "type": "Image", 62 | "format": "image/png", 63 | "height": 310, 64 | "width": 100 65 | } 66 | ] 67 | }], 68 | "seeAlso": [ 69 | { 70 | "id": "https://www.europeana.eu/api/v2/record/9200355/BibliographicResource_3000096302605.json-ld", 71 | "type": "Dataset", 72 | "format": "application/ld+json", 73 | "profile": "http://www.europeana.eu/schemas/edm/" 74 | } 75 | ], 76 | "items": [ 77 | { 78 | "id": "{{ id.path }}/newspaper_issue_1-manifest.json", 79 | "type": "Manifest", 80 | "label": { 81 | "de": [ 82 | "Berliner Tageblatt - 1925-02-16" 83 | ] 84 | }, 85 | "navDate": "1925-02-16T00:00:00Z" 86 | }, 87 | { 88 | "id": "{{ id.path }}/newspaper_issue_2-manifest.json", 89 | "type": "Manifest", 90 | "label": { 91 | "de": [ 92 | "Berliner Tageblatt - 1925-03-13" 93 | ] 94 | }, 95 | "navDate": "1925-03-13T00:00:00Z" 96 | } 97 | ] 98 | } 99 | -------------------------------------------------------------------------------- /recipe/0377-image-in-annotation/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Image in Annotations 3 | id: 377 4 | layout: recipe 5 | tags: [annotation] 6 | summary: "Provides an image in an annotation" 7 | viewers: 8 | - Annona 9 | - Glycerine Viewer 10 | - Theseus 11 | - TIFY 12 | topic: 13 | - basic 14 | --- 15 | 16 | ## Use Case 17 | 18 | Provide an image that adds details about or shows a different view of a particular feature/area of the Resource. 19 | 20 | - You have a group picture of many people. The image quality doesn't allow you to recognize all of them, so you annotate each face with the name of the person and an individual photo of that person. 21 | - You have a picture of an architect's plan for a building which has been built. To show how the completed building looks, you decide to annotate specific features, such as the patio, with actual photographs. 22 | - You have a Manifest with a video showing an old building at the time of its creation. In some instances, where the video shows a specific part of the building, you might want to annotate the video with a photo of how this part looks now. Annotations may be just one image or contain a description like, "This wall faces north, you can see there is more moss there." 23 | 24 | ## Implementation Notes 25 | 26 | Our supplementary image is not part of the Canvas content, thus it must not have the motivation `painting` and is placed in the `annotations` section of the Canvas. Following the [W3C Web Annotation model](https://www.w3.org/TR/annotation-model/#external-web-resources), we have two separate objects that make up the Annotation body. One object is an image which is the supplementary image and the other is a textual body which acts as a caption for the supplementary image. Both of these objects together target the Resource. 27 | 28 | ## Example 29 | 30 | The main content is a photo of a square in Göttingen, which shows, among others things, a fountain. We wanted to show the lights on the fountain during the night, so we associated the part of the Canvas containing the fountain with an Annotation consisting of a picture of the fountain at night and a text comment. 31 | 32 | {% include manifest_links.html viewers="Annona, Glycerine Viewer, Theseus, TIFY" manifest="manifest.json" %} 33 | 34 | {% include jsonviewer.html src="manifest.json" config="data-line='49-66'" %} 35 | 36 | ## Related Recipes 37 | 38 | * [Simplest Annotation][0266] 39 | * [Annotate specific images or layers][0326] to annotate only one of the images 40 | * [Annotation with a Non-Rectangular Polygon][0261] to precisely draw the contours of the fountain 41 | * [Tagging with an External Resource][0258] 42 | 43 | {% include acronyms.md %} 44 | {% include links.md %} 45 | -------------------------------------------------------------------------------- /recipe/0560-resources-on-a-timeline/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Rendering Resources Sequentially on a Timeline" 8 | ] 9 | }, 10 | "behavior": [ 11 | "repeat" 12 | ], 13 | "items": [ 14 | { 15 | "id": "{{ id.path }}/canvas1", 16 | "type": "Canvas", 17 | "height": 2572, 18 | "width": 3764, 19 | "duration": 4.0, 20 | "items": [ 21 | { 22 | "id": "{{ id.path }}/canvas1/page/p1/1", 23 | "type": "AnnotationPage", 24 | "items": [ 25 | { 26 | "id": "{{ id.path }}/canvas1/annotation/p1a1-image", 27 | "type": "Annotation", 28 | "motivation": "painting", 29 | "body": { 30 | "id": "https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Northeaster_by_Winslow_Homer_1895/full/max/0/default.jpg", 31 | "type": "Image", 32 | "format": "image/jpeg", 33 | "height": 2572, 34 | "width": 3764, 35 | "service": [ 36 | { 37 | "id": "https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Northeaster_by_Winslow_Homer_1895/", 38 | "profile": "level1", 39 | "type": "ImageService3" 40 | } 41 | ] 42 | }, 43 | "target": "{{ id.path }}/canvas1&t=0,2" 44 | }, 45 | { 46 | "id": "{{ id.path }}/canvas1/annotation/p1a2-image", 47 | "type": "Annotation", 48 | "motivation": "painting", 49 | "body": { 50 | "id": "https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Winslow_Homer_-_The_Gulf_Stream_-_Metropolitan_Museum_of_Art/full/max/0/default.jpg", 51 | "type": "Image", 52 | "format": "image/jpeg", 53 | "height": 3540, 54 | "width": 5886, 55 | "service": [ 56 | { 57 | "id": "https://iiif.io/api/image/3.0/example/reference/329817fc8a251a01c393f517d8a17d87-Winslow_Homer_-_The_Gulf_Stream_-_Metropolitan_Museum_of_Art/", 58 | "profile": "level1", 59 | "type": "ImageService3" 60 | } 61 | ] 62 | }, 63 | "target": "{{ id.path }}/canvas1&t=2,4" 64 | } 65 | ] 66 | } 67 | ] 68 | } 69 | ] 70 | } -------------------------------------------------------------------------------- /recipe/0014-accompanyingcanvas/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Audio Presentation with Accompanying Image" 3 | id: 14 4 | layout: recipe 5 | tags: [audio,image] 6 | summary: "Provide the user with something to look at before they choose to start interacting with the main content, and/or while they wait for it to load/buffer, and/or while interacting with the main content." 7 | viewers: 8 | - Clover 9 | - Aviary 10 | - Theseus 11 | topic: 12 | - property 13 | - AV 14 | property: accompanyingCanvas 15 | --- 16 | 17 | ## Use Case 18 | 19 | You have content you would like to provide to the user to enrich the presentation or experience of the main content. It could be something to experience before the user chooses to start interacting with the main content and/or something additional to consider while interacting with the main content. You might want to have an image available while an audio-only Canvas is playing or, conversely, audio available while a user is navigating an image-only Manifest. 20 | 21 | ## Implementation notes 22 | 23 | Across a Manifest and its properties, you may use more than one `accompanyingCanvas`, allowing you to have an authentic `accompanyingCanvas` for each appropriate resource (Collection, Manifest, Canvas, and Range). 24 | 25 | The `target` of the `Annotation` of an `accompanyingCanvas` should have as its value the `id` of the `accompanyingCanvas`, not the `id` of the resource that has the `accompanyingCanvas`. 26 | 27 | Always keep in mind the wide latitude given conforming clients: It is up to the client whether and in what sort of UI to display content you place in a `accompanyingCanvas` property. Don't use this property for content that must be displayed. On the other hand, placing content in a `accompanyingCanvas` does tell a client that the content, if displayed, should be displayed at the same time as the resource to which it is attached. 28 | 29 | ## Restrictions 30 | 31 | Each instance of `accompanyingCanvas` may only contain one Canvas, and as such may specifically not contain an additional `accompanyingCanvas` or a `placeholderCanvas`. 32 | 33 | ## Example 34 | 35 | In the example, the main Canvas contains audio of a performance of Gustav Mahler's Symphony No. 3 and the `accompanyingCanvas` contains an image of a page from the score. 36 | 37 | {% include manifest_links.html viewers="Clover, Aviary, Theseus" manifest="manifest.json" %} 38 | 39 | {% include jsonviewer.html src="manifest.json" config="data-line='20-58'"%} 40 | 41 | # Related recipes 42 | 43 | * [Simplest Manifest - Video][0003] 44 | * [Load a Preview Image Before the Main Content][0013], using `placeholderCanvas` to present one resource ahead of another. 45 | 46 | {% include acronyms.md %} 47 | {% include links.md %} 48 | -------------------------------------------------------------------------------- /recipe/0258-tagging-external-resource/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tagging with an External Resource 3 | id: 258 4 | layout: recipe 5 | tags: annotation, tagging, linking 6 | summary: "Connect a tagging annotation to an external resource" 7 | viewers: 8 | - Glycerine Viewer 9 | - Theseus 10 | topic: annotation 11 | --- 12 | 13 | ## Use Case 14 | 15 | When you annotate a resource with a tag, you'd like to connect that tag to an external source, whether an authority file, a linked data node, or something else that represents unambiguously some data you want to associate with the annotated resource. 16 | 17 | ## Implementation Notes 18 | The [IIIF Presentation 3.0 API][prezi3] does not itself discuss linking to external web resources in annotations, incorporating them from the [W3C Web Annotation Data Model](http://w3.org/TR/annotation-model/) by reference. For a full description of this and other portions of the data model used in IIIF annotations, we recommend you read that document. 19 | 20 | In order to make possible a link between the IIIF resource and an external web resource, the pertinent Annotation must have at least a `body` that is a Specific Resource whose `source` property contains the appropriate URI as its value. That `source` value must resolve, that is, it must be a real URI at the time of the creation of the Annotation. 21 | 22 | Finally, be sure you are writing valid value forms in your Annotation. In the Web Annotation data model, there are different patterns for the `value` property, when used within an Annotation. The `value` of a `TextualBody` or a `FragmentSelector`, for example, is a string rather than a JSON object. See also [the Presentation API v3.0](https://iiif.io/api/presentation/3.0/#56-annotation). 23 | 24 | ## Restrictions 25 | 26 | None known. 27 | 28 | ## Example 29 | 30 | In this example, we continue our use of a photograph of a square in Göttingen, Germany, which includes a fountain topped by a sculpture of a girl and 2 accompanying geese. While the Annotation `body` that points to the Wikidata entry for the fountain is valid all alone, we've added an additional `body` to provide the viewer a natural language textual label to display to a person using that viewer. 31 | 32 | Using multiple `body` properties, as shown here, does not have any predictable consequences for a viewer's handling of the data. With this in mind, each `body` in this Manifest could stand alone. 33 | 34 | {% include manifest_links.html viewers="Glycerine Viewer, Theseus" manifest="manifest.json" %} 35 | 36 | {% include jsonviewer.html src="manifest.json" config="data-line='49-66'"%} 37 | 38 | ## Related Recipes 39 | 40 | * [Simplest Annotation][0266] 41 | * [Simple Annotation — Tagging][0021] 42 | 43 | {% include links.md %} 44 | -------------------------------------------------------------------------------- /recipe/0033-choice/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "John Dee performing an experiment before Queen Elizabeth I." ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas/p1", 9 | "type": "Canvas", 10 | "height": 1271, 11 | "width": 2000, 12 | "items": [ 13 | { 14 | "id": "{{ id.path }}/page/p1/1", 15 | "type": "AnnotationPage", 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/annotation/p0001-image", 19 | "type": "Annotation", 20 | "motivation": "painting", 21 | "body": { 22 | "type": "Choice", 23 | "items": [ 24 | { 25 | "id": "https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-natural/full/max/0/default.jpg", 26 | "type": "Image", 27 | "format": "image/jpeg", 28 | "width": 2000, 29 | "height": 1271, 30 | "label": { "en": [ "Natural Light" ] }, 31 | "service": [ 32 | { 33 | "id": "https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-natural", 34 | "type": "ImageService3", 35 | "profile": "level1" 36 | } 37 | ] 38 | }, 39 | { 40 | "id": "https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-xray/full/max/0/default.jpg", 41 | "type": "Image", 42 | "format": "image/jpeg", 43 | "width": 2000, 44 | "height": 1271, 45 | "label": { "en": [ "X-Ray" ] }, 46 | "service": [ 47 | { 48 | "id": "https://iiif.io/api/image/3.0/example/reference/421e65be2ce95439b3ad6ef1f2ab87a9-dee-xray", 49 | "type": "ImageService3", 50 | "profile": "level1" 51 | } 52 | ] 53 | } 54 | ] 55 | }, 56 | "target": "{{ id.path }}/canvas/p1" 57 | } 58 | ] 59 | } 60 | ] 61 | } 62 | ] 63 | } 64 | -------------------------------------------------------------------------------- /recipe/0135-annotating-point-in-canvas/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Using a point selector for annotating a location on a map." 8 | ] 9 | }, 10 | "summary": { 11 | "en": [ 12 | "A map containing an point with an annotation of the location." 13 | ] 14 | }, 15 | "items": [ 16 | { 17 | "id": "{{ id.path }}/canvas.json", 18 | "type": "Canvas", 19 | "label": { 20 | "en": [ 21 | "Chesapeake and Ohio Canal Pamphlet" 22 | ] 23 | }, 24 | "height": 7072, 25 | "width": 5212, 26 | "items": [ 27 | { 28 | "id": "{{ id.path }}/contentPage.json", 29 | "type": "AnnotationPage", 30 | "items": [ 31 | { 32 | "id": "{{ id.path }}/content.json", 33 | "type": "Annotation", 34 | "motivation": "painting", 35 | "body": { 36 | "id": "https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-88695674/full/max/0/default.jpg", 37 | "type": "Image", 38 | "format": "image/jpeg", 39 | "height": 7072, 40 | "width": 5212, 41 | "service": [ 42 | { 43 | "id": "https://iiif.io/api/image/3.0/example/reference/43153e2ec7531f14dd1c9b2fc401678a-88695674", 44 | "type": "ImageService3", 45 | "profile": "level1" 46 | } 47 | ] 48 | }, 49 | "target": "{{ id.path }}/canvas.json" 50 | } 51 | ] 52 | } 53 | ], 54 | "annotations": [ 55 | { 56 | "id": "{{ id.path }}/page/p2/1", 57 | "type": "AnnotationPage", 58 | "items": [ 59 | { 60 | "id": "{{ id.path }}/annotation/p0002-tag", 61 | "type": "Annotation", 62 | "motivation": "tagging", 63 | "body": { 64 | "type": "TextualBody", 65 | "value": "Town Creek Aqueduct", 66 | "language": "en", 67 | "format": "text/plain" 68 | }, 69 | "target": { 70 | "type": "SpecificResource", 71 | "source": "{{ id.path }}/canvas.json", 72 | "selector": { 73 | "type": "PointSelector", 74 | "x": 3385, 75 | "y": 1464 76 | } 77 | } 78 | } 79 | ] 80 | } 81 | ] 82 | } 83 | ] 84 | } 85 | -------------------------------------------------------------------------------- /recipe/0261-non-rectangular-commenting/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Picture of Göttingen taken during the 2019 IIIF Conference" 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas/p1", 13 | "type": "Canvas", 14 | "height": 3024, 15 | "width": 4032, 16 | "items": [ 17 | { 18 | "id": "{{ id.path }}/page/p1/1", 19 | "type": "AnnotationPage", 20 | "items": [ 21 | { 22 | "id": "{{ id.path }}/annotation/p0001-image", 23 | "type": "Annotation", 24 | "motivation": "painting", 25 | "body": { 26 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 27 | "type": "Image", 28 | "format": "image/jpeg", 29 | "height": 3024, 30 | "width": 4032, 31 | "service": [ 32 | { 33 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 34 | "profile": "level1", 35 | "type": "ImageService3" 36 | } 37 | ] 38 | }, 39 | "target": "{{ id.path }}/canvas/p1" 40 | } 41 | ] 42 | } 43 | ], 44 | "annotations": [ 45 | { 46 | "id": "{{ id.path }}/page/p2/1", 47 | "type": "AnnotationPage", 48 | "items": [ 49 | { 50 | "id": "{{ id.path }}/annotation/p0002-svg", 51 | "type": "Annotation", 52 | "motivation": "tagging", 53 | "body": { 54 | "type": "TextualBody", 55 | "value": "Gänseliesel-Brunnen", 56 | "language": "de", 57 | "format": "text/plain" 58 | }, 59 | "target": { 60 | "type": "SpecificResource", 61 | "source": "{{ id.path }}/canvas/p1", 62 | "selector": { 63 | "type": "SvgSelector", 64 | "value": "" 65 | } 66 | } 67 | } 68 | ] 69 | } 70 | ] 71 | } 72 | ] 73 | } -------------------------------------------------------------------------------- /recipe/0047-homepage/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Linking to Web Page of an Object 3 | id: 47 4 | layout: recipe 5 | tags: [metadata, presentation] 6 | summary: "tbc" 7 | viewers: 8 | - Mirador 9 | - Clover 10 | - Annona 11 | - Glycerine Viewer 12 | - Theseus 13 | - TIFY 14 | topic: property 15 | property: homepage 16 | --- 17 | 18 | ## Use Case 19 | 20 | You have a IIIF Manifest representing an object that is also represented by one or more home pages by an organization. These web pages may be published by the organization responsible for the object as well as its Manifest resource. For each homepage entry, an actionable route would be provided to a web page able to be displayed to the user. 21 | 22 | ## Implementation Notes 23 | 24 | Conforming clients may render the `homepage` property in various ways, yet most likely as an HTML anchor element for each entry. An alternative consideration could be as a button. 25 | 26 | If an anchor is utilized for the instance, the `id` represents the destination of the link and would serve as the value for its `href` attribute. 27 | 28 | The `label` is rendered as the content within the link according to the [Language of Property Values](https://iiif.io/api/presentation/3.0/#language-of-property-values). A client may also choose to provide a `lang` attribute on the anchor element with a value of the determined BCP 47 language code of the `label`. 29 | 30 | Entries of a `homepage` property may also have a `language` property. These values represent the language(s) of the destination web page. A client may also render a _single_ language entry as the value for `hreflang` attribute on the anchor element. Entries should have a `format` property, most likely with a value being `text/html`. 31 | 32 | ## Restrictions 33 | 34 | Web pages related to the object described by the Manifest that are not its home should utilize the `metadata` property as a `label` and `value` pair. 35 | 36 | ## Example 37 | 38 | In this example we have a Manifest representing an object housed at the Getty Museum Collection. A `homepage` property is at the Manifest level with one entry. The single instance references the URL at which a user could be displayed a web page of the object’s catalog entry. 39 | 40 | _Laocöon_. Credit: Getty. 41 | 42 | {% include manifest_links.html viewers="Mirador, Clover, Annona, Glycerine Viewer, Theseus, TIFY" manifest="manifest.json" %} 43 | 44 | {% include jsonviewer.html src="manifest.json" config='data-line="10-24"' %} 45 | 46 | ## Related Recipes 47 | 48 | - [Acknowledge Content Contributors][0234] for demonstrating the use of `homepage` for a `provider` 49 | - [Linking to Structured Metadata][0053] for demonstrating the use of `seeAlso` 50 | - [Metadata on any Resource][0029] 51 | 52 | {% include acronyms.md %} 53 | {% include links.md %} 54 | -------------------------------------------------------------------------------- /recipe/0040-image-rotation-service/manifest-service.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }} ", 4 | "type": "Manifest", 5 | "label": { 6 | "ca": [ 7 | "[Conoximent de las orines] Ihesus, Ihesus. En nom de Deu et dela beneyeta sa mare e de tots los angels i archangels e de tots los sants e santes de paradis yo micer Johannes comense aquest libre de reseptes en l’ayn Mi 466." 8 | ] 9 | }, 10 | "items": [ 11 | { 12 | "id": "{{ id.path }}/canvas/p1", 13 | "type": "Canvas", 14 | "label": { 15 | "en": [ 16 | "inside cover; 1r" 17 | ] 18 | }, 19 | "width": 2105, 20 | "height": 1523, 21 | "items": [ 22 | { 23 | "id": "{{ id.path }}/p1/1", 24 | "type": "AnnotationPage", 25 | "items": [ 26 | { 27 | "id": "{{ id.path }}/annotation/v0001-image", 28 | "type": "Annotation", 29 | "motivation": "painting", 30 | "body": { 31 | "id": "{{ id.path }}/body/v0001-image", 32 | "type": "SpecificResource", 33 | "source": { 34 | "id": "https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-0-21198-zz00022840-1-page1/full/max/0/default.jpg", 35 | "type": "Image", 36 | "format": "image/jpeg", 37 | "width": 1523, 38 | "height": 2105, 39 | "service": [ 40 | { 41 | "id": "https://iiif.io/api/image/3.0/example/reference/85a96c630f077e6ac6cb984f1b752bbf-0-21198-zz00022840-1-page1", 42 | "type": "ImageService3", 43 | "profile": "level1" 44 | } 45 | ] 46 | }, 47 | "selector": { 48 | "type": "ImageApiSelector", 49 | "rotation": "270" 50 | } 51 | }, 52 | "target": "{{ id.path }}/canvas/p1" 53 | } 54 | ] 55 | } 56 | ] 57 | } 58 | ] 59 | } 60 | -------------------------------------------------------------------------------- /recipe/0026-toc-opera/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "it": [ "L'Elisir D'Amore" ], "en": [ "The Elixir of Love" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas/1", 9 | "type": "Canvas", 10 | "width": 1920, 11 | "height": 1080, 12 | "duration": 7278.422, 13 | "items": [ 14 | { 15 | "id": "{{ id.path }}/canvas/1/annotation_page/1", 16 | "type": "AnnotationPage", 17 | "items": [ 18 | { 19 | "id": "{{ id.path }}/canvas/1/annotation_page/1/annotation/1", 20 | "type": "Annotation", 21 | "motivation": "painting", 22 | "target": "{{ id.path }}/canvas/1", 23 | "body": { 24 | "id": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low.mp4", 25 | "type": "Video", 26 | "format": "video/mp4", 27 | "height": 1080, 28 | "width": 1920, 29 | "duration": 7278.422 30 | } 31 | } 32 | ] 33 | } 34 | ] 35 | } 36 | ], 37 | "structures": [ 38 | { 39 | "type": "Range", 40 | "id": "{{ id.path }}/range/1", 41 | "label": { "it": [ "Gaetano Donizetti, L'Elisir D'Amore" ] }, 42 | "items": [ 43 | { 44 | "type": "Range", 45 | "id": "{{ id.path }}/range/2", 46 | "label": { "it": [ "Atto Primo" ] }, 47 | "items": [ 48 | { 49 | "type": "Range", 50 | "id": "{{ id.path }}/range/3", 51 | "label": { "it": [ "Preludio e Coro d'introduzione – Bel conforto al mietitore" ] }, 52 | "items": [ 53 | { 54 | "type": "Canvas", 55 | "id": "{{ id.path }}/canvas/1#t=0,302.05" 56 | } 57 | ] 58 | }, 59 | { 60 | "type": "Range", 61 | "id": "{{ id.path }}/range/4", 62 | "label": { "en": [ "Remainder of Atto Primo" ] }, 63 | "items": [ 64 | { 65 | "type": "Canvas", 66 | "id": "{{ id.path }}/canvas/1#t=302.05,3971.24" 67 | } 68 | ] 69 | } 70 | ] 71 | }, 72 | { 73 | "type": "Range", 74 | "id": "{{ id.path }}/range/5", 75 | "label": { "it": [ "Atto Secondo" ] }, 76 | "items": [ 77 | { 78 | "type": "Canvas", 79 | "id": "{{ id.path }}/canvas/1#t=3971.24" 80 | } 81 | ] 82 | } 83 | ] 84 | } 85 | ] 86 | } -------------------------------------------------------------------------------- /recipe/0219-using-caption-file/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Using Caption and Subtitle Files with Video Content 3 | id: 219 4 | layout: recipe 5 | tags: [video, caption, subtitle, presentation] 6 | summary: "Providing a caption or subtitle file to a video resource." 7 | viewers: 8 | - Clover 9 | - Ramp 10 | - Aviary 11 | - Theseus 12 | - TIFY 13 | topic: AV 14 | --- 15 | 16 | 17 | ## Use Case 18 | 19 | Captions and subtitles may be available for your video content and you may want to enable them for your IIIF video resources. 20 | 21 | ## Implementation notes 22 | 23 | Caption and subtitle file formats are used to mark up the external text track resources in connection with the HTML track element of a video file. The markup file formats use time tags that allow for time alignment of the video content with the captions or subtitles. 24 | 25 | Offering the caption file as an Annotation on the Canvas that contains the media file itself enables us to express the relationship between the two. The `type` and `format` properties of the Annotation can be used by the client to identify files in a format supported by the media player for captions. The `motivation` value of `supplementing` indicates the fact that processing this Annotation is optional. 26 | 27 | In addition to this implementation, one should consider offering the captions or subtitles as multiple timed annotations, making the text available in multiple ways. See [Using Annotations for Timed Text][0079]. 28 | 29 | While captions, subtitles, and transcripts each present some text interpretation of the A/V content, the ways in which they are consumed by users differ. For a more detailed discussion about these differences see [Transcripts, Captions, and Subtitles - General Considerations][0231]. 30 | 31 | ## Restrictions 32 | 33 | Formats other than [WebVTT](https://w3c.github.io/webvtt/) (Web Video Text Tracks) are supported in IIIF, but may not be as widely supported in viewers. 34 | 35 | When using segmented WebVTT with HLS, see [Serving HLS Files][0257]. 36 | 37 | ## Example 38 | 39 | In this example we use a caption file in the WebVTT format, but other options include a subtitle file in the [SRT](https://en.wikipedia.org/wiki/SubRip) (SubRip Text) or [TTML](https://w3c.github.io/ttml3/index.html) (Timed Text Markup Language) formats, or other text-based format used for the same purpose. 40 | 41 | {% include manifest_links.html viewers="Clover, Ramp, Aviary, Theseus, TIFY" manifest="manifest.json" %} 42 | 43 | {% include jsonviewer.html src="manifest.json" config='data-line="41-67"'%} 44 | 45 | # Related recipes 46 | 47 | - [Simplest Manifest - Video][0003] 48 | - [Providing Access to Transcripts of A/V Content][0017] 49 | - [Providing Alternative Representations][0046] 50 | - [Using Annotations for Timed Text][0079] 51 | - [Serving HLS Files][0257] 52 | 53 | {% include acronyms.md %} 54 | {% include links.md %} 55 | -------------------------------------------------------------------------------- /recipe/0466-link-for-loading-manifest/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Sharing a link to open a Manifest in a specific viewer 3 | id: 466 4 | layout: recipe 5 | tags: [annotation] 6 | summary: "Allows users to use links that can be clicked to open a viewer with a selected manifest." 7 | viewers: 8 | - Mirador 9 | - Clover 10 | - Theseus 11 | - TIFY 12 | topic: 13 | - content-state 14 | --- 15 | 16 | # Use case 17 | You would like to provide the user a link to click that will open a specific Manifest directly in a preselected viewer application. For example, on your web page or in an email to a user or colleague, you share a link to a IIIF Manifest for a book that will automatically open in a Mirador instance. 18 | 19 | # Implementation notes 20 | This type of request can be implemented using the [IIIF Content State API](https://iiif.io/api/content-state) following the [HTTP GET (Query String) Parameter](https://iiif.io/api/content-state/1.0/#initialization-mechanisms-link) section. 21 | 22 | The Manifest URL is provided as the value of the `iiif-content` parameter following the viewer instance URL. Assuming the viewer can be accessed at `https://example.org/viewer` we can pass the `iiif-content` parameter as follows: 23 | 24 | ``` 25 | https://example.org/viewer?iiif-content=manifest-url 26 | ``` 27 | 28 | Note when the content state is a plain URI, rather than a JSON object, it must not be [content-state-encoded](https://iiif.io/api/content-state/0.9/#62-content-state-encoding-and-uri-requirements). 29 | 30 | **However, the current specs do not provide a standardized approach to interpret URIs containing special characters, please see the issue https://github.com/IIIF/api/issues/2292 for a detailed explanation and updates regarding this issue.** 31 | 32 | ## Example 33 | 34 | To open the IIIF Manifest [https://iiif.io/api/cookbook/recipe/0001-mvm-image/manifest.json](https://iiif.io/api/cookbook/recipe/0001-mvm-image/manifest.json) in the Mirador viewer hosted at [https://projectmirador.org/embed/](https://projectmirador.org/embed/), we construct the link as follows: 35 | 36 | [https://projectmirador.org/embed/?iiif-content=https://iiif.io/api/cookbook/recipe/0001-mvm-image/manifest.json](https://projectmirador.org/embed/?iiif-content=https://iiif.io/api/cookbook/recipe/0001-mvm-image/manifest.json) 37 | 38 | Similarly with Clover we append the `iiif-content` parameter to the viewer location as so: 39 | 40 | [https://samvera-labs.github.io/clover-iiif/docs/viewer/demo?iiif-content=https://iiif.io/api/cookbook/recipe/0001-mvm-image/manifest.json](https://samvera-labs.github.io/clover-iiif/docs/viewer/demo?iiif-content=https://iiif.io/api/cookbook/recipe/0001-mvm-image/manifest.json) 41 | 42 | ## Related Recipes 43 | 44 | * [Simplest Manifest - Image][0001] shows the basic structure of a IIIF Manifest using presentation API 3.0. 45 | 46 | {% include acronyms.md %} 47 | {% include links.md %} 48 | -------------------------------------------------------------------------------- /recipe/0026-toc-opera/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Table of Contents for A/V Content 3 | id: 26 4 | layout: recipe 5 | tags: [video, presentation, opera] 6 | summary: "Complex nested table of contents for an opera." 7 | viewers: 8 | - UV 9 | - Ramp 10 | - Aviary 11 | - Theseus 12 | topic: 13 | - AV 14 | - structure 15 | --- 16 | 17 | 18 | ## Use Case 19 | 20 | Like books, A/V content can be divided into parts that constitute a unit of interest. It is important to provide users with easy access to these individual units so the structure of an A/V item is represented in a table of contents to facilitate navigation given that jumping to a specific point using only the player slider is hard. 21 | 22 | Opera is a form of theatre in which music has a leading role. A recording of an opera is a good example of structured A/V: an opera is composed of acts; an act is composed of scenes; a scene may include multiple arias. Ranges are well suited to model the hierarchy of the components of an opera. 23 | 24 | ## Implementation Notes 25 | 26 | Implementation is similar to [Book Chapters][0024] except that nesting may be deeper. 27 | 28 | Ranges in the structure target different portions of the same Canvas using temporal [media fragments](https://www.w3.org/TR/media-frags/#naming-time) (e.g. "t=0,100"). This is in contrast to the Book Chapters recipe where each Range targets a different Canvas using spatial media fragments. 29 | 30 | A media fragment specifying the Canvas temporal dimensions for a Range does not need the end time to be explicitly specified when it coincides with the end time of the Canvas itself, as exemplified here for Atto Secondo. 31 | 32 | ## Restrictions 33 | 34 | Leaf Range nodes in a structure are played linearly so they should be contiguous, since gaps will cause silent moments resulting in poor user experience. 35 | 36 | ## Example 37 | 38 | The opera covers the whole length of the Canvas and is divided into two Ranges for the two acts. Atto Primo has a Range for the prelude and first song and then a Range for the remainder of the act. Atto Secondo has not been subdivided into Ranges for simplicity of this example. 39 | 40 | {% include manifest_links.html viewers="UV, Ramp, Aviary, Theseus" manifest="manifest.json" %} 41 | {% include jsonviewer.html src="manifest.json" %} 42 | 43 | ## Related Recipes 44 | 45 | - [Simplest Manifest - Video][0003] 46 | - [Text in Multiple Languages][0006] - Recipe explaining the use of multiple languages in text like in the label for this opera. 47 | - [Table of Contents (Ranges) - Book Chapters][0024] 48 | - [Table of Contents for Multiple A/V Files on a Single Canvas][0064] - The same opera from this example but expanded into a real world example. 49 | - [Table of Contents for Multiple A/V Files on Multiple Canvases][0065] - The same opera from this example but expanded into a real world example in audio format split across multiple Canvases. 50 | 51 | {% include acronyms.md %} 52 | {% include links.md %} 53 | -------------------------------------------------------------------------------- /recipe/0232-image-thumbnail-canvas/manifest-av.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "Video recording of Donizetti's _The Elixir of Love_" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas/donizetti/1", 9 | "type": "Canvas", 10 | "label": { "en": [ "The Elixir of Love, Act 1" ] }, 11 | "duration": 3971.243, 12 | "width": 640, 13 | "height": 360, 14 | "thumbnail": [ 15 | { 16 | "id": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/act1-thumbnail.png", 17 | "type": "Image", 18 | "format": "image/png", 19 | "width": 640, 20 | "height": 360 21 | } 22 | ], 23 | "items": [ 24 | { 25 | "id": "{{ id.path }}/donizetti/1/1", 26 | "type": "AnnotationPage", 27 | "items": [ 28 | { 29 | "id": "{{ id.path }}/donizetti/1/1-video", 30 | "type": "Annotation", 31 | "motivation": "painting", 32 | "body": { 33 | "id": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_1.mp4", 34 | "type": "Video", 35 | "duration": 3971.243, 36 | "width": 640, 37 | "height": 360, 38 | "format": "video/mp4" 39 | }, 40 | "target": "{{ id.path }}/canvas/donizetti/1" 41 | } 42 | ] 43 | } 44 | ] 45 | }, 46 | { 47 | "id": "{{ id.path }}/canvas/donizetti/2", 48 | "type": "Canvas", 49 | "label": { "en": [ "The Elixir of Love, Act 2" ] }, 50 | "duration": 3307.224, 51 | "width": 640, 52 | "height": 360, 53 | "thumbnail": [ 54 | { 55 | "id": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/act2-thumbnail.png", 56 | "type": "Image", 57 | "format": "image/png", 58 | "width": 640, 59 | "height": 360 60 | } 61 | ], 62 | "items": [ 63 | { 64 | "id": "{{ id.path }}/donizetti/2/1", 65 | "type": "AnnotationPage", 66 | "items": [ 67 | { 68 | "id": "{{ id.path }}/donizetti/2/1-video", 69 | "type": "Annotation", 70 | "motivation": "painting", 71 | "body": { 72 | "id": "https://fixtures.iiif.io/video/indiana/donizetti-elixir/vae0637_accessH264_low_act_2.mp4", 73 | "type": "Video", 74 | "duration": 3307.224, 75 | "width": 640, 76 | "height": 360, 77 | "format": "video/mp4" 78 | }, 79 | "target": "{{ id.path }}/canvas/donizetti/2" 80 | } 81 | ] 82 | } 83 | ] 84 | } 85 | ] 86 | } 87 | -------------------------------------------------------------------------------- /recipe/0024-book-4-toc/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Table of Contents for Book Chapters 3 | id: 24 4 | layout: recipe 5 | tags: [text, image, book] 6 | summary: "Using Ranges to create a table of contents for a book" 7 | viewers: 8 | - UV 9 | - Mirador 10 | - Theseus 11 | - Glycerine Viewer 12 | - TIFY 13 | topic: structure 14 | property: structures 15 | --- 16 | 17 | ## Use Case 18 | 19 | Many books have a logical structure that can be made navigable through a table of contents (ToC) or other wayfinding methods. These might include chapters and other internal sections, or might reflect multiple works contained within an anthology or bound manuscript. IIIF uses Ranges to represent a book's structure and IIIF viewers can display this structure as a ToC in an index panel to aid users in navigating the book by chapter, section, work, etc. 20 | 21 | ## Implementation Notes 22 | 23 | Ranges are used to represent a structure within a book object by grouping Canvases together and/or by providing an alternate order of the Canvases from the order presented in the `items` property of the Manifest. Ranges can include Canvases, parts of Canvases, or other Ranges, creating a tree structure like a table of contents. 24 | 25 | Ranges are contained within the `structures` property and require a `label` property to display in the ToC (`labels` are not inherited from a referenced Canvas, so you will need to explicitly include the `label` property in the Range). Within a Range, resources are included as an array of resources using the `items` property. These structures can be made hierarchical simply by nesting an `items` array within another `items` array. This is useful when chapters might be sub-divided or in the case of multiple works where individual works may have chapters. This is a departure from the method defined by previous versions of the IIIF Presentation API. 26 | 27 | The `behavior` property can also be applied to Ranges. For more information on how `behavior` affects navigation in Ranges, see the [IIIF Presentation API on Ranges](https://iiif.io/api/presentation/3.0/#54-range) and the [Ranges and the `behavior` Property][229] recipe. 28 | 29 | ## Restrictions 30 | 31 | None 32 | 33 | ## Example 34 | 35 | In this example, an Ethiopic manuscript contains multiple works, one of which contains multiple sections. The Manifest contains a Range to represent the top-level structure (begins with lines 247–254), and another embedded Range to represent the content sections of the second work, *Arede'et* (begins with lines 275–282). This will result in a hierarchical ToC like so: 36 | 37 | * Tabiba Tabiban [ጠቢበ ጠቢባን] 38 | * Arede'et [አርድዕት] 39 | * Monday 40 | * Tuesday 41 | 42 | {% include manifest_links.html viewers="UV, Mirador, Glycerine Viewer, Theseus, TIFY" manifest="manifest.json" %} 43 | 44 | {% include jsonviewer.html src="manifest.json" config='data-line="246-326, 247-254, 275-282"' %} 45 | 46 | ## Related Recipes 47 | 48 | * [Book (simplest)][0009] 49 | * [Book (paging variations)][0011] 50 | * [Table of Contents for A/V Content][0026] 51 | 52 | {% include acronyms.md %} 53 | {% include links.md %} 54 | -------------------------------------------------------------------------------- /recipe/0029-metadata-anywhere/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Metadata on any Resource 3 | id: 29 4 | layout: recipe 5 | tags: [presentation] 6 | summary: "Provide item metadata for displaying to users" 7 | viewers: 8 | - UV 9 | - Mirador 10 | - Annona 11 | - id: Clover 12 | support: partial 13 | - Glycerine Viewer 14 | - Theseus 15 | - Curation 16 | - TIFY 17 | topic: property 18 | property: metadata 19 | --- 20 | 21 | ## Use Case 22 | 23 | Often it is useful to provide descriptive metadata about a resource, such as information on creators, dates, subject headings, and physical or contextual descriptions, that a client will display to the end user. This metadata might describe the entire resource, but may also be applied at more granular levels to provide information on parts of the resource, such as a single image or page, a region of a page, or an annotation. 24 | 25 | ## Implementation notes 26 | 27 | The `metadata` property is used to provide an ordered list of descriptive metadata as an array, with each entry given as a pair of human readable `label` and `value` arrays. The values of both the `label` and `value` properties must be JSON objects. These values will be displayed to the user as label/value pairs by the client. For more information, see the IIIF Presentation API [Metadata](https://iiif.io/api/presentation/3.0/#metadata) section. 28 | 29 | ## Restrictions 30 | 31 | All descriptive properties intended for presentation to the user must use language maps as outlined in the [Language of Property Values](https://iiif.io/api/presentation/3.0/#44-language-of-property-values) section and demonstrated in the [Internationalization and Multi-language Values][0006] recipe. 32 | 33 | The content of these entries is intended for presentation only; descriptive semantics should not be inferred. For information on how to include structured metadata that can support discovery, see the [Linking to Structured Metadata][0053] recipe. 34 | 35 | ## Example 36 | 37 | In this example, we have two Canvases, each with a different photograph of the same painting: one using natural light and the other an x-ray image. Metadata is provided at the Manifest level to convey information about the resource and additional metadata is provided on each Canvas to provide image-specific details. 38 | 39 | Note: Clover supports Metadata at the Manifest level but not down at the Canvas. 40 | 41 | Credit: *John Dee performing an experiment before Queen Elizabeth I*. Oil painting by Henry Gillard Glindoni. Credit: Wellcome Collection. Attribution-NonCommercial 4.0 International (CC BY-NC 4.0) 42 | 43 | {% include manifest_links.html viewers="UV, Mirador, Annona, Clover, Glycerine Viewer, Theseus, Curation, TIFY" manifest="manifest.json" %} 44 | 45 | {% include jsonviewer.html src="manifest.json" config='data-line="10-59, 83-96, 136-149"' %} 46 | 47 | # Related recipes 48 | 49 | * [Internationalization and Multi-language Values][0006] 50 | * [Displaying Multiple Values with Language Maps][0118] 51 | * [Linking to Structured Metadata][0053] 52 | - [Linking to Web Page of an Object][0047] 53 | 54 | {% include acronyms.md %} 55 | {% include links.md %} 56 | -------------------------------------------------------------------------------- /recipe/0117-add-image-thumbnail/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { 6 | "en": [ 7 | "Playbill Cover with Manifest Thumbnail" 8 | ] 9 | }, 10 | "summary": { 11 | "en": [ 12 | "Cover of playbill for \"Akiba gongen kaisen-banashi,\" \"Futatsu chōchō kuruwa nikki\" and \"Godairiki koi no fūjime\" performed at the Chikugo Theater in Osaka from the fifth month of Kaei 2 (May, 1849); main actors: Gadō Kataoka II, Ebizō Ichikawa VI, Kitō Sawamura II, Daigorō Mimasu IV and Karoku Nakamura I; on front cover: producer Mominosuke Ichikawa's crest." 13 | ] 14 | }, 15 | "thumbnail": [ 16 | { 17 | "id": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001/full/max/0/default.jpg", 18 | "type": "Image", 19 | "format": "image/jpeg", 20 | "height": 4823, 21 | "width": 3497, 22 | "service": [ 23 | { 24 | "id":"https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001", 25 | "type":"ImageService3", 26 | "profile":"level1", 27 | "height": 4823, 28 | "width": 3497, 29 | "extraFormats":[ 30 | "png" 31 | ], 32 | "extraQualities":[ 33 | "default", 34 | "color", 35 | "gray" 36 | ], 37 | "protocol":"http://iiif.io/api/image", 38 | "tiles":[ 39 | { 40 | "height":512, 41 | "scaleFactors":[ 42 | 1, 43 | 2, 44 | 4, 45 | 8 46 | ], 47 | "width":512 48 | } 49 | ] 50 | } 51 | ] 52 | } 53 | ], 54 | "items": [ 55 | { 56 | "id": "{{ id.path }}/canvas/p0", 57 | "type": "Canvas", 58 | "label": { 59 | "en": [ 60 | "front cover with color bar" 61 | ] 62 | }, 63 | "width": 4520, 64 | "height": 5312, 65 | "items": [ 66 | { 67 | "id": "{{ id.path }}/page/p0/1", 68 | "type": "AnnotationPage", 69 | "items": [ 70 | { 71 | "id": "{{ id.path }}/annotation/p0000-image", 72 | "type": "Annotation", 73 | "motivation": "painting", 74 | "body": { 75 | "id": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001_full/full/max/0/default.jpg", 76 | "type": "Image", 77 | "format": "image/jpeg", 78 | "height": 5312, 79 | "width": 4520, 80 | "service": [ 81 | { 82 | "id": "https://iiif.io/api/image/3.0/example/reference/4f92cceb12dd53b52433425ce44308c7-ucla_bib1987273_no001_rs_001_full", 83 | "type": "ImageService3", 84 | "profile": "level1" 85 | } 86 | ] 87 | }, 88 | "target": "{{ id.path }}/canvas/p0" 89 | } 90 | ] 91 | } 92 | ] 93 | } 94 | ] 95 | } 96 | -------------------------------------------------------------------------------- /recipe/0004-canvas-size/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Image and Canvas with Differing Dimensions 3 | id: 4 4 | layout: recipe 5 | tags: [image, presentation, canvas] 6 | summary: "Demonstrates that image dimensions (pixels) need not be the same as the Canvas dimensions (unit-less)" 7 | viewers: 8 | - UV 9 | - Mirador 10 | - Annona 11 | - Theseus 12 | - Curation 13 | - TIFY 14 | topic: image 15 | code: 16 | - iiif-prezi3 17 | --- 18 | 19 | ## Use Case 20 | 21 | You have an image ready for annotating that is expected to be replaced later by a higher resolution image. You would like to provide a sufficiently high-resolution coordinate space to position the annotations precisely. IIIF Presentation v3.0 allows you to describe a Canvas with the dimensions of the larger image to come, fill it with the smaller image you have ready now, and capture annotations on the smaller image in confidence that they will be positioned appropriately on the larger image when it is swapped in. 22 | 23 | ## Implementation notes 24 | 25 | This recipe demonstrates the importance of thinking about a Canvas as a coordinate space, not as absolute pixel or display dimensions. The Canvas dimensions (unit-less values of width and height) need not be related to the (pixel) dimensions of the content painted onto the Canvas. This recipe shows the Canvas dimensions differing from the image dimensions, yet the image fills the Canvas completely. A more complex but not uncommon case (with a recipe linked below in Related Recipes) is to have multiple images on the same Canvas, where each image might have a different pixel-based resolution but must be reconciled into the same Canvas coordinate space. 26 | 27 | By making the Canvas coordinate space larger than the pixel space of an image: 28 | + You have the leeway to not know what your replacement image dimensions will be, 29 | + Annotations made on the current version will have consistent locations on the larger image, and 30 | + Drawing annotation regions on the smaller version will be facilitated by having more screen space. 31 | 32 | For a future replacement image of unknown dimensions, a good starting point is to make each Canvas dimension at least twice the corresponding pixel dimension of the current image as long as each Canvas dimension is over 1000. 33 | 34 | Finally, if the image dimensions are larger than the Canvas, the image will be scaled to fit the Canvas. 35 | 36 | ## Restrictions 37 | 38 | The aspect ratio should be consistent between your source image and Canvas. Otherwise, you'll see unpredictable stretching and/or distorting. 39 | 40 | ## Example 41 | 42 | This example shows a Manifest with a single Canvas that has height and width dimensions three times the pixel dimensions of the image in order to construct a Canvas with both dimensions greater than 1000px. 43 | 44 | {% include manifest_links.html viewers="UV, Mirador, Annona, Theseus, Curation, TIFY" manifest="manifest.json" %} 45 | {% include jsonviewer.html src="manifest.json" config="data-line='14-15,29-30'"%} 46 | 47 | # Related recipes 48 | 49 | * [Simple Image Manifest][0001] 50 | * [A/V Content and the Behavior Property][0000] 51 | 52 | {% include acronyms.md %} 53 | {% include links.md %} 54 | -------------------------------------------------------------------------------- /recipe/0036-composition-from-multiple-images/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "http://iiif.io/api/presentation/3/context.json", 3 | "id": "{{ id.url }}", 4 | "type": "Manifest", 5 | "label": { "en": [ "Folio from Grandes Chroniques de France, ca. 1460" ] }, 6 | "items": [ 7 | { 8 | "id": "{{ id.path }}/canvas/p1", 9 | "type": "Canvas", 10 | "label": { "none": [ "f. 033v-034r [Chilpéric Ier tue Galswinthe, se remarie et est assassiné]" ] }, 11 | "height": 5412, 12 | "width": 7216, 13 | "items": [ 14 | { 15 | "id": "{{ id.path }}/page/p1/1", 16 | "type": "AnnotationPage", 17 | "items": [ 18 | { 19 | "id": "{{ id.path }}/annotation/p0001-image", 20 | "type": "Annotation", 21 | "motivation": "painting", 22 | "body": { 23 | "id": "https://iiif.io/api/image/3.0/example/reference/899da506920824588764bc12b10fc800-bnf_chateauroux/full/max/0/default.jpg", 24 | "type": "Image", 25 | "format": "image/jpeg", 26 | "height": 5412, 27 | "width": 7216, 28 | "service": [ 29 | { 30 | "id": "https://iiif.io/api/image/3.0/example/reference/899da506920824588764bc12b10fc800-bnf_chateauroux", 31 | "type": "ImageService3", 32 | "profile": "level1" 33 | } 34 | ] 35 | }, 36 | "target": "{{ id.path }}/canvas/p1" 37 | }, 38 | { 39 | "id": "{{ id.path }}/annotation/p0002-image", 40 | "type": "Annotation", 41 | "motivation": "painting", 42 | "body": { 43 | "id": "https://iiif.io/api/image/3.0/example/reference/899da506920824588764bc12b10fc800-bnf_chateauroux_miniature/full/max/0/default.jpg", 44 | "type": "Image", 45 | "format": "image/jpeg", 46 | "label": { "fr": [ "Miniature [Chilpéric Ier tue Galswinthe, se remarie et est assassiné]" ] }, 47 | "width":2138, 48 | "height":2414, 49 | "service": [ 50 | { 51 | "id": "https://iiif.io/api/image/3.0/example/reference/899da506920824588764bc12b10fc800-bnf_chateauroux_miniature", 52 | "type": "ImageService3", 53 | "profile": "level1" 54 | } 55 | ] 56 | }, 57 | "target": "{{ id.path }}/canvas/p1#xywh=3949,994,1091,1232" 58 | } 59 | ] 60 | } 61 | ] 62 | } 63 | ] 64 | } 65 | -------------------------------------------------------------------------------- /recipe/0027-alternative-page-order/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Alternative Page Sequences 3 | id: 27 4 | layout: recipe 5 | tags: [book, presentation] 6 | summary: "Using Ranges to offer alternative orderings of book pages." 7 | viewers: 8 | topic: 9 | - structure 10 | --- 11 | 12 | ## Use Case 13 | 14 | A book may contain pages in the incorrect order; for example, a codex that was rebound at some point in history may have certain folios or quires accidentally misplaced. You want to digitally represent the book object in its current order while offering users the option to browse its contents in the intended order. 15 | 16 | ## Implementation Notes 17 | 18 | In [Presentation API 3.0](https://iiif.io/api/presentation/3.0/#54-range), setting a Range’s `behavior` value to `sequence` allows you to define a specific viewing order for Canvases that differs from the default order in the Manifest’s `items` property. Such Ranges must be directly within the `structures` property of the Manifest and must not be referenced or embedded within other Ranges ([see specification](https://iiif.io/api/presentation/3.0/#54-range)). When `behavior` is set to `sequence`, user interfaces that interact with this order should use the order within the selected Range, rather than the default order of items. 19 | 20 | There may be more than one Range, each representing an alternative sequence of items (such as different orderings of book pages). The first Range should act as the default ordering, and any additional Ranges should be available for the user to select. For a IIIF viewer to display the selectable Ranges, each Range should have a `label`. 21 | 22 | If reordering the Canvases affects the reading layout or direction, properties can be set on the Range (such as `viewingDirection` or other [valid behaviors](https://iiif.io/api/presentation/3.0/#behavior) besides `sequence`) to override those inherited from the Manifest. 23 | 24 | ## Example 25 | 26 | These manuscript folios are an excerpt from the original draft of the 1895 novel _Piccolo mondo antico_ by novelist and Nobel Prize nominee for Literature, Antonio Fogazzaro. The pencil numbering in the upper right of each page (171r–172v) follows the bifolio's physical order, but does not correspond to the author's intended sequence, which he noted in ink: 384 (171v), 385 (172r), [386] (172v), 387 (171r). 27 | 28 | Two Ranges are provided within the `structures` to represent this case study. From the two Ranges with the `behavior` value `sequence`, the first Range should be used as the navigation default, and the other should be selectable via its supplied `label`. 29 | 30 | Images provided by permission of Biblioteca Civica Bertoliana. 31 | 32 | {% include manifest_links.html viewers="" manifest="manifest.json" %} 33 | 34 | {% include jsonviewer.html src="manifest.json" config='data-line="200-261"' %} 35 | 36 | ## Related Recipes 37 | 38 | * [Simple Manifest - Book][0009] shows an example where the order of the pages follows the order in the `items` property. 39 | * [Table of Contents for Book Chapters][0024] shows how to use Ranges to create a table of contents rather than to represent alternative orders. 40 | 41 | {% include acronyms.md %} 42 | {% include links.md %} 43 | -------------------------------------------------------------------------------- /recipe/0118-multivalue/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Displaying Multiple Values with Language Maps 3 | id: 118 4 | layout: recipe 5 | tags: [tbc] 6 | summary: "The language map pattern requires that all values are supplied as an array, whether a single value string or a string of multiple values." 7 | viewers: 8 | - UV 9 | - Mirador 10 | - Annona 11 | - Glycerine Viewer 12 | - Theseus 13 | - Curation 14 | - TIFY 15 | topic: property 16 | property: label, summary, metadata, requiredStatement 17 | --- 18 | 19 | ## Use Case 20 | 21 | In some cases, a work is known by more than one title (or has multiple authors, subject heading, etc.) that we would like to display to end users. In this case, our work has title variants that we will include in the `metadata` property using the required arrays. This pattern can be applied to any property values that are intended to be displayed to end users. 22 | 23 | ## Implementation Notes 24 | 25 | Language maps are required of all strings that are intended to be displayed to the user (this includes the `label` and `summary` properties, as well as `label` and `value` properties within the `metadata` and `requiredStatement` properties). Furthermore, the language map pattern requires that all values are an array, whether a single value or multiple value strings. The client must display all of the strings in the array value. Thus, a work with multiple authors might include separate strings for each author within a single array: `["Picart, Bernard", "Bernard, Jean-Frédéric"]`. See the Presentation API section [Always require arrays if property can have multiple values](https://iiif.io/api/presentation/3.0/change-log/#134-always-require-arrays-if-property-can-have-multiple-values). 26 | 27 | In the case of multiple languages, each language is represented by its own language map comprising a language key and an array. For more information on language maps and multi-language values, see the recipe [Internationalization and Multi-language Values][0006]. For more information about what clients are expected to do with language map properties and values, see the Presentation API [Language of Property Values](https://iiif.io/api/presentation/3.0/#44-language-of-property-values) section. 28 | 29 | ## Restrictions 30 | 31 | None 32 | 33 | ## Example 34 | 35 | In this example, the work has multiple titles in both English and French. The Manifest `label` provides a single title in French within a single-value array (lines 6–8). The alternative titles are provided in the `metadata` property in both English and French, each with variants contained within two separate arrays -- one array for English (lines 18–21) and one for French (lines 22–25). In the `summary` property (lines 30–32) the value is included as a single-string array. 36 | 37 | {% include manifest_links.html viewers="UV, Mirador, Annona, Glycerine Viewer, Theseus, Curation, TIFY" manifest="manifest.json" %} 38 | 39 | {% include jsonviewer.html src="manifest.json" config='data-line="6-8, 18-21, 22-25, 30-32"'%} 40 | 41 | ## Related Recipes 42 | 43 | * [Internationalization and Multi-language Values][0006] 44 | * [Metadata][0029] 45 | * [Annotating in Multiple Languages][0346] 46 | 47 | {% include acronyms.md %} 48 | {% include links.md %} 49 | -------------------------------------------------------------------------------- /recipe/0015-start/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Begin playback at a specific point - Time-based media 3 | id: 15 4 | layout: recipe 5 | tags: [audio, video] 6 | summary: "This manifest uses the 'start' property to specify a point in an audio or video object where a client application should begin playback." 7 | viewers: 8 | - Ramp 9 | - Aviary 10 | - Theseus 11 | topic: 12 | - AV 13 | - property 14 | property: start 15 | code: 16 | - iiif-prezi3 17 | --- 18 | 19 | ## Use Case 20 | 21 | Often an audio or video resource will have content that is part of the object but not significant, such as a microphone check, or audience noise before the start of a performance, or a test card. The `start` property allows the publisher to specify a point where a client application should begin playback. 22 | 23 | ## Implementation notes 24 | 25 | This recipe extends [Simplest Manifest - Video][0003] by adding the information required by a client to start playback at a particular point. This is done by adding the `start` property to the Manifest with the start time in seconds. 26 | 27 | The target of `start` must be a JSON object with `id` and `type` properties and can be either a Canvas, or a Specific Resource with a Selector and a `source` property where the value is a Canvas. 28 | 29 | In this use case, the target `type` property is a Specific Resource (`"type": "SpecificResource"`), and the Selector `type` property is a Point Selector (`"type": "PointSelector"`) that identifies a starting time point (`"t": 120.5`) within the `source`. 30 | 31 | For more on the `start` property, see: [Start Property][prezi3-start]. 32 | 33 | ### About selector classes: 34 | 35 | Selectors in Annotation targets are used to describe how to retrieve a given part of a resource. There are three Selector classes defined in the IIIF specification, but only the [`PointSelector`][prezi3-pointselector] class is appropriate for this use case. The `PointSelector` class defines a specific point either spatially (`x`, `y`) and/or temporally (`t`). 36 | 37 | For more information on other Selector classes, see: [IIIF Open/Web Annotation Extensions][prezi3-openannotation] and [W3C Web Annotation Selectors](https://www.w3.org/TR/annotation-model/#selectors). 38 | 39 | ## Example 40 | 41 | This example shows a Manifest with a single Canvas with a duration of 1801.055 seconds. It has a single video file (30-minute-clock.mp4) which is associated with it. The `start` property specifies a start point of 120.5 seconds into the playback. The video was created by [DrLex1](https://www.youtube.com/watch?v=Lsq0FiXjGHg) and was released using a [Creative Commons Attribution license](https://creativecommons.org/licenses/by/3.0/). 42 | 43 | {% include manifest_links.html viewers="Ramp, Aviary, Theseus" manifest="manifest.json" %} 44 | 45 | {% include jsonviewer.html src="manifest.json" config='data-line="10-18"' %} 46 | 47 | # Related recipes 48 | 49 | * [Simplest Manifest - Video][0003] shows a manifest for a simple video resource. 50 | * [Simplest Manifest - Audio][0002] shows a manifest for a simple audio resource. 51 | * [Load Manifest Beginning with a Specific Canvas][202] uses the `start` property to load at a specific canvas. 52 | 53 | {% include acronyms.md %} 54 | {% include links.md %} 55 | -------------------------------------------------------------------------------- /recipe/0464-reuse-manifest/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": [ 3 | "http://iiif.io/api/presentation/3/context.json" 4 | ], 5 | "id": "{{ id.url }}", 6 | "type": "Manifest", 7 | "label": { 8 | "en": [ 9 | "Picture of Göttingen taken during the 2019 IIIF Conference, reused and annotated." 10 | ] 11 | }, 12 | "rights": "http://creativecommons.org/licenses/by-sa/3.0/", 13 | "requiredStatement": { 14 | "label": { 15 | "en": [ 16 | "Attribution" 17 | ] 18 | }, 19 | "value": { 20 | "en": [ 21 | "Glen Robson, IIIF Technical Coordinator. CC BY-SA 3.0 " 22 | ] 23 | } 24 | }, 25 | "metadata": [ 26 | { 27 | "label": { "en": [ "Source Manifest" ] }, 28 | "value": { "en": [ "Reuse of Source Manifest with added Annotation" ] } 29 | } 30 | ], 31 | "items": [ 32 | { 33 | "id": "https://iiif.io/api/cookbook/recipe/0008-rights/canvas/p1", 34 | "type": "Canvas", 35 | "height": 3024, 36 | "width": 4032, 37 | "items": [ 38 | { 39 | "id": "https://iiif.io/api/cookbook/recipe/0008-rights/page/p1/1", 40 | "type": "AnnotationPage", 41 | "items": [ 42 | { 43 | "id": "https://iiif.io/api/cookbook/recipe/0008-rights/annotation/p0001-image", 44 | "type": "Annotation", 45 | "motivation": "painting", 46 | "body": { 47 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen/full/max/0/default.jpg", 48 | "type": "Image", 49 | "format": "image/jpeg", 50 | "height": 3024, 51 | "width": 4032, 52 | "service": [ 53 | { 54 | "id": "https://iiif.io/api/image/3.0/example/reference/918ecd18c2592080851777620de9bcb5-gottingen", 55 | "profile": "level1", 56 | "type": "ImageService3" 57 | } 58 | ] 59 | }, 60 | "target": "https://iiif.io/api/cookbook/recipe/0008-rights/canvas/p1" 61 | } 62 | ] 63 | } 64 | ], 65 | "annotations": [ 66 | { 67 | "id": "{{ id.path }}/canvas-1/annopage-2", 68 | "type": "AnnotationPage", 69 | "items": [ 70 | { 71 | "id": "{{ id.path }}{{ id.path }}/canvas-1/annopage-2/anno-1", 72 | "type": "Annotation", 73 | "motivation": "commenting", 74 | "body": { 75 | "type": "TextualBody", 76 | "language": "de", 77 | "format": "text/plain", 78 | "value": "Göttinger Marktplatz mit Gänseliesel Brunnen" 79 | }, 80 | "target": "{{ id.path }}/canvas-1" 81 | } 82 | ] 83 | } 84 | ] 85 | } 86 | ] 87 | } -------------------------------------------------------------------------------- /recipe/0318-navPlace-navDate/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Locating an Item in Place and Time 3 | id: 318 4 | layout: recipe 5 | topic: geo-recipes 6 | tags: [maps, geolocate, navPlace, navDate] 7 | summary: "Use navDate together with the navPlace extension to provide geographic and temporal data" 8 | viewers: 9 | - Navplace Viewer 10 | --- 11 | 12 | ### Use Case 13 | 14 | You have one or more IIIF resources that have a date and a location associated with each, and you would like to provide these to a client for use in the user interface. For instance, you may wish the client to provide a visualization in a timeline with an associated map, or to provide the capability to filter the set based on a date range or a bounding box on a map. The data required to meet this use case can be provided by the use of both the `navDate` and `navPlace` properties on the IIIF resources. 15 | 16 | ### Implementation Notes 17 | 18 | The `navDate` property, as implied by its name, allows a Manifest to identify a pertinent date associated with an IIIF resource in order to help viewers provide users with date-aware navigation. Clients are not required to make use of `navDate`, and clients that do have date-aware navigation available may not default to that navigation interface. This property is described in [Navigation by Chronology][0230] 19 | 20 | The `navPlace` property is analogous to `navDate`, but provides geographic information. The value for `navPlace` is a single [GeoJSON Feature Collection](https://iiif.io/api/extension/navplace/#222-feature-collection). A Feature Collection represents an aggregation of spatially bounded areas. This property is described in [Locate a Manifest on a Web Map][0154]. 21 | 22 | The `navPlace` property is not processed by the Universal Viewer or Mirador viewer at this time. 23 | 24 | ### Example 25 | 26 | The example consists of a [Collection](collection.json) that references five Manifests. All five Manifests contain the `navDate` and `navPlace` properties, as shown below. 27 | 28 | The example can be displayed in a [custom viewer](https://mikeapp.github.io/maptime-demo/?iiif-content=https://preview.iiif.io/cookbook/0318/recipe/0318-navPlace-navDate/collection.json). In the viewer, click on the "Limit by Date Range" button to sort the objects by date. Adjust the ends of the timeline slider to filter the objects based on a date range. 29 | 30 | In a more limited way, the Collection can be displayed in the Navplace viewer used elsewhere in this cookbook. This viewer will show all examples places appropriately on a map, but ignores the `navDate` data. 31 | 32 | [NavPlace and NavDate Collection](collection.json) 33 | * [Castel Sant'Angelo, Rome](manifest-1.json) 34 | * [The Colosseum](manifest-2.json) 35 | * [The Arch of Titus from the Forum, Rome, ca. 1725](manifest-3.json) 36 | * [The Temple of Vesta, Rome, 1849](manifest-4.json) 37 | * [A View of Trajan's Forum, Rome, 1821](manifest-5.json) 38 | 39 | {% include manifest_links.html manifest="collection.json" %} 40 | 41 | {% include jsonviewer.html src="collection.json" config='data-line="39-63,73-97,107-131,141-165,175-200"' %} 42 | 43 | ## Related Recipes 44 | * [Locate a Manifest on a Web Map][0154] 45 | * [Navigation by Chronology][0230] 46 | 47 | {% include acronyms.md %} 48 | {% include links.md %} -------------------------------------------------------------------------------- /recipe/0117-add-image-thumbnail/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Image Thumbnail for Manifest 3 | id: 117 4 | layout: recipe 5 | tags: [image,presentation] 6 | summary: "Display a thumbnail image for a resource other than a Canvas, such that it can be used by clients to represent the object." 7 | viewers: 8 | - Mirador 9 | - Clover 10 | - Glycerine Viewer 11 | - Theseus 12 | topic: property 13 | property: thumbnail 14 | --- 15 | 16 | ## Use Case 17 | 18 | You have images of a booklet, and you want to select one to use as the singular representation of the whole object for consuming clients. These clients range from object viewers such as Mirador or Universal Viewer to discovery services and other aggregators such as [Spotlight](https://spotlight.projectblacklight.org) or a homegrown solution. Absent a declared thumbnail for the Manifest, some clients will create a thumbnail from the first Canvas in the Manifest. 19 | 20 | ## Implementation Notes 21 | 22 | Thumbnails can permit non-human interfaces consuming your manifests to present representations of your content for rapid comprehension by human readers. For instance, this could be in a cross-institutional catalog website. 23 | 24 | Thumbnails are strongly recommended for Collections and Manifests, and permitted on Canvases, content resources, and other resource types. Conforming clients are not required to render any thumbnails, though they are strongly recommended to do so when they exist for Collections, Manifests, Canvases, and content resources. Clients are permitted to render thumbnails when they exist for all other resource types. Each resource may contain multiple thumbnails, each of which may be — but are not required to be — of the same `type` and `format` as its containing resource. 25 | 26 | Multiple methods exist for describing a thumbnail in your manifest. For a Manifest, it makes most sense to use a full-size image URI in conjunction with a IIIF Image Service containing the whole IIIF Image service JSON. Clients consuming a Manifest thumbnail will have unpredictable size requirements; reproducing the complete service JSON gives them the most flexibility and best shot at quickly and efficiently displaying your object's thumbnail. 27 | 28 | ## Restrictions 29 | 30 | None known. 31 | 32 | ## Example 33 | 34 | This example uses an image of the cover of the same kabuki performance program as in the recipe for [Viewing direction and its effect on navigation][0010]. This image, though, has a color bar and the Manifest contains an explicit `thumbnail` property for the Manifest. In this particular use case, to avoid having a Manifest thumbnail image with a color calibration bar, you can choose to declare a thumbnail from a completely different image. Keep in mind that this thumbnail is just for the Manifest; no thumbnail has been explicitly set for the sole resource, so the supporting viewers should use the resource's IIIF Image service to create one. 35 | 36 | {% include manifest_links.html viewers="Mirador, Clover, Glycerine Viewer, Theseus" manifest="manifest.json" %} 37 | 38 | {% include jsonviewer.html src="manifest.json" %} 39 | 40 | ## Related Recipes 41 | 42 | * [Support Deep Viewing with Basic Use of a IIIF Image Service][0005] 43 | * [Implementation Discussion: Thumbnails on Canvases][0232] 44 | 45 | {% include acronyms.md %} 46 | {% include links.md %} 47 | -------------------------------------------------------------------------------- /recipe/0306-linking-annotations-to-manifests/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Linking external Annotations targeting a Canvas to a Manifest 3 | id: 306 4 | layout: recipe 5 | tags: [annotation, multiple-images] 6 | summary: "Keep a resolvable link between annotations (contained in an external Annotation Page) and the Manifest containing the Canvases they are pointing at." 7 | viewers: 8 | - Theseus 9 | topic: annotation 10 | --- 11 | 12 | ## Use Case 13 | You want to keep a resolvable link between annotations (contained in an external Annotation Page) and the Manifest containing the Canvases they are pointing at. 14 | 15 | Usually, annotations in an external Annotation Page point to a Canvas or a Canvas fragment. This can cause problems for annotation consuming viewers as the Canvas identifier doesn't have to resolve. To get the information from a Canvas a viewer needs access to the containing Manifest. 16 | 17 | ## Implementation Notes 18 | 19 | The Annotation Pages stored in an external JSON file contain a list of Annotations. 20 | While often the `target` of the annotations is an URL containing the identifier of the Canvas the `target` can also be a [Specific Resource](https://www.w3.org/TR/annotation-model/#specific-resources). 21 | The Specific Resource can have a `source` attribute containing the `id` pointing at the Canvas identifier and a `partOf` attribute pointing at the Manifest. 22 | Hence, the `partOf` attribute will contain the Manifest identifier in the `id` attribute, while the `type` attribute will be "Manifest". 23 | 24 | ## Restrictions 25 | There is usually no advantage in using `partOf` attribute for pointing at Manifest with Annotations contained in a Manifest. In this case, it is implicit that they are about the Manifest containing them. 26 | 27 | 28 | ## Example 29 | The example is based on the recipe [Embedded or referenced Annotations][0269]. 30 | 31 | However, the `target` of the Annotation contained in the Annotation Page file will be a Specific Resource, which allows us to use a `partOf` attribute inside the `source` element to point at the original Manifest containing the Canvas. The `partOf` `id` attribute is the resolvable link of the Manifest. 32 | 33 | In the example, it is also shown the usage of the `selector` attribute of the Specific Resource that allows us to select a region of the image using the `value` attribute of the Fragment Selector. 34 | The `value` attribute follows the Fragment Selector syntax [Fragment Selectors][0020]. 35 | 36 | Annotation Page file 37 | {% include manifest_links.html viewers="" manifest="annotationpage.json" %} 38 | 39 | {% include jsonviewer.html src="annotationpage.json" config='data-line="16-33"' %} 40 | 41 | Manifest file 42 | {% include manifest_links.html viewers="Mirador, Annona, Glycerine Viewer, Theseus" manifest="manifest.json" %} 43 | 44 | {% include jsonviewer.html src="manifest.json" config='data-line="44-49"' %} 45 | 46 | ## Related Recipes 47 | 48 | * [Embedded or Referenced Annotations][0269] an Annotation Page without links to the original Manifest. 49 | * [Annotate specific images or layers][0326] Specific Resource used for annotating specific images or layers. 50 | * [Simple Annotation — Tagging][0021] for an Annotation using a Fragment Selector. 51 | * [Fragment Selectors][0020] for understanding how to use a Fragment Selector. 52 | 53 | {% include acronyms.md %} 54 | {% include links.md %} 55 | -------------------------------------------------------------------------------- /recipe/0035-foldouts/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Foldouts, Flaps, and Maps 3 | id: 35 4 | layout: recipe 5 | tags: [images, behavior, non-paged] 6 | summary: "Demonstrates how to model a foldout diagram or map." 7 | viewers: 8 | - Theseus 9 | topic: structure 10 | property: behavior 11 | --- 12 | 13 | 14 | ## Use Case 15 | 16 | Books (and other objects) sometimes include foldout flaps or sheets, such as a map in a historical work. During digitization, the foldout might be captured in both its folded and unfolded state. 17 | 18 | In the previous recipe, [Multiple choice of images in a single view][0033], a flap is offered to users as a Choice of images for the same view. But consider this example: 19 | 20 | ![two images of a map foldout, folded and unfolded](foldout.png) 21 | 22 | Here, the page has been captured folded and unfolded. Unlike the example in the previous recipe, these are not the same **view**. There is no one single IIIF Canvas that would serve to represent both of these spatial extents - we can't logically place these two images on the same spatial view. 23 | 24 | While the present example and that given in [Multiple choice of images in a single view][0033] are clearly different, the modeling decision may not always be as obvious. There will be cases that could be modeled in either way, depending on what the publisher is trying to present. 25 | 26 | ## Implementation notes 27 | 28 | The unfolded view is simply an additional Canvas in the sequence given by `manifest.items`. 29 | 30 | These pages are from a printed, paged book, which might have the `behavior` value of `paged`, so as to generate the correct recto-verso-recto-verso representation in a viewer that supports this behavior. If we insert an additional Canvas into the Manifest's `items`, we will break this sequence unless we introduce an additional `behavior` property on the Canvas with the foldout using the value `non-paged` to indicate that it is not part of the paged sequence. 31 | 32 | ## Example 33 | 34 | This example has been adapted from [https://wellcomelibrary.org/iiif/b29346423/manifest](https://wellcomelibrary.org/iiif/b29346423/manifest) but in a much reduced form to convey the essential points. 35 | 36 | The Manifest is given the behavior `paged`. With no other qualifiers, this indicates a left-to-right sequence with the first item _recto_. 37 | 38 | The sequence is: 39 | 40 | * Front cover 41 | * Inside front cover 42 | * Foldout, folded 43 | * Foldout, unfolded (given the behavior `non-paged`, to indicate that it does not constitute part of the paged sequence of the Manifest) 44 | * Foldout, folded (verso) 45 | * Title page 46 | * Back of title page 47 | * _the normal run of pages would continue here; removed in this Manifest for brevity_ 48 | * Inside back cover 49 | * Back Cover 50 | 51 | The "non-paged" behavior on Canvases is not yet supported by viewers making this difficult to visualize. The resulting layout in a thumbnail view would look something like this: 52 | 53 | ![thumbnail layout example with non-paged](layout_example1.jpg) 54 | 55 | {% include manifest_links.html viewers="Theseus" manifest="manifest.json" %} 56 | 57 | {% include jsonviewer.html src="manifest.json" config='data-line="10-12, 134-136"' %} 58 | 59 | ## Related recipes 60 | 61 | * [Multiple choice of images in a single view][0033] 62 | * [Composition of one view from multiple image sources][0036] 63 | 64 | {% include acronyms.md %} 65 | {% include links.md %} 66 | --------------------------------------------------------------------------------