+1
crates/jacquard-api/Cargo.toml
+1
crates/jacquard-api/Cargo.toml
+90
crates/jacquard-api/lexicons/fm_teal_alpha_actor_defs.json
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+6
crates/jacquard-api/src/fm_teal.rs
+8
crates/jacquard-api/src/fm_teal/alpha.rs
+8
crates/jacquard-api/src/fm_teal/alpha.rs
+118
crates/jacquard-api/src/fm_teal/alpha/actor.rs
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+3
crates/jacquard-api/src/lib.rs