Cursor API
Cursor APIは、Canvas
のリストを動的に生成するサービスである。例えば、Manifest
のsequences
がCanvas
の長大なリストとなって列挙が実用的ではない場合でも、Canvas
リストの一部を切り出して提供することが可能となる。このサービスはCursor APIに準拠したCursor
を返戻するが、そのオブジェクトの@type
をcs:Cursor
とする。
Cursor
の構造は以下のようになる。
-
Cursor
-
@context
(必須) -
@type
(必須) -
@id
(必須) -
label
(必須) -
service
(必須)-
@context
(必須) -
@id
(必須) profile
-
next
prev
within
-
sequence
(必須)
-
service
の@id
には自身のCursor
のURIを記載する。このURIは参照解決可能なものでなければならない。Cursor
のURIは、次のパターンを推奨する。
{scheme}://{host}/{prefix}/{identifier}/cursor
next
には次の切り出し範囲の始点となるcursorIndex
値、prev
には前の切り出し範囲の始点となるcursorIndex
値を記載する。
within
には、このCursor
を含んでいるtl:Manifest
に関する情報を記載する。
sequence
は、IIIF Presentation API 2.1のSequence
(http://iiif.io/api/presentation/2.1/#sequence)構造である。そのcanvases
プロパティは、IIIF Presentation API 2.1のCanvas
(http://iiif.io/api/presentation/2.1/#canvas)を拡張した構造を含みうるものとする。この拡張されたCanvas
は、現時点ではIIIF Presentation API 2.1の独自拡張であり、@type
はcs:Canvas
としている。ここでは、この拡張されたCanvas
をcs:Canvas
と呼ぶ。
cs:Canvas
の構造は以下のようになる。
-
cs:Canvas
@context
-
@type
(必須) -
@id
(必須) -
label
(必須) -
height
(必須) -
width
(必須) -
cursorIndex
(必須)
cs:Canvas
のcursorIndex
プロパティは整数値を取り、viewingHint
プロパティ値をtime
とする構造の下で利用される場合、Unix time(秒)として解釈される。
Cursor APIに対応したビューワは、service
の@id
で示されるURIに対し、クエリパラメータcursorIndex
を用いて問い合わせを行い、返戻オブジェクトを得る。
この問い合わせは、例えば、次のような形となる。
http://agora.ex.nii.ac.jp/digital-typhoon/service/iiif/Hsfd/cursor?cursorIndex=1493596800
Cursor APIは、クエリパラメータcursorIndex
で指定された値と、cs:Canvas
の持つcursorIndex
プロパティ値を比較し、クエリパラメータcursorIndex
値以上のcursorIndex
プロパティ値を持つcs:Canvas
の全てまたは一部範囲を抽出して、その順序付きリスト(配列)からなるcanvases
を含むsequence
を持ったCursor
を返す。
このsequence
のcanvases
長は、API Compliance Level 0(必要最低限の実装レベル)では、Cursor APIの実装依存とし、API Compliance Level 1以降(オプションの実装レベル)では、クエリパラメータによる変更指定が可能となるよう検討する。
例えば、Timeline
であれば、クエリパラメータcursorIndex
で指定された時刻以降の1日間分の時系列画像を返すCursor API実装などが考えられる。この場合、Cursor
のnext
に記載されたcursorIndex
値を用いて問い合わせを行うことで、次の1日間分の時系列画像を取得できることになる(この問い合わせは、以下の記述例であれば、次の形となる)。
http://agora.ex.nii.ac.jp/digital-typhoon/service/iiif/Hsfd/cursor?cursorIndex=1493683200
記述例
{
"@context": [
"http://iiif.io/api/presentation/2/context.json",
"http://codh.rois.ac.jp/iiif/cursor/1/context.json"
],
"@type": "cs:Cursor",
"@id": "http://agora.ex.nii.ac.jp/digital-typhoon/service/iiif/Hsfd/cursor?cursorIndex=1493596800",
"label": "デジタル台風:ひまわり8号クリッピング (2017-05-01T00:00:00Z ~ 2017-05-01T23:50:00Z)",
"service": {
"@context": "http://codh.rois.ac.jp/iiif/cursor/1/context.json",
"@id": "http://agora.ex.nii.ac.jp/digital-typhoon/service/iiif/Hsfd/cursor",
"profile": "http://codh.rois.ac.jp/iiif/cursor/1/level0.json"
},
"next": 1493683200,
"prev": 1493510400,
"within": "http://codh.rois.ac.jp/iiif/iiif-curation-viewer/sample/himawari/timeline.json",
"sequence": {
"@id": "http://agora.ex.nii.ac.jp/digital-typhoon/service/iiif/Hsfd/cursor?cursorIndex=1493596800",
"@type": "sc:Sequence",
"label": "2017-05-01T00:00:00Z ~ 2017-05-01T23:50:00Z",
"canvases": [
{
"@id": "http://agora.ex.nii.ac.jp/digital-typhoon/iiif/2017/05/01/20170501000000",
"@type": "cs:Canvas",
"label": [
{
"@value": "2017-05-01T09:00:00+09:00",
"@language": "ja"
},
{
"@value": "2017-05-01T00:00:00Z",
"@language": "en"
}
],
"height": 11000,
"width": 11000,
"cursorIndex": 1493596800,
"images": [
{
"@type": "oa:Annotation",
"@motivation": "sc:painting",
"@id": "http://agora.ex.nii.ac.jp/digital-typhoon/iiif/2017/05/01/20170501000000",
"resource": {
"@id": "http://agora.ex.nii.ac.jp/digital-typhoon/iiif/2017/05/01/20170501000000.tif/full/full/0/default.jpg",
"@type": "dctypes:Image",
"format": "image/jpeg",
"service": {
"@context": "http://iiif.io/api/image/2/context.json",
"@id": "http://agora.ex.nii.ac.jp/digital-typhoon/iiif/2017/05/01/20170501000000.tif",
"profile": "http://iiif.io/api/image/2/level1.json"
},
"width": 11000,
"height": 11000
},
"on": "http://agora.ex.nii.ac.jp/digital-typhoon/iiif/2017/05/01/20170501000000"
}
]
},
{
"@id": "http://agora.ex.nii.ac.jp/digital-typhoon/iiif/2017/05/01/20170501235000",
"@type": "cs:Canvas",
"label": [
{
"@value": "2017-05-02T08:50:00+09:00",
"@language": "ja"
},
{
"@value": "2017-05-01T23:50:00Z",
"@language": "en"
}
],
"height": 11000,
"width": 11000,
"cursorIndex": 1493682600,
"images": [
{
"@type": "oa:Annotation",
"@motivation": "sc:painting",
"@id": "http://agora.ex.nii.ac.jp/digital-typhoon/iiif/2017/05/01/20170501235000",
"resource": {
"@id": "http://agora.ex.nii.ac.jp/digital-typhoon/iiif/2017/05/01/20170501235000.tif/full/full/0/default.jpg",
"@type": "dctypes:Image",
"format": "image/jpeg",
"service": {
"@context": "http://iiif.io/api/image/2/context.json",
"@id": "http://agora.ex.nii.ac.jp/digital-typhoon/iiif/2017/05/01/20170501235000.tif",
"profile": "http://iiif.io/api/image/2/level1.json"
},
"width": 11000,
"height": 11000
},
"on": "http://agora.ex.nii.ac.jp/digital-typhoon/iiif/2017/05/01/20170501235000"
}
]
}
]
}
}