Compare commits

...

10 commits

Author SHA1 Message Date
0c7e67126c
log, remove invalid concrete schema 2025-05-08 14:59:57 -07:00
ebb6fdce39
content, move title out of defs 2025-05-08 14:59:53 -07:00
d7b4ede16e
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
2025-05-08 14:59:50 -07:00
0beee2c8d0
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
2025-05-08 14:59:16 -07:00
60262fed0c
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.
2025-05-08 14:59:03 -07:00
360a3b3fde
me.woach.content, add atproto media storage 2025-05-08 14:58:57 -07:00
f22b060c97
me.woach.feed, use strongRef instead of union 2025-05-08 14:58:34 -07:00
d2779156f6
me.woach.content, make anilist an nsid key 2025-05-08 14:58:27 -07:00
83b070619c
me.woach.{feed/content}, change from media#anilist to just anilist 2025-05-08 14:58:16 -07:00
26f8b34251
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.
2025-05-08 14:57:58 -07:00
5 changed files with 171 additions and 5 deletions

View file

@ -0,0 +1,42 @@
{
"lexicon": 1,
"id": "my.spoor.content.external",
"defs": {
"main": {
"type": "record",
"key": "nsid",
"record": {
"type": "object",
"required": [ "source", "queryable" ],
"properties": {
"titles": {
"type": "array",
"minLength": 1,
"items": {
"type": "ref",
"ref": "my.spoor.content.title"
}
},
"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": []
}
}
}
}
}
}

View file

@ -0,0 +1,53 @@
{
"lexicon": 1,
"id": "my.spoor.content.media",
"defs": {
"main": {
"type": "record",
"key": "nsid",
"record": {
"type": "object",
"required": [ "titles", "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,29 @@
{
"lexicon": 1,
"id": "my.spoor.content.title",
"defs": {
"main": {
"type": "object",
"properties": {
"translationType": {
"type": "string",
"format": "nsid",
"knownValues": [
"#titleHomophonic", "#titleNative", "#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" }
}
}

View file

@ -1,10 +1,10 @@
{ {
"lexicon": 1, "lexicon": 1,
"id": "me.woach.feed.activity", "id": "my.spoor.log.activity",
"defs": { "defs": {
"main": { "main": {
"type": "record", "type": "record",
"description": "A single activity log for a specific show", "description": "A single activity (spoor) for a specific session",
"key": "tid", "key": "tid",
"record": { "record": {
"type": "object", "type": "object",
@ -13,13 +13,15 @@
"properties": { "properties": {
"session": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, "session": { "type": "ref", "ref": "com.atproto.repo.strongRef" },
"progress": { "progress": {
"type": "integer", "type": "union",
"description": "The episode/chapter number for the content consumed." "refs": [
"#progressIndex"
]
}, },
"performedAt": { "performedAt": {
"type": "string", "type": "string",
"format": "datetime", "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": { "createdAt": {
"type": "string", "type": "string",
@ -28,6 +30,14 @@
} }
} }
} }
},
"progressIndex": {
"type": "object",
"description": "The index of the content consumed. Content must be indexable",
"required": [ "index" ],
"properties": {
"index": { "type": "integer" }
}
} }
} }
} }

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"
}
}
}
}
}
}