IIIF マニフェストの作り方(入門編)

本ページは IIIF Presentation API 3.0 に従って、マニフェストの作り方を解説します。

大まかな流れ

マニフェストの作り方の大まかな流れは次のとおりです。

  1. マニフェストを宣言します。
  2. マニフェストに含まれるキャンバスをそれぞれ宣言します。
  3. 各キャンバスに含まれるアノテーション・ページをそれぞれ宣言します。
  4. 各アノテーション・ページに含まれるアノテーションをそれぞれ宣言します。

キャンバスは IIIF ビューワの表示域を表します。基本的には、メインとなる素材(画像、動画)ごとに 1 つのキャンバスを用意します。1 つのキャンバスに複数の素材を載せることもできます(たとえば、画像と注釈テキスト、動画と字幕テキストなど)。キャンバスに載せる素材のことをアノテーションと呼びます。

ただし、素材(アノテーション)を直接キャンバスに載せていくのではなく、いったんアノテーション・ページと呼ばれるレイヤーを作成し、キャンバスに重ねていく感じになります。

マニフェスト、キャンバス、アノテーション・ページ、アノテーションはすべて、JSON-LD にもとづく JSON オブジェクトとして記述されます。

実際に作成してみる

2.1 マニフェストの宣言

マニフェストは、IIIF ビューワに読み込ませるための全設定を統括する JSON オブジェクトです。

{
  "type": "Manifest",
  "id": "https://example.org/Archive/Record1/manifest",
  "label": { "en": [ "Record 1" ], "ja": [ "記録 1" ] },
  "items": [
     // ここに各キャンバスの宣言が置かれる
] }

実際には、マニフェストを独立ファイルにすることが多いでしょう。独立ファイル manifest.json を作成した場合は次のようになります。

// manifest.json
{
  "@context": "http://iiif.io/api/presentation/3/context.json",
  "type": "Manifest",
  "id": "https://example.org/Archive/Record1/manifest.json",
  "label": { "en": [ "Record 1" ], "ja": [ "記録 1" ] },
  "items": [
     // ここに各キャンバスの宣言が置かれる
] }

2.2 キャンバスの宣言

キャンバスは、IIIF ビューワの表示域を表す JSON オブジェクトです。必要なものは次のとおりですが、特に大事なのは itemsannotations です。

{
  "type": "Canvas",
  "id": "https://example.org/Archive/Research2020/canvas/1",
  "label": { "en": [ "Monologue 1" ], "ja": [ "モノローグ 1" ] },
  "items": [
    // 常に表示しておきたいアノテーション・ページの宣言が置かれる
  ],
  "annotations": [
    // 表示・非表示を切り替えたいアノテーション・ページの宣言が置かれる
  ]
}

また、必要に応じて次の宣言をします。

{
  "type": "Canvas",
  "id": "https://example.org/Archive/Research2020/canvas/1",
  "label": { "en": [ "Monologue 1" ], "ja": [ "モノローグ 1" ] },
  
  "width": "640",
  "height": "480",
  "duration": "120",
  
  "items": [
    // 常に表示しておきたいアノテーション・ページの宣言が置かれる
  ],
  "annotations": [
    // 表示・非表示を切り替えたいアノテーション・ページの宣言が置かれる
   ]
}

キャンバスを独立ファイルにする場合(たとえば canvas1.json を作成する場合)は、冒頭に @context を付けなければなりません。

{
  "type": "Manifest",
  "id": "https://example.org/Archive/Record1/manifest",
  "label": {"en": ["Record 1" ],"ja": ["記録 1" ] },
  "items": [
    // ここに各キャンバスの宣言が置かれる
    {
      "type": "Canvas",
      "id": "https://example.org/Archive/Research2020/canvas1.json"
    }
  ]
}
// canvas1.json
{
  "@context": "http://iiif.io/api/presentation/3/context.json",
  
  "type": "Canvas",
  "id": "https://example.org/Archive/Research2020/canvas1.json",
  "label": {"en": ["Monologue 1" ],"ja": ["モノローグ 1" ] },
  
  "width": "640",
  "height": "480",
  "duration": "120",
  
  "items": [
    // 常に表示しておきたいアノテーション・ページの宣言が置かれる
  ],
  "annotations": [
    // 表示・非表示を切り替えたいアノテーション・ページの宣言が置かれる
  ]
}

2.3 アノテーション・ページの宣言

素材(アノテーション)は直接キャンバスに載せられるのではなく、いったんアノテーション・ページと呼ばれるレイヤーに集積されます。

{
  "type": "AnnotationPage",
  "id": "https://example.org/Archive/Research2020/page/1",
  "items": [
    // ここに各アノテーションの宣言が置かれる
  ]
}

たとえば、動画の書き起こし字幕テキスト(page1.json)と翻訳字幕テキスト(page2.json)とを、別のアノテーション・ページとして同時に読み込むことができます。独立ファイルの冒頭には @context を付けなければなりません。

{
  "type": "Canvas",
  "id": "https://example.org/Archive/Research2020/canvas/1",
  "label": { "en": [ "Monologue 1" ], "ja": [ "モノローグ 1" ] },
  "items": [
    // 常に表示しておきたいアノテーション・ページの宣言が置かれる
  ],
  "annotations": [
    // 表示・非表示を切り替えたいアノテーション・ページの宣言が置かれる
    {
      "type": "AnnotationPage",
      "id": "https://example.org/Archive/Research2020/page1.json"
    },
    {
      "type": "AnnotationPage",
      "id": "https://example.org/Archive/Research2020/page2.json"
    }
  ]
}
// 字幕テキスト/page1.json
{
  "@context": "http://iiif.io/api/presentation/3/context.json",
  "type": "AnnotationPage",
  "id": "https://example.org/Archive/Research2020/page1.json",
  "items": [
    // ここに各アノテーションの宣言が置かれる
  ]
}
// 翻訳テキスト/page2.json
{
  "@context": "http://iiif.io/api/presentation/3/context.json",
  "type": "AnnotationPage",
  "id": "https://example.org/Archive/Research2020/page2.json",
  "items": [
    // ここに各アノテーションの宣言が置かれる
  ]
}

2.4 アノテーションの宣言

素材(アノテーション)の JSON オブジェクトは次のようになります。

{
  "type": "Annotation",
  "id": "https://example.org/Archive/Research2020/annotation/1",
  "motivation": "painting",
  "body": {
    // アノテーションの実体
  },
  "target": "https://example.org/Archive/Research2020/canvas/1"
}

アノテーションを独立ファイルにする場合(たとえば annotation1.jsonannotation2.json を作成する場合)は、冒頭に @context を付けなければなりません。

{
  "type": "Canvas",
  "id": "https://example.org/Archive/Research2020/canvas/1",
  "label": {"en": ["Monologue 1" ],"ja": ["モノローグ 1" ] },
  "items": [
    // 常に表示しておきたいアノテーション・ページの宣言が置かれる
    {
      "type": "AnnotationPage",
      "id": "https://example.org/Archive/Research2020/page/1",
      "items": [
        // ここに各アノテーションの宣言が置かれる
        {
          "type": "Annotation",
          "id": "https://example.org/Archive/Research2020/annotation1.json"
        }
      ]
    }
  ],
  "annotations": [
    // 表示・非表示を切り替えたいアノテーション・ページの宣言が置かれる
    {
      "type": "AnnotationPage",
      "id": "https://example.org/Archive/Research2020/page/2",
      "items": [
        // ここに各アノテーションの宣言が置かれる
        {
          "type": "Annotation",
          "id": "https://example.org/Archive/Research2020/annotation2.json"
        }
      ]
    }
  ]
}
// annotation1.json
{
  "@context": "http://iiif.io/api/presentation/3/context.json",
  "type": "Annotation",
  "id": "https://example.org/Archive/Research2020/annotation1.json",
  "motivation": "painting",
  "body": {
    // アノテーションの実体
  },
  "target": "https://example.org/Archive/Research2020/canvas/1"
}
// annotation2.json
{
  "@context": "http://iiif.io/api/presentation/3/context.json",
  "type": "Annotation",
  "id": "https://example.org/Archive/Research2020/annotation2.json",
  "motivation": "supplementing",
  "body": {
    // アノテーションの実体
  },
  "target": "https://example.org/Archive/Research2020/canvas/1"
}

2.5 アノテーションの実体

繰り返しますが、IIIF ではキャンバスに載せる素材のことをアノテーションと呼びます。アノテーションの実体は画像、動画、音声、注釈テキスト、字幕テキストなど様々です。

アノテーションの実体は body の中に記述されます。外部ファイルを参照する場合も、参照しない場合も、必ず id として URI を持ちます。

画像を参照する場合、

{
  "type": "Annotation",
  "id": "https://example.org/Archive/Research2020/annotation/1",
  "motivation": "painting",
  "body": {
    "id": "https://example.org/Archive/Research2020/content/image1.jpg",
    "type": "Image",
    "format": "image/jpeg",
    "width": "640",
    "height": "480"
  },
  "target": "https://example.org/Archive/Research2020/canvas/1"
}
{
  "type": "Annotation",
  "id": "https://example.org/Archive/Research2020/annotation/1",
  "motivation": "painting",
  "body": {
    "id": "https://example.org/Archive/Research2020/content/image1/full/640,480/0/default.jpg",
    "type": "Image"
  },
  "target": "https://example.org/Archive/Research2020/canvas/1"
}

動画、音声を参照する場合、

{
  "type": "Annotation",
  "id": "https://example.org/Archive/Research2020/annotation/1",
  "motivation": "painting",
  "body": {
    "id": "https://example.org/Archive/Research2020/content/video1.mp4",
    "type": "Video",
    "format": "audio"
  },
  "target": "https://example.org/Archive/Research2020/canvas/1"
}

動画の字幕テキスト(WebVTT)を参照する場合、

{
  "type": "Annotation",
  "id": "https://example.org/Archive/Research2020/annotation/1",
  "motivation": "painting",
  "body": {
    "id": "https://example.org/Archive/Research2020/content/tracktext1.vtt",
    "type": "Text",
    "format": "text/vtt"
  },
  "target": "https://example.org/Archive/Research2020/canvas/1"
}

画像、動画、音声等への注釈テキストを body に直接埋め込むこともできます。

{
  "type": "Annotation",
  "id": "https://example.org/Archive/Research2020/annotation/1",
  "motivation": "commenting",
  "body": {
    "id": "https://example.org/Archive/Research2020/content/text1",
    "type": "TextualBody",
    "format": "text/html",
    "language": "en",
    "value": "I love <strong>this</strong> portion of the movie!"
  },
  "target": "https://example.org/Archive/Research2020/canvas/1#xywh=0,0,20,30&t=20,25"
}

付録

3.1 参考ページなど