shelff JSON仕様
shelffは、PDFファイルのメタデータや読書進捗をJSONファイルとしてiCloud上に保存します。このページでは、shelffが読み書きするJSONファイルの仕様を説明します。
shelffはこれらのJSONファイルを通じてデータを管理しており、他のツールからも同じファイルを読み書きすることで、shelffと連携できます。
概要
shelffは3種類のJSONファイルを使用します。
| ファイル | 場所 | 役割 |
|---|---|---|
*.pdf.meta.json |
各PDFと同じディレクトリ | 個別PDFのメタデータ・読書進捗・表示設定 |
.shelff/categories.json |
shelffドキュメントルート直下の.shelffディレクトリ |
カテゴリの定義と順序 |
.shelff/tags.json |
shelffドキュメントルート直下の.shelffディレクトリ |
タグの表示順序 |
メタデータファイル(*.pdf.meta.json)は、shelffでPDFを最初に開いたときに自動的に作成されます。このときdc:titleにはファイル名が設定されます。
文字エンコーディングはUTF-8です。日付はISO 8601形式で記録されます。
メタデータファイル *.pdf.meta.json
各PDFファイルに対応するメタデータファイルです。PDFファイルと同じディレクトリに、元のファイル名に.meta.jsonを付加した名前で保存されます。
例: my-book.pdf → my-book.pdf.meta.json
例
{
"schemaVersion": 1,
"metadata": {
"dc:title": "プログラミング入門",
"dc:creator": ["山田太郎"],
"dc:publisher": "技術出版社",
"dc:date": "2024",
"dc:language": "ja",
"dc:subject": ["プログラミング", "入門"],
"dc:identifier": "978-4-00-000000-0"
},
"reading": {
"lastReadPage": 42,
"totalPages": 300,
"lastReadAt": "2025-03-20T14:30:00Z",
"status": "reading",
"finishedAt": null
},
"display": {
"direction": "LTR",
"pageLayout": "spread-with-cover",
"crop": {
"excludeFirstPage": true,
"odd": { "top": 0.05, "bottom": 0.04, "left": 0.03, "right": 0.03 },
"even": { "top": 0.05, "bottom": 0.04, "left": 0.02, "right": 0.04 }
}
},
"collection": { "title": "プログラミング入門シリーズ", "position": 1 },
"category": "技術書",
"tags": ["Swift", "入門"],
"bookmarks": [
{ "page": 3, "label": "重要な図" },
{ "page": 15 },
{ "page": 42 }
]
}
トップレベルフィールド
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
schemaVersion |
整数 | はい | スキーマバージョン。現在は1 |
metadata |
オブジェクト | はい | 書誌メタデータ(後述) |
reading |
オブジェクト | いいえ | 読書進捗(後述) |
display |
オブジェクト | いいえ | 表示設定(後述) |
collection |
オブジェクト | いいえ | 所属するコレクション(シリーズ・雑誌)。1つのPDFにつき最大1つ |
category |
文字列 | いいえ | カテゴリ名(1つのPDFにつき1つ) |
tags |
文字列の配列 | いいえ | タグ名の配列 |
bookmarks |
オブジェクトの配列 | いいえ | ユーザー定義のページしおり(後述) |
metadataオブジェクト
書誌メタデータです。フィールド名はDublin Core Metadata Termsに基づいたdc:接頭辞付きのキーを使用しています。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
dc:title |
文字列 | はい | タイトル |
dc:creator |
文字列の配列 | いいえ | 著者 |
dc:date |
文字列 | いいえ | 日付。"2024"、"2024-06"、"2024-06-15"のいずれも有効 |
dc:publisher |
文字列 | いいえ | 出版社 |
dc:language |
文字列 | いいえ | 言語コード(例: "ja"、"en") |
dc:subject |
文字列の配列 | いいえ | 主題・キーワード |
dc:identifier |
文字列 | いいえ | 識別子(ISBNなど) |
readingオブジェクト
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
lastReadPage |
整数 | はい | 最後に読んだページ番号(1始まり) |
totalPages |
整数 | はい | 総ページ数 |
lastReadAt |
文字列 | はい | 最終閲覧日時(ISO 8601) |
status |
文字列 | いいえ | 読書ステータス: "unread" / "reading" / "finished" |
finishedAt |
文字列 | いいえ | 読了日時(ISO 8601) |
displayオブジェクト
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
direction |
文字列 | はい | 読み方向: "LTR"(左→右)/ "RTL"(右→左) |
pageLayout |
文字列 | いいえ | ページレイアウト: "single" / "spread" / "spread-with-cover" |
crop |
オブジェクト または null |
いいえ | 余白の調整(後述)。省略またはnullの場合は調整なし |
display.cropオブジェクト
ページを表示するときに適用する余白の調整(クロップ)です。PDFファイル自体は変更せず、リーダーが表示時にページの表示範囲へ適用します。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
odd |
オブジェクト | はい | 奇数ページ(1, 3, 5, …)の余白幅(後述) |
even |
オブジェクト | はい | 偶数ページ(2, 4, 6, …)の余白幅(後述) |
excludeFirstPage |
真偽値 | いいえ | trueの場合、1ページ目(通常は表紙)には調整を適用しない。省略時はfalse |
奇偶は PDF のページ番号(1始まり)で決まり、pageLayoutやdirectionには依存しません。全ページに同じ調整を適用する場合はoddとevenに同じ値を書きます。
odd / even は次の4フィールドを持つオブジェクトです。値はページの MediaBox に対する比率(0.0〜1.0)で、/Rotate適用後の表示上の向きで定義します。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
top |
数値 | はい | 上辺から切り落とす幅(ページ高さに対する比率) |
bottom |
数値 | はい | 下辺から切り落とす幅(ページ高さに対する比率) |
left |
数値 | はい | 左辺から切り落とす幅(ページ幅に対する比率) |
right |
数値 | はい | 右辺から切り落とす幅(ページ幅に対する比率) |
各値は0以上で、top + bottom < 1かつleft + right < 1でなければなりません。この条件を満たさない場合、リーダーはエラーにせず「調整なし」として扱います。displayを書き換えるツールはcropを保持してください。
bookmarks配列
ユーザーが任意のページに付与する「しおり」(デジタル付箋)の配列です。PDFに組み込まれたアウトライン(目次)とは別に、読み手が関心のあるページを記録するために使用します。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
page |
整数 | はい | しおりを付けたページ番号(1始まり) |
label |
文字列 | いいえ | しおりのラベル。省略時はページ番号などをフォールバック表示してよい |
collectionオブジェクト
各PDFが属するシリーズや雑誌を表すオブジェクトです。EPUBのbelongs-to-collection/group-positionに着想を得て、type区分なしの単一コレクションに簡略化しています。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
title |
文字列 | はい | コレクション名 |
position |
数値 | いいえ | コレクション内の位置。小数も可(例: 0.5 は特別号・半巻)。雑誌など発行日順で並べる場合は省略 |
カテゴリファイル categories.json
shelffドキュメントルート直下の.shelffディレクトリに保存される、カテゴリの定義ファイルです。各PDFは最大1つのカテゴリに属します。
例
{
"version": 1,
"categories": [
{ "name": "技術書", "order": 0 },
{ "name": "小説", "order": 1 },
{ "name": "論文", "order": 2 }
]
}
| フィールド | 型 | 説明 |
|---|---|---|
version |
整数 | スキーマバージョン。現在は1 |
categories |
配列 | カテゴリの配列。各要素はname(文字列)とorder(整数、0始まり)を持つ |
タグファイル tags.json
shelffドキュメントルート直下の.shelffディレクトリに保存される、タグの表示順序ファイルです。タグ自体の定義は各PDFのメタデータファイル内のtagsフィールドで行われます。このファイルはタグの表示順序のみを管理します。
例
{
"version": 1,
"tagOrder": ["Swift", "SwiftUI", "プログラミング", "読みかけ"]
}
| フィールド | 型 | 説明 |
|---|---|---|
version |
整数 | スキーマバージョン。現在は1 |
tagOrder |
文字列の配列 | タグの表示順序。この配列に含まれないタグは名前順で末尾に表示される |
拡張フィールド
3種類のファイルはいずれもトップレベルに未定義のフィールドを置けます。他のツールやユーザーが独自のデータを保存する場合は、フィールド名にx-接頭辞を付けてください(例: x-calibre-id)。metadataオブジェクト内も同様で、Dublin Core の標準拡張(dcterms:など)はそのまま使えます。readingとdisplayは未定義のフィールドを許可しません。
shelffを含め、これらのファイルを読み書きするツールは、自分が理解しないフィールドを捨てずに書き戻すことが求められます。
JSON Schema
各ファイル形式のJSON Schemaは以下のリポジトリで公開しています。