A better Rust ATProto crate

teal.fm alpha lexicons

Orual f8a7a78a 8f90b5b0

+1
crates/jacquard-api/Cargo.toml
··· 65 65 dev_ocbwoy3 = [] 66 66 dev_regnault = [] 67 67 events_smokesignal = [] 68 + fm_teal = [] 68 69 fyi_frontpage = [] 69 70 fyi_unravel = [] 70 71 garden_lexicon = []
+90
crates/jacquard-api/lexicons/fm_teal_alpha_actor_defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.actor.defs", 4 + "defs": { 5 + "miniProfileView": { 6 + "type": "object", 7 + "properties": { 8 + "avatar": { 9 + "type": "string", 10 + "description": "IPLD of the avatar" 11 + }, 12 + "did": { 13 + "type": "string", 14 + "description": "The decentralized identifier of the actor" 15 + }, 16 + "displayName": { 17 + "type": "string" 18 + }, 19 + "handle": { 20 + "type": "string" 21 + } 22 + } 23 + }, 24 + "profileView": { 25 + "type": "object", 26 + "properties": { 27 + "avatar": { 28 + "type": "string", 29 + "description": "IPLD of the avatar" 30 + }, 31 + "banner": { 32 + "type": "string", 33 + "description": "IPLD of the banner image" 34 + }, 35 + "createdAt": { 36 + "type": "string", 37 + "format": "datetime" 38 + }, 39 + "description": { 40 + "type": "string", 41 + "description": "Free-form profile description text." 42 + }, 43 + "descriptionFacets": { 44 + "type": "array", 45 + "description": "Annotations of text in the profile description (mentions, URLs, hashtags, etc). May be changed to another (backwards compatible) lexicon.", 46 + "items": { 47 + "type": "ref", 48 + "ref": "app.bsky.richtext.facet" 49 + } 50 + }, 51 + "did": { 52 + "type": "string", 53 + "description": "The decentralized identifier of the actor" 54 + }, 55 + "displayName": { 56 + "type": "string" 57 + }, 58 + "featuredItem": { 59 + "type": "ref", 60 + "description": "The user's most recent item featured on their profile.", 61 + "ref": "fm.teal.alpha.actor.profile#featuredItem" 62 + }, 63 + "status": { 64 + "type": "ref", 65 + "ref": "#statusView" 66 + } 67 + } 68 + }, 69 + "statusView": { 70 + "type": "object", 71 + "description": "A declaration of the status of the actor.", 72 + "properties": { 73 + "expiry": { 74 + "type": "string", 75 + "description": "The unix timestamp of the expiry time of the item. If unavailable, default to 10 minutes past the start time.", 76 + "format": "datetime" 77 + }, 78 + "item": { 79 + "type": "ref", 80 + "ref": "fm.teal.alpha.feed.defs#playView" 81 + }, 82 + "time": { 83 + "type": "string", 84 + "description": "The unix timestamp of when the item was recorded", 85 + "format": "datetime" 86 + } 87 + } 88 + } 89 + } 90 + }
+38
crates/jacquard-api/lexicons/fm_teal_alpha_actor_getProfile.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.actor.getProfile", 4 + "description": "This lexicon is in a not officially released state. It is subject to change. | Retrieves a play given an author DID and record key.", 5 + "defs": { 6 + "main": { 7 + "type": "query", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actor" 12 + ], 13 + "properties": { 14 + "actor": { 15 + "type": "string", 16 + "description": "The author's DID", 17 + "format": "at-identifier" 18 + } 19 + } 20 + }, 21 + "output": { 22 + "encoding": "application/json", 23 + "schema": { 24 + "type": "object", 25 + "required": [ 26 + "actor" 27 + ], 28 + "properties": { 29 + "actor": { 30 + "type": "ref", 31 + "ref": "fm.teal.alpha.actor.defs#profileView" 32 + } 33 + } 34 + } 35 + } 36 + } 37 + } 38 + }
+44
crates/jacquard-api/lexicons/fm_teal_alpha_actor_getProfiles.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.actor.getProfiles", 4 + "description": "This lexicon is in a not officially released state. It is subject to change. | Retrieves the associated profile.", 5 + "defs": { 6 + "main": { 7 + "type": "query", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actors" 12 + ], 13 + "properties": { 14 + "actors": { 15 + "type": "array", 16 + "description": "Array of actor DIDs", 17 + "items": { 18 + "type": "string", 19 + "format": "at-identifier" 20 + } 21 + } 22 + } 23 + }, 24 + "output": { 25 + "encoding": "application/json", 26 + "schema": { 27 + "type": "object", 28 + "required": [ 29 + "actors" 30 + ], 31 + "properties": { 32 + "actors": { 33 + "type": "array", 34 + "items": { 35 + "type": "ref", 36 + "ref": "fm.teal.alpha.actor.defs#miniProfileView" 37 + } 38 + } 39 + } 40 + } 41 + } 42 + } 43 + } 44 + }
+79
crates/jacquard-api/lexicons/fm_teal_alpha_actor_profile.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.actor.profile", 4 + "defs": { 5 + "featuredItem": { 6 + "type": "object", 7 + "required": [ 8 + "mbid", 9 + "type" 10 + ], 11 + "properties": { 12 + "mbid": { 13 + "type": "string", 14 + "description": "The Musicbrainz ID of the item" 15 + }, 16 + "type": { 17 + "type": "string", 18 + "description": "The type of the item. Must be a valid Musicbrainz type, e.g. album, track, recording, etc." 19 + } 20 + } 21 + }, 22 + "main": { 23 + "type": "record", 24 + "description": "This lexicon is in a not officially released state. It is subject to change. | A declaration of a teal.fm account profile.", 25 + "key": "literal:self", 26 + "record": { 27 + "type": "object", 28 + "properties": { 29 + "avatar": { 30 + "type": "blob", 31 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'", 32 + "accept": [ 33 + "image/png", 34 + "image/jpeg" 35 + ], 36 + "maxSize": 1000000 37 + }, 38 + "banner": { 39 + "type": "blob", 40 + "description": "Larger horizontal image to display behind profile view.", 41 + "accept": [ 42 + "image/png", 43 + "image/jpeg" 44 + ], 45 + "maxSize": 1000000 46 + }, 47 + "createdAt": { 48 + "type": "string", 49 + "format": "datetime" 50 + }, 51 + "description": { 52 + "type": "string", 53 + "description": "Free-form profile description text.", 54 + "maxLength": 2560, 55 + "maxGraphemes": 256 56 + }, 57 + "descriptionFacets": { 58 + "type": "array", 59 + "description": "Annotations of text in the profile description (mentions, URLs, hashtags, etc).", 60 + "items": { 61 + "type": "ref", 62 + "ref": "app.bsky.richtext.facet" 63 + } 64 + }, 65 + "displayName": { 66 + "type": "string", 67 + "maxLength": 640, 68 + "maxGraphemes": 64 69 + }, 70 + "featuredItem": { 71 + "type": "ref", 72 + "description": "The user's most recent item featured on their profile.", 73 + "ref": "#featuredItem" 74 + } 75 + } 76 + } 77 + } 78 + } 79 + }
+39
crates/jacquard-api/lexicons/fm_teal_alpha_actor_profileStatus.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.actor.profileStatus", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "This lexicon is in a not officially released state. It is subject to change. | A declaration of the profile status of the actor.", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "completedOnboarding" 13 + ], 14 + "properties": { 15 + "completedOnboarding": { 16 + "type": "string", 17 + "description": "The onboarding completion status", 18 + "knownValues": [ 19 + "none", 20 + "profileOnboarding", 21 + "playOnboarding", 22 + "complete" 23 + ] 24 + }, 25 + "createdAt": { 26 + "type": "string", 27 + "description": "The timestamp when this status was created", 28 + "format": "datetime" 29 + }, 30 + "updatedAt": { 31 + "type": "string", 32 + "description": "The timestamp when this status was last updated", 33 + "format": "datetime" 34 + } 35 + } 36 + } 37 + } 38 + } 39 + }
+56
crates/jacquard-api/lexicons/fm_teal_alpha_actor_searchActors.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.actor.searchActors", 4 + "description": "This lexicon is in a not officially released state. It is subject to change. | Searches for actors based on profile contents.", 5 + "defs": { 6 + "main": { 7 + "type": "query", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "q" 12 + ], 13 + "properties": { 14 + "cursor": { 15 + "type": "string", 16 + "description": "Cursor for pagination" 17 + }, 18 + "limit": { 19 + "type": "integer", 20 + "description": "The maximum number of actors to return", 21 + "minimum": 1, 22 + "maximum": 25 23 + }, 24 + "q": { 25 + "type": "string", 26 + "description": "The search query", 27 + "maxLength": 640, 28 + "maxGraphemes": 128 29 + } 30 + } 31 + }, 32 + "output": { 33 + "encoding": "application/json", 34 + "schema": { 35 + "type": "object", 36 + "required": [ 37 + "actors" 38 + ], 39 + "properties": { 40 + "actors": { 41 + "type": "array", 42 + "items": { 43 + "type": "ref", 44 + "ref": "fm.teal.alpha.actor.defs#miniProfileView" 45 + } 46 + }, 47 + "cursor": { 48 + "type": "string", 49 + "description": "Cursor for pagination" 50 + } 51 + } 52 + } 53 + } 54 + } 55 + } 56 + }
+34
crates/jacquard-api/lexicons/fm_teal_alpha_actor_status.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.actor.status", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "This lexicon is in a not officially released state. It is subject to change. | A declaration of the status of the actor. Only one can be shown at a time. If there are multiple, the latest record should be picked and earlier records should be deleted or tombstoned.", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "time", 13 + "item" 14 + ], 15 + "properties": { 16 + "expiry": { 17 + "type": "string", 18 + "description": "The unix timestamp of the expiry time of the item. If unavailable, default to 10 minutes past the start time.", 19 + "format": "datetime" 20 + }, 21 + "item": { 22 + "type": "ref", 23 + "ref": "fm.teal.alpha.feed.defs#playView" 24 + }, 25 + "time": { 26 + "type": "string", 27 + "description": "The unix timestamp of when the item was recorded", 28 + "format": "datetime" 29 + } 30 + } 31 + } 32 + } 33 + } 34 + }
+95
crates/jacquard-api/lexicons/fm_teal_alpha_feed_defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.feed.defs", 4 + "description": "This lexicon is in a not officially released state. It is subject to change. | Misc. items related to feeds.", 5 + "defs": { 6 + "artist": { 7 + "type": "object", 8 + "required": [ 9 + "artistName" 10 + ], 11 + "properties": { 12 + "artistMbId": { 13 + "type": "string", 14 + "description": "The Musicbrainz ID of the artist" 15 + }, 16 + "artistName": { 17 + "type": "string", 18 + "description": "The name of the artist", 19 + "minLength": 1, 20 + "maxLength": 256, 21 + "maxGraphemes": 2560 22 + } 23 + } 24 + }, 25 + "playView": { 26 + "type": "object", 27 + "required": [ 28 + "trackName", 29 + "artists" 30 + ], 31 + "properties": { 32 + "artists": { 33 + "type": "array", 34 + "description": "Array of artists in order of original appearance.", 35 + "items": { 36 + "type": "ref", 37 + "ref": "#artist" 38 + } 39 + }, 40 + "duration": { 41 + "type": "integer", 42 + "description": "The length of the track in seconds" 43 + }, 44 + "isrc": { 45 + "type": "string", 46 + "description": "The ISRC code associated with the recording" 47 + }, 48 + "musicServiceBaseDomain": { 49 + "type": "string", 50 + "description": "The base domain of the music service. e.g. music.apple.com, tidal.com, spotify.com. Defaults to 'local' if not provided." 51 + }, 52 + "originUrl": { 53 + "type": "string", 54 + "description": "The URL associated with this track" 55 + }, 56 + "playedTime": { 57 + "type": "string", 58 + "description": "The unix timestamp of when the track was played", 59 + "format": "datetime" 60 + }, 61 + "recordingMbId": { 62 + "type": "string", 63 + "description": "The Musicbrainz recording ID of the track" 64 + }, 65 + "releaseMbId": { 66 + "type": "string", 67 + "description": "The Musicbrainz release ID" 68 + }, 69 + "releaseName": { 70 + "type": "string", 71 + "description": "The name of the release/album", 72 + "maxLength": 256, 73 + "maxGraphemes": 2560 74 + }, 75 + "submissionClientAgent": { 76 + "type": "string", 77 + "description": "A user-agent style string specifying the user agent. e.g. tealtracker/0.0.1b (Linux; Android 13; SM-A715F). Defaults to 'manual/unknown' if not provided.", 78 + "maxLength": 256, 79 + "maxGraphemes": 2560 80 + }, 81 + "trackMbId": { 82 + "type": "string", 83 + "description": "The Musicbrainz ID of the track" 84 + }, 85 + "trackName": { 86 + "type": "string", 87 + "description": "The name of the track", 88 + "minLength": 1, 89 + "maxLength": 256, 90 + "maxGraphemes": 2560 91 + } 92 + } 93 + } 94 + } 95 + }
+49
crates/jacquard-api/lexicons/fm_teal_alpha_feed_getActorFeed.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.feed.getActorFeed", 4 + "description": "This lexicon is in a not officially released state. It is subject to change. | Retrieves multiple plays from the index or via an author's DID.", 5 + "defs": { 6 + "main": { 7 + "type": "query", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "authorDID" 12 + ], 13 + "properties": { 14 + "authorDID": { 15 + "type": "string", 16 + "description": "The author's DID for the play", 17 + "format": "at-identifier" 18 + }, 19 + "cursor": { 20 + "type": "string", 21 + "description": "The cursor to start the query from" 22 + }, 23 + "limit": { 24 + "type": "integer", 25 + "description": "The upper limit of tracks to get per request. Default is 20, max is 50." 26 + } 27 + } 28 + }, 29 + "output": { 30 + "encoding": "application/json", 31 + "schema": { 32 + "type": "object", 33 + "required": [ 34 + "plays" 35 + ], 36 + "properties": { 37 + "plays": { 38 + "type": "array", 39 + "items": { 40 + "type": "ref", 41 + "ref": "fm.teal.alpha.feed.defs#playView" 42 + } 43 + } 44 + } 45 + } 46 + } 47 + } 48 + } 49 + }
+43
crates/jacquard-api/lexicons/fm_teal_alpha_feed_getPlay.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.feed.getPlay", 4 + "description": "This lexicon is in a not officially released state. It is subject to change. | Retrieves a play given an author DID and record key.", 5 + "defs": { 6 + "main": { 7 + "type": "query", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "authorDID", 12 + "rkey" 13 + ], 14 + "properties": { 15 + "authorDID": { 16 + "type": "string", 17 + "description": "The author's DID for the play", 18 + "format": "at-identifier" 19 + }, 20 + "rkey": { 21 + "type": "string", 22 + "description": "The record key of the play" 23 + } 24 + } 25 + }, 26 + "output": { 27 + "encoding": "application/json", 28 + "schema": { 29 + "type": "object", 30 + "required": [ 31 + "play" 32 + ], 33 + "properties": { 34 + "play": { 35 + "type": "ref", 36 + "ref": "fm.teal.alpha.feed.defs#playView" 37 + } 38 + } 39 + } 40 + } 41 + } 42 + } 43 + }
+108
crates/jacquard-api/lexicons/fm_teal_alpha_feed_play.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.feed.play", 4 + "description": "This lexicon is in a not officially released state. It is subject to change. | A declaration of a teal.fm play. Plays are submitted as a result of a user listening to a track. Plays should be marked as tracked when a user has listened to the entire track if it's under 2 minutes long, or half of the track's duration up to 4 minutes, whichever is longest.", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "trackName" 13 + ], 14 + "properties": { 15 + "artistMbIds": { 16 + "type": "array", 17 + "description": "Array of Musicbrainz artist IDs. Prefer using 'artists'.", 18 + "items": { 19 + "type": "string" 20 + } 21 + }, 22 + "artistNames": { 23 + "type": "array", 24 + "description": "Array of artist names in order of original appearance. Prefer using 'artists'.", 25 + "items": { 26 + "type": "string", 27 + "minLength": 1, 28 + "maxLength": 256, 29 + "maxGraphemes": 2560 30 + } 31 + }, 32 + "artists": { 33 + "type": "array", 34 + "description": "Array of artists in order of original appearance.", 35 + "items": { 36 + "type": "ref", 37 + "ref": "fm.teal.alpha.feed.defs#artist" 38 + } 39 + }, 40 + "duration": { 41 + "type": "integer", 42 + "description": "The length of the track in seconds" 43 + }, 44 + "isrc": { 45 + "type": "string", 46 + "description": "The ISRC code associated with the recording" 47 + }, 48 + "musicServiceBaseDomain": { 49 + "type": "string", 50 + "description": "The base domain of the music service. e.g. music.apple.com, tidal.com, spotify.com. Defaults to 'local' if unavailable or not provided." 51 + }, 52 + "originUrl": { 53 + "type": "string", 54 + "description": "The URL associated with this track" 55 + }, 56 + "playedTime": { 57 + "type": "string", 58 + "description": "The unix timestamp of when the track was played", 59 + "format": "datetime" 60 + }, 61 + "recordingMbId": { 62 + "type": "string", 63 + "description": "The Musicbrainz recording ID of the track" 64 + }, 65 + "releaseDiscriminant": { 66 + "type": "string", 67 + "description": "Distinguishing information for release variants (e.g. 'Deluxe Edition', 'Remastered', '2023 Remaster', 'Special Edition'). Used to differentiate between different versions of the same base release while maintaining grouping capabilities.", 68 + "maxLength": 128, 69 + "maxGraphemes": 1280 70 + }, 71 + "releaseMbId": { 72 + "type": "string", 73 + "description": "The Musicbrainz release ID" 74 + }, 75 + "releaseName": { 76 + "type": "string", 77 + "description": "The name of the release/album", 78 + "maxLength": 256, 79 + "maxGraphemes": 2560 80 + }, 81 + "submissionClientAgent": { 82 + "type": "string", 83 + "description": "A metadata string specifying the user agent where the format is `<app-identifier>/<version> (<kernel/OS-base>; <platform/OS-version>; <device-model>)`. If string is provided, only `app-identifier` and `version` are required. `app-identifier` is recommended to be in reverse dns format. Defaults to 'manual/unknown' if unavailable or not provided.", 84 + "maxLength": 256, 85 + "maxGraphemes": 2560 86 + }, 87 + "trackDiscriminant": { 88 + "type": "string", 89 + "description": "Distinguishing information for track variants (e.g. 'Acoustic Version', 'Live at Wembley', 'Radio Edit', 'Demo'). Used to differentiate between different versions of the same base track while maintaining grouping capabilities.", 90 + "maxLength": 128, 91 + "maxGraphemes": 1280 92 + }, 93 + "trackMbId": { 94 + "type": "string", 95 + "description": "The Musicbrainz ID of the track" 96 + }, 97 + "trackName": { 98 + "type": "string", 99 + "description": "The name of the track", 100 + "minLength": 1, 101 + "maxLength": 256, 102 + "maxGraphemes": 2560 103 + } 104 + } 105 + } 106 + } 107 + } 108 + }
+72
crates/jacquard-api/lexicons/fm_teal_alpha_stats_defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.stats.defs", 4 + "defs": { 5 + "artistView": { 6 + "type": "object", 7 + "required": [ 8 + "mbid", 9 + "name", 10 + "playCount" 11 + ], 12 + "properties": { 13 + "mbid": { 14 + "type": "string", 15 + "description": "MusicBrainz artist ID" 16 + }, 17 + "name": { 18 + "type": "string", 19 + "description": "Artist name" 20 + }, 21 + "playCount": { 22 + "type": "integer", 23 + "description": "Total number of plays for this artist" 24 + } 25 + } 26 + }, 27 + "recordingView": { 28 + "type": "object", 29 + "required": [ 30 + "mbid", 31 + "name", 32 + "playCount" 33 + ], 34 + "properties": { 35 + "mbid": { 36 + "type": "string", 37 + "description": "MusicBrainz recording ID" 38 + }, 39 + "name": { 40 + "type": "string", 41 + "description": "Recording/track name" 42 + }, 43 + "playCount": { 44 + "type": "integer", 45 + "description": "Total number of plays for this recording" 46 + } 47 + } 48 + }, 49 + "releaseView": { 50 + "type": "object", 51 + "required": [ 52 + "mbid", 53 + "name", 54 + "playCount" 55 + ], 56 + "properties": { 57 + "mbid": { 58 + "type": "string", 59 + "description": "MusicBrainz release ID" 60 + }, 61 + "name": { 62 + "type": "string", 63 + "description": "Release/album name" 64 + }, 65 + "playCount": { 66 + "type": "integer", 67 + "description": "Total number of plays for this release" 68 + } 69 + } 70 + } 71 + } 72 + }
+40
crates/jacquard-api/lexicons/fm_teal_alpha_stats_getLatest.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.stats.getLatest", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get latest plays globally", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "description": "Number of latest plays to return", 14 + "default": 50, 15 + "minimum": 1, 16 + "maximum": 100 17 + } 18 + } 19 + }, 20 + "output": { 21 + "encoding": "application/json", 22 + "schema": { 23 + "type": "object", 24 + "required": [ 25 + "plays" 26 + ], 27 + "properties": { 28 + "plays": { 29 + "type": "array", 30 + "items": { 31 + "type": "ref", 32 + "ref": "fm.teal.alpha.feed.defs#playView" 33 + } 34 + } 35 + } 36 + } 37 + } 38 + } 39 + } 40 + }
+58
crates/jacquard-api/lexicons/fm_teal_alpha_stats_getTopArtists.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.stats.getTopArtists", 4 + "description": "Get top artists by play count", 5 + "defs": { 6 + "main": { 7 + "type": "query", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "cursor": { 12 + "type": "string", 13 + "description": "Pagination cursor" 14 + }, 15 + "limit": { 16 + "type": "integer", 17 + "description": "Number of artists to return", 18 + "default": 50, 19 + "minimum": 1, 20 + "maximum": 100 21 + }, 22 + "period": { 23 + "type": "string", 24 + "description": "Time period for top artists", 25 + "default": "all", 26 + "enum": [ 27 + "all", 28 + "30days", 29 + "7days" 30 + ] 31 + } 32 + } 33 + }, 34 + "output": { 35 + "encoding": "application/json", 36 + "schema": { 37 + "type": "object", 38 + "required": [ 39 + "artists" 40 + ], 41 + "properties": { 42 + "artists": { 43 + "type": "array", 44 + "items": { 45 + "type": "ref", 46 + "ref": "fm.teal.alpha.stats.defs#artistView" 47 + } 48 + }, 49 + "cursor": { 50 + "type": "string", 51 + "description": "Next page cursor" 52 + } 53 + } 54 + } 55 + } 56 + } 57 + } 58 + }
+58
crates/jacquard-api/lexicons/fm_teal_alpha_stats_getTopReleases.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.stats.getTopReleases", 4 + "description": "Get top releases/albums by play count", 5 + "defs": { 6 + "main": { 7 + "type": "query", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "cursor": { 12 + "type": "string", 13 + "description": "Pagination cursor" 14 + }, 15 + "limit": { 16 + "type": "integer", 17 + "description": "Number of releases to return", 18 + "default": 50, 19 + "minimum": 1, 20 + "maximum": 100 21 + }, 22 + "period": { 23 + "type": "string", 24 + "description": "Time period for top releases", 25 + "default": "all", 26 + "enum": [ 27 + "all", 28 + "30days", 29 + "7days" 30 + ] 31 + } 32 + } 33 + }, 34 + "output": { 35 + "encoding": "application/json", 36 + "schema": { 37 + "type": "object", 38 + "required": [ 39 + "releases" 40 + ], 41 + "properties": { 42 + "cursor": { 43 + "type": "string", 44 + "description": "Next page cursor" 45 + }, 46 + "releases": { 47 + "type": "array", 48 + "items": { 49 + "type": "ref", 50 + "ref": "fm.teal.alpha.stats.defs#releaseView" 51 + } 52 + } 53 + } 54 + } 55 + } 56 + } 57 + } 58 + }
+65
crates/jacquard-api/lexicons/fm_teal_alpha_stats_getUserTopArtists.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.stats.getUserTopArtists", 4 + "description": "Get a user's top artists by play count", 5 + "defs": { 6 + "main": { 7 + "type": "query", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actor" 12 + ], 13 + "properties": { 14 + "actor": { 15 + "type": "string", 16 + "description": "The user's DID or handle", 17 + "format": "at-identifier" 18 + }, 19 + "cursor": { 20 + "type": "string", 21 + "description": "Pagination cursor" 22 + }, 23 + "limit": { 24 + "type": "integer", 25 + "description": "Number of artists to return", 26 + "default": 50, 27 + "minimum": 1, 28 + "maximum": 100 29 + }, 30 + "period": { 31 + "type": "string", 32 + "description": "Time period for top artists", 33 + "default": "30days", 34 + "enum": [ 35 + "30days", 36 + "7days" 37 + ] 38 + } 39 + } 40 + }, 41 + "output": { 42 + "encoding": "application/json", 43 + "schema": { 44 + "type": "object", 45 + "required": [ 46 + "artists" 47 + ], 48 + "properties": { 49 + "artists": { 50 + "type": "array", 51 + "items": { 52 + "type": "ref", 53 + "ref": "fm.teal.alpha.stats.defs#artistView" 54 + } 55 + }, 56 + "cursor": { 57 + "type": "string", 58 + "description": "Next page cursor" 59 + } 60 + } 61 + } 62 + } 63 + } 64 + } 65 + }
+65
crates/jacquard-api/lexicons/fm_teal_alpha_stats_getUserTopReleases.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "fm.teal.alpha.stats.getUserTopReleases", 4 + "description": "Get a user's top releases/albums by play count", 5 + "defs": { 6 + "main": { 7 + "type": "query", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actor" 12 + ], 13 + "properties": { 14 + "actor": { 15 + "type": "string", 16 + "description": "The user's DID or handle", 17 + "format": "at-identifier" 18 + }, 19 + "cursor": { 20 + "type": "string", 21 + "description": "Pagination cursor" 22 + }, 23 + "limit": { 24 + "type": "integer", 25 + "description": "Number of releases to return", 26 + "default": 50, 27 + "minimum": 1, 28 + "maximum": 100 29 + }, 30 + "period": { 31 + "type": "string", 32 + "description": "Time period for top releases", 33 + "default": "30days", 34 + "enum": [ 35 + "30days", 36 + "7days" 37 + ] 38 + } 39 + } 40 + }, 41 + "output": { 42 + "encoding": "application/json", 43 + "schema": { 44 + "type": "object", 45 + "required": [ 46 + "releases" 47 + ], 48 + "properties": { 49 + "cursor": { 50 + "type": "string", 51 + "description": "Next page cursor" 52 + }, 53 + "releases": { 54 + "type": "array", 55 + "items": { 56 + "type": "ref", 57 + "ref": "fm.teal.alpha.stats.defs#releaseView" 58 + } 59 + } 60 + } 61 + } 62 + } 63 + } 64 + } 65 + }
+6
crates/jacquard-api/src/fm_teal.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // This file was automatically generated from Lexicon schemas. 4 + // Any manual changes will be overwritten on the next regeneration. 5 + 6 + pub mod alpha;
+8
crates/jacquard-api/src/fm_teal/alpha.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // This file was automatically generated from Lexicon schemas. 4 + // Any manual changes will be overwritten on the next regeneration. 5 + 6 + pub mod actor; 7 + pub mod feed; 8 + pub mod stats;
+118
crates/jacquard-api/src/fm_teal/alpha/actor.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.actor.defs 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + pub mod get_profile; 9 + pub mod get_profiles; 10 + pub mod profile; 11 + pub mod profile_status; 12 + pub mod search_actors; 13 + pub mod status; 14 + 15 + #[jacquard_derive::lexicon] 16 + #[derive( 17 + serde::Serialize, 18 + serde::Deserialize, 19 + Debug, 20 + Clone, 21 + PartialEq, 22 + Eq, 23 + jacquard_derive::IntoStatic, 24 + Default 25 + )] 26 + #[serde(rename_all = "camelCase")] 27 + pub struct MiniProfileView<'a> { 28 + /// IPLD of the avatar 29 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 30 + #[serde(borrow)] 31 + pub avatar: std::option::Option<jacquard_common::CowStr<'a>>, 32 + /// The decentralized identifier of the actor 33 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 34 + #[serde(borrow)] 35 + pub did: std::option::Option<jacquard_common::CowStr<'a>>, 36 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 37 + #[serde(borrow)] 38 + pub display_name: std::option::Option<jacquard_common::CowStr<'a>>, 39 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 40 + #[serde(borrow)] 41 + pub handle: std::option::Option<jacquard_common::CowStr<'a>>, 42 + } 43 + 44 + #[jacquard_derive::lexicon] 45 + #[derive( 46 + serde::Serialize, 47 + serde::Deserialize, 48 + Debug, 49 + Clone, 50 + PartialEq, 51 + Eq, 52 + jacquard_derive::IntoStatic, 53 + Default 54 + )] 55 + #[serde(rename_all = "camelCase")] 56 + pub struct ProfileView<'a> { 57 + /// IPLD of the avatar 58 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 59 + #[serde(borrow)] 60 + pub avatar: std::option::Option<jacquard_common::CowStr<'a>>, 61 + /// IPLD of the banner image 62 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 63 + #[serde(borrow)] 64 + pub banner: std::option::Option<jacquard_common::CowStr<'a>>, 65 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 66 + pub created_at: std::option::Option<jacquard_common::types::string::Datetime>, 67 + /// Free-form profile description text. 68 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 69 + #[serde(borrow)] 70 + pub description: std::option::Option<jacquard_common::CowStr<'a>>, 71 + /// Annotations of text in the profile description (mentions, URLs, hashtags, etc). May be changed to another (backwards compatible) lexicon. 72 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 73 + #[serde(borrow)] 74 + pub description_facets: std::option::Option< 75 + Vec<crate::app_bsky::richtext::facet::Facet<'a>>, 76 + >, 77 + /// The decentralized identifier of the actor 78 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 79 + #[serde(borrow)] 80 + pub did: std::option::Option<jacquard_common::CowStr<'a>>, 81 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 82 + #[serde(borrow)] 83 + pub display_name: std::option::Option<jacquard_common::CowStr<'a>>, 84 + /// The user's most recent item featured on their profile. 85 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 86 + #[serde(borrow)] 87 + pub featured_item: std::option::Option< 88 + crate::fm_teal::alpha::actor::profile::FeaturedItem<'a>, 89 + >, 90 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 91 + #[serde(borrow)] 92 + pub status: std::option::Option<crate::fm_teal::alpha::actor::StatusView<'a>>, 93 + } 94 + 95 + /// A declaration of the status of the actor. 96 + #[jacquard_derive::lexicon] 97 + #[derive( 98 + serde::Serialize, 99 + serde::Deserialize, 100 + Debug, 101 + Clone, 102 + PartialEq, 103 + Eq, 104 + jacquard_derive::IntoStatic, 105 + Default 106 + )] 107 + #[serde(rename_all = "camelCase")] 108 + pub struct StatusView<'a> { 109 + /// The unix timestamp of the expiry time of the item. If unavailable, default to 10 minutes past the start time. 110 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 111 + pub expiry: std::option::Option<jacquard_common::types::string::Datetime>, 112 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 113 + #[serde(borrow)] 114 + pub item: std::option::Option<crate::fm_teal::alpha::feed::PlayView<'a>>, 115 + /// The unix timestamp of when the item was recorded 116 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 117 + pub time: std::option::Option<jacquard_common::types::string::Datetime>, 118 + }
+65
crates/jacquard-api/src/fm_teal/alpha/actor/get_profile.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.actor.getProfile 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[derive( 9 + serde::Serialize, 10 + serde::Deserialize, 11 + Debug, 12 + Clone, 13 + PartialEq, 14 + Eq, 15 + bon::Builder, 16 + jacquard_derive::IntoStatic 17 + )] 18 + #[builder(start_fn = new)] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct GetProfile<'a> { 21 + #[serde(borrow)] 22 + pub actor: jacquard_common::types::ident::AtIdentifier<'a>, 23 + } 24 + 25 + #[jacquard_derive::lexicon] 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct GetProfileOutput<'a> { 37 + #[serde(borrow)] 38 + pub actor: crate::fm_teal::alpha::actor::ProfileView<'a>, 39 + } 40 + 41 + /// Response type for 42 + ///fm.teal.alpha.actor.getProfile 43 + pub struct GetProfileResponse; 44 + impl jacquard_common::xrpc::XrpcResp for GetProfileResponse { 45 + const NSID: &'static str = "fm.teal.alpha.actor.getProfile"; 46 + const ENCODING: &'static str = "application/json"; 47 + type Output<'de> = GetProfileOutput<'de>; 48 + type Err<'de> = jacquard_common::xrpc::GenericError<'de>; 49 + } 50 + 51 + impl<'a> jacquard_common::xrpc::XrpcRequest for GetProfile<'a> { 52 + const NSID: &'static str = "fm.teal.alpha.actor.getProfile"; 53 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 54 + type Response = GetProfileResponse; 55 + } 56 + 57 + /// Endpoint type for 58 + ///fm.teal.alpha.actor.getProfile 59 + pub struct GetProfileRequest; 60 + impl jacquard_common::xrpc::XrpcEndpoint for GetProfileRequest { 61 + const PATH: &'static str = "/xrpc/fm.teal.alpha.actor.getProfile"; 62 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 63 + type Request<'de> = GetProfile<'de>; 64 + type Response = GetProfileResponse; 65 + }
+65
crates/jacquard-api/src/fm_teal/alpha/actor/get_profiles.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.actor.getProfiles 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[derive( 9 + serde::Serialize, 10 + serde::Deserialize, 11 + Debug, 12 + Clone, 13 + PartialEq, 14 + Eq, 15 + bon::Builder, 16 + jacquard_derive::IntoStatic 17 + )] 18 + #[builder(start_fn = new)] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct GetProfiles<'a> { 21 + #[serde(borrow)] 22 + pub actors: Vec<jacquard_common::types::ident::AtIdentifier<'a>>, 23 + } 24 + 25 + #[jacquard_derive::lexicon] 26 + #[derive( 27 + serde::Serialize, 28 + serde::Deserialize, 29 + Debug, 30 + Clone, 31 + PartialEq, 32 + Eq, 33 + jacquard_derive::IntoStatic 34 + )] 35 + #[serde(rename_all = "camelCase")] 36 + pub struct GetProfilesOutput<'a> { 37 + #[serde(borrow)] 38 + pub actors: Vec<crate::fm_teal::alpha::actor::MiniProfileView<'a>>, 39 + } 40 + 41 + /// Response type for 42 + ///fm.teal.alpha.actor.getProfiles 43 + pub struct GetProfilesResponse; 44 + impl jacquard_common::xrpc::XrpcResp for GetProfilesResponse { 45 + const NSID: &'static str = "fm.teal.alpha.actor.getProfiles"; 46 + const ENCODING: &'static str = "application/json"; 47 + type Output<'de> = GetProfilesOutput<'de>; 48 + type Err<'de> = jacquard_common::xrpc::GenericError<'de>; 49 + } 50 + 51 + impl<'a> jacquard_common::xrpc::XrpcRequest for GetProfiles<'a> { 52 + const NSID: &'static str = "fm.teal.alpha.actor.getProfiles"; 53 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 54 + type Response = GetProfilesResponse; 55 + } 56 + 57 + /// Endpoint type for 58 + ///fm.teal.alpha.actor.getProfiles 59 + pub struct GetProfilesRequest; 60 + impl jacquard_common::xrpc::XrpcEndpoint for GetProfilesRequest { 61 + const PATH: &'static str = "/xrpc/fm.teal.alpha.actor.getProfiles"; 62 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 63 + type Request<'de> = GetProfiles<'de>; 64 + type Response = GetProfilesResponse; 65 + }
+136
crates/jacquard-api/src/fm_teal/alpha/actor/profile.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.actor.profile 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[jacquard_derive::lexicon] 9 + #[derive( 10 + serde::Serialize, 11 + serde::Deserialize, 12 + Debug, 13 + Clone, 14 + PartialEq, 15 + Eq, 16 + jacquard_derive::IntoStatic, 17 + Default 18 + )] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct FeaturedItem<'a> { 21 + /// The Musicbrainz ID of the item 22 + #[serde(borrow)] 23 + pub mbid: jacquard_common::CowStr<'a>, 24 + /// The type of the item. Must be a valid Musicbrainz type, e.g. album, track, recording, etc. 25 + #[serde(borrow)] 26 + pub r#type: jacquard_common::CowStr<'a>, 27 + } 28 + 29 + /// This lexicon is in a not officially released state. It is subject to change. | A declaration of a teal.fm account profile. 30 + #[jacquard_derive::lexicon] 31 + #[derive( 32 + serde::Serialize, 33 + serde::Deserialize, 34 + Debug, 35 + Clone, 36 + PartialEq, 37 + Eq, 38 + jacquard_derive::IntoStatic, 39 + bon::Builder 40 + )] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct Profile<'a> { 43 + /// Small image to be displayed next to posts from account. AKA, 'profile picture' 44 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 45 + #[builder(into)] 46 + #[serde(borrow)] 47 + pub avatar: Option<jacquard_common::types::blob::BlobRef<'a>>, 48 + /// Larger horizontal image to display behind profile view. 49 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 50 + #[builder(into)] 51 + #[serde(borrow)] 52 + pub banner: Option<jacquard_common::types::blob::BlobRef<'a>>, 53 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 54 + #[builder(into)] 55 + pub created_at: Option<jacquard_common::types::string::Datetime>, 56 + /// Free-form profile description text. 57 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 58 + #[builder(into)] 59 + #[serde(borrow)] 60 + pub description: Option<jacquard_common::CowStr<'a>>, 61 + /// Annotations of text in the profile description (mentions, URLs, hashtags, etc). 62 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 63 + #[builder(into)] 64 + #[serde(borrow)] 65 + pub description_facets: Option<Vec<crate::app_bsky::richtext::facet::Facet<'a>>>, 66 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 67 + #[builder(into)] 68 + #[serde(borrow)] 69 + pub display_name: Option<jacquard_common::CowStr<'a>>, 70 + /// The user's most recent item featured on their profile. 71 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 72 + #[builder(into)] 73 + #[serde(borrow)] 74 + pub featured_item: Option<crate::fm_teal::alpha::actor::profile::FeaturedItem<'a>>, 75 + } 76 + 77 + impl<'a> Profile<'a> { 78 + pub fn uri( 79 + uri: impl Into<jacquard_common::CowStr<'a>>, 80 + ) -> Result< 81 + jacquard_common::types::uri::RecordUri<'a, ProfileRecord>, 82 + jacquard_common::types::uri::UriError, 83 + > { 84 + jacquard_common::types::uri::RecordUri::try_from_uri( 85 + jacquard_common::types::string::AtUri::new_cow(uri.into())?, 86 + ) 87 + } 88 + } 89 + 90 + /// Typed wrapper for GetRecord response with this collection's record type. 91 + #[derive( 92 + serde::Serialize, 93 + serde::Deserialize, 94 + Debug, 95 + Clone, 96 + PartialEq, 97 + Eq, 98 + jacquard_derive::IntoStatic 99 + )] 100 + #[serde(rename_all = "camelCase")] 101 + pub struct ProfileGetRecordOutput<'a> { 102 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 103 + #[serde(borrow)] 104 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 105 + #[serde(borrow)] 106 + pub uri: jacquard_common::types::string::AtUri<'a>, 107 + #[serde(borrow)] 108 + pub value: Profile<'a>, 109 + } 110 + 111 + impl From<ProfileGetRecordOutput<'_>> for Profile<'_> { 112 + fn from(output: ProfileGetRecordOutput<'_>) -> Self { 113 + use jacquard_common::IntoStatic; 114 + output.value.into_static() 115 + } 116 + } 117 + 118 + impl jacquard_common::types::collection::Collection for Profile<'_> { 119 + const NSID: &'static str = "fm.teal.alpha.actor.profile"; 120 + type Record = ProfileRecord; 121 + } 122 + 123 + /// Marker type for deserializing records from this collection. 124 + #[derive(Debug, serde::Serialize, serde::Deserialize)] 125 + pub struct ProfileRecord; 126 + impl jacquard_common::xrpc::XrpcResp for ProfileRecord { 127 + const NSID: &'static str = "fm.teal.alpha.actor.profile"; 128 + const ENCODING: &'static str = "application/json"; 129 + type Output<'de> = ProfileGetRecordOutput<'de>; 130 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 131 + } 132 + 133 + impl jacquard_common::types::collection::Collection for ProfileRecord { 134 + const NSID: &'static str = "fm.teal.alpha.actor.profile"; 135 + type Record = ProfileRecord; 136 + }
+95
crates/jacquard-api/src/fm_teal/alpha/actor/profile_status.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.actor.profileStatus 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + /// This lexicon is in a not officially released state. It is subject to change. | A declaration of the profile status of the actor. 9 + #[jacquard_derive::lexicon] 10 + #[derive( 11 + serde::Serialize, 12 + serde::Deserialize, 13 + Debug, 14 + Clone, 15 + PartialEq, 16 + Eq, 17 + jacquard_derive::IntoStatic, 18 + bon::Builder 19 + )] 20 + #[serde(rename_all = "camelCase")] 21 + pub struct ProfileStatus<'a> { 22 + /// The onboarding completion status 23 + #[serde(borrow)] 24 + #[builder(into)] 25 + pub completed_onboarding: jacquard_common::CowStr<'a>, 26 + /// The timestamp when this status was created 27 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 28 + #[builder(into)] 29 + pub created_at: Option<jacquard_common::types::string::Datetime>, 30 + /// The timestamp when this status was last updated 31 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 32 + #[builder(into)] 33 + pub updated_at: Option<jacquard_common::types::string::Datetime>, 34 + } 35 + 36 + impl<'a> ProfileStatus<'a> { 37 + pub fn uri( 38 + uri: impl Into<jacquard_common::CowStr<'a>>, 39 + ) -> Result< 40 + jacquard_common::types::uri::RecordUri<'a, ProfileStatusRecord>, 41 + jacquard_common::types::uri::UriError, 42 + > { 43 + jacquard_common::types::uri::RecordUri::try_from_uri( 44 + jacquard_common::types::string::AtUri::new_cow(uri.into())?, 45 + ) 46 + } 47 + } 48 + 49 + /// Typed wrapper for GetRecord response with this collection's record type. 50 + #[derive( 51 + serde::Serialize, 52 + serde::Deserialize, 53 + Debug, 54 + Clone, 55 + PartialEq, 56 + Eq, 57 + jacquard_derive::IntoStatic 58 + )] 59 + #[serde(rename_all = "camelCase")] 60 + pub struct ProfileStatusGetRecordOutput<'a> { 61 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 62 + #[serde(borrow)] 63 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 64 + #[serde(borrow)] 65 + pub uri: jacquard_common::types::string::AtUri<'a>, 66 + #[serde(borrow)] 67 + pub value: ProfileStatus<'a>, 68 + } 69 + 70 + impl From<ProfileStatusGetRecordOutput<'_>> for ProfileStatus<'_> { 71 + fn from(output: ProfileStatusGetRecordOutput<'_>) -> Self { 72 + use jacquard_common::IntoStatic; 73 + output.value.into_static() 74 + } 75 + } 76 + 77 + impl jacquard_common::types::collection::Collection for ProfileStatus<'_> { 78 + const NSID: &'static str = "fm.teal.alpha.actor.profileStatus"; 79 + type Record = ProfileStatusRecord; 80 + } 81 + 82 + /// Marker type for deserializing records from this collection. 83 + #[derive(Debug, serde::Serialize, serde::Deserialize)] 84 + pub struct ProfileStatusRecord; 85 + impl jacquard_common::xrpc::XrpcResp for ProfileStatusRecord { 86 + const NSID: &'static str = "fm.teal.alpha.actor.profileStatus"; 87 + const ENCODING: &'static str = "application/json"; 88 + type Output<'de> = ProfileStatusGetRecordOutput<'de>; 89 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 90 + } 91 + 92 + impl jacquard_common::types::collection::Collection for ProfileStatusRecord { 93 + const NSID: &'static str = "fm.teal.alpha.actor.profileStatus"; 94 + type Record = ProfileStatusRecord; 95 + }
+77
crates/jacquard-api/src/fm_teal/alpha/actor/search_actors.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.actor.searchActors 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[derive( 9 + serde::Serialize, 10 + serde::Deserialize, 11 + Debug, 12 + Clone, 13 + PartialEq, 14 + Eq, 15 + bon::Builder, 16 + jacquard_derive::IntoStatic 17 + )] 18 + #[builder(start_fn = new)] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct SearchActors<'a> { 21 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 22 + #[serde(borrow)] 23 + #[builder(into)] 24 + pub cursor: std::option::Option<jacquard_common::CowStr<'a>>, 25 + ///(min: 1, max: 25) 26 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 27 + pub limit: std::option::Option<i64>, 28 + #[serde(borrow)] 29 + #[builder(into)] 30 + pub q: jacquard_common::CowStr<'a>, 31 + } 32 + 33 + #[jacquard_derive::lexicon] 34 + #[derive( 35 + serde::Serialize, 36 + serde::Deserialize, 37 + Debug, 38 + Clone, 39 + PartialEq, 40 + Eq, 41 + jacquard_derive::IntoStatic 42 + )] 43 + #[serde(rename_all = "camelCase")] 44 + pub struct SearchActorsOutput<'a> { 45 + #[serde(borrow)] 46 + pub actors: Vec<crate::fm_teal::alpha::actor::MiniProfileView<'a>>, 47 + /// Cursor for pagination 48 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 49 + #[serde(borrow)] 50 + pub cursor: std::option::Option<jacquard_common::CowStr<'a>>, 51 + } 52 + 53 + /// Response type for 54 + ///fm.teal.alpha.actor.searchActors 55 + pub struct SearchActorsResponse; 56 + impl jacquard_common::xrpc::XrpcResp for SearchActorsResponse { 57 + const NSID: &'static str = "fm.teal.alpha.actor.searchActors"; 58 + const ENCODING: &'static str = "application/json"; 59 + type Output<'de> = SearchActorsOutput<'de>; 60 + type Err<'de> = jacquard_common::xrpc::GenericError<'de>; 61 + } 62 + 63 + impl<'a> jacquard_common::xrpc::XrpcRequest for SearchActors<'a> { 64 + const NSID: &'static str = "fm.teal.alpha.actor.searchActors"; 65 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 66 + type Response = SearchActorsResponse; 67 + } 68 + 69 + /// Endpoint type for 70 + ///fm.teal.alpha.actor.searchActors 71 + pub struct SearchActorsRequest; 72 + impl jacquard_common::xrpc::XrpcEndpoint for SearchActorsRequest { 73 + const PATH: &'static str = "/xrpc/fm.teal.alpha.actor.searchActors"; 74 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 75 + type Request<'de> = SearchActors<'de>; 76 + type Response = SearchActorsResponse; 77 + }
+91
crates/jacquard-api/src/fm_teal/alpha/actor/status.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.actor.status 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + /// This lexicon is in a not officially released state. It is subject to change. | A declaration of the status of the actor. Only one can be shown at a time. If there are multiple, the latest record should be picked and earlier records should be deleted or tombstoned. 9 + #[jacquard_derive::lexicon] 10 + #[derive( 11 + serde::Serialize, 12 + serde::Deserialize, 13 + Debug, 14 + Clone, 15 + PartialEq, 16 + Eq, 17 + jacquard_derive::IntoStatic, 18 + bon::Builder 19 + )] 20 + #[serde(rename_all = "camelCase")] 21 + pub struct Status<'a> { 22 + /// The unix timestamp of the expiry time of the item. If unavailable, default to 10 minutes past the start time. 23 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 24 + #[builder(into)] 25 + pub expiry: Option<jacquard_common::types::string::Datetime>, 26 + #[serde(borrow)] 27 + pub item: crate::fm_teal::alpha::feed::PlayView<'a>, 28 + /// The unix timestamp of when the item was recorded 29 + pub time: jacquard_common::types::string::Datetime, 30 + } 31 + 32 + impl<'a> Status<'a> { 33 + pub fn uri( 34 + uri: impl Into<jacquard_common::CowStr<'a>>, 35 + ) -> Result< 36 + jacquard_common::types::uri::RecordUri<'a, StatusRecord>, 37 + jacquard_common::types::uri::UriError, 38 + > { 39 + jacquard_common::types::uri::RecordUri::try_from_uri( 40 + jacquard_common::types::string::AtUri::new_cow(uri.into())?, 41 + ) 42 + } 43 + } 44 + 45 + /// Typed wrapper for GetRecord response with this collection's record type. 46 + #[derive( 47 + serde::Serialize, 48 + serde::Deserialize, 49 + Debug, 50 + Clone, 51 + PartialEq, 52 + Eq, 53 + jacquard_derive::IntoStatic 54 + )] 55 + #[serde(rename_all = "camelCase")] 56 + pub struct StatusGetRecordOutput<'a> { 57 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 58 + #[serde(borrow)] 59 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 60 + #[serde(borrow)] 61 + pub uri: jacquard_common::types::string::AtUri<'a>, 62 + #[serde(borrow)] 63 + pub value: Status<'a>, 64 + } 65 + 66 + impl From<StatusGetRecordOutput<'_>> for Status<'_> { 67 + fn from(output: StatusGetRecordOutput<'_>) -> Self { 68 + use jacquard_common::IntoStatic; 69 + output.value.into_static() 70 + } 71 + } 72 + 73 + impl jacquard_common::types::collection::Collection for Status<'_> { 74 + const NSID: &'static str = "fm.teal.alpha.actor.status"; 75 + type Record = StatusRecord; 76 + } 77 + 78 + /// Marker type for deserializing records from this collection. 79 + #[derive(Debug, serde::Serialize, serde::Deserialize)] 80 + pub struct StatusRecord; 81 + impl jacquard_common::xrpc::XrpcResp for StatusRecord { 82 + const NSID: &'static str = "fm.teal.alpha.actor.status"; 83 + const ENCODING: &'static str = "application/json"; 84 + type Output<'de> = StatusGetRecordOutput<'de>; 85 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 86 + } 87 + 88 + impl jacquard_common::types::collection::Collection for StatusRecord { 89 + const NSID: &'static str = "fm.teal.alpha.actor.status"; 90 + type Record = StatusRecord; 91 + }
+102
crates/jacquard-api/src/fm_teal/alpha/feed.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.feed.defs 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + pub mod get_actor_feed; 9 + pub mod get_play; 10 + pub mod play; 11 + 12 + #[jacquard_derive::lexicon] 13 + #[derive( 14 + serde::Serialize, 15 + serde::Deserialize, 16 + Debug, 17 + Clone, 18 + PartialEq, 19 + Eq, 20 + jacquard_derive::IntoStatic, 21 + Default 22 + )] 23 + #[serde(rename_all = "camelCase")] 24 + pub struct Artist<'a> { 25 + /// The Musicbrainz ID of the artist 26 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 27 + #[serde(borrow)] 28 + pub artist_mb_id: std::option::Option<jacquard_common::CowStr<'a>>, 29 + /// The name of the artist 30 + #[serde(borrow)] 31 + pub artist_name: jacquard_common::CowStr<'a>, 32 + } 33 + 34 + #[jacquard_derive::lexicon] 35 + #[derive( 36 + serde::Serialize, 37 + serde::Deserialize, 38 + Debug, 39 + Clone, 40 + PartialEq, 41 + Eq, 42 + jacquard_derive::IntoStatic, 43 + bon::Builder 44 + )] 45 + #[serde(rename_all = "camelCase")] 46 + pub struct PlayView<'a> { 47 + /// Array of artists in order of original appearance. 48 + #[serde(borrow)] 49 + pub artists: Vec<crate::fm_teal::alpha::feed::Artist<'a>>, 50 + /// The length of the track in seconds 51 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 52 + #[builder(into)] 53 + pub duration: Option<i64>, 54 + /// The ISRC code associated with the recording 55 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 56 + #[builder(into)] 57 + #[serde(borrow)] 58 + pub isrc: Option<jacquard_common::CowStr<'a>>, 59 + /// The base domain of the music service. e.g. music.apple.com, tidal.com, spotify.com. Defaults to 'local' if not provided. 60 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 61 + #[builder(into)] 62 + #[serde(borrow)] 63 + pub music_service_base_domain: Option<jacquard_common::CowStr<'a>>, 64 + /// The URL associated with this track 65 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 66 + #[builder(into)] 67 + #[serde(borrow)] 68 + pub origin_url: Option<jacquard_common::CowStr<'a>>, 69 + /// The unix timestamp of when the track was played 70 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 71 + #[builder(into)] 72 + pub played_time: Option<jacquard_common::types::string::Datetime>, 73 + /// The Musicbrainz recording ID of the track 74 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 75 + #[builder(into)] 76 + #[serde(borrow)] 77 + pub recording_mb_id: Option<jacquard_common::CowStr<'a>>, 78 + /// The Musicbrainz release ID 79 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 80 + #[builder(into)] 81 + #[serde(borrow)] 82 + pub release_mb_id: Option<jacquard_common::CowStr<'a>>, 83 + /// The name of the release/album 84 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 85 + #[builder(into)] 86 + #[serde(borrow)] 87 + pub release_name: Option<jacquard_common::CowStr<'a>>, 88 + /// A user-agent style string specifying the user agent. e.g. tealtracker/0.0.1b (Linux; Android 13; SM-A715F). Defaults to 'manual/unknown' if not provided. 89 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 90 + #[builder(into)] 91 + #[serde(borrow)] 92 + pub submission_client_agent: Option<jacquard_common::CowStr<'a>>, 93 + /// The Musicbrainz ID of the track 94 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 95 + #[builder(into)] 96 + #[serde(borrow)] 97 + pub track_mb_id: Option<jacquard_common::CowStr<'a>>, 98 + /// The name of the track 99 + #[serde(borrow)] 100 + #[builder(into)] 101 + pub track_name: jacquard_common::CowStr<'a>, 102 + }
+71
crates/jacquard-api/src/fm_teal/alpha/feed/get_actor_feed.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.feed.getActorFeed 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[derive( 9 + serde::Serialize, 10 + serde::Deserialize, 11 + Debug, 12 + Clone, 13 + PartialEq, 14 + Eq, 15 + bon::Builder, 16 + jacquard_derive::IntoStatic 17 + )] 18 + #[builder(start_fn = new)] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct GetActorFeed<'a> { 21 + #[serde(borrow)] 22 + pub author_did: jacquard_common::types::ident::AtIdentifier<'a>, 23 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 24 + #[serde(borrow)] 25 + #[builder(into)] 26 + pub cursor: std::option::Option<jacquard_common::CowStr<'a>>, 27 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 28 + pub limit: std::option::Option<i64>, 29 + } 30 + 31 + #[jacquard_derive::lexicon] 32 + #[derive( 33 + serde::Serialize, 34 + serde::Deserialize, 35 + Debug, 36 + Clone, 37 + PartialEq, 38 + Eq, 39 + jacquard_derive::IntoStatic 40 + )] 41 + #[serde(rename_all = "camelCase")] 42 + pub struct GetActorFeedOutput<'a> { 43 + #[serde(borrow)] 44 + pub plays: Vec<crate::fm_teal::alpha::feed::PlayView<'a>>, 45 + } 46 + 47 + /// Response type for 48 + ///fm.teal.alpha.feed.getActorFeed 49 + pub struct GetActorFeedResponse; 50 + impl jacquard_common::xrpc::XrpcResp for GetActorFeedResponse { 51 + const NSID: &'static str = "fm.teal.alpha.feed.getActorFeed"; 52 + const ENCODING: &'static str = "application/json"; 53 + type Output<'de> = GetActorFeedOutput<'de>; 54 + type Err<'de> = jacquard_common::xrpc::GenericError<'de>; 55 + } 56 + 57 + impl<'a> jacquard_common::xrpc::XrpcRequest for GetActorFeed<'a> { 58 + const NSID: &'static str = "fm.teal.alpha.feed.getActorFeed"; 59 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 60 + type Response = GetActorFeedResponse; 61 + } 62 + 63 + /// Endpoint type for 64 + ///fm.teal.alpha.feed.getActorFeed 65 + pub struct GetActorFeedRequest; 66 + impl jacquard_common::xrpc::XrpcEndpoint for GetActorFeedRequest { 67 + const PATH: &'static str = "/xrpc/fm.teal.alpha.feed.getActorFeed"; 68 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 69 + type Request<'de> = GetActorFeed<'de>; 70 + type Response = GetActorFeedResponse; 71 + }
+68
crates/jacquard-api/src/fm_teal/alpha/feed/get_play.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.feed.getPlay 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[derive( 9 + serde::Serialize, 10 + serde::Deserialize, 11 + Debug, 12 + Clone, 13 + PartialEq, 14 + Eq, 15 + bon::Builder, 16 + jacquard_derive::IntoStatic 17 + )] 18 + #[builder(start_fn = new)] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct GetPlay<'a> { 21 + #[serde(borrow)] 22 + pub author_did: jacquard_common::types::ident::AtIdentifier<'a>, 23 + #[serde(borrow)] 24 + #[builder(into)] 25 + pub rkey: jacquard_common::CowStr<'a>, 26 + } 27 + 28 + #[jacquard_derive::lexicon] 29 + #[derive( 30 + serde::Serialize, 31 + serde::Deserialize, 32 + Debug, 33 + Clone, 34 + PartialEq, 35 + Eq, 36 + jacquard_derive::IntoStatic 37 + )] 38 + #[serde(rename_all = "camelCase")] 39 + pub struct GetPlayOutput<'a> { 40 + #[serde(borrow)] 41 + pub play: crate::fm_teal::alpha::feed::PlayView<'a>, 42 + } 43 + 44 + /// Response type for 45 + ///fm.teal.alpha.feed.getPlay 46 + pub struct GetPlayResponse; 47 + impl jacquard_common::xrpc::XrpcResp for GetPlayResponse { 48 + const NSID: &'static str = "fm.teal.alpha.feed.getPlay"; 49 + const ENCODING: &'static str = "application/json"; 50 + type Output<'de> = GetPlayOutput<'de>; 51 + type Err<'de> = jacquard_common::xrpc::GenericError<'de>; 52 + } 53 + 54 + impl<'a> jacquard_common::xrpc::XrpcRequest for GetPlay<'a> { 55 + const NSID: &'static str = "fm.teal.alpha.feed.getPlay"; 56 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 57 + type Response = GetPlayResponse; 58 + } 59 + 60 + /// Endpoint type for 61 + ///fm.teal.alpha.feed.getPlay 62 + pub struct GetPlayRequest; 63 + impl jacquard_common::xrpc::XrpcEndpoint for GetPlayRequest { 64 + const PATH: &'static str = "/xrpc/fm.teal.alpha.feed.getPlay"; 65 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 66 + type Request<'de> = GetPlay<'de>; 67 + type Response = GetPlayResponse; 68 + }
+159
crates/jacquard-api/src/fm_teal/alpha/feed/play.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.feed.play 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[jacquard_derive::lexicon] 9 + #[derive( 10 + serde::Serialize, 11 + serde::Deserialize, 12 + Debug, 13 + Clone, 14 + PartialEq, 15 + Eq, 16 + jacquard_derive::IntoStatic, 17 + bon::Builder 18 + )] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct Play<'a> { 21 + /// Array of Musicbrainz artist IDs. Prefer using 'artists'. 22 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 23 + #[builder(into)] 24 + #[serde(borrow)] 25 + pub artist_mb_ids: Option<Vec<jacquard_common::CowStr<'a>>>, 26 + /// Array of artist names in order of original appearance. Prefer using 'artists'. 27 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 28 + #[builder(into)] 29 + #[serde(borrow)] 30 + pub artist_names: Option<Vec<jacquard_common::CowStr<'a>>>, 31 + /// Array of artists in order of original appearance. 32 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 33 + #[builder(into)] 34 + #[serde(borrow)] 35 + pub artists: Option<Vec<crate::fm_teal::alpha::feed::Artist<'a>>>, 36 + /// The length of the track in seconds 37 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 38 + #[builder(into)] 39 + pub duration: Option<i64>, 40 + /// The ISRC code associated with the recording 41 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 42 + #[builder(into)] 43 + #[serde(borrow)] 44 + pub isrc: Option<jacquard_common::CowStr<'a>>, 45 + /// The base domain of the music service. e.g. music.apple.com, tidal.com, spotify.com. Defaults to 'local' if unavailable or not provided. 46 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 47 + #[builder(into)] 48 + #[serde(borrow)] 49 + pub music_service_base_domain: Option<jacquard_common::CowStr<'a>>, 50 + /// The URL associated with this track 51 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 52 + #[builder(into)] 53 + #[serde(borrow)] 54 + pub origin_url: Option<jacquard_common::CowStr<'a>>, 55 + /// The unix timestamp of when the track was played 56 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 57 + #[builder(into)] 58 + pub played_time: Option<jacquard_common::types::string::Datetime>, 59 + /// The Musicbrainz recording ID of the track 60 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 61 + #[builder(into)] 62 + #[serde(borrow)] 63 + pub recording_mb_id: Option<jacquard_common::CowStr<'a>>, 64 + /// Distinguishing information for release variants (e.g. 'Deluxe Edition', 'Remastered', '2023 Remaster', 'Special Edition'). Used to differentiate between different versions of the same base release while maintaining grouping capabilities. 65 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 66 + #[builder(into)] 67 + #[serde(borrow)] 68 + pub release_discriminant: Option<jacquard_common::CowStr<'a>>, 69 + /// The Musicbrainz release ID 70 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 71 + #[builder(into)] 72 + #[serde(borrow)] 73 + pub release_mb_id: Option<jacquard_common::CowStr<'a>>, 74 + /// The name of the release/album 75 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 76 + #[builder(into)] 77 + #[serde(borrow)] 78 + pub release_name: Option<jacquard_common::CowStr<'a>>, 79 + /// A metadata string specifying the user agent where the format is `<app-identifier>/<version> (<kernel/OS-base>; <platform/OS-version>; <device-model>)`. If string is provided, only `app-identifier` and `version` are required. `app-identifier` is recommended to be in reverse dns format. Defaults to 'manual/unknown' if unavailable or not provided. 80 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 81 + #[builder(into)] 82 + #[serde(borrow)] 83 + pub submission_client_agent: Option<jacquard_common::CowStr<'a>>, 84 + /// Distinguishing information for track variants (e.g. 'Acoustic Version', 'Live at Wembley', 'Radio Edit', 'Demo'). Used to differentiate between different versions of the same base track while maintaining grouping capabilities. 85 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 86 + #[builder(into)] 87 + #[serde(borrow)] 88 + pub track_discriminant: Option<jacquard_common::CowStr<'a>>, 89 + /// The Musicbrainz ID of the track 90 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 91 + #[builder(into)] 92 + #[serde(borrow)] 93 + pub track_mb_id: Option<jacquard_common::CowStr<'a>>, 94 + /// The name of the track 95 + #[serde(borrow)] 96 + #[builder(into)] 97 + pub track_name: jacquard_common::CowStr<'a>, 98 + } 99 + 100 + impl<'a> Play<'a> { 101 + pub fn uri( 102 + uri: impl Into<jacquard_common::CowStr<'a>>, 103 + ) -> Result< 104 + jacquard_common::types::uri::RecordUri<'a, PlayRecord>, 105 + jacquard_common::types::uri::UriError, 106 + > { 107 + jacquard_common::types::uri::RecordUri::try_from_uri( 108 + jacquard_common::types::string::AtUri::new_cow(uri.into())?, 109 + ) 110 + } 111 + } 112 + 113 + /// Typed wrapper for GetRecord response with this collection's record type. 114 + #[derive( 115 + serde::Serialize, 116 + serde::Deserialize, 117 + Debug, 118 + Clone, 119 + PartialEq, 120 + Eq, 121 + jacquard_derive::IntoStatic 122 + )] 123 + #[serde(rename_all = "camelCase")] 124 + pub struct PlayGetRecordOutput<'a> { 125 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 126 + #[serde(borrow)] 127 + pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>, 128 + #[serde(borrow)] 129 + pub uri: jacquard_common::types::string::AtUri<'a>, 130 + #[serde(borrow)] 131 + pub value: Play<'a>, 132 + } 133 + 134 + impl From<PlayGetRecordOutput<'_>> for Play<'_> { 135 + fn from(output: PlayGetRecordOutput<'_>) -> Self { 136 + use jacquard_common::IntoStatic; 137 + output.value.into_static() 138 + } 139 + } 140 + 141 + impl jacquard_common::types::collection::Collection for Play<'_> { 142 + const NSID: &'static str = "fm.teal.alpha.feed.play"; 143 + type Record = PlayRecord; 144 + } 145 + 146 + /// Marker type for deserializing records from this collection. 147 + #[derive(Debug, serde::Serialize, serde::Deserialize)] 148 + pub struct PlayRecord; 149 + impl jacquard_common::xrpc::XrpcResp for PlayRecord { 150 + const NSID: &'static str = "fm.teal.alpha.feed.play"; 151 + const ENCODING: &'static str = "application/json"; 152 + type Output<'de> = PlayGetRecordOutput<'de>; 153 + type Err<'de> = jacquard_common::types::collection::RecordError<'de>; 154 + } 155 + 156 + impl jacquard_common::types::collection::Collection for PlayRecord { 157 + const NSID: &'static str = "fm.teal.alpha.feed.play"; 158 + type Record = PlayRecord; 159 + }
+87
crates/jacquard-api/src/fm_teal/alpha/stats.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.stats.defs 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + pub mod get_latest; 9 + pub mod get_top_artists; 10 + pub mod get_top_releases; 11 + pub mod get_user_top_artists; 12 + pub mod get_user_top_releases; 13 + 14 + #[jacquard_derive::lexicon] 15 + #[derive( 16 + serde::Serialize, 17 + serde::Deserialize, 18 + Debug, 19 + Clone, 20 + PartialEq, 21 + Eq, 22 + jacquard_derive::IntoStatic, 23 + bon::Builder 24 + )] 25 + #[serde(rename_all = "camelCase")] 26 + pub struct ArtistView<'a> { 27 + /// MusicBrainz artist ID 28 + #[serde(borrow)] 29 + #[builder(into)] 30 + pub mbid: jacquard_common::CowStr<'a>, 31 + /// Artist name 32 + #[serde(borrow)] 33 + #[builder(into)] 34 + pub name: jacquard_common::CowStr<'a>, 35 + /// Total number of plays for this artist 36 + pub play_count: i64, 37 + } 38 + 39 + #[jacquard_derive::lexicon] 40 + #[derive( 41 + serde::Serialize, 42 + serde::Deserialize, 43 + Debug, 44 + Clone, 45 + PartialEq, 46 + Eq, 47 + jacquard_derive::IntoStatic, 48 + bon::Builder 49 + )] 50 + #[serde(rename_all = "camelCase")] 51 + pub struct RecordingView<'a> { 52 + /// MusicBrainz recording ID 53 + #[serde(borrow)] 54 + #[builder(into)] 55 + pub mbid: jacquard_common::CowStr<'a>, 56 + /// Recording/track name 57 + #[serde(borrow)] 58 + #[builder(into)] 59 + pub name: jacquard_common::CowStr<'a>, 60 + /// Total number of plays for this recording 61 + pub play_count: i64, 62 + } 63 + 64 + #[jacquard_derive::lexicon] 65 + #[derive( 66 + serde::Serialize, 67 + serde::Deserialize, 68 + Debug, 69 + Clone, 70 + PartialEq, 71 + Eq, 72 + jacquard_derive::IntoStatic, 73 + bon::Builder 74 + )] 75 + #[serde(rename_all = "camelCase")] 76 + pub struct ReleaseView<'a> { 77 + /// MusicBrainz release ID 78 + #[serde(borrow)] 79 + #[builder(into)] 80 + pub mbid: jacquard_common::CowStr<'a>, 81 + /// Release/album name 82 + #[serde(borrow)] 83 + #[builder(into)] 84 + pub name: jacquard_common::CowStr<'a>, 85 + /// Total number of plays for this release 86 + pub play_count: i64, 87 + }
+66
crates/jacquard-api/src/fm_teal/alpha/stats/get_latest.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.stats.getLatest 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[derive( 9 + serde::Serialize, 10 + serde::Deserialize, 11 + Debug, 12 + Clone, 13 + PartialEq, 14 + Eq, 15 + bon::Builder, 16 + jacquard_derive::IntoStatic 17 + )] 18 + #[builder(start_fn = new)] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct GetLatest { 21 + ///(default: 50, min: 1, max: 100) 22 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 23 + pub limit: std::option::Option<i64>, 24 + } 25 + 26 + #[jacquard_derive::lexicon] 27 + #[derive( 28 + serde::Serialize, 29 + serde::Deserialize, 30 + Debug, 31 + Clone, 32 + PartialEq, 33 + Eq, 34 + jacquard_derive::IntoStatic 35 + )] 36 + #[serde(rename_all = "camelCase")] 37 + pub struct GetLatestOutput<'a> { 38 + #[serde(borrow)] 39 + pub plays: Vec<crate::fm_teal::alpha::feed::PlayView<'a>>, 40 + } 41 + 42 + /// Response type for 43 + ///fm.teal.alpha.stats.getLatest 44 + pub struct GetLatestResponse; 45 + impl jacquard_common::xrpc::XrpcResp for GetLatestResponse { 46 + const NSID: &'static str = "fm.teal.alpha.stats.getLatest"; 47 + const ENCODING: &'static str = "application/json"; 48 + type Output<'de> = GetLatestOutput<'de>; 49 + type Err<'de> = jacquard_common::xrpc::GenericError<'de>; 50 + } 51 + 52 + impl jacquard_common::xrpc::XrpcRequest for GetLatest { 53 + const NSID: &'static str = "fm.teal.alpha.stats.getLatest"; 54 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 55 + type Response = GetLatestResponse; 56 + } 57 + 58 + /// Endpoint type for 59 + ///fm.teal.alpha.stats.getLatest 60 + pub struct GetLatestRequest; 61 + impl jacquard_common::xrpc::XrpcEndpoint for GetLatestRequest { 62 + const PATH: &'static str = "/xrpc/fm.teal.alpha.stats.getLatest"; 63 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 64 + type Request<'de> = GetLatest; 65 + type Response = GetLatestResponse; 66 + }
+79
crates/jacquard-api/src/fm_teal/alpha/stats/get_top_artists.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.stats.getTopArtists 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[derive( 9 + serde::Serialize, 10 + serde::Deserialize, 11 + Debug, 12 + Clone, 13 + PartialEq, 14 + Eq, 15 + bon::Builder, 16 + jacquard_derive::IntoStatic 17 + )] 18 + #[builder(start_fn = new)] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct GetTopArtists<'a> { 21 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 22 + #[serde(borrow)] 23 + #[builder(into)] 24 + pub cursor: std::option::Option<jacquard_common::CowStr<'a>>, 25 + ///(default: 50, min: 1, max: 100) 26 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 27 + pub limit: std::option::Option<i64>, 28 + ///(default: "all") 29 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 30 + #[serde(borrow)] 31 + #[builder(into)] 32 + pub period: std::option::Option<jacquard_common::CowStr<'a>>, 33 + } 34 + 35 + #[jacquard_derive::lexicon] 36 + #[derive( 37 + serde::Serialize, 38 + serde::Deserialize, 39 + Debug, 40 + Clone, 41 + PartialEq, 42 + Eq, 43 + jacquard_derive::IntoStatic 44 + )] 45 + #[serde(rename_all = "camelCase")] 46 + pub struct GetTopArtistsOutput<'a> { 47 + #[serde(borrow)] 48 + pub artists: Vec<crate::fm_teal::alpha::stats::ArtistView<'a>>, 49 + /// Next page cursor 50 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 51 + #[serde(borrow)] 52 + pub cursor: std::option::Option<jacquard_common::CowStr<'a>>, 53 + } 54 + 55 + /// Response type for 56 + ///fm.teal.alpha.stats.getTopArtists 57 + pub struct GetTopArtistsResponse; 58 + impl jacquard_common::xrpc::XrpcResp for GetTopArtistsResponse { 59 + const NSID: &'static str = "fm.teal.alpha.stats.getTopArtists"; 60 + const ENCODING: &'static str = "application/json"; 61 + type Output<'de> = GetTopArtistsOutput<'de>; 62 + type Err<'de> = jacquard_common::xrpc::GenericError<'de>; 63 + } 64 + 65 + impl<'a> jacquard_common::xrpc::XrpcRequest for GetTopArtists<'a> { 66 + const NSID: &'static str = "fm.teal.alpha.stats.getTopArtists"; 67 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 68 + type Response = GetTopArtistsResponse; 69 + } 70 + 71 + /// Endpoint type for 72 + ///fm.teal.alpha.stats.getTopArtists 73 + pub struct GetTopArtistsRequest; 74 + impl jacquard_common::xrpc::XrpcEndpoint for GetTopArtistsRequest { 75 + const PATH: &'static str = "/xrpc/fm.teal.alpha.stats.getTopArtists"; 76 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 77 + type Request<'de> = GetTopArtists<'de>; 78 + type Response = GetTopArtistsResponse; 79 + }
+79
crates/jacquard-api/src/fm_teal/alpha/stats/get_top_releases.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.stats.getTopReleases 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[derive( 9 + serde::Serialize, 10 + serde::Deserialize, 11 + Debug, 12 + Clone, 13 + PartialEq, 14 + Eq, 15 + bon::Builder, 16 + jacquard_derive::IntoStatic 17 + )] 18 + #[builder(start_fn = new)] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct GetTopReleases<'a> { 21 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 22 + #[serde(borrow)] 23 + #[builder(into)] 24 + pub cursor: std::option::Option<jacquard_common::CowStr<'a>>, 25 + ///(default: 50, min: 1, max: 100) 26 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 27 + pub limit: std::option::Option<i64>, 28 + ///(default: "all") 29 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 30 + #[serde(borrow)] 31 + #[builder(into)] 32 + pub period: std::option::Option<jacquard_common::CowStr<'a>>, 33 + } 34 + 35 + #[jacquard_derive::lexicon] 36 + #[derive( 37 + serde::Serialize, 38 + serde::Deserialize, 39 + Debug, 40 + Clone, 41 + PartialEq, 42 + Eq, 43 + jacquard_derive::IntoStatic 44 + )] 45 + #[serde(rename_all = "camelCase")] 46 + pub struct GetTopReleasesOutput<'a> { 47 + /// Next page cursor 48 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 49 + #[serde(borrow)] 50 + pub cursor: std::option::Option<jacquard_common::CowStr<'a>>, 51 + #[serde(borrow)] 52 + pub releases: Vec<crate::fm_teal::alpha::stats::ReleaseView<'a>>, 53 + } 54 + 55 + /// Response type for 56 + ///fm.teal.alpha.stats.getTopReleases 57 + pub struct GetTopReleasesResponse; 58 + impl jacquard_common::xrpc::XrpcResp for GetTopReleasesResponse { 59 + const NSID: &'static str = "fm.teal.alpha.stats.getTopReleases"; 60 + const ENCODING: &'static str = "application/json"; 61 + type Output<'de> = GetTopReleasesOutput<'de>; 62 + type Err<'de> = jacquard_common::xrpc::GenericError<'de>; 63 + } 64 + 65 + impl<'a> jacquard_common::xrpc::XrpcRequest for GetTopReleases<'a> { 66 + const NSID: &'static str = "fm.teal.alpha.stats.getTopReleases"; 67 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 68 + type Response = GetTopReleasesResponse; 69 + } 70 + 71 + /// Endpoint type for 72 + ///fm.teal.alpha.stats.getTopReleases 73 + pub struct GetTopReleasesRequest; 74 + impl jacquard_common::xrpc::XrpcEndpoint for GetTopReleasesRequest { 75 + const PATH: &'static str = "/xrpc/fm.teal.alpha.stats.getTopReleases"; 76 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 77 + type Request<'de> = GetTopReleases<'de>; 78 + type Response = GetTopReleasesResponse; 79 + }
+81
crates/jacquard-api/src/fm_teal/alpha/stats/get_user_top_artists.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.stats.getUserTopArtists 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[derive( 9 + serde::Serialize, 10 + serde::Deserialize, 11 + Debug, 12 + Clone, 13 + PartialEq, 14 + Eq, 15 + bon::Builder, 16 + jacquard_derive::IntoStatic 17 + )] 18 + #[builder(start_fn = new)] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct GetUserTopArtists<'a> { 21 + #[serde(borrow)] 22 + pub actor: jacquard_common::types::ident::AtIdentifier<'a>, 23 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 24 + #[serde(borrow)] 25 + #[builder(into)] 26 + pub cursor: std::option::Option<jacquard_common::CowStr<'a>>, 27 + ///(default: 50, min: 1, max: 100) 28 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 29 + pub limit: std::option::Option<i64>, 30 + ///(default: "30days") 31 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 32 + #[serde(borrow)] 33 + #[builder(into)] 34 + pub period: std::option::Option<jacquard_common::CowStr<'a>>, 35 + } 36 + 37 + #[jacquard_derive::lexicon] 38 + #[derive( 39 + serde::Serialize, 40 + serde::Deserialize, 41 + Debug, 42 + Clone, 43 + PartialEq, 44 + Eq, 45 + jacquard_derive::IntoStatic 46 + )] 47 + #[serde(rename_all = "camelCase")] 48 + pub struct GetUserTopArtistsOutput<'a> { 49 + #[serde(borrow)] 50 + pub artists: Vec<crate::fm_teal::alpha::stats::ArtistView<'a>>, 51 + /// Next page cursor 52 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 53 + #[serde(borrow)] 54 + pub cursor: std::option::Option<jacquard_common::CowStr<'a>>, 55 + } 56 + 57 + /// Response type for 58 + ///fm.teal.alpha.stats.getUserTopArtists 59 + pub struct GetUserTopArtistsResponse; 60 + impl jacquard_common::xrpc::XrpcResp for GetUserTopArtistsResponse { 61 + const NSID: &'static str = "fm.teal.alpha.stats.getUserTopArtists"; 62 + const ENCODING: &'static str = "application/json"; 63 + type Output<'de> = GetUserTopArtistsOutput<'de>; 64 + type Err<'de> = jacquard_common::xrpc::GenericError<'de>; 65 + } 66 + 67 + impl<'a> jacquard_common::xrpc::XrpcRequest for GetUserTopArtists<'a> { 68 + const NSID: &'static str = "fm.teal.alpha.stats.getUserTopArtists"; 69 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 70 + type Response = GetUserTopArtistsResponse; 71 + } 72 + 73 + /// Endpoint type for 74 + ///fm.teal.alpha.stats.getUserTopArtists 75 + pub struct GetUserTopArtistsRequest; 76 + impl jacquard_common::xrpc::XrpcEndpoint for GetUserTopArtistsRequest { 77 + const PATH: &'static str = "/xrpc/fm.teal.alpha.stats.getUserTopArtists"; 78 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 79 + type Request<'de> = GetUserTopArtists<'de>; 80 + type Response = GetUserTopArtistsResponse; 81 + }
+81
crates/jacquard-api/src/fm_teal/alpha/stats/get_user_top_releases.rs
··· 1 + // @generated by jacquard-lexicon. DO NOT EDIT. 2 + // 3 + // Lexicon: fm.teal.alpha.stats.getUserTopReleases 4 + // 5 + // This file was automatically generated from Lexicon schemas. 6 + // Any manual changes will be overwritten on the next regeneration. 7 + 8 + #[derive( 9 + serde::Serialize, 10 + serde::Deserialize, 11 + Debug, 12 + Clone, 13 + PartialEq, 14 + Eq, 15 + bon::Builder, 16 + jacquard_derive::IntoStatic 17 + )] 18 + #[builder(start_fn = new)] 19 + #[serde(rename_all = "camelCase")] 20 + pub struct GetUserTopReleases<'a> { 21 + #[serde(borrow)] 22 + pub actor: jacquard_common::types::ident::AtIdentifier<'a>, 23 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 24 + #[serde(borrow)] 25 + #[builder(into)] 26 + pub cursor: std::option::Option<jacquard_common::CowStr<'a>>, 27 + ///(default: 50, min: 1, max: 100) 28 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 29 + pub limit: std::option::Option<i64>, 30 + ///(default: "30days") 31 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 32 + #[serde(borrow)] 33 + #[builder(into)] 34 + pub period: std::option::Option<jacquard_common::CowStr<'a>>, 35 + } 36 + 37 + #[jacquard_derive::lexicon] 38 + #[derive( 39 + serde::Serialize, 40 + serde::Deserialize, 41 + Debug, 42 + Clone, 43 + PartialEq, 44 + Eq, 45 + jacquard_derive::IntoStatic 46 + )] 47 + #[serde(rename_all = "camelCase")] 48 + pub struct GetUserTopReleasesOutput<'a> { 49 + /// Next page cursor 50 + #[serde(skip_serializing_if = "std::option::Option::is_none")] 51 + #[serde(borrow)] 52 + pub cursor: std::option::Option<jacquard_common::CowStr<'a>>, 53 + #[serde(borrow)] 54 + pub releases: Vec<crate::fm_teal::alpha::stats::ReleaseView<'a>>, 55 + } 56 + 57 + /// Response type for 58 + ///fm.teal.alpha.stats.getUserTopReleases 59 + pub struct GetUserTopReleasesResponse; 60 + impl jacquard_common::xrpc::XrpcResp for GetUserTopReleasesResponse { 61 + const NSID: &'static str = "fm.teal.alpha.stats.getUserTopReleases"; 62 + const ENCODING: &'static str = "application/json"; 63 + type Output<'de> = GetUserTopReleasesOutput<'de>; 64 + type Err<'de> = jacquard_common::xrpc::GenericError<'de>; 65 + } 66 + 67 + impl<'a> jacquard_common::xrpc::XrpcRequest for GetUserTopReleases<'a> { 68 + const NSID: &'static str = "fm.teal.alpha.stats.getUserTopReleases"; 69 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 70 + type Response = GetUserTopReleasesResponse; 71 + } 72 + 73 + /// Endpoint type for 74 + ///fm.teal.alpha.stats.getUserTopReleases 75 + pub struct GetUserTopReleasesRequest; 76 + impl jacquard_common::xrpc::XrpcEndpoint for GetUserTopReleasesRequest { 77 + const PATH: &'static str = "/xrpc/fm.teal.alpha.stats.getUserTopReleases"; 78 + const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Query; 79 + type Request<'de> = GetUserTopReleases<'de>; 80 + type Response = GetUserTopReleasesResponse; 81 + }
+3
crates/jacquard-api/src/lib.rs
··· 75 75 #[cfg(feature = "events_smokesignal")] 76 76 pub mod events_smokesignal; 77 77 78 + #[cfg(feature = "fm_teal")] 79 + pub mod fm_teal; 80 + 78 81 #[cfg(feature = "fyi_frontpage")] 79 82 pub mod fyi_frontpage; 80 83
+5
lexicons.kdl
··· 99 99 repo "https://github.com/tsirysndr/rocksky-lexicons/" 100 100 pattern "lexicons/**/*.json" 101 101 } 102 + 103 + source "teal-fm" type="git" priority=50 { 104 + repo "https://github.com/teal-fm/teal" 105 + pattern "lexicons/**/*.json" 106 + }