From 26f8b34251eea1698f66af354743aa176367be1b Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Sun, 16 Mar 2025 16:42:53 -0700 Subject: [PATCH 01/10] me.woach.{feed,content}, add session and anilist media I have a local stash with an alternative media method, but for the MVP we'll just implement anilist. In order to use anilist we need to contact them to make sure we don't break rule 5 of their Terms of Service. --- lexicons/me/woach/content/media.json | 13 ++++++++++ lexicons/me/woach/feed/session.json | 37 ++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 lexicons/me/woach/content/media.json create mode 100644 lexicons/me/woach/feed/session.json diff --git a/lexicons/me/woach/content/media.json b/lexicons/me/woach/content/media.json new file mode 100644 index 0000000..4a82ed0 --- /dev/null +++ b/lexicons/me/woach/content/media.json @@ -0,0 +1,13 @@ +{ + "lexicon": 1, + "id": "me.woach.content.media", + "defs": { + "anilist": { + "type": "object", + "required": ["id"], + "properties": { + "id": { "type": "integer" } + } + } + } +} diff --git a/lexicons/me/woach/feed/session.json b/lexicons/me/woach/feed/session.json new file mode 100644 index 0000000..1a50c15 --- /dev/null +++ b/lexicons/me/woach/feed/session.json @@ -0,0 +1,37 @@ +{ + "lexicon": 1, + "id": "me.woach.feed.session", + "defs": { + "main": { + "type": "record", + "description": "A session of consuming some content", + "key": "tid", + "record": { + "type": "object", + "required": ["content", "createdAt"], + "properties": { + "content": { + "type": "union", + "refs": [ + "me.woach.content.media#anilist" + ] + }, + "title": { + "type": "string", + "maxGraphemes": 64, + "maxLength": 640 + }, + "participants": { + "type": "array", + "items": { "type": "ref", "ref": "com.atproto.repo.strongRef" } + }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp for when this activity was created" + } + } + } + } + } +} From 83b070619c630f3276111674f168d1f006cfd747 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Thu, 20 Mar 2025 23:54:26 -0700 Subject: [PATCH 02/10] me.woach.{feed/content}, change from media#anilist to just anilist --- lexicons/me/woach/content/{media.json => anilist.json} | 4 ++-- lexicons/me/woach/feed/session.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename lexicons/me/woach/content/{media.json => anilist.json} (75%) diff --git a/lexicons/me/woach/content/media.json b/lexicons/me/woach/content/anilist.json similarity index 75% rename from lexicons/me/woach/content/media.json rename to lexicons/me/woach/content/anilist.json index 4a82ed0..f1f9be1 100644 --- a/lexicons/me/woach/content/media.json +++ b/lexicons/me/woach/content/anilist.json @@ -1,8 +1,8 @@ { "lexicon": 1, - "id": "me.woach.content.media", + "id": "me.woach.content.anilist", "defs": { - "anilist": { + "main": { "type": "object", "required": ["id"], "properties": { diff --git a/lexicons/me/woach/feed/session.json b/lexicons/me/woach/feed/session.json index 1a50c15..40ddeb8 100644 --- a/lexicons/me/woach/feed/session.json +++ b/lexicons/me/woach/feed/session.json @@ -13,10 +13,10 @@ "content": { "type": "union", "refs": [ - "me.woach.content.media#anilist" + "me.woach.content.anilist" ] }, - "title": { + "label": { "type": "string", "maxGraphemes": 64, "maxLength": 640 From d2779156f654cb34dfcc3da3f2d7c4708a8e5bc2 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Fri, 21 Mar 2025 19:53:08 -0700 Subject: [PATCH 03/10] me.woach.content, make anilist an nsid key --- lexicons/me/woach/content/anilist.json | 1 + 1 file changed, 1 insertion(+) diff --git a/lexicons/me/woach/content/anilist.json b/lexicons/me/woach/content/anilist.json index f1f9be1..06b6ab9 100644 --- a/lexicons/me/woach/content/anilist.json +++ b/lexicons/me/woach/content/anilist.json @@ -5,6 +5,7 @@ "main": { "type": "object", "required": ["id"], + "key": "nsid", "properties": { "id": { "type": "integer" } } From f22b060c97a2170550ce3046b48166968aa125d8 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Fri, 21 Mar 2025 19:53:45 -0700 Subject: [PATCH 04/10] me.woach.feed, use strongRef instead of union --- lexicons/me/woach/feed/session.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lexicons/me/woach/feed/session.json b/lexicons/me/woach/feed/session.json index 40ddeb8..a7979c7 100644 --- a/lexicons/me/woach/feed/session.json +++ b/lexicons/me/woach/feed/session.json @@ -10,12 +10,7 @@ "type": "object", "required": ["content", "createdAt"], "properties": { - "content": { - "type": "union", - "refs": [ - "me.woach.content.anilist" - ] - }, + "content": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, "label": { "type": "string", "maxGraphemes": 64, From 360a3b3fdeab6afd89f2bf769abda1245895073d Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Fri, 21 Mar 2025 19:54:05 -0700 Subject: [PATCH 05/10] me.woach.content, add atproto media storage --- lexicons/me/woach/content/media.json | 50 ++++++++++++++++++++++++++++ lexicons/me/woach/content/title.json | 26 +++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 lexicons/me/woach/content/media.json create mode 100644 lexicons/me/woach/content/title.json diff --git a/lexicons/me/woach/content/media.json b/lexicons/me/woach/content/media.json new file mode 100644 index 0000000..0ea082a --- /dev/null +++ b/lexicons/me/woach/content/media.json @@ -0,0 +1,50 @@ +{ + "lexicon": 1, + "id": "me.woach.content.media", + "defs": { + "main": { + "type": "object", + "key": "nsid", + "required": [ "titles", "durationData", "lastUpdated" ], + "properties": { + "titles": { + "type": "array", + "minLength": 1, + "items": { + "type": "ref", + "ref": "me.woach.content.title" + } + }, + "durationData": { + "type": "union", + "refs": [ + "me.woach.content.media#television", + "me.woach.content.media#book" + ] + }, + "posterImage": { + "type": "blob", + "accept": ["image/png", "image/jpeg"], + "maxSize": 1000000 + }, + "lastUpdated": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp for when this activity was last updated" + } + } + }, + "television": { + "type": "object", + "properties": { + "episodes": { "type": "integer", "minimum": 0} + } + }, + "book": { + "type": "object", + "properties": { + "chapters": { "type": "integer", "minimum": 0} + } + } + } +} diff --git a/lexicons/me/woach/content/title.json b/lexicons/me/woach/content/title.json new file mode 100644 index 0000000..0394b9f --- /dev/null +++ b/lexicons/me/woach/content/title.json @@ -0,0 +1,26 @@ +{ + "lexicon": 1, + "id": "me.woach.content.title", + "defs": { + "main": { + "type": "object", + "properties": { + "language": { + "type": "string", + "knownValues": [ + "me.woach.content.title#romanization", + "me.woach.content.title#english", + "me.woach.content.title#native" + ] + }, + "value": { "type": "string", "minLength": 1 } + } + }, + "romanization": { "type": "token", + "description": "Romanization of the native title" }, + "english": { "type": "token", + "description": "English translation or title" }, + "native": { "type": "token", + "description": "Native title" } + } +} From 60262fed0c953d4c12d423a0f4b5a87f4408cd12 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Thu, 1 May 2025 15:48:13 -0700 Subject: [PATCH 06/10] woach to spoor, anilist to external THESE LEXICONS ARE NOT FINAL, she screamed into the wind. converts all references to woach.me to spoor.my to reflect the official domain name. Rename "feed" 3ld to "log" since the content here is separate from what an activity feed would look like. Log has more in common with records. I maintained the name activity over "spoor" here, because I want the items to be easily digested by other services. I think "spoor" is actually a more apt term than "activity" since "activity" is more generic, than the specific mediaspoor it is, but it will do. Changes the "anilist" entry to a more generic "external" entry, which will be able to handle tvdb, or similar. --- lexicons/me/woach/content/anilist.json | 14 --------- lexicons/my/spoor/content/external.json | 30 +++++++++++++++++++ .../{me/woach => my/spoor}/content/media.json | 8 ++--- .../{me/woach => my/spoor}/content/title.json | 9 +++--- .../woach/feed => my/spoor/log}/activity.json | 16 ++++++---- .../woach/feed => my/spoor/log}/session.json | 6 ++-- 6 files changed, 53 insertions(+), 30 deletions(-) delete mode 100644 lexicons/me/woach/content/anilist.json create mode 100644 lexicons/my/spoor/content/external.json rename lexicons/{me/woach => my/spoor}/content/media.json (85%) rename lexicons/{me/woach => my/spoor}/content/title.json (72%) rename lexicons/{me/woach/feed => my/spoor/log}/activity.json (64%) rename lexicons/{me/woach/feed => my/spoor/log}/session.json (84%) diff --git a/lexicons/me/woach/content/anilist.json b/lexicons/me/woach/content/anilist.json deleted file mode 100644 index 06b6ab9..0000000 --- a/lexicons/me/woach/content/anilist.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "lexicon": 1, - "id": "me.woach.content.anilist", - "defs": { - "main": { - "type": "object", - "required": ["id"], - "key": "nsid", - "properties": { - "id": { "type": "integer" } - } - } - } -} diff --git a/lexicons/my/spoor/content/external.json b/lexicons/my/spoor/content/external.json new file mode 100644 index 0000000..ae74ab0 --- /dev/null +++ b/lexicons/my/spoor/content/external.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "my.spoor.content.external", + "defs": { + "main": { + "type": "object", + "required": [ "source", "queryable" ], + "key": "nsid", + "properties": { + "source": { + "type": "string", + "description": "An nsid for a specific data source. The domain authority governs how to process the queryable", + "format": "nsid", + "knownValues": [ + "my.spoor.content.external#tvdb" + ] + }, + "queryable": { + "type": "union", + "description": "All the data needed to query the content from the source" + }, + "overrides": { + "type": "object", + "description": "User defined overrides for the returned content", + "properties": {} + } + } + } + } +} diff --git a/lexicons/me/woach/content/media.json b/lexicons/my/spoor/content/media.json similarity index 85% rename from lexicons/me/woach/content/media.json rename to lexicons/my/spoor/content/media.json index 0ea082a..3f18ad8 100644 --- a/lexicons/me/woach/content/media.json +++ b/lexicons/my/spoor/content/media.json @@ -1,6 +1,6 @@ { "lexicon": 1, - "id": "me.woach.content.media", + "id": "my.spoor.content.media", "defs": { "main": { "type": "object", @@ -12,14 +12,14 @@ "minLength": 1, "items": { "type": "ref", - "ref": "me.woach.content.title" + "ref": "my.spoor.content.title" } }, "durationData": { "type": "union", "refs": [ - "me.woach.content.media#television", - "me.woach.content.media#book" + "my.spoor.content.media#television", + "my.spoor.content.media#book" ] }, "posterImage": { diff --git a/lexicons/me/woach/content/title.json b/lexicons/my/spoor/content/title.json similarity index 72% rename from lexicons/me/woach/content/title.json rename to lexicons/my/spoor/content/title.json index 0394b9f..48f338d 100644 --- a/lexicons/me/woach/content/title.json +++ b/lexicons/my/spoor/content/title.json @@ -1,16 +1,17 @@ { "lexicon": 1, - "id": "me.woach.content.title", + "id": "my.spoor.content.title", "defs": { "main": { "type": "object", "properties": { "language": { "type": "string", + "format": "nsid", "knownValues": [ - "me.woach.content.title#romanization", - "me.woach.content.title#english", - "me.woach.content.title#native" + "my.spoor.content.title#romanization", + "my.spoor.content.title#english", + "my.spoor.content.title#native" ] }, "value": { "type": "string", "minLength": 1 } diff --git a/lexicons/me/woach/feed/activity.json b/lexicons/my/spoor/log/activity.json similarity index 64% rename from lexicons/me/woach/feed/activity.json rename to lexicons/my/spoor/log/activity.json index 67ab025..f3035fb 100644 --- a/lexicons/me/woach/feed/activity.json +++ b/lexicons/my/spoor/log/activity.json @@ -1,10 +1,10 @@ { "lexicon": 1, - "id": "me.woach.feed.activity", + "id": "my.spoor.log.activity", "defs": { "main": { "type": "record", - "description": "A single activity log for a specific show", + "description": "A single activity (spoor) for a specific session", "key": "tid", "record": { "type": "object", @@ -13,13 +13,15 @@ "properties": { "session": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, "progress": { - "type": "integer", - "description": "The episode/chapter number for the content consumed." + "type": "union", + "refs": [ + "my.spoor.log.activity#indexProgress" + ] }, "performedAt": { "type": "string", "format": "datetime", - "description": "User-declared timestamp for when they performed the activity." + "description": "User-declared timestamp for when they performed the activity. Null implies unknown time." }, "createdAt": { "type": "string", @@ -28,6 +30,10 @@ } } } + }, + "indexProgress": { + "type": "integer", + "description": "The index of the content consumed. Content must be indexable" } } } diff --git a/lexicons/me/woach/feed/session.json b/lexicons/my/spoor/log/session.json similarity index 84% rename from lexicons/me/woach/feed/session.json rename to lexicons/my/spoor/log/session.json index a7979c7..4da7738 100644 --- a/lexicons/me/woach/feed/session.json +++ b/lexicons/my/spoor/log/session.json @@ -1,6 +1,6 @@ { "lexicon": 1, - "id": "me.woach.feed.session", + "id": "my.spoor.log.session", "defs": { "main": { "type": "record", @@ -16,9 +16,9 @@ "maxGraphemes": 64, "maxLength": 640 }, - "participants": { + "otherParticipants": { "type": "array", - "items": { "type": "ref", "ref": "com.atproto.repo.strongRef" } + "items": { "type": "string", "format": "did" } }, "createdAt": { "type": "string", From 0beee2c8d0d4a100b2bff6ea7dbb7184fd6a0858 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Wed, 7 May 2025 16:20:28 -0700 Subject: [PATCH 07/10] content, use primary types, move title to defs So I sort of used "object" instead of "record" because I thought key was an option type ^_^ So I had to fix that. Also moves title to defs because it is not supposed to be a record --- lexicons/my/spoor/content/defs.json | 31 ++++++++++++++ lexicons/my/spoor/content/external.json | 42 ++++++++++--------- lexicons/my/spoor/content/media.json | 55 +++++++++++++------------ lexicons/my/spoor/content/title.json | 27 ------------ 4 files changed, 83 insertions(+), 72 deletions(-) create mode 100644 lexicons/my/spoor/content/defs.json delete mode 100644 lexicons/my/spoor/content/title.json diff --git a/lexicons/my/spoor/content/defs.json b/lexicons/my/spoor/content/defs.json new file mode 100644 index 0000000..f13f8fd --- /dev/null +++ b/lexicons/my/spoor/content/defs.json @@ -0,0 +1,31 @@ +{ + "lexicon": 1, + "id": "my.spoor.content.defs", + "defs": { + "title": { + "type": "object", + "properties": { + "translationType": { + "type": "string", + "format": "nsid", + "knownValues": [ + "my.spoor.content.defs#titleHomophonic", + "my.spoor.content.defs#titleNative", + "my.spoor.content.defs#titleTranslation" + ] + }, + "lang": { + "type": "string", + "format": "language" + }, + "value": { "type": "string", "minLength": 1 } + } + }, + "titleHomophonic": { "type": "token", + "description": "A phonetic transcription of the native title such that when read it will sound like the native title." }, + "titleNative": { "type": "token", + "description": "The title in its native script" }, + "titleTranslation": { "type": "token", + "description": "A translation of the title" } + } +} diff --git a/lexicons/my/spoor/content/external.json b/lexicons/my/spoor/content/external.json index ae74ab0..6cd4f52 100644 --- a/lexicons/my/spoor/content/external.json +++ b/lexicons/my/spoor/content/external.json @@ -3,26 +3,30 @@ "id": "my.spoor.content.external", "defs": { "main": { - "type": "object", - "required": [ "source", "queryable" ], + "type": "record", "key": "nsid", - "properties": { - "source": { - "type": "string", - "description": "An nsid for a specific data source. The domain authority governs how to process the queryable", - "format": "nsid", - "knownValues": [ - "my.spoor.content.external#tvdb" - ] - }, - "queryable": { - "type": "union", - "description": "All the data needed to query the content from the source" - }, - "overrides": { - "type": "object", - "description": "User defined overrides for the returned content", - "properties": {} + "record": { + "type": "object", + "required": [ "source", "queryable" ], + "properties": { + "source": { + "type": "string", + "description": "An nsid for a specific data source. The domain authority governs how to process the queryable", + "format": "nsid", + "knownValues": [ + "my.spoor.content.external#tvdb" + ] + }, + "queryable": { + "type": "union", + "description": "All the data needed to query the content from the source", + "refs": [] + }, + "overrides": { + "type": "union", + "description": "User defined overrides for the returned content", + "refs": [] + } } } } diff --git a/lexicons/my/spoor/content/media.json b/lexicons/my/spoor/content/media.json index 3f18ad8..ec383d1 100644 --- a/lexicons/my/spoor/content/media.json +++ b/lexicons/my/spoor/content/media.json @@ -3,34 +3,37 @@ "id": "my.spoor.content.media", "defs": { "main": { - "type": "object", + "type": "record", "key": "nsid", - "required": [ "titles", "durationData", "lastUpdated" ], - "properties": { - "titles": { - "type": "array", - "minLength": 1, - "items": { - "type": "ref", - "ref": "my.spoor.content.title" + "record": { + "type": "object", + "required": [ "titles", "lastUpdated" ], + "properties": { + "titles": { + "type": "array", + "minLength": 1, + "items": { + "type": "ref", + "ref": "my.spoor.content.defs#title" + } + }, + "durationData": { + "type": "union", + "refs": [ + "my.spoor.content.media#television", + "my.spoor.content.media#book" + ] + }, + "posterImage": { + "type": "blob", + "accept": ["image/png", "image/jpeg"], + "maxSize": 1000000 + }, + "lastUpdated": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp for when this activity was last updated" } - }, - "durationData": { - "type": "union", - "refs": [ - "my.spoor.content.media#television", - "my.spoor.content.media#book" - ] - }, - "posterImage": { - "type": "blob", - "accept": ["image/png", "image/jpeg"], - "maxSize": 1000000 - }, - "lastUpdated": { - "type": "string", - "format": "datetime", - "description": "Client-declared timestamp for when this activity was last updated" } } }, diff --git a/lexicons/my/spoor/content/title.json b/lexicons/my/spoor/content/title.json deleted file mode 100644 index 48f338d..0000000 --- a/lexicons/my/spoor/content/title.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "lexicon": 1, - "id": "my.spoor.content.title", - "defs": { - "main": { - "type": "object", - "properties": { - "language": { - "type": "string", - "format": "nsid", - "knownValues": [ - "my.spoor.content.title#romanization", - "my.spoor.content.title#english", - "my.spoor.content.title#native" - ] - }, - "value": { "type": "string", "minLength": 1 } - } - }, - "romanization": { "type": "token", - "description": "Romanization of the native title" }, - "english": { "type": "token", - "description": "English translation or title" }, - "native": { "type": "token", - "description": "Native title" } - } -} From d7b4ede16e5163300fe034b79643b16c640c77dc Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Wed, 7 May 2025 16:25:07 -0700 Subject: [PATCH 08/10] content, add optional title to external I really like this change. I think it'll make records way easier to understand in the repo, and more useful if the external site goes down. Also allows shortcut querying if you don't need more data than the title --- lexicons/my/spoor/content/external.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lexicons/my/spoor/content/external.json b/lexicons/my/spoor/content/external.json index 6cd4f52..fd272af 100644 --- a/lexicons/my/spoor/content/external.json +++ b/lexicons/my/spoor/content/external.json @@ -9,6 +9,14 @@ "type": "object", "required": [ "source", "queryable" ], "properties": { + "titles": { + "type": "array", + "minLength": 1, + "items": { + "type": "ref", + "ref": "my.spoor.content.defs#title" + } + }, "source": { "type": "string", "description": "An nsid for a specific data source. The domain authority governs how to process the queryable", From ebb6fdce39ba2d394b0606acd761abb1ca1cf2b7 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Thu, 8 May 2025 14:25:29 -0700 Subject: [PATCH 09/10] content, move title out of defs --- lexicons/my/spoor/content/external.json | 2 +- lexicons/my/spoor/content/media.json | 2 +- lexicons/my/spoor/content/{defs.json => title.json} | 8 +++----- 3 files changed, 5 insertions(+), 7 deletions(-) rename lexicons/my/spoor/content/{defs.json => title.json} (78%) diff --git a/lexicons/my/spoor/content/external.json b/lexicons/my/spoor/content/external.json index fd272af..fc6f470 100644 --- a/lexicons/my/spoor/content/external.json +++ b/lexicons/my/spoor/content/external.json @@ -14,7 +14,7 @@ "minLength": 1, "items": { "type": "ref", - "ref": "my.spoor.content.defs#title" + "ref": "my.spoor.content.title" } }, "source": { diff --git a/lexicons/my/spoor/content/media.json b/lexicons/my/spoor/content/media.json index ec383d1..e8897c2 100644 --- a/lexicons/my/spoor/content/media.json +++ b/lexicons/my/spoor/content/media.json @@ -14,7 +14,7 @@ "minLength": 1, "items": { "type": "ref", - "ref": "my.spoor.content.defs#title" + "ref": "my.spoor.content.title" } }, "durationData": { diff --git a/lexicons/my/spoor/content/defs.json b/lexicons/my/spoor/content/title.json similarity index 78% rename from lexicons/my/spoor/content/defs.json rename to lexicons/my/spoor/content/title.json index f13f8fd..3368a47 100644 --- a/lexicons/my/spoor/content/defs.json +++ b/lexicons/my/spoor/content/title.json @@ -1,17 +1,15 @@ { "lexicon": 1, - "id": "my.spoor.content.defs", + "id": "my.spoor.content.title", "defs": { - "title": { + "main": { "type": "object", "properties": { "translationType": { "type": "string", "format": "nsid", "knownValues": [ - "my.spoor.content.defs#titleHomophonic", - "my.spoor.content.defs#titleNative", - "my.spoor.content.defs#titleTranslation" + "#titleHomophonic", "#titleNative", "#titleTranslation" ] }, "lang": { From 0c7e67126c2eb46bd1901c2c329d1139747d7e89 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Thu, 8 May 2025 14:27:17 -0700 Subject: [PATCH 10/10] log, remove invalid concrete schema --- lexicons/my/spoor/log/activity.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lexicons/my/spoor/log/activity.json b/lexicons/my/spoor/log/activity.json index f3035fb..adb3a1e 100644 --- a/lexicons/my/spoor/log/activity.json +++ b/lexicons/my/spoor/log/activity.json @@ -15,7 +15,7 @@ "progress": { "type": "union", "refs": [ - "my.spoor.log.activity#indexProgress" + "#progressIndex" ] }, "performedAt": { @@ -31,9 +31,13 @@ } } }, - "indexProgress": { - "type": "integer", - "description": "The index of the content consumed. Content must be indexable" + "progressIndex": { + "type": "object", + "description": "The index of the content consumed. Content must be indexable", + "required": [ "index" ], + "properties": { + "index": { "type": "integer" } + } } } }