Lexicons, 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.
This commit is contained in:
Julia Lange 2025-05-01 15:48:13 -07:00
parent db33099405
commit 8363125108
Signed by: Julia
SSH key fingerprint: SHA256:50XUMcOFYPUs9/1j7p9SPnwASZ7QnxXm7THF7HkbqzQ
6 changed files with 53 additions and 30 deletions

View file

@ -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": {}
}
}
}
}
}

View file

@ -0,0 +1,50 @@
{
"lexicon": 1,
"id": "my.spoor.content.media",
"defs": {
"main": {
"type": "object",
"key": "nsid",
"required": [ "titles", "durationData", "lastUpdated" ],
"properties": {
"titles": {
"type": "array",
"minLength": 1,
"items": {
"type": "ref",
"ref": "my.spoor.content.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"
}
}
},
"television": {
"type": "object",
"properties": {
"episodes": { "type": "integer", "minimum": 0}
}
},
"book": {
"type": "object",
"properties": {
"chapters": { "type": "integer", "minimum": 0}
}
}
}
}

View file

@ -0,0 +1,27 @@
{
"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" }
}
}

View file

@ -0,0 +1,39 @@
{
"lexicon": 1,
"id": "my.spoor.log.activity",
"defs": {
"main": {
"type": "record",
"description": "A single activity (spoor) for a specific session",
"key": "tid",
"record": {
"type": "object",
"required": ["session", "progress", "createdAt"],
"nullable": ["performedAt"],
"properties": {
"session": { "type": "ref", "ref": "com.atproto.repo.strongRef" },
"progress": {
"type": "union",
"refs": [
"my.spoor.log.activity#indexProgress"
]
},
"performedAt": {
"type": "string",
"format": "datetime",
"description": "User-declared timestamp for when they performed the activity. Null implies unknown time."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp for when this activity was created"
}
}
}
},
"indexProgress": {
"type": "integer",
"description": "The index of the content consumed. Content must be indexable"
}
}
}

View file

@ -0,0 +1,32 @@
{
"lexicon": 1,
"id": "my.spoor.log.session",
"defs": {
"main": {
"type": "record",
"description": "A session of consuming some content",
"key": "tid",
"record": {
"type": "object",
"required": ["content", "createdAt"],
"properties": {
"content": { "type": "ref", "ref": "com.atproto.repo.strongRef" },
"label": {
"type": "string",
"maxGraphemes": 64,
"maxLength": 640
},
"otherParticipants": {
"type": "array",
"items": { "type": "string", "format": "did" }
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp for when this activity was created"
}
}
}
}
}
}