@keystrokehq/spotify 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -0
  3. package/dist/_official/index.d.mts +32 -0
  4. package/dist/_official/index.mjs +3 -0
  5. package/dist/_runtime/index.d.mts +1 -0
  6. package/dist/_runtime/index.mjs +1 -0
  7. package/dist/albums.d.mts +265 -0
  8. package/dist/albums.mjs +72 -0
  9. package/dist/artists.d.mts +237 -0
  10. package/dist/artists.mjs +84 -0
  11. package/dist/audio-analysis.d.mts +91 -0
  12. package/dist/audio-analysis.mjs +19 -0
  13. package/dist/audio-features.d.mts +61 -0
  14. package/dist/audio-features.mjs +31 -0
  15. package/dist/audiobooks.d.mts +176 -0
  16. package/dist/audiobooks.mjs +59 -0
  17. package/dist/browse.d.mts +74 -0
  18. package/dist/browse.mjs +31 -0
  19. package/dist/categories.d.mts +118 -0
  20. package/dist/categories.mjs +66 -0
  21. package/dist/chapters.d.mts +163 -0
  22. package/dist/chapters.mjs +39 -0
  23. package/dist/client.d.mts +3486 -0
  24. package/dist/client.mjs +758 -0
  25. package/dist/connection.d.mts +2 -0
  26. package/dist/connection.mjs +3 -0
  27. package/dist/episodes.d.mts +149 -0
  28. package/dist/episodes.mjs +39 -0
  29. package/dist/errors.d.mts +34 -0
  30. package/dist/errors.mjs +89 -0
  31. package/dist/events.d.mts +613 -0
  32. package/dist/events.mjs +55 -0
  33. package/dist/factory-tZba6Hij.mjs +8 -0
  34. package/dist/follow.d.mts +83 -0
  35. package/dist/follow.mjs +65 -0
  36. package/dist/genres.d.mts +14 -0
  37. package/dist/genres.mjs +19 -0
  38. package/dist/index.d.mts +1 -0
  39. package/dist/index.mjs +1 -0
  40. package/dist/integration-DQ5Egd4f.d.mts +41 -0
  41. package/dist/integration-ykoImsCq.mjs +78 -0
  42. package/dist/library.d.mts +472 -0
  43. package/dist/library.mjs +225 -0
  44. package/dist/markets.d.mts +14 -0
  45. package/dist/markets.mjs +20 -0
  46. package/dist/me.d.mts +169 -0
  47. package/dist/me.mjs +58 -0
  48. package/dist/messaging.d.mts +1 -0
  49. package/dist/messaging.mjs +1 -0
  50. package/dist/operations.d.mts +6 -0
  51. package/dist/operations.mjs +237 -0
  52. package/dist/player.d.mts +877 -0
  53. package/dist/player.mjs +220 -0
  54. package/dist/playlists.d.mts +546 -0
  55. package/dist/playlists.mjs +243 -0
  56. package/dist/recommendations.d.mts +144 -0
  57. package/dist/recommendations.mjs +137 -0
  58. package/dist/schemas.d.mts +3312 -0
  59. package/dist/schemas.mjs +460 -0
  60. package/dist/search.d.mts +389 -0
  61. package/dist/search.mjs +42 -0
  62. package/dist/shows.d.mts +159 -0
  63. package/dist/shows.mjs +59 -0
  64. package/dist/tracks.d.mts +173 -0
  65. package/dist/tracks.mjs +37 -0
  66. package/dist/triggers.d.mts +45 -0
  67. package/dist/triggers.mjs +201 -0
  68. package/dist/users.d.mts +35 -0
  69. package/dist/users.mjs +20 -0
  70. package/dist/verification.d.mts +1 -0
  71. package/dist/verification.mjs +1 -0
  72. package/package.json +187 -0
@@ -0,0 +1,243 @@
1
+ import { spotifyBooleanListSchema, spotifyIdSchema, spotifyMarketSchema, spotifyMutationSuccessSchema, spotifyPlaylistImageSchema, spotifyPlaylistItemPageSchema, spotifyPlaylistPageSchema, spotifyPlaylistSchema, spotifySnapshotResponseSchema, spotifyUriSchema } from "./schemas.mjs";
2
+ import { createSpotifyClient } from "./client.mjs";
3
+ import { t as spotifyOperation } from "./factory-tZba6Hij.mjs";
4
+ import { z } from "zod";
5
+
6
+ //#region src/playlists.ts
7
+ const playlistPaginationInputSchema = z.object({
8
+ limit: z.number().int().positive().max(50).optional(),
9
+ offset: z.number().int().nonnegative().optional()
10
+ });
11
+ const playlistIdInputSchema = z.object({ playlistId: spotifyIdSchema });
12
+ const playlistAdditionalTypeSchema = z.enum(["track", "episode"]);
13
+ const createPlaylistInputSchema = z.object({
14
+ name: z.string().trim().min(1),
15
+ public: z.boolean().optional(),
16
+ collaborative: z.boolean().optional(),
17
+ description: z.string().optional()
18
+ });
19
+ const getPlaylistInputSchema = playlistIdInputSchema.extend({
20
+ market: spotifyMarketSchema.optional(),
21
+ fields: z.string().trim().min(1).optional(),
22
+ additionalTypes: z.array(playlistAdditionalTypeSchema).min(1).optional()
23
+ });
24
+ const updatePlaylistDetailsInputSchema = playlistIdInputSchema.extend({
25
+ name: z.string().trim().min(1).optional(),
26
+ public: z.boolean().optional(),
27
+ collaborative: z.boolean().optional(),
28
+ description: z.string().optional()
29
+ });
30
+ const getPlaylistItemsInputSchema = getPlaylistInputSchema.extend({
31
+ limit: z.number().int().positive().max(100).optional(),
32
+ offset: z.number().int().nonnegative().optional()
33
+ });
34
+ const addItemsToPlaylistInputSchema = playlistIdInputSchema.extend({
35
+ uris: z.array(spotifyUriSchema).min(1).max(100),
36
+ position: z.number().int().nonnegative().optional()
37
+ });
38
+ const reorderPlaylistItemsInputSchema = playlistIdInputSchema.extend({
39
+ mode: z.literal("reorder"),
40
+ rangeStart: z.number().int().nonnegative(),
41
+ insertBefore: z.number().int().nonnegative(),
42
+ rangeLength: z.number().int().positive().optional(),
43
+ snapshotId: z.string().trim().min(1).optional()
44
+ });
45
+ const replacePlaylistItemsInputSchema = playlistIdInputSchema.extend({
46
+ mode: z.literal("replace"),
47
+ uris: z.array(spotifyUriSchema).min(1).max(100)
48
+ });
49
+ const playlistTrackRemovalSchema = z.object({
50
+ uri: spotifyUriSchema,
51
+ positions: z.array(z.number().int().nonnegative()).min(1).optional()
52
+ });
53
+ const removeItemsFromPlaylistInputSchema = playlistIdInputSchema.extend({
54
+ tracks: z.array(playlistTrackRemovalSchema).min(1).max(100),
55
+ snapshotId: z.string().trim().min(1).optional()
56
+ });
57
+ const listUserPlaylistsInputSchema = playlistPaginationInputSchema.extend({ userId: spotifyIdSchema });
58
+ const followPlaylistInputSchema = playlistIdInputSchema.extend({ public: z.boolean().optional() });
59
+ const checkUsersFollowPlaylistInputSchema = playlistIdInputSchema.extend({ userIds: z.array(spotifyIdSchema).min(1).max(5) });
60
+ const uploadPlaylistCoverImageInputSchema = playlistIdInputSchema.extend({ imageBase64: z.string().trim().min(1) });
61
+ const playlistCoverImageResponseSchema = z.object({ images: z.array(spotifyPlaylistImageSchema) });
62
+ const createPlaylist = spotifyOperation({
63
+ id: "create_playlist",
64
+ name: "Create Playlist",
65
+ description: "Create a Spotify playlist for the connected account.",
66
+ input: createPlaylistInputSchema,
67
+ output: spotifyPlaylistSchema,
68
+ needsApproval: true,
69
+ run: async (input, credentials) => {
70
+ return createSpotifyClient(credentials).playlists.createPlaylist(input);
71
+ }
72
+ });
73
+ const getPlaylist = spotifyOperation({
74
+ id: "get_playlist",
75
+ name: "Get Playlist",
76
+ description: "Fetch a Spotify playlist by ID.",
77
+ input: getPlaylistInputSchema,
78
+ output: spotifyPlaylistSchema,
79
+ run: async (input, credentials) => {
80
+ return createSpotifyClient(credentials).playlists.getPlaylist(input.playlistId, {
81
+ market: input.market,
82
+ fields: input.fields,
83
+ additional_types: input.additionalTypes
84
+ });
85
+ }
86
+ });
87
+ const updatePlaylistDetails = spotifyOperation({
88
+ id: "update_playlist_details",
89
+ name: "Update Playlist Details",
90
+ description: "Update a Spotify playlist name, privacy, collaboration, or description.",
91
+ input: updatePlaylistDetailsInputSchema,
92
+ output: spotifyMutationSuccessSchema,
93
+ needsApproval: true,
94
+ run: async (input, credentials) => {
95
+ return createSpotifyClient(credentials).playlists.updatePlaylistDetails(input.playlistId, {
96
+ name: input.name,
97
+ public: input.public,
98
+ collaborative: input.collaborative,
99
+ description: input.description
100
+ });
101
+ }
102
+ });
103
+ const getPlaylistItems = spotifyOperation({
104
+ id: "get_playlist_items",
105
+ name: "Get Playlist Items",
106
+ description: "List tracks and episodes in a Spotify playlist.",
107
+ input: getPlaylistItemsInputSchema,
108
+ output: spotifyPlaylistItemPageSchema,
109
+ run: async (input, credentials) => {
110
+ return createSpotifyClient(credentials).playlists.getPlaylistItems(input.playlistId, {
111
+ market: input.market,
112
+ fields: input.fields,
113
+ limit: input.limit,
114
+ offset: input.offset,
115
+ additional_types: input.additionalTypes
116
+ });
117
+ }
118
+ });
119
+ const getPlaylistCoverImage = spotifyOperation({
120
+ id: "get_playlist_cover_image",
121
+ name: "Get Playlist Cover Image",
122
+ description: "Fetch cover images for a Spotify playlist.",
123
+ input: playlistIdInputSchema,
124
+ output: playlistCoverImageResponseSchema,
125
+ run: async (input, credentials) => {
126
+ return createSpotifyClient(credentials).playlists.getPlaylistCoverImage(input.playlistId);
127
+ }
128
+ });
129
+ const addItemsToPlaylist = spotifyOperation({
130
+ id: "add_items_to_playlist",
131
+ name: "Add Items To Playlist",
132
+ description: "Add tracks or episodes to a Spotify playlist.",
133
+ input: addItemsToPlaylistInputSchema,
134
+ output: spotifySnapshotResponseSchema,
135
+ needsApproval: true,
136
+ run: async (input, credentials) => {
137
+ return createSpotifyClient(credentials).playlists.addItemsToPlaylist(input.playlistId, {
138
+ uris: input.uris,
139
+ position: input.position
140
+ });
141
+ }
142
+ });
143
+ const reorderOrReplacePlaylistItems = spotifyOperation({
144
+ id: "reorder_or_replace_playlist_items",
145
+ name: "Reorder Or Replace Playlist Items",
146
+ description: "Reorder existing playlist items or replace the full playlist contents.",
147
+ input: z.discriminatedUnion("mode", [reorderPlaylistItemsInputSchema, replacePlaylistItemsInputSchema]),
148
+ output: spotifySnapshotResponseSchema,
149
+ needsApproval: true,
150
+ run: async (input, credentials) => {
151
+ const client = createSpotifyClient(credentials);
152
+ if (input.mode === "reorder") return client.playlists.reorderPlaylistItems(input.playlistId, {
153
+ rangeStart: input.rangeStart,
154
+ insertBefore: input.insertBefore,
155
+ rangeLength: input.rangeLength,
156
+ snapshotId: input.snapshotId
157
+ });
158
+ return client.playlists.replacePlaylistItems(input.playlistId, { uris: input.uris });
159
+ }
160
+ });
161
+ const removeItemsFromPlaylist = spotifyOperation({
162
+ id: "remove_items_from_playlist",
163
+ name: "Remove Items From Playlist",
164
+ description: "Remove specific tracks or episodes from a Spotify playlist.",
165
+ input: removeItemsFromPlaylistInputSchema,
166
+ output: spotifySnapshotResponseSchema,
167
+ needsApproval: true,
168
+ run: async (input, credentials) => {
169
+ return createSpotifyClient(credentials).playlists.removeItemsFromPlaylist(input.playlistId, {
170
+ tracks: input.tracks,
171
+ snapshotId: input.snapshotId
172
+ });
173
+ }
174
+ });
175
+ const listMyPlaylists = spotifyOperation({
176
+ id: "list_my_playlists",
177
+ name: "List My Playlists",
178
+ description: "List Spotify playlists owned or followed by the connected account.",
179
+ input: playlistPaginationInputSchema,
180
+ output: spotifyPlaylistPageSchema,
181
+ run: async (input, credentials) => {
182
+ return createSpotifyClient(credentials).playlists.listMyPlaylists(input);
183
+ }
184
+ });
185
+ const listUserPlaylists = spotifyOperation({
186
+ id: "list_user_playlists",
187
+ name: "List User Playlists",
188
+ description: "List public Spotify playlists for a given user.",
189
+ input: listUserPlaylistsInputSchema,
190
+ output: spotifyPlaylistPageSchema,
191
+ run: async (input, credentials) => {
192
+ return createSpotifyClient(credentials).playlists.listUserPlaylists(input.userId, {
193
+ limit: input.limit,
194
+ offset: input.offset
195
+ });
196
+ }
197
+ });
198
+ const followPlaylist = spotifyOperation({
199
+ id: "follow_playlist",
200
+ name: "Follow Playlist",
201
+ description: "Follow a Spotify playlist for the connected account.",
202
+ input: followPlaylistInputSchema,
203
+ output: spotifyMutationSuccessSchema,
204
+ needsApproval: true,
205
+ run: async (input, credentials) => {
206
+ return createSpotifyClient(credentials).playlists.followPlaylist(input.playlistId, { public: input.public });
207
+ }
208
+ });
209
+ const unfollowPlaylist = spotifyOperation({
210
+ id: "unfollow_playlist",
211
+ name: "Unfollow Playlist",
212
+ description: "Unfollow a Spotify playlist for the connected account.",
213
+ input: playlistIdInputSchema,
214
+ output: spotifyMutationSuccessSchema,
215
+ needsApproval: true,
216
+ run: async (input, credentials) => {
217
+ return createSpotifyClient(credentials).playlists.unfollowPlaylist(input.playlistId);
218
+ }
219
+ });
220
+ const checkUsersFollowPlaylist = spotifyOperation({
221
+ id: "check_users_follow_playlist",
222
+ name: "Check Users Follow Playlist",
223
+ description: "Check whether specific Spotify users follow a playlist.",
224
+ input: checkUsersFollowPlaylistInputSchema,
225
+ output: spotifyBooleanListSchema,
226
+ run: async (input, credentials) => {
227
+ return createSpotifyClient(credentials).playlists.checkUsersFollowPlaylist(input.playlistId, input.userIds);
228
+ }
229
+ });
230
+ const uploadPlaylistCoverImage = spotifyOperation({
231
+ id: "upload_playlist_cover_image",
232
+ name: "Upload Playlist Cover Image",
233
+ description: "Replace the cover image for a Spotify playlist.",
234
+ input: uploadPlaylistCoverImageInputSchema,
235
+ output: spotifyMutationSuccessSchema,
236
+ needsApproval: true,
237
+ run: async (input, credentials) => {
238
+ return createSpotifyClient(credentials).playlists.uploadPlaylistCoverImage(input.playlistId, input.imageBase64);
239
+ }
240
+ });
241
+
242
+ //#endregion
243
+ export { addItemsToPlaylist, checkUsersFollowPlaylist, createPlaylist, followPlaylist, getPlaylist, getPlaylistCoverImage, getPlaylistItems, listMyPlaylists, listUserPlaylists, removeItemsFromPlaylist, reorderOrReplacePlaylistItems, unfollowPlaylist, updatePlaylistDetails, uploadPlaylistCoverImage };
@@ -0,0 +1,144 @@
1
+ import { z } from "zod";
2
+ import * as _keystrokehq_core0 from "@keystrokehq/core";
3
+ import * as _keystrokehq_core_credential_set0 from "@keystrokehq/core/credential-set";
4
+
5
+ //#region src/recommendations.d.ts
6
+ declare const getRecommendations: _keystrokehq_core0.Operation<z.ZodObject<{
7
+ seedArtists: z.ZodOptional<z.ZodArray<z.ZodString>>;
8
+ seedGenres: z.ZodOptional<z.ZodArray<z.ZodString>>;
9
+ seedTracks: z.ZodOptional<z.ZodArray<z.ZodString>>;
10
+ market: z.ZodOptional<z.ZodString>;
11
+ limit: z.ZodOptional<z.ZodNumber>;
12
+ minAcousticness: z.ZodOptional<z.ZodNumber>;
13
+ maxAcousticness: z.ZodOptional<z.ZodNumber>;
14
+ targetAcousticness: z.ZodOptional<z.ZodNumber>;
15
+ minDanceability: z.ZodOptional<z.ZodNumber>;
16
+ maxDanceability: z.ZodOptional<z.ZodNumber>;
17
+ targetDanceability: z.ZodOptional<z.ZodNumber>;
18
+ minDurationMs: z.ZodOptional<z.ZodNumber>;
19
+ maxDurationMs: z.ZodOptional<z.ZodNumber>;
20
+ targetDurationMs: z.ZodOptional<z.ZodNumber>;
21
+ minEnergy: z.ZodOptional<z.ZodNumber>;
22
+ maxEnergy: z.ZodOptional<z.ZodNumber>;
23
+ targetEnergy: z.ZodOptional<z.ZodNumber>;
24
+ minInstrumentalness: z.ZodOptional<z.ZodNumber>;
25
+ maxInstrumentalness: z.ZodOptional<z.ZodNumber>;
26
+ targetInstrumentalness: z.ZodOptional<z.ZodNumber>;
27
+ minKey: z.ZodOptional<z.ZodNumber>;
28
+ maxKey: z.ZodOptional<z.ZodNumber>;
29
+ targetKey: z.ZodOptional<z.ZodNumber>;
30
+ minLiveness: z.ZodOptional<z.ZodNumber>;
31
+ maxLiveness: z.ZodOptional<z.ZodNumber>;
32
+ targetLiveness: z.ZodOptional<z.ZodNumber>;
33
+ minLoudness: z.ZodOptional<z.ZodNumber>;
34
+ maxLoudness: z.ZodOptional<z.ZodNumber>;
35
+ targetLoudness: z.ZodOptional<z.ZodNumber>;
36
+ minMode: z.ZodOptional<z.ZodNumber>;
37
+ maxMode: z.ZodOptional<z.ZodNumber>;
38
+ targetMode: z.ZodOptional<z.ZodNumber>;
39
+ minPopularity: z.ZodOptional<z.ZodNumber>;
40
+ maxPopularity: z.ZodOptional<z.ZodNumber>;
41
+ targetPopularity: z.ZodOptional<z.ZodNumber>;
42
+ minSpeechiness: z.ZodOptional<z.ZodNumber>;
43
+ maxSpeechiness: z.ZodOptional<z.ZodNumber>;
44
+ targetSpeechiness: z.ZodOptional<z.ZodNumber>;
45
+ minTempo: z.ZodOptional<z.ZodNumber>;
46
+ maxTempo: z.ZodOptional<z.ZodNumber>;
47
+ targetTempo: z.ZodOptional<z.ZodNumber>;
48
+ minTimeSignature: z.ZodOptional<z.ZodNumber>;
49
+ maxTimeSignature: z.ZodOptional<z.ZodNumber>;
50
+ targetTimeSignature: z.ZodOptional<z.ZodNumber>;
51
+ minValence: z.ZodOptional<z.ZodNumber>;
52
+ maxValence: z.ZodOptional<z.ZodNumber>;
53
+ targetValence: z.ZodOptional<z.ZodNumber>;
54
+ }, z.core.$strip>, z.ZodObject<{
55
+ seeds: z.ZodArray<z.ZodObject<{
56
+ afterFilteringSize: z.ZodOptional<z.ZodNumber>;
57
+ afterRelinkingSize: z.ZodOptional<z.ZodNumber>;
58
+ href: z.ZodOptional<z.ZodURL>;
59
+ id: z.ZodString;
60
+ initialPoolSize: z.ZodOptional<z.ZodNumber>;
61
+ type: z.ZodString;
62
+ }, z.core.$strip>>;
63
+ tracks: z.ZodArray<z.ZodObject<{
64
+ album: z.ZodOptional<z.ZodObject<{
65
+ albumType: z.ZodOptional<z.ZodEnum<{
66
+ album: "album";
67
+ single: "single";
68
+ compilation: "compilation";
69
+ }>>;
70
+ artists: z.ZodArray<z.ZodObject<{
71
+ externalUrls: z.ZodOptional<z.ZodObject<{
72
+ spotify: z.ZodOptional<z.ZodURL>;
73
+ }, z.core.$strip>>;
74
+ href: z.ZodOptional<z.ZodURL>;
75
+ id: z.ZodString;
76
+ name: z.ZodString;
77
+ type: z.ZodLiteral<"artist">;
78
+ uri: z.ZodOptional<z.ZodString>;
79
+ }, z.core.$strip>>;
80
+ availableMarkets: z.ZodOptional<z.ZodArray<z.ZodString>>;
81
+ externalUrls: z.ZodOptional<z.ZodObject<{
82
+ spotify: z.ZodOptional<z.ZodURL>;
83
+ }, z.core.$strip>>;
84
+ href: z.ZodOptional<z.ZodURL>;
85
+ id: z.ZodString;
86
+ images: z.ZodArray<z.ZodObject<{
87
+ url: z.ZodURL;
88
+ height: z.ZodNullable<z.ZodNumber>;
89
+ width: z.ZodNullable<z.ZodNumber>;
90
+ }, z.core.$strip>>;
91
+ name: z.ZodString;
92
+ releaseDate: z.ZodOptional<z.ZodString>;
93
+ releaseDatePrecision: z.ZodOptional<z.ZodEnum<{
94
+ year: "year";
95
+ month: "month";
96
+ day: "day";
97
+ }>>;
98
+ totalTracks: z.ZodOptional<z.ZodNumber>;
99
+ type: z.ZodLiteral<"album">;
100
+ uri: z.ZodOptional<z.ZodString>;
101
+ }, z.core.$strip>>;
102
+ artists: z.ZodArray<z.ZodObject<{
103
+ externalUrls: z.ZodOptional<z.ZodObject<{
104
+ spotify: z.ZodOptional<z.ZodURL>;
105
+ }, z.core.$strip>>;
106
+ href: z.ZodOptional<z.ZodURL>;
107
+ id: z.ZodString;
108
+ name: z.ZodString;
109
+ type: z.ZodLiteral<"artist">;
110
+ uri: z.ZodOptional<z.ZodString>;
111
+ }, z.core.$strip>>;
112
+ availableMarkets: z.ZodOptional<z.ZodArray<z.ZodString>>;
113
+ discNumber: z.ZodOptional<z.ZodNumber>;
114
+ durationMs: z.ZodNumber;
115
+ explicit: z.ZodBoolean;
116
+ externalIds: z.ZodOptional<z.ZodObject<{
117
+ isrc: z.ZodOptional<z.ZodString>;
118
+ ean: z.ZodOptional<z.ZodString>;
119
+ upc: z.ZodOptional<z.ZodString>;
120
+ }, z.core.$strip>>;
121
+ externalUrls: z.ZodOptional<z.ZodObject<{
122
+ spotify: z.ZodOptional<z.ZodURL>;
123
+ }, z.core.$strip>>;
124
+ href: z.ZodOptional<z.ZodURL>;
125
+ id: z.ZodString;
126
+ isLocal: z.ZodOptional<z.ZodBoolean>;
127
+ isPlayable: z.ZodOptional<z.ZodBoolean>;
128
+ name: z.ZodString;
129
+ popularity: z.ZodOptional<z.ZodNumber>;
130
+ previewUrl: z.ZodOptional<z.ZodUnion<readonly [z.ZodURL, z.ZodNull]>>;
131
+ restrictions: z.ZodOptional<z.ZodObject<{
132
+ reason: z.ZodString;
133
+ }, z.core.$strip>>;
134
+ trackNumber: z.ZodOptional<z.ZodNumber>;
135
+ type: z.ZodLiteral<"track">;
136
+ uri: z.ZodOptional<z.ZodString>;
137
+ }, z.core.$strip>>;
138
+ }, z.core.$strip>, readonly [_keystrokehq_core0.CredentialSet<"spotify", z.ZodObject<{
139
+ SPOTIFY_ACCESS_TOKEN: z.ZodString;
140
+ }, z.core.$strip>, readonly _keystrokehq_core_credential_set0.CredentialConnection<z.ZodObject<{
141
+ SPOTIFY_ACCESS_TOKEN: z.ZodString;
142
+ }, z.core.$strip>>[] | undefined>], undefined>;
143
+ //#endregion
144
+ export { getRecommendations };
@@ -0,0 +1,137 @@
1
+ import { spotifyIdSchema, spotifyMarketSchema, spotifyRecommendationsSchema } from "./schemas.mjs";
2
+ import { createSpotifyClient } from "./client.mjs";
3
+ import { t as spotifyOperation } from "./factory-tZba6Hij.mjs";
4
+ import { z } from "zod";
5
+
6
+ //#region src/recommendations.ts
7
+ const recommendationNumberSchema = z.number().min(0).max(1);
8
+ const recommendationKeySchema = z.number().int().min(0).max(11);
9
+ const recommendationModeSchema = z.number().int().min(0).max(1);
10
+ const recommendationPopularitySchema = z.number().int().min(0).max(100);
11
+ const recommendationTempoSchema = z.number().nonnegative();
12
+ const recommendationDurationSchema = z.number().int().nonnegative();
13
+ const recommendationTimeSignatureSchema = z.number().int().positive();
14
+ const recommendationSeedIdListSchema = z.array(spotifyIdSchema).max(5).optional();
15
+ const recommendationSeedGenreListSchema = z.array(z.string().min(1)).max(5).optional();
16
+ const recommendationInputSchema = z.object({
17
+ seedArtists: recommendationSeedIdListSchema,
18
+ seedGenres: recommendationSeedGenreListSchema,
19
+ seedTracks: recommendationSeedIdListSchema,
20
+ market: spotifyMarketSchema.optional(),
21
+ limit: z.number().int().positive().max(100).optional(),
22
+ minAcousticness: recommendationNumberSchema.optional(),
23
+ maxAcousticness: recommendationNumberSchema.optional(),
24
+ targetAcousticness: recommendationNumberSchema.optional(),
25
+ minDanceability: recommendationNumberSchema.optional(),
26
+ maxDanceability: recommendationNumberSchema.optional(),
27
+ targetDanceability: recommendationNumberSchema.optional(),
28
+ minDurationMs: recommendationDurationSchema.optional(),
29
+ maxDurationMs: recommendationDurationSchema.optional(),
30
+ targetDurationMs: recommendationDurationSchema.optional(),
31
+ minEnergy: recommendationNumberSchema.optional(),
32
+ maxEnergy: recommendationNumberSchema.optional(),
33
+ targetEnergy: recommendationNumberSchema.optional(),
34
+ minInstrumentalness: recommendationNumberSchema.optional(),
35
+ maxInstrumentalness: recommendationNumberSchema.optional(),
36
+ targetInstrumentalness: recommendationNumberSchema.optional(),
37
+ minKey: recommendationKeySchema.optional(),
38
+ maxKey: recommendationKeySchema.optional(),
39
+ targetKey: recommendationKeySchema.optional(),
40
+ minLiveness: recommendationNumberSchema.optional(),
41
+ maxLiveness: recommendationNumberSchema.optional(),
42
+ targetLiveness: recommendationNumberSchema.optional(),
43
+ minLoudness: z.number().optional(),
44
+ maxLoudness: z.number().optional(),
45
+ targetLoudness: z.number().optional(),
46
+ minMode: recommendationModeSchema.optional(),
47
+ maxMode: recommendationModeSchema.optional(),
48
+ targetMode: recommendationModeSchema.optional(),
49
+ minPopularity: recommendationPopularitySchema.optional(),
50
+ maxPopularity: recommendationPopularitySchema.optional(),
51
+ targetPopularity: recommendationPopularitySchema.optional(),
52
+ minSpeechiness: recommendationNumberSchema.optional(),
53
+ maxSpeechiness: recommendationNumberSchema.optional(),
54
+ targetSpeechiness: recommendationNumberSchema.optional(),
55
+ minTempo: recommendationTempoSchema.optional(),
56
+ maxTempo: recommendationTempoSchema.optional(),
57
+ targetTempo: recommendationTempoSchema.optional(),
58
+ minTimeSignature: recommendationTimeSignatureSchema.optional(),
59
+ maxTimeSignature: recommendationTimeSignatureSchema.optional(),
60
+ targetTimeSignature: recommendationTimeSignatureSchema.optional(),
61
+ minValence: recommendationNumberSchema.optional(),
62
+ maxValence: recommendationNumberSchema.optional(),
63
+ targetValence: recommendationNumberSchema.optional()
64
+ }).superRefine((input, ctx) => {
65
+ const seedCount = (input.seedArtists?.length ?? 0) + (input.seedGenres?.length ?? 0) + (input.seedTracks?.length ?? 0);
66
+ if (seedCount === 0) ctx.addIssue({
67
+ code: z.ZodIssueCode.custom,
68
+ message: "At least one recommendation seed is required.",
69
+ path: ["seedArtists"]
70
+ });
71
+ if (seedCount > 5) ctx.addIssue({
72
+ code: z.ZodIssueCode.custom,
73
+ message: "Spotify recommendations support at most 5 combined seeds.",
74
+ path: ["seedArtists"]
75
+ });
76
+ });
77
+ const getRecommendations = spotifyOperation({
78
+ id: "get_spotify_recommendations",
79
+ name: "Get Spotify Recommendations",
80
+ description: "Generate Spotify track recommendations from seeds and tunable audio targets.",
81
+ input: recommendationInputSchema,
82
+ output: spotifyRecommendationsSchema,
83
+ run: async (input, credentials) => {
84
+ return createSpotifyClient(credentials).recommendations.getRecommendations({
85
+ seed_artists: input.seedArtists,
86
+ seed_genres: input.seedGenres,
87
+ seed_tracks: input.seedTracks,
88
+ market: input.market,
89
+ limit: input.limit,
90
+ min_acousticness: input.minAcousticness,
91
+ max_acousticness: input.maxAcousticness,
92
+ target_acousticness: input.targetAcousticness,
93
+ min_danceability: input.minDanceability,
94
+ max_danceability: input.maxDanceability,
95
+ target_danceability: input.targetDanceability,
96
+ min_duration_ms: input.minDurationMs,
97
+ max_duration_ms: input.maxDurationMs,
98
+ target_duration_ms: input.targetDurationMs,
99
+ min_energy: input.minEnergy,
100
+ max_energy: input.maxEnergy,
101
+ target_energy: input.targetEnergy,
102
+ min_instrumentalness: input.minInstrumentalness,
103
+ max_instrumentalness: input.maxInstrumentalness,
104
+ target_instrumentalness: input.targetInstrumentalness,
105
+ min_key: input.minKey,
106
+ max_key: input.maxKey,
107
+ target_key: input.targetKey,
108
+ min_liveness: input.minLiveness,
109
+ max_liveness: input.maxLiveness,
110
+ target_liveness: input.targetLiveness,
111
+ min_loudness: input.minLoudness,
112
+ max_loudness: input.maxLoudness,
113
+ target_loudness: input.targetLoudness,
114
+ min_mode: input.minMode,
115
+ max_mode: input.maxMode,
116
+ target_mode: input.targetMode,
117
+ min_popularity: input.minPopularity,
118
+ max_popularity: input.maxPopularity,
119
+ target_popularity: input.targetPopularity,
120
+ min_speechiness: input.minSpeechiness,
121
+ max_speechiness: input.maxSpeechiness,
122
+ target_speechiness: input.targetSpeechiness,
123
+ min_tempo: input.minTempo,
124
+ max_tempo: input.maxTempo,
125
+ target_tempo: input.targetTempo,
126
+ min_time_signature: input.minTimeSignature,
127
+ max_time_signature: input.maxTimeSignature,
128
+ target_time_signature: input.targetTimeSignature,
129
+ min_valence: input.minValence,
130
+ max_valence: input.maxValence,
131
+ target_valence: input.targetValence
132
+ });
133
+ }
134
+ });
135
+
136
+ //#endregion
137
+ export { getRecommendations };