From 36a8ebb48021cb46bee3b3e4ba9d08debffeb26a Mon Sep 17 00:00:00 2001 From: mmattbtw Date: Mon, 9 Jun 2025 09:44:36 -0500 Subject: [PATCH 01/11] start post lexicon --- .../real/fm/teal/alpha/feed/social/post.json | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 packages/lexicons/real/fm/teal/alpha/feed/social/post.json diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/post.json b/packages/lexicons/real/fm/teal/alpha/feed/social/post.json new file mode 100644 index 00000000..3aae4de3 --- /dev/null +++ b/packages/lexicons/real/fm/teal/alpha/feed/social/post.json @@ -0,0 +1,102 @@ +{ + "lexicon": 1, + "id": "fm.teal.alpha.feed.social.post", + "description": "This lexicon is in a not officially released state. It is subject to change. | Record containing a teal.fm post. Teal.fm posts include a track that is connected to the post, and could have some text. Replies, by default, have the same track as the parent post.", + "defs": { + "main": { + "type": "record", + "description": "Record containing a teal.fm post.", + "key": "tid", + "record": { + "type": "object", + "required": ["text", "createdAt"], + "properties": { + "text": { + "type": "string", + "maxLength": 3000, + "maxGraphemes": 300, + "description": "The primary post content. May be an empty string, if there are embeds." + }, + "trackName": { + "type": "string", + "minLength": 1, + "maxLength": 256, + "maxGraphemes": 2560, + "description": "The name of the track" + }, + "trackMbId": { + "type": "string", + "description": "The Musicbrainz ID of the track" + }, + "recordingMbId": { + "type": "string", + "description": "The Musicbrainz recording ID of the track" + }, + "duration": { + "type": "integer", + "description": "The duration of the track in seconds" + }, + "artistNames": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 256, + "maxGraphemes": 2560 + }, + "description": "The names of the artists" + }, + "artistMbIds": { + "type": "array", + "items": { "type": "string" }, + "description": "The Musicbrainz IDs of the artists" + }, + "releaseName": { + "type": "string", + "maxLength": 256, + "maxGraphemes": 2560, + "description": "The name of the release/album" + }, + "releaseMbId": { + "type": "string", + "description": "The Musicbrainz ID of the release/album" + }, + "isrc": { + "type": "string", + "description": "The ISRC code associated with the recording" + }, + "facets": { + "type": "array", + "items": { "type": "ref", "ref": "#facetRef" } + }, + "reply": { "type": "ref", "ref": "#replyRef" }, + "langs": { + "type": "array", + "description": "Indicates human language of post primary text content.", + "maxLength": 3, + "items": { "type": "string", "format": "language" } + }, + "tags": { + "type": "array", + "description": "Additional hashtags, in addition to any included in post text and facets.", + "maxLength": 8, + "items": { "type": "string", "maxLength": 640, "maxGraphemes": 64 } + }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp when this post was originally created." + } + } + } + }, + "replyRef": { + "type": "object", + "required": ["root", "parent"], + "properties": { + "root": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, + "parent": { "type": "ref", "ref": "com.atproto.repo.strongRef" } + } + } + } +} From dcfff8a651057ced9473800638f839c53d7ed325 Mon Sep 17 00:00:00 2001 From: mmattbtw Date: Mon, 9 Jun 2025 09:59:01 -0500 Subject: [PATCH 02/11] like, playlist+item, and repost lexicons --- .../real/fm/teal/alpha/feed/play.json | 1 - .../real/fm/teal/alpha/feed/social/like.json | 24 +++++++ .../fm/teal/alpha/feed/social/playlist.json | 30 ++++++++ .../teal/alpha/feed/social/playlistItem.json | 69 +++++++++++++++++++ .../fm/teal/alpha/feed/social/repost.json | 24 +++++++ 5 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 packages/lexicons/real/fm/teal/alpha/feed/social/like.json create mode 100644 packages/lexicons/real/fm/teal/alpha/feed/social/playlist.json create mode 100644 packages/lexicons/real/fm/teal/alpha/feed/social/playlistItem.json create mode 100644 packages/lexicons/real/fm/teal/alpha/feed/social/repost.json diff --git a/packages/lexicons/real/fm/teal/alpha/feed/play.json b/packages/lexicons/real/fm/teal/alpha/feed/play.json index a9216b4e..6b9f697e 100644 --- a/packages/lexicons/real/fm/teal/alpha/feed/play.json +++ b/packages/lexicons/real/fm/teal/alpha/feed/play.json @@ -19,7 +19,6 @@ }, "trackMbId": { "type": "string", - "description": "The Musicbrainz ID of the track" }, "recordingMbId": { diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/like.json b/packages/lexicons/real/fm/teal/alpha/feed/social/like.json new file mode 100644 index 00000000..09489c80 --- /dev/null +++ b/packages/lexicons/real/fm/teal/alpha/feed/social/like.json @@ -0,0 +1,24 @@ +{ + "lexicon": 1, + "id": "fm.teal.alpha.feed.social.like", + "description": "This lexicon is in a not officially released state. It is subject to change. | The action of 'Liking' a Teal.fm post.", + "defs": { + "main": { + "type": "record", + "description": "Record containing a like for a teal.fm post.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp when this post was originally created." + } + } + } + } + } +} diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/playlist.json b/packages/lexicons/real/fm/teal/alpha/feed/social/playlist.json new file mode 100644 index 00000000..06e978f8 --- /dev/null +++ b/packages/lexicons/real/fm/teal/alpha/feed/social/playlist.json @@ -0,0 +1,30 @@ +{ + "lexicon": 1, + "id": "fm.teal.alpha.feed.social.playlist", + "description": "This lexicon is in a not officially released state. It is subject to change. | A teal.fm playlist, representing a list of tracks.", + "defs": { + "main": { + "type": "record", + "description": "Record containing a repost for a teal.fm post.", + "key": "tid", + "record": { + "type": "object", + "required": ["name", "createdAt"], + "properties": { + "name": { + "type": "string", + "description": "Display name for the playlist, required.", + "minLength": 1, + "maxLength": 50 + }, + "description": { "type": "string", "maxLength": 5000 }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp when this post was originally created." + } + } + } + } + } +} diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/playlistItem.json b/packages/lexicons/real/fm/teal/alpha/feed/social/playlistItem.json new file mode 100644 index 00000000..0893cd6d --- /dev/null +++ b/packages/lexicons/real/fm/teal/alpha/feed/social/playlistItem.json @@ -0,0 +1,69 @@ +{ + "lexicon": 1, + "id": "fm.teal.alpha.feed.social.playlistItem", + "description": "This lexicon is in a not officially released state. It is subject to change. | A teal.fm playlist item.", + "defs": { + "main": { + "type": "record", + "description": "Record containing a repost for a teal.fm post.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt", "trackName"], + "properties": { + "subject": { "type": "record", "ref": "com.atproto.repo.strongRef" }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp when this post was originally created." + }, + "trackName": { + "type": "string", + "minLength": 1, + "maxLength": 256, + "maxGraphemes": 2560, + "description": "The name of the track" + }, + "trackMbId": { + "type": "string", + "description": "The Musicbrainz ID of the track" + }, + "recordingMbId": { + "type": "string", + "description": "The Musicbrainz recording ID of the track" + }, + "artistNames": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 256, + "maxGraphemes": 2560 + }, + "description": "Array of artist names in order of original appearance. Prefer using 'artists'." + }, + "artistMbIds": { + "type": "array", + "items": { "type": "string" }, + "description": "Array of Musicbrainz artist IDs. Prefer using 'artists'." + }, + "artists": { + "type": "array", + "items": { "type": "ref", "ref": "fm.teal.alpha.feed.defs#artist" }, + "description": "Array of artists in order of original appearance." + }, + "releaseName": { + "type": "string", + "maxLength": 256, + "maxGraphemes": 2560, + "description": "The name of the release/album" + }, + "releaseMbId": { + "type": "string", + "description": "The Musicbrainz release ID" + } + } + } + } + } +} diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/repost.json b/packages/lexicons/real/fm/teal/alpha/feed/social/repost.json new file mode 100644 index 00000000..683b7918 --- /dev/null +++ b/packages/lexicons/real/fm/teal/alpha/feed/social/repost.json @@ -0,0 +1,24 @@ +{ + "lexicon": 1, + "id": "fm.teal.alpha.feed.social.repost", + "description": "This lexicon is in a not officially released state. It is subject to change. | The action of 'Reposting' a Teal.fm post.", + "defs": { + "main": { + "type": "record", + "description": "Record containing a repost for a teal.fm post.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp when this post was originally created." + } + } + } + } + } +} From f8200896350807654e0fca4452a67fa835b28ce5 Mon Sep 17 00:00:00 2001 From: mmattbtw Date: Wed, 9 Jul 2025 22:05:16 -0500 Subject: [PATCH 03/11] fix playlistItem desc. --- .../lexicons/real/fm/teal/alpha/feed/social/playlistItem.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/playlistItem.json b/packages/lexicons/real/fm/teal/alpha/feed/social/playlistItem.json index 0893cd6d..a227d317 100644 --- a/packages/lexicons/real/fm/teal/alpha/feed/social/playlistItem.json +++ b/packages/lexicons/real/fm/teal/alpha/feed/social/playlistItem.json @@ -5,7 +5,7 @@ "defs": { "main": { "type": "record", - "description": "Record containing a repost for a teal.fm post.", + "description": "Record containing a playlist item for a teal.fm playlist.", "key": "tid", "record": { "type": "object", From 0537cd77c37931b85dc33dcf95f038217c77cee1 Mon Sep 17 00:00:00 2001 From: mmattbtw Date: Wed, 9 Jul 2025 22:07:29 -0500 Subject: [PATCH 04/11] add richtext facet - lexicon stolen from place.stream.richtext.facet lol --- .../real/fm/teal/alpha/feed/social/post.json | 6 +++-- .../real/fm/teal/alpha/richtext/facet.json | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 packages/lexicons/real/fm/teal/alpha/richtext/facet.json diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/post.json b/packages/lexicons/real/fm/teal/alpha/feed/social/post.json index 3aae4de3..d178159a 100644 --- a/packages/lexicons/real/fm/teal/alpha/feed/social/post.json +++ b/packages/lexicons/real/fm/teal/alpha/feed/social/post.json @@ -17,6 +17,7 @@ "maxGraphemes": 300, "description": "The primary post content. May be an empty string, if there are embeds." }, + "trackName": { "type": "string", "minLength": 1, @@ -65,11 +66,12 @@ "type": "string", "description": "The ISRC code associated with the recording" }, + "reply": { "type": "ref", "ref": "#replyRef" }, "facets": { "type": "array", - "items": { "type": "ref", "ref": "#facetRef" } + "description": "Rich text facets, which may include mentions, links, and other features.", + "items": { "type": "ref", "ref": "fm.teal.alpha.richtext.facet" } }, - "reply": { "type": "ref", "ref": "#replyRef" }, "langs": { "type": "array", "description": "Indicates human language of post primary text content.", diff --git a/packages/lexicons/real/fm/teal/alpha/richtext/facet.json b/packages/lexicons/real/fm/teal/alpha/richtext/facet.json new file mode 100644 index 00000000..11440bea --- /dev/null +++ b/packages/lexicons/real/fm/teal/alpha/richtext/facet.json @@ -0,0 +1,24 @@ +{ + "lexicon": 1, + "id": "fm.teal.alpha.richtext.facet", + "defs": { + "main": { + "type": "object", + "description": "Annotation of a sub-string within rich text.", + "required": ["index", "features"], + "properties": { + "index": { "type": "ref", "ref": "app.bsky.richtext.facet#byteSlice" }, + "features": { + "type": "array", + "items": { + "type": "union", + "refs": [ + "app.bsky.richtext.facet#mention", + "app.bsky.richtext.facet#link" + ] + } + } + } + } + } +} From bd4858d8e2ade7802fa12316250af4c8e1f4d682 Mon Sep 17 00:00:00 2001 From: mmattbtw Date: Tue, 16 Sep 2025 13:16:19 -0500 Subject: [PATCH 05/11] move social lexicons to new folder --- .../teal/alpha => lexicons/fm.teal.alpha}/feed/social/like.json | 0 .../alpha => lexicons/fm.teal.alpha}/feed/social/playlist.json | 0 .../fm.teal.alpha}/feed/social/playlistItem.json | 0 .../teal/alpha => lexicons/fm.teal.alpha}/feed/social/post.json | 0 .../teal/alpha => lexicons/fm.teal.alpha}/feed/social/repost.json | 0 .../fm/teal/alpha => lexicons/fm.teal.alpha}/richtext/facet.json | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {packages/lexicons/real/fm/teal/alpha => lexicons/fm.teal.alpha}/feed/social/like.json (100%) rename {packages/lexicons/real/fm/teal/alpha => lexicons/fm.teal.alpha}/feed/social/playlist.json (100%) rename {packages/lexicons/real/fm/teal/alpha => lexicons/fm.teal.alpha}/feed/social/playlistItem.json (100%) rename {packages/lexicons/real/fm/teal/alpha => lexicons/fm.teal.alpha}/feed/social/post.json (100%) rename {packages/lexicons/real/fm/teal/alpha => lexicons/fm.teal.alpha}/feed/social/repost.json (100%) rename {packages/lexicons/real/fm/teal/alpha => lexicons/fm.teal.alpha}/richtext/facet.json (100%) diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/like.json b/lexicons/fm.teal.alpha/feed/social/like.json similarity index 100% rename from packages/lexicons/real/fm/teal/alpha/feed/social/like.json rename to lexicons/fm.teal.alpha/feed/social/like.json diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/playlist.json b/lexicons/fm.teal.alpha/feed/social/playlist.json similarity index 100% rename from packages/lexicons/real/fm/teal/alpha/feed/social/playlist.json rename to lexicons/fm.teal.alpha/feed/social/playlist.json diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/playlistItem.json b/lexicons/fm.teal.alpha/feed/social/playlistItem.json similarity index 100% rename from packages/lexicons/real/fm/teal/alpha/feed/social/playlistItem.json rename to lexicons/fm.teal.alpha/feed/social/playlistItem.json diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/post.json b/lexicons/fm.teal.alpha/feed/social/post.json similarity index 100% rename from packages/lexicons/real/fm/teal/alpha/feed/social/post.json rename to lexicons/fm.teal.alpha/feed/social/post.json diff --git a/packages/lexicons/real/fm/teal/alpha/feed/social/repost.json b/lexicons/fm.teal.alpha/feed/social/repost.json similarity index 100% rename from packages/lexicons/real/fm/teal/alpha/feed/social/repost.json rename to lexicons/fm.teal.alpha/feed/social/repost.json diff --git a/packages/lexicons/real/fm/teal/alpha/richtext/facet.json b/lexicons/fm.teal.alpha/richtext/facet.json similarity index 100% rename from packages/lexicons/real/fm/teal/alpha/richtext/facet.json rename to lexicons/fm.teal.alpha/richtext/facet.json From 040926adaeb91e5f9189f02253703f4a853ca659 Mon Sep 17 00:00:00 2001 From: mmattbtw Date: Mon, 22 Sep 2025 10:46:38 -0500 Subject: [PATCH 06/11] #trackView def in feed.social --- lexicons/fm.teal.alpha/feed/social/defs.json | 54 +++++++++++++++++++ .../feed/social/playlistItem.json | 47 ++-------------- 2 files changed, 57 insertions(+), 44 deletions(-) create mode 100644 lexicons/fm.teal.alpha/feed/social/defs.json diff --git a/lexicons/fm.teal.alpha/feed/social/defs.json b/lexicons/fm.teal.alpha/feed/social/defs.json new file mode 100644 index 00000000..734a1435 --- /dev/null +++ b/lexicons/fm.teal.alpha/feed/social/defs.json @@ -0,0 +1,54 @@ +{ + "lexicon": 1, + "id": "fm.teal.alpha.feed.social.defs", + "description": "This lexicon is in a not officially released state. It is subject to change. | Misc. items related to the social feed..", + "defs": { + "trackView": { + "trackName": { + "type": "string", + "minLength": 1, + "maxLength": 256, + "maxGraphemes": 2560, + "description": "The name of the track" + }, + "trackMbId": { + "type": "string", + "description": "The Musicbrainz ID of the track" + }, + "recordingMbId": { + "type": "string", + "description": "The Musicbrainz recording ID of the track" + }, + "artistNames": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 256, + "maxGraphemes": 2560 + }, + "description": "Array of artist names in order of original appearance. Prefer using 'artists'." + }, + "artistMbIds": { + "type": "array", + "items": { "type": "string" }, + "description": "Array of Musicbrainz artist IDs. Prefer using 'artists'." + }, + "artists": { + "type": "array", + "items": { "type": "ref", "ref": "fm.teal.alpha.feed.defs#artist" }, + "description": "Array of artists in order of original appearance." + }, + "releaseName": { + "type": "string", + "maxLength": 256, + "maxGraphemes": 2560, + "description": "The name of the release/album" + }, + "releaseMbId": { + "type": "string", + "description": "The Musicbrainz release ID" + } + } + } +} diff --git a/lexicons/fm.teal.alpha/feed/social/playlistItem.json b/lexicons/fm.teal.alpha/feed/social/playlistItem.json index a227d317..220b3c73 100644 --- a/lexicons/fm.teal.alpha/feed/social/playlistItem.json +++ b/lexicons/fm.teal.alpha/feed/social/playlistItem.json @@ -17,50 +17,9 @@ "format": "datetime", "description": "Client-declared timestamp when this post was originally created." }, - "trackName": { - "type": "string", - "minLength": 1, - "maxLength": 256, - "maxGraphemes": 2560, - "description": "The name of the track" - }, - "trackMbId": { - "type": "string", - "description": "The Musicbrainz ID of the track" - }, - "recordingMbId": { - "type": "string", - "description": "The Musicbrainz recording ID of the track" - }, - "artistNames": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "maxLength": 256, - "maxGraphemes": 2560 - }, - "description": "Array of artist names in order of original appearance. Prefer using 'artists'." - }, - "artistMbIds": { - "type": "array", - "items": { "type": "string" }, - "description": "Array of Musicbrainz artist IDs. Prefer using 'artists'." - }, - "artists": { - "type": "array", - "items": { "type": "ref", "ref": "fm.teal.alpha.feed.defs#artist" }, - "description": "Array of artists in order of original appearance." - }, - "releaseName": { - "type": "string", - "maxLength": 256, - "maxGraphemes": 2560, - "description": "The name of the release/album" - }, - "releaseMbId": { - "type": "string", - "description": "The Musicbrainz release ID" + "track": { + "type": "ref", + "ref": "fm.teal.alpha.feed.social.defs#trackView" } } } From 8e27c31ea9d644c28459fe2f803804c22da7dd71 Mon Sep 17 00:00:00 2001 From: mmattbtw Date: Mon, 22 Sep 2025 10:47:22 -0500 Subject: [PATCH 07/11] add ordering to playlistItem lexicon --- lexicons/fm.teal.alpha/feed/social/playlistItem.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lexicons/fm.teal.alpha/feed/social/playlistItem.json b/lexicons/fm.teal.alpha/feed/social/playlistItem.json index 220b3c73..e67ca590 100644 --- a/lexicons/fm.teal.alpha/feed/social/playlistItem.json +++ b/lexicons/fm.teal.alpha/feed/social/playlistItem.json @@ -20,6 +20,10 @@ "track": { "type": "ref", "ref": "fm.teal.alpha.feed.social.defs#trackView" + }, + "order": { + "type": "integer", + "description": "The order of the track in the playlist" } } } From e14ab8253751372df473afed973141bdee7b2f5c Mon Sep 17 00:00:00 2001 From: mmattbtw Date: Mon, 22 Sep 2025 10:48:31 -0500 Subject: [PATCH 08/11] fix description for playlist lexicon --- lexicons/fm.teal.alpha/feed/social/playlist.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lexicons/fm.teal.alpha/feed/social/playlist.json b/lexicons/fm.teal.alpha/feed/social/playlist.json index 06e978f8..e5d815f9 100644 --- a/lexicons/fm.teal.alpha/feed/social/playlist.json +++ b/lexicons/fm.teal.alpha/feed/social/playlist.json @@ -5,7 +5,7 @@ "defs": { "main": { "type": "record", - "description": "Record containing a repost for a teal.fm post.", + "description": "Record containing the playlist metadata.", "key": "tid", "record": { "type": "object", @@ -21,7 +21,7 @@ "createdAt": { "type": "string", "format": "datetime", - "description": "Client-declared timestamp when this post was originally created." + "description": "Client-declared timestamp when this playlist was originally created." } } } From 191eed6e78ea1cf06f19f289055ff46320bcdb04 Mon Sep 17 00:00:00 2001 From: mmattbtw Date: Wed, 3 Jun 2026 16:43:19 -0500 Subject: [PATCH 09/11] feat(lexicons): finalize social badge records --- lexicons/fm.teal.alpha/feed/social/badge.json | 64 ++++++++++ .../feed/social/badgeAssignment.json | 38 ++++++ lexicons/fm.teal.alpha/feed/social/defs.json | 119 +++++++++++------- lexicons/fm.teal.alpha/feed/social/like.json | 8 +- .../fm.teal.alpha/feed/social/playlist.json | 30 ++++- .../feed/social/playlistItem.json | 16 ++- lexicons/fm.teal.alpha/feed/social/post.json | 54 +------- .../fm.teal.alpha/feed/social/repost.json | 8 +- 8 files changed, 234 insertions(+), 103 deletions(-) create mode 100644 lexicons/fm.teal.alpha/feed/social/badge.json create mode 100644 lexicons/fm.teal.alpha/feed/social/badgeAssignment.json diff --git a/lexicons/fm.teal.alpha/feed/social/badge.json b/lexicons/fm.teal.alpha/feed/social/badge.json new file mode 100644 index 00000000..1d532760 --- /dev/null +++ b/lexicons/fm.teal.alpha/feed/social/badge.json @@ -0,0 +1,64 @@ +{ + "lexicon": 1, + "id": "fm.teal.alpha.feed.social.badge", + "description": "This lexicon is in a not officially released state. It is subject to change. | A teal.fm badge definition.", + "defs": { + "main": { + "type": "record", + "description": "Record containing badge metadata that can be assigned to actors.", + "key": "tid", + "record": { + "type": "object", + "required": [ + "name", + "description", + "image", + "creator", + "type", + "createdAt" + ], + "properties": { + "name": { + "type": "string", + "description": "Display name for the badge.", + "minLength": 1, + "maxLength": 100, + "maxGraphemes": 100 + }, + "description": { + "type": "string", + "description": "Description of what the badge represents.", + "minLength": 1, + "maxLength": 5000, + "maxGraphemes": 500 + }, + "descriptionFacets": { + "type": "array", + "description": "Annotations of text in the badge description.", + "items": { "type": "ref", "ref": "fm.teal.alpha.richtext.facet" } + }, + "image": { + "type": "blob", + "description": "Image displayed for the badge.", + "accept": ["image/png", "image/jpeg"], + "maxSize": 1000000 + }, + "creator": { + "type": "string", + "format": "did", + "description": "DID of the actor who created this badge definition." + }, + "type": { + "type": "ref", + "ref": "fm.teal.alpha.feed.social.defs#badgeType" + }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp when this badge was originally created." + } + } + } + } + } +} diff --git a/lexicons/fm.teal.alpha/feed/social/badgeAssignment.json b/lexicons/fm.teal.alpha/feed/social/badgeAssignment.json new file mode 100644 index 00000000..1a3ef846 --- /dev/null +++ b/lexicons/fm.teal.alpha/feed/social/badgeAssignment.json @@ -0,0 +1,38 @@ +{ + "lexicon": 1, + "id": "fm.teal.alpha.feed.social.badgeAssignment", + "description": "This lexicon is in a not officially released state. It is subject to change. | A teal.fm badge assignment.", + "defs": { + "main": { + "type": "record", + "description": "Record assigning a badge to an actor.", + "key": "tid", + "record": { + "type": "object", + "required": ["badge", "assignee", "assigner", "createdAt"], + "properties": { + "badge": { + "type": "ref", + "ref": "com.atproto.repo.strongRef", + "description": "Strong reference to the badge definition being assigned." + }, + "assignee": { + "type": "string", + "format": "did", + "description": "DID of the actor receiving the badge." + }, + "assigner": { + "type": "string", + "format": "did", + "description": "DID of the actor assigning the badge." + }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp when this badge assignment was originally created." + } + } + } + } + } +} diff --git a/lexicons/fm.teal.alpha/feed/social/defs.json b/lexicons/fm.teal.alpha/feed/social/defs.json index 734a1435..f0eda4e8 100644 --- a/lexicons/fm.teal.alpha/feed/social/defs.json +++ b/lexicons/fm.teal.alpha/feed/social/defs.json @@ -1,54 +1,89 @@ { "lexicon": 1, "id": "fm.teal.alpha.feed.social.defs", - "description": "This lexicon is in a not officially released state. It is subject to change. | Misc. items related to the social feed..", + "description": "This lexicon is in a not officially released state. It is subject to change. | Miscellaneous types related to the social feed.", "defs": { "trackView": { - "trackName": { - "type": "string", - "minLength": 1, - "maxLength": 256, - "maxGraphemes": 2560, - "description": "The name of the track" - }, - "trackMbId": { - "type": "string", - "description": "The Musicbrainz ID of the track" - }, - "recordingMbId": { - "type": "string", - "description": "The Musicbrainz recording ID of the track" - }, - "artistNames": { - "type": "array", - "items": { + "type": "object", + "required": ["trackName"], + "properties": { + "trackName": { "type": "string", "minLength": 1, "maxLength": 256, - "maxGraphemes": 2560 - }, - "description": "Array of artist names in order of original appearance. Prefer using 'artists'." - }, - "artistMbIds": { - "type": "array", - "items": { "type": "string" }, - "description": "Array of Musicbrainz artist IDs. Prefer using 'artists'." - }, - "artists": { - "type": "array", - "items": { "type": "ref", "ref": "fm.teal.alpha.feed.defs#artist" }, - "description": "Array of artists in order of original appearance." - }, - "releaseName": { - "type": "string", - "maxLength": 256, - "maxGraphemes": 2560, - "description": "The name of the release/album" - }, - "releaseMbId": { - "type": "string", - "description": "The Musicbrainz release ID" + "maxGraphemes": 2560, + "description": "The name of the track." + }, + "trackMbId": { + "type": "string", + "description": "The MusicBrainz track ID." + }, + "recordingMbId": { + "type": "string", + "description": "The MusicBrainz recording ID." + }, + "duration": { + "type": "integer", + "minimum": 0, + "description": "The length of the track in seconds." + }, + "artistNames": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 256, + "maxGraphemes": 2560 + }, + "description": "Array of artist names in order of original appearance. Prefer using 'artists'." + }, + "artistMbIds": { + "type": "array", + "items": { "type": "string" }, + "description": "Array of MusicBrainz artist IDs. Prefer using 'artists'." + }, + "artists": { + "type": "array", + "items": { "type": "ref", "ref": "fm.teal.alpha.feed.defs#artist" }, + "description": "Array of artists in order of original appearance." + }, + "releaseName": { + "type": "string", + "maxLength": 256, + "maxGraphemes": 2560, + "description": "The name of the release or album." + }, + "releaseMbId": { + "type": "string", + "description": "The MusicBrainz release ID." + }, + "isrc": { + "type": "string", + "description": "The ISRC code associated with the recording." + }, + "trackDiscriminant": { + "type": "string", + "maxLength": 128, + "maxGraphemes": 1280, + "description": "Distinguishing information for track variants." + }, + "releaseDiscriminant": { + "type": "string", + "maxLength": 128, + "maxGraphemes": 1280, + "description": "Distinguishing information for release variants." + }, + "originUrl": { + "type": "string", + "format": "uri", + "description": "The URL associated with this track." + } } + }, + "badgeType": { + "type": "string", + "description": "The category of badge.", + "knownValues": ["verification", "listeningParty", "achievement"] } } } diff --git a/lexicons/fm.teal.alpha/feed/social/like.json b/lexicons/fm.teal.alpha/feed/social/like.json index 09489c80..02f33702 100644 --- a/lexicons/fm.teal.alpha/feed/social/like.json +++ b/lexicons/fm.teal.alpha/feed/social/like.json @@ -11,11 +11,15 @@ "type": "object", "required": ["subject", "createdAt"], "properties": { - "subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, + "subject": { + "type": "ref", + "ref": "com.atproto.repo.strongRef", + "description": "Strong reference to the record being liked." + }, "createdAt": { "type": "string", "format": "datetime", - "description": "Client-declared timestamp when this post was originally created." + "description": "Client-declared timestamp when this like was originally created." } } } diff --git a/lexicons/fm.teal.alpha/feed/social/playlist.json b/lexicons/fm.teal.alpha/feed/social/playlist.json index e5d815f9..c9898d28 100644 --- a/lexicons/fm.teal.alpha/feed/social/playlist.json +++ b/lexicons/fm.teal.alpha/feed/social/playlist.json @@ -9,15 +9,39 @@ "key": "tid", "record": { "type": "object", - "required": ["name", "createdAt"], + "required": ["name", "authors", "createdAt"], "properties": { "name": { "type": "string", "description": "Display name for the playlist, required.", "minLength": 1, - "maxLength": 50 + "maxLength": 100, + "maxGraphemes": 100 + }, + "description": { + "type": "string", + "description": "Free-form playlist description text.", + "maxLength": 5000, + "maxGraphemes": 500 + }, + "descriptionFacets": { + "type": "array", + "description": "Annotations of text in the playlist description.", + "items": { "type": "ref", "ref": "fm.teal.alpha.richtext.facet" } + }, + "authors": { + "type": "array", + "description": "DIDs of actors who can author playlist items for this playlist. Include the playlist record author. Appviews may attribute playlist items to this playlist when the item's repo author appears in this list.", + "minLength": 1, + "maxLength": 100, + "items": { "type": "string", "format": "did" } + }, + "cover": { + "type": "blob", + "description": "Optional image displayed for the playlist.", + "accept": ["image/png", "image/jpeg"], + "maxSize": 1000000 }, - "description": { "type": "string", "maxLength": 5000 }, "createdAt": { "type": "string", "format": "datetime", diff --git a/lexicons/fm.teal.alpha/feed/social/playlistItem.json b/lexicons/fm.teal.alpha/feed/social/playlistItem.json index e67ca590..64011bc3 100644 --- a/lexicons/fm.teal.alpha/feed/social/playlistItem.json +++ b/lexicons/fm.teal.alpha/feed/social/playlistItem.json @@ -9,21 +9,27 @@ "key": "tid", "record": { "type": "object", - "required": ["subject", "createdAt", "trackName"], + "required": ["subject", "track", "createdAt"], "properties": { - "subject": { "type": "record", "ref": "com.atproto.repo.strongRef" }, + "subject": { + "type": "ref", + "ref": "com.atproto.repo.strongRef", + "description": "Strong reference to the playlist this item belongs to." + }, "createdAt": { "type": "string", "format": "datetime", - "description": "Client-declared timestamp when this post was originally created." + "description": "Client-declared timestamp when this playlist item was originally created." }, "track": { "type": "ref", - "ref": "fm.teal.alpha.feed.social.defs#trackView" + "ref": "fm.teal.alpha.feed.social.defs#trackView", + "description": "The track added to the playlist." }, "order": { "type": "integer", - "description": "The order of the track in the playlist" + "minimum": 0, + "description": "The order of the track in the playlist." } } } diff --git a/lexicons/fm.teal.alpha/feed/social/post.json b/lexicons/fm.teal.alpha/feed/social/post.json index d178159a..ba7c0e76 100644 --- a/lexicons/fm.teal.alpha/feed/social/post.json +++ b/lexicons/fm.teal.alpha/feed/social/post.json @@ -9,7 +9,7 @@ "key": "tid", "record": { "type": "object", - "required": ["text", "createdAt"], + "required": ["text", "track", "createdAt"], "properties": { "text": { "type": "string", @@ -17,54 +17,10 @@ "maxGraphemes": 300, "description": "The primary post content. May be an empty string, if there are embeds." }, - - "trackName": { - "type": "string", - "minLength": 1, - "maxLength": 256, - "maxGraphemes": 2560, - "description": "The name of the track" - }, - "trackMbId": { - "type": "string", - "description": "The Musicbrainz ID of the track" - }, - "recordingMbId": { - "type": "string", - "description": "The Musicbrainz recording ID of the track" - }, - "duration": { - "type": "integer", - "description": "The duration of the track in seconds" - }, - "artistNames": { - "type": "array", - "items": { - "type": "string", - "minLength": 1, - "maxLength": 256, - "maxGraphemes": 2560 - }, - "description": "The names of the artists" - }, - "artistMbIds": { - "type": "array", - "items": { "type": "string" }, - "description": "The Musicbrainz IDs of the artists" - }, - "releaseName": { - "type": "string", - "maxLength": 256, - "maxGraphemes": 2560, - "description": "The name of the release/album" - }, - "releaseMbId": { - "type": "string", - "description": "The Musicbrainz ID of the release/album" - }, - "isrc": { - "type": "string", - "description": "The ISRC code associated with the recording" + "track": { + "type": "ref", + "ref": "fm.teal.alpha.feed.social.defs#trackView", + "description": "The track associated with this post." }, "reply": { "type": "ref", "ref": "#replyRef" }, "facets": { diff --git a/lexicons/fm.teal.alpha/feed/social/repost.json b/lexicons/fm.teal.alpha/feed/social/repost.json index 683b7918..4b62101e 100644 --- a/lexicons/fm.teal.alpha/feed/social/repost.json +++ b/lexicons/fm.teal.alpha/feed/social/repost.json @@ -11,11 +11,15 @@ "type": "object", "required": ["subject", "createdAt"], "properties": { - "subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, + "subject": { + "type": "ref", + "ref": "com.atproto.repo.strongRef", + "description": "Strong reference to the record being reposted." + }, "createdAt": { "type": "string", "format": "datetime", - "description": "Client-declared timestamp when this post was originally created." + "description": "Client-declared timestamp when this repost was originally created." } } } From a78d226a09941dd9b32c327fd781f42dc6afb800 Mon Sep 17 00:00:00 2001 From: mmattbtw Date: Wed, 3 Jun 2026 16:46:16 -0500 Subject: [PATCH 10/11] fix(lexicons): require mbid uri values --- lexicons/fm.teal.alpha/feed/play.json | 5 +++-- lexicons/fm.teal.alpha/feed/social/defs.json | 13 ++++++++----- lexicons/fm.teal.alpha/music/getAlbum.json | 3 ++- lexicons/fm.teal.alpha/music/getArtist.json | 3 ++- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/lexicons/fm.teal.alpha/feed/play.json b/lexicons/fm.teal.alpha/feed/play.json index 72df22c8..cf643140 100644 --- a/lexicons/fm.teal.alpha/feed/play.json +++ b/lexicons/fm.teal.alpha/feed/play.json @@ -44,9 +44,10 @@ "artistMbIds": { "type": "array", "items": { - "type": "string" + "type": "string", + "format": "uri" }, - "description": "DEPRECATED: USE 'artists' INSTEAD. Array of Musicbrainz artist IDs." + "description": "DEPRECATED: USE 'artists' INSTEAD. Array of MusicBrainz artist ID URIs, formatted as mbid:." }, "artists": { "type": "array", diff --git a/lexicons/fm.teal.alpha/feed/social/defs.json b/lexicons/fm.teal.alpha/feed/social/defs.json index f0eda4e8..40fb5a52 100644 --- a/lexicons/fm.teal.alpha/feed/social/defs.json +++ b/lexicons/fm.teal.alpha/feed/social/defs.json @@ -16,11 +16,13 @@ }, "trackMbId": { "type": "string", - "description": "The MusicBrainz track ID." + "format": "uri", + "description": "The MusicBrainz ID URI of the track, formatted as mbid:." }, "recordingMbId": { "type": "string", - "description": "The MusicBrainz recording ID." + "format": "uri", + "description": "The MusicBrainz recording ID URI of the track, formatted as mbid:." }, "duration": { "type": "integer", @@ -39,8 +41,8 @@ }, "artistMbIds": { "type": "array", - "items": { "type": "string" }, - "description": "Array of MusicBrainz artist IDs. Prefer using 'artists'." + "items": { "type": "string", "format": "uri" }, + "description": "Array of MusicBrainz artist ID URIs, formatted as mbid:. Prefer using 'artists'." }, "artists": { "type": "array", @@ -55,7 +57,8 @@ }, "releaseMbId": { "type": "string", - "description": "The MusicBrainz release ID." + "format": "uri", + "description": "The MusicBrainz release ID URI, formatted as mbid:." }, "isrc": { "type": "string", diff --git a/lexicons/fm.teal.alpha/music/getAlbum.json b/lexicons/fm.teal.alpha/music/getAlbum.json index d9a39cac..71e30491 100644 --- a/lexicons/fm.teal.alpha/music/getAlbum.json +++ b/lexicons/fm.teal.alpha/music/getAlbum.json @@ -11,7 +11,8 @@ "properties": { "mbid": { "type": "string", - "description": "MusicBrainz release ID URI or UUID" + "format": "uri", + "description": "MusicBrainz release ID URI, formatted as mbid:" }, "limit": { "type": "integer", diff --git a/lexicons/fm.teal.alpha/music/getArtist.json b/lexicons/fm.teal.alpha/music/getArtist.json index e643cc55..f018cd94 100644 --- a/lexicons/fm.teal.alpha/music/getArtist.json +++ b/lexicons/fm.teal.alpha/music/getArtist.json @@ -10,7 +10,8 @@ "properties": { "mbid": { "type": "string", - "description": "MusicBrainz artist ID URI or UUID" + "format": "uri", + "description": "MusicBrainz artist ID URI, formatted as mbid:" }, "name": { "type": "string", From 1be014bbcfb79a5bd621c0483ee20d76bcf3db38 Mon Sep 17 00:00:00 2001 From: mmattbtw Date: Wed, 3 Jun 2026 20:50:29 -0500 Subject: [PATCH 11/11] fix(lexicons): preserve deprecated artist mbids --- lexicons/fm.teal.alpha/feed/play.json | 5 ++--- lexicons/fm.teal.alpha/feed/social/defs.json | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lexicons/fm.teal.alpha/feed/play.json b/lexicons/fm.teal.alpha/feed/play.json index cf643140..72df22c8 100644 --- a/lexicons/fm.teal.alpha/feed/play.json +++ b/lexicons/fm.teal.alpha/feed/play.json @@ -44,10 +44,9 @@ "artistMbIds": { "type": "array", "items": { - "type": "string", - "format": "uri" + "type": "string" }, - "description": "DEPRECATED: USE 'artists' INSTEAD. Array of MusicBrainz artist ID URIs, formatted as mbid:." + "description": "DEPRECATED: USE 'artists' INSTEAD. Array of Musicbrainz artist IDs." }, "artists": { "type": "array", diff --git a/lexicons/fm.teal.alpha/feed/social/defs.json b/lexicons/fm.teal.alpha/feed/social/defs.json index 40fb5a52..e183076f 100644 --- a/lexicons/fm.teal.alpha/feed/social/defs.json +++ b/lexicons/fm.teal.alpha/feed/social/defs.json @@ -41,8 +41,8 @@ }, "artistMbIds": { "type": "array", - "items": { "type": "string", "format": "uri" }, - "description": "Array of MusicBrainz artist ID URIs, formatted as mbid:. Prefer using 'artists'." + "items": { "type": "string" }, + "description": "DEPRECATED: USE 'artists' INSTEAD. Array of Musicbrainz artist IDs." }, "artists": { "type": "array",