ink.resenha.reading
A reader's reading of a book BookHive's catalogue doesn't hold, or can't be matched to for certain: the home of last resort, so any book can be added to a library and reviewed. One per book. Status, dates, rating, review and progress live here as they do on a buzz.bookhive.book; the book is named in every key anyone uses, so any app that recognises one of them can show the reading. When BookHive's catalogue has the book, Resenha moves the reading there: it writes a buzz.bookhive.book with everything the reading held, or fills in the one the reader already has, and deletes the reading in the same commit. It does this when BookHive answers for the reading's ISBN, or when the reader picks the book in BookHive's catalogue.
Details · record, key tid
| Kind | record |
|---|---|
| Record key | tid |
| Authority | resenha.ink |
| Indexed |
Checks
Validlarge-stringdefs.main.record.properties.reviewmaxLength is over 20 KB. Use a blob for content that large.unlimited-stringdefs.main.record.properties.statusNo maxLength, maxGraphemes or format limits this string.
{
"$type": "com.atproto.lexicon.schema",
"defs": {
"main": {
"description": "A reader's reading of a book BookHive's catalogue doesn't hold, or can't be matched to for certain: the home of last resort, so any book can be added to a library and reviewed. One per book. Status, dates, rating, review and progress live here as they do on a buzz.bookhive.book; the book is named in every key anyone uses, so any app that recognises one of them can show the reading. When BookHive's catalogue has the book, Resenha moves the reading there: it writes a buzz.bookhive.book with everything the reading held, or fills in the one the reader already has, and deletes the reading in the same commit. It does this when BookHive answers for the reading's ISBN, or when the reader picks the book in BookHive's catalogue.",
"key": "tid",
"record": {
"properties": {
"book": {
"ref": "ink.resenha.defs#bookRef",
"type": "ref"
},
"bookProgress": {
"ref": "#progress",
"type": "ref"
},
"coverImage": {
"accept": [
"image/*"
],
"description": "The cover itself, kept in the reader's repository, for a book whose cover has no lasting address elsewhere.",
"maxSize": 2000000,
"type": "blob"
},
"coverUrl": {
"description": "The cover as the reader's app found it, for apps without a catalogue to ask. Kept for Resenha before 1.6.10, which reads only this; newer builds also write covers.",
"format": "uri",
"type": "string"
},
"covers": {
"description": "Every address of the cover the reader's app knew, surest first. A reader tries the next when one fails.",
"items": {
"format": "uri",
"type": "string"
},
"maxLength": 8,
"type": "array"
},
"createdAt": {
"format": "datetime",
"type": "string"
},
"finishedAt": {
"format": "datetime",
"type": "string"
},
"review": {
"description": "The review as plain text. A formatted version, when there is one, is a site.standard.document the reader's ink.resenha.bookReview links to.",
"maxGraphemes": 15000,
"maxLength": 150000,
"type": "string"
},
"stars": {
"description": "In half stars, 1 to 10, as BookHive and Popfeed keep them.",
"maximum": 10,
"minimum": 1,
"type": "integer"
},
"startedAt": {
"format": "datetime",
"type": "string"
},
"status": {
"knownValues": [
"wantToRead",
"reading",
"finished",
"abandoned"
],
"type": "string"
}
},
"required": [
"book",
"createdAt"
],
"type": "object"
},
"type": "record"
},
"progress": {
"description": "How far through the book the reader is, as BookHive's bookProgress has it.",
"properties": {
"currentPage": {
"minimum": 1,
"type": "integer"
},
"percent": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"totalPages": {
"minimum": 1,
"type": "integer"
},
"updatedAt": {
"format": "datetime",
"type": "string"
}
},
"required": [
"percent",
"updatedAt"
],
"type": "object"
}
},
"id": "ink.resenha.reading",
"lexicon": 1
}