@purpleschool/gptbot-tools 0.2.48 → 0.2.50

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 (47) hide show
  1. package/build/music/commands/add-track-to-music-playlist.command.js +23 -0
  2. package/build/music/commands/boost-music-style.command.js +17 -0
  3. package/build/music/commands/create-music-playlist.command.js +22 -0
  4. package/build/music/commands/delete-music-playlist.command.js +21 -0
  5. package/build/music/commands/edit-music.command.js +11 -0
  6. package/build/music/commands/generate-music.command.js +5 -0
  7. package/build/music/commands/index.js +7 -0
  8. package/build/music/commands/remove-track-from-music-playlist.command.js +23 -0
  9. package/build/music/commands/update-music-playlist.command.js +23 -0
  10. package/build/music/enums/index.js +3 -0
  11. package/build/music/enums/music-action-type.enum.js +7 -0
  12. package/build/music/enums/music-audio-action-type.enum.js +12 -0
  13. package/build/music/enums/music-generation-action-type.enum.js +10 -0
  14. package/build/music/enums/music-lyrics-structure.enum.js +9 -0
  15. package/build/music/models/index.js +1 -0
  16. package/build/music/models/music-config-with-vendors.schema.js +2 -0
  17. package/build/music/models/music-config.schema.js +4 -1
  18. package/build/music/models/music-job.schema.js +133 -2
  19. package/build/music/models/music-playlist.schema.js +15 -0
  20. package/build/music/models/music-track.schema.js +11 -0
  21. package/build/music/queries/find-music-playlists.query.js +21 -0
  22. package/build/music/queries/index.js +1 -0
  23. package/build/music/routes/music.amqp.routes.js +8 -0
  24. package/music/commands/add-track-to-music-playlist.command.ts +26 -0
  25. package/music/commands/boost-music-style.command.ts +19 -0
  26. package/music/commands/create-music-playlist.command.ts +25 -0
  27. package/music/commands/delete-music-playlist.command.ts +24 -0
  28. package/music/commands/edit-music.command.ts +13 -0
  29. package/music/commands/generate-music.command.ts +5 -0
  30. package/music/commands/index.ts +7 -0
  31. package/music/commands/remove-track-from-music-playlist.command.ts +26 -0
  32. package/music/commands/update-music-playlist.command.ts +26 -0
  33. package/music/enums/index.ts +3 -0
  34. package/music/enums/music-action-type.enum.ts +7 -0
  35. package/music/enums/music-audio-action-type.enum.ts +8 -0
  36. package/music/enums/music-generation-action-type.enum.ts +6 -0
  37. package/music/enums/music-lyrics-structure.enum.ts +5 -0
  38. package/music/models/index.ts +1 -0
  39. package/music/models/music-config-with-vendors.schema.ts +2 -0
  40. package/music/models/music-config.schema.ts +8 -0
  41. package/music/models/music-job.schema.ts +173 -2
  42. package/music/models/music-playlist.schema.ts +15 -0
  43. package/music/models/music-track.schema.ts +12 -0
  44. package/music/queries/find-music-playlists.query.ts +24 -0
  45. package/music/queries/index.ts +1 -0
  46. package/music/routes/music.amqp.routes.ts +8 -0
  47. package/package.json +2 -2
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AddTrackToMusicPlaylistCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const command_response_schema_1 = require("../../common/models/command-response.schema");
6
+ const music_playlist_schema_1 = require("../models/music-playlist.schema");
7
+ var AddTrackToMusicPlaylistCommand;
8
+ (function (AddTrackToMusicPlaylistCommand) {
9
+ AddTrackToMusicPlaylistCommand.RequestSchema = zod_1.z
10
+ .object({
11
+ playlistId: zod_1.z.string().uuid(),
12
+ trackId: zod_1.z.string().uuid(),
13
+ userId: zod_1.z.string().uuid().optional(),
14
+ unregisteredUserId: zod_1.z.string().uuid().optional(),
15
+ })
16
+ .refine((data) => {
17
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
18
+ }, {
19
+ message: 'At least userId or unregisteredUserId must be present',
20
+ path: ['userId', 'unregisteredUserId'],
21
+ });
22
+ AddTrackToMusicPlaylistCommand.ResponseSchema = (0, command_response_schema_1.ICommandResponseSchema)(music_playlist_schema_1.MusicPlaylistSchema);
23
+ })(AddTrackToMusicPlaylistCommand || (exports.AddTrackToMusicPlaylistCommand = AddTrackToMusicPlaylistCommand = {}));
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BoostMusicStyleCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const command_response_schema_1 = require("../../common/models/command-response.schema");
6
+ var BoostMusicStyleCommand;
7
+ (function (BoostMusicStyleCommand) {
8
+ BoostMusicStyleCommand.RequestSchema = zod_1.z.object({
9
+ userId: zod_1.z.string().uuid().nullable().optional(),
10
+ unregisteredUserId: zod_1.z.string().uuid().nullable().optional(),
11
+ userBalance: zod_1.z.number(),
12
+ content: zod_1.z.string().min(1).max(3000),
13
+ });
14
+ BoostMusicStyleCommand.ResponseSchema = (0, command_response_schema_1.ICommandResponseSchema)(zod_1.z.object({
15
+ result: zod_1.z.string(),
16
+ }));
17
+ })(BoostMusicStyleCommand || (exports.BoostMusicStyleCommand = BoostMusicStyleCommand = {}));
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreateMusicPlaylistCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const command_response_schema_1 = require("../../common/models/command-response.schema");
6
+ const music_playlist_schema_1 = require("../models/music-playlist.schema");
7
+ var CreateMusicPlaylistCommand;
8
+ (function (CreateMusicPlaylistCommand) {
9
+ CreateMusicPlaylistCommand.RequestSchema = zod_1.z
10
+ .object({
11
+ title: zod_1.z.string().min(1).max(80).trim(),
12
+ userId: zod_1.z.string().uuid().optional(),
13
+ unregisteredUserId: zod_1.z.string().uuid().optional(),
14
+ })
15
+ .refine((data) => {
16
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
17
+ }, {
18
+ message: 'At least userId or unregisteredUserId must be present',
19
+ path: ['userId', 'unregisteredUserId'],
20
+ });
21
+ CreateMusicPlaylistCommand.ResponseSchema = (0, command_response_schema_1.ICommandResponseSchema)(music_playlist_schema_1.MusicPlaylistSchema);
22
+ })(CreateMusicPlaylistCommand || (exports.CreateMusicPlaylistCommand = CreateMusicPlaylistCommand = {}));
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeleteMusicPlaylistCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const command_response_schema_1 = require("../../common/models/command-response.schema");
6
+ var DeleteMusicPlaylistCommand;
7
+ (function (DeleteMusicPlaylistCommand) {
8
+ DeleteMusicPlaylistCommand.RequestSchema = zod_1.z
9
+ .object({
10
+ uuid: zod_1.z.string().uuid(),
11
+ userId: zod_1.z.string().uuid().optional(),
12
+ unregisteredUserId: zod_1.z.string().uuid().optional(),
13
+ })
14
+ .refine((data) => {
15
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
16
+ }, {
17
+ message: 'At least userId or unregisteredUserId must be present',
18
+ path: ['userId', 'unregisteredUserId'],
19
+ });
20
+ DeleteMusicPlaylistCommand.ResponseSchema = (0, command_response_schema_1.ICommandResponseSchema)(zod_1.z.boolean());
21
+ })(DeleteMusicPlaylistCommand || (exports.DeleteMusicPlaylistCommand = DeleteMusicPlaylistCommand = {}));
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EditMusicCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const command_response_schema_1 = require("../../common/models/command-response.schema");
6
+ const models_1 = require("../models");
7
+ var EditMusicCommand;
8
+ (function (EditMusicCommand) {
9
+ EditMusicCommand.RequestSchema = models_1.MusicEditRequestSchema;
10
+ EditMusicCommand.ResponseSchema = (0, command_response_schema_1.ICommandResponseSchema)(zod_1.z.union([models_1.MusicJobSchema, models_1.MusicEditActionResultSchema]));
11
+ })(EditMusicCommand || (exports.EditMusicCommand = EditMusicCommand = {}));
@@ -6,12 +6,17 @@ const command_response_schema_1 = require("../../common/models/command-response.
6
6
  const locale_schema_1 = require("../../common/models/locale.schema");
7
7
  const music_job_schema_1 = require("../models/music-job.schema");
8
8
  const models_1 = require("../models");
9
+ const enums_1 = require("../enums");
9
10
  var GenerateMusicCommand;
10
11
  (function (GenerateMusicCommand) {
11
12
  GenerateMusicCommand.RequestSchema = zod_1.z.object({
12
13
  locale: locale_schema_1.LocaleSchema,
13
14
  userId: zod_1.z.string().uuid().nullable().optional(),
14
15
  unregisteredUserId: zod_1.z.string().uuid().nullable().optional(),
16
+ actionType: zod_1.z
17
+ .nativeEnum(enums_1.MUSIC_GENERATION_ACTION_TYPE)
18
+ .optional()
19
+ .default(enums_1.MUSIC_GENERATION_ACTION_TYPE.GENERATE),
15
20
  modelId: zod_1.z.string(),
16
21
  params: models_1.MusicJobParamsSchema,
17
22
  tokenReservationId: zod_1.z.string().uuid(),
@@ -14,15 +14,22 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./add-track-to-music-playlist.command"), exports);
18
+ __exportStar(require("./create-music-playlist.command"), exports);
19
+ __exportStar(require("./delete-music-playlist.command"), exports);
20
+ __exportStar(require("./edit-music.command"), exports);
17
21
  __exportStar(require("./delete-music-job-by-uuid.command"), exports);
18
22
  __exportStar(require("./delete-all-music-jobs.command"), exports);
23
+ __exportStar(require("./remove-track-from-music-playlist.command"), exports);
19
24
  __exportStar(require("./retry-music-job.command"), exports);
20
25
  __exportStar(require("./set-reaction-to-music-job.command"), exports);
21
26
  __exportStar(require("./generate-music.command"), exports);
22
27
  __exportStar(require("./get-music-price.command"), exports);
23
28
  __exportStar(require("./update-music-job-title.command"), exports);
24
29
  __exportStar(require("./update-music-job-favorite.command"), exports);
30
+ __exportStar(require("./update-music-playlist.command"), exports);
25
31
  __exportStar(require("./convert-to-wav.command"), exports);
26
32
  __exportStar(require("./generate-lyrics.command"), exports);
33
+ __exportStar(require("./boost-music-style.command"), exports);
27
34
  __exportStar(require("./music-model"), exports);
28
35
  __exportStar(require("./update-published-status-music-jobs.command"), exports);
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemoveTrackFromMusicPlaylistCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const command_response_schema_1 = require("../../common/models/command-response.schema");
6
+ const music_playlist_schema_1 = require("../models/music-playlist.schema");
7
+ var RemoveTrackFromMusicPlaylistCommand;
8
+ (function (RemoveTrackFromMusicPlaylistCommand) {
9
+ RemoveTrackFromMusicPlaylistCommand.RequestSchema = zod_1.z
10
+ .object({
11
+ playlistId: zod_1.z.string().uuid(),
12
+ trackId: zod_1.z.string().uuid(),
13
+ userId: zod_1.z.string().uuid().optional(),
14
+ unregisteredUserId: zod_1.z.string().uuid().optional(),
15
+ })
16
+ .refine((data) => {
17
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
18
+ }, {
19
+ message: 'At least userId or unregisteredUserId must be present',
20
+ path: ['userId', 'unregisteredUserId'],
21
+ });
22
+ RemoveTrackFromMusicPlaylistCommand.ResponseSchema = (0, command_response_schema_1.ICommandResponseSchema)(music_playlist_schema_1.MusicPlaylistSchema);
23
+ })(RemoveTrackFromMusicPlaylistCommand || (exports.RemoveTrackFromMusicPlaylistCommand = RemoveTrackFromMusicPlaylistCommand = {}));
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpdateMusicPlaylistCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const command_response_schema_1 = require("../../common/models/command-response.schema");
6
+ const music_playlist_schema_1 = require("../models/music-playlist.schema");
7
+ var UpdateMusicPlaylistCommand;
8
+ (function (UpdateMusicPlaylistCommand) {
9
+ UpdateMusicPlaylistCommand.RequestSchema = zod_1.z
10
+ .object({
11
+ uuid: zod_1.z.string().uuid(),
12
+ title: zod_1.z.string().min(1).max(80).trim(),
13
+ userId: zod_1.z.string().uuid().optional(),
14
+ unregisteredUserId: zod_1.z.string().uuid().optional(),
15
+ })
16
+ .refine((data) => {
17
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
18
+ }, {
19
+ message: 'At least userId or unregisteredUserId must be present',
20
+ path: ['userId', 'unregisteredUserId'],
21
+ });
22
+ UpdateMusicPlaylistCommand.ResponseSchema = (0, command_response_schema_1.ICommandResponseSchema)(music_playlist_schema_1.MusicPlaylistSchema);
23
+ })(UpdateMusicPlaylistCommand || (exports.UpdateMusicPlaylistCommand = UpdateMusicPlaylistCommand = {}));
@@ -20,3 +20,6 @@ __exportStar(require("./music-vocal-gender.enum"), exports);
20
20
  __exportStar(require("./music-pricing-rule-type.enum"), exports);
21
21
  __exportStar(require("./suno-mode-type.enum"), exports);
22
22
  __exportStar(require("./music-action-type.enum"), exports);
23
+ __exportStar(require("./music-audio-action-type.enum"), exports);
24
+ __exportStar(require("./music-generation-action-type.enum"), exports);
25
+ __exportStar(require("./music-lyrics-structure.enum"), exports);
@@ -4,4 +4,11 @@ exports.MUSIC_ACTION_TYPE = void 0;
4
4
  var MUSIC_ACTION_TYPE;
5
5
  (function (MUSIC_ACTION_TYPE) {
6
6
  MUSIC_ACTION_TYPE["LYRICS"] = "LYRICS";
7
+ MUSIC_ACTION_TYPE["BOOST_STYLE"] = "BOOST_STYLE";
8
+ MUSIC_ACTION_TYPE["REMOVE_VOCALS"] = "REMOVE_VOCALS";
9
+ MUSIC_ACTION_TYPE["EXTRACT_VOCALS"] = "EXTRACT_VOCALS";
10
+ MUSIC_ACTION_TYPE["COVER"] = "COVER";
11
+ MUSIC_ACTION_TYPE["EXTEND"] = "EXTEND";
12
+ MUSIC_ACTION_TYPE["ADD_INSTRUMENTAL"] = "ADD_INSTRUMENTAL";
13
+ MUSIC_ACTION_TYPE["ADD_VOCALS"] = "ADD_VOCALS";
7
14
  })(MUSIC_ACTION_TYPE || (exports.MUSIC_ACTION_TYPE = MUSIC_ACTION_TYPE = {}));
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MUSIC_AUDIO_ACTION_TYPE = void 0;
4
+ var MUSIC_AUDIO_ACTION_TYPE;
5
+ (function (MUSIC_AUDIO_ACTION_TYPE) {
6
+ MUSIC_AUDIO_ACTION_TYPE["REMOVE_VOCALS"] = "removeVocals";
7
+ MUSIC_AUDIO_ACTION_TYPE["EXTRACT_VOCALS"] = "extractVocals";
8
+ MUSIC_AUDIO_ACTION_TYPE["COVER"] = "cover";
9
+ MUSIC_AUDIO_ACTION_TYPE["EXTEND"] = "extend";
10
+ MUSIC_AUDIO_ACTION_TYPE["ADD_INSTRUMENTAL"] = "addInstrumental";
11
+ MUSIC_AUDIO_ACTION_TYPE["ADD_VOCALS"] = "addVocals";
12
+ })(MUSIC_AUDIO_ACTION_TYPE || (exports.MUSIC_AUDIO_ACTION_TYPE = MUSIC_AUDIO_ACTION_TYPE = {}));
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MUSIC_GENERATION_ACTION_TYPE = void 0;
4
+ var MUSIC_GENERATION_ACTION_TYPE;
5
+ (function (MUSIC_GENERATION_ACTION_TYPE) {
6
+ MUSIC_GENERATION_ACTION_TYPE["GENERATE"] = "generate";
7
+ MUSIC_GENERATION_ACTION_TYPE["GIFT"] = "gift";
8
+ MUSIC_GENERATION_ACTION_TYPE["BACKGROUND"] = "background";
9
+ MUSIC_GENERATION_ACTION_TYPE["GENERATE_LYRICS"] = "generateLyrics";
10
+ })(MUSIC_GENERATION_ACTION_TYPE || (exports.MUSIC_GENERATION_ACTION_TYPE = MUSIC_GENERATION_ACTION_TYPE = {}));
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MUSIC_LYRICS_STRUCTURE = void 0;
4
+ var MUSIC_LYRICS_STRUCTURE;
5
+ (function (MUSIC_LYRICS_STRUCTURE) {
6
+ MUSIC_LYRICS_STRUCTURE["VERSE_CHORUS"] = "verse_chorus";
7
+ MUSIC_LYRICS_STRUCTURE["WITH_BRIDGE"] = "with_bridge";
8
+ MUSIC_LYRICS_STRUCTURE["FREE"] = "free";
9
+ })(MUSIC_LYRICS_STRUCTURE || (exports.MUSIC_LYRICS_STRUCTURE = MUSIC_LYRICS_STRUCTURE = {}));
@@ -19,4 +19,5 @@ __exportStar(require("./music-config-with-vendors.schema"), exports);
19
19
  __exportStar(require("./music-job.schema"), exports);
20
20
  __exportStar(require("./music-model.schema"), exports);
21
21
  __exportStar(require("./music-model-with-vendor.schema"), exports);
22
+ __exportStar(require("./music-playlist.schema"), exports);
22
23
  __exportStar(require("./music-track.schema"), exports);
@@ -4,7 +4,9 @@ exports.MusicConfigWithVendorsSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const ai_vendor_1 = require("../../ai-vendor");
6
6
  const music_model_with_vendor_schema_1 = require("./music-model-with-vendor.schema");
7
+ const music_config_schema_1 = require("./music-config.schema");
7
8
  exports.MusicConfigWithVendorsSchema = zod_1.z.object({
8
9
  vendors: zod_1.z.array(ai_vendor_1.AiVendorSchema),
9
10
  models: zod_1.z.array(music_model_with_vendor_schema_1.MusicModelWithVendorSchema),
11
+ audioActionPrices: music_config_schema_1.MusicAudioActionPricesSchema,
10
12
  });
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MusicConfigSchema = void 0;
3
+ exports.MusicConfigSchema = exports.MusicAudioActionPricesSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const music_model_schema_1 = require("./music-model.schema");
6
+ const enums_1 = require("../enums");
7
+ exports.MusicAudioActionPricesSchema = zod_1.z.record(zod_1.z.nativeEnum(enums_1.MUSIC_AUDIO_ACTION_TYPE), zod_1.z.number());
6
8
  exports.MusicConfigSchema = zod_1.z.object({
7
9
  models: zod_1.z.array(music_model_schema_1.MusicModelSchema),
10
+ audioActionPrices: exports.MusicAudioActionPricesSchema,
8
11
  });
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MusicJobSchema = exports.MusicJobParamsSchema = void 0;
3
+ exports.MusicJobSchema = exports.MusicExecuteRequestSchema = exports.MusicAnyJobParamsSchema = exports.MusicEditActionResultSchema = exports.MusicEditRequestSchema = exports.MusicAddVocalsParamsSchema = exports.MusicAddInstrumentalParamsSchema = exports.MusicUploadExtendParamsSchema = exports.MusicUploadCoverParamsSchema = exports.MusicSeparateVocalsParamsSchema = exports.MusicBackgroundParamsSchema = exports.MusicLyricsParamsSchema = exports.MusicJobParamsSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const tools_1 = require("../../tools");
6
6
  const common_1 = require("../../common");
@@ -30,6 +30,137 @@ exports.MusicJobParamsSchema = zod_1.z.discriminatedUnion('mode', [
30
30
  style: zod_1.z.string().min(1).max(1000),
31
31
  }),
32
32
  ]);
33
+ exports.MusicLyricsParamsSchema = zod_1.z.object({
34
+ prompt: zod_1.z.string().min(1).max(1000),
35
+ style: zod_1.z.string().min(1).max(200).optional(),
36
+ structure: zod_1.z.nativeEnum(enums_1.MUSIC_LYRICS_STRUCTURE),
37
+ });
38
+ exports.MusicBackgroundParamsSchema = zod_1.z.object({
39
+ prompt: zod_1.z.string().min(1).max(450),
40
+ style: zod_1.z.string(),
41
+ });
42
+ exports.MusicSeparateVocalsParamsSchema = zod_1.z.object({
43
+ externalId: zod_1.z.string().uuid(),
44
+ audioId: zod_1.z.string().min(1),
45
+ });
46
+ exports.MusicUploadCoverParamsSchema = zod_1.z.object({
47
+ audioId: zod_1.z.string().uuid(),
48
+ uploadUrl: zod_1.z.string().url(),
49
+ style: zod_1.z.string().min(1).max(1000),
50
+ prompt: zod_1.z.string().min(1).max(5000).optional(),
51
+ title: zod_1.z.string().min(1).max(80).optional(),
52
+ negativeTags: zod_1.z.string().max(1000).optional(),
53
+ vocalGender: zod_1.z.nativeEnum(enums_1.MUSIC_VOCAL_GENDER).optional(),
54
+ instrumental: zod_1.z.boolean().optional(),
55
+ });
56
+ exports.MusicUploadExtendParamsSchema = zod_1.z.object({
57
+ audioId: zod_1.z.string().uuid(),
58
+ uploadUrl: zod_1.z.string().url(),
59
+ continueAt: zod_1.z.number().positive(),
60
+ prompt: zod_1.z.string().min(1).max(5000),
61
+ style: zod_1.z.string().min(1).max(1000).optional(),
62
+ title: zod_1.z.string().min(1).max(80).optional(),
63
+ negativeTags: zod_1.z.string().max(1000).optional(),
64
+ vocalGender: zod_1.z.nativeEnum(enums_1.MUSIC_VOCAL_GENDER).optional(),
65
+ instrumental: zod_1.z.boolean().optional(),
66
+ });
67
+ exports.MusicAddInstrumentalParamsSchema = zod_1.z.object({
68
+ audioId: zod_1.z.string().uuid(),
69
+ uploadUrl: zod_1.z.string().url(),
70
+ style: zod_1.z.string().min(1).max(1000),
71
+ title: zod_1.z.string().min(1).max(80).optional(),
72
+ negativeTags: zod_1.z.string().max(1000).optional(),
73
+ vocalGender: zod_1.z.nativeEnum(enums_1.MUSIC_VOCAL_GENDER).optional(),
74
+ });
75
+ exports.MusicAddVocalsParamsSchema = zod_1.z.object({
76
+ audioId: zod_1.z.string().uuid(),
77
+ uploadUrl: zod_1.z.string().url(),
78
+ prompt: zod_1.z.string().min(1).max(5000),
79
+ style: zod_1.z.string().min(1).max(1000),
80
+ title: zod_1.z.string().min(1).max(80).optional(),
81
+ negativeTags: zod_1.z.string().max(1000).optional(),
82
+ vocalGender: zod_1.z.nativeEnum(enums_1.MUSIC_VOCAL_GENDER).optional(),
83
+ });
84
+ exports.MusicEditRequestSchema = zod_1.z
85
+ .object({
86
+ actionType: zod_1.z.nativeEnum(enums_1.MUSIC_AUDIO_ACTION_TYPE),
87
+ modelId: zod_1.z.string().uuid().optional(),
88
+ params: zod_1.z.unknown(),
89
+ userId: zod_1.z.string().optional(),
90
+ unregisteredUserId: zod_1.z.string().optional(),
91
+ userBalance: zod_1.z.number(),
92
+ })
93
+ .superRefine((data, ctx) => {
94
+ const requiresModel = ![
95
+ enums_1.MUSIC_AUDIO_ACTION_TYPE.REMOVE_VOCALS,
96
+ enums_1.MUSIC_AUDIO_ACTION_TYPE.EXTRACT_VOCALS,
97
+ ].includes(data.actionType);
98
+ if (requiresModel && !data.modelId) {
99
+ ctx.addIssue({
100
+ code: zod_1.z.ZodIssueCode.custom,
101
+ message: 'modelId is required',
102
+ path: ['modelId'],
103
+ });
104
+ }
105
+ const paramsValidation = data.actionType === enums_1.MUSIC_AUDIO_ACTION_TYPE.REMOVE_VOCALS ||
106
+ data.actionType === enums_1.MUSIC_AUDIO_ACTION_TYPE.EXTRACT_VOCALS
107
+ ? exports.MusicSeparateVocalsParamsSchema.safeParse(data.params)
108
+ : data.actionType === enums_1.MUSIC_AUDIO_ACTION_TYPE.COVER
109
+ ? exports.MusicUploadCoverParamsSchema.safeParse(data.params)
110
+ : data.actionType === enums_1.MUSIC_AUDIO_ACTION_TYPE.EXTEND
111
+ ? exports.MusicUploadExtendParamsSchema.safeParse(data.params)
112
+ : data.actionType === enums_1.MUSIC_AUDIO_ACTION_TYPE.ADD_INSTRUMENTAL
113
+ ? exports.MusicAddInstrumentalParamsSchema.safeParse(data.params)
114
+ : exports.MusicAddVocalsParamsSchema.safeParse(data.params);
115
+ if (!paramsValidation.success) {
116
+ for (const issue of paramsValidation.error.issues) {
117
+ ctx.addIssue(Object.assign(Object.assign({}, issue), { path: ['params', ...issue.path] }));
118
+ }
119
+ }
120
+ });
121
+ exports.MusicEditActionResultSchema = zod_1.z.object({
122
+ actionType: zod_1.z.nativeEnum(enums_1.MUSIC_AUDIO_ACTION_TYPE),
123
+ url: zod_1.z.string(),
124
+ vocalUrl: zod_1.z.string().optional(),
125
+ instrumentalUrl: zod_1.z.string().optional(),
126
+ originUrl: zod_1.z.string().optional(),
127
+ price: zod_1.z.number(),
128
+ });
129
+ exports.MusicAnyJobParamsSchema = zod_1.z.union([
130
+ exports.MusicJobParamsSchema,
131
+ exports.MusicUploadCoverParamsSchema,
132
+ exports.MusicUploadExtendParamsSchema,
133
+ exports.MusicAddInstrumentalParamsSchema,
134
+ exports.MusicAddVocalsParamsSchema,
135
+ ]);
136
+ exports.MusicExecuteRequestSchema = zod_1.z
137
+ .object({
138
+ actionType: zod_1.z
139
+ .nativeEnum(enums_1.MUSIC_GENERATION_ACTION_TYPE)
140
+ .optional()
141
+ .default(enums_1.MUSIC_GENERATION_ACTION_TYPE.GENERATE),
142
+ modelId: zod_1.z.string().uuid().optional(),
143
+ params: zod_1.z.unknown(),
144
+ })
145
+ .superRefine((data, ctx) => {
146
+ if (data.actionType !== enums_1.MUSIC_GENERATION_ACTION_TYPE.GENERATE_LYRICS && !data.modelId) {
147
+ ctx.addIssue({
148
+ code: zod_1.z.ZodIssueCode.custom,
149
+ message: 'modelId is required',
150
+ path: ['modelId'],
151
+ });
152
+ }
153
+ const paramsValidation = data.actionType === enums_1.MUSIC_GENERATION_ACTION_TYPE.GENERATE_LYRICS
154
+ ? exports.MusicLyricsParamsSchema.safeParse(data.params)
155
+ : data.actionType === enums_1.MUSIC_GENERATION_ACTION_TYPE.BACKGROUND
156
+ ? exports.MusicBackgroundParamsSchema.safeParse(data.params)
157
+ : exports.MusicJobParamsSchema.safeParse(data.params);
158
+ if (!paramsValidation.success) {
159
+ for (const issue of paramsValidation.error.issues) {
160
+ ctx.addIssue(Object.assign(Object.assign({}, issue), { path: ['params', ...issue.path] }));
161
+ }
162
+ }
163
+ });
33
164
  exports.MusicJobSchema = zod_1.z.object({
34
165
  uuid: zod_1.z.string(),
35
166
  prompt: zod_1.z.string(),
@@ -41,7 +172,7 @@ exports.MusicJobSchema = zod_1.z.object({
41
172
  error: zod_1.z.string().nullable(),
42
173
  modelId: zod_1.z.string(),
43
174
  price: zod_1.z.number(),
44
- params: exports.MusicJobParamsSchema,
175
+ params: exports.MusicAnyJobParamsSchema,
45
176
  tracks: zod_1.z.array(music_track_schema_1.MusicTrackSchema),
46
177
  attempts: zod_1.z.array(zod_1.z.any()),
47
178
  userId: zod_1.z.string().nullable().optional(),
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MusicPlaylistSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const music_track_schema_1 = require("./music-track.schema");
6
+ exports.MusicPlaylistSchema = zod_1.z.object({
7
+ uuid: zod_1.z.string().uuid(),
8
+ title: zod_1.z.string(),
9
+ tracks: zod_1.z.array(music_track_schema_1.MusicTrackSchema).optional(),
10
+ trackCount: zod_1.z.number(),
11
+ userId: zod_1.z.string().uuid().nullable().optional(),
12
+ unregisteredUserId: zod_1.z.string().uuid().nullable().optional(),
13
+ createdAt: zod_1.z.date(),
14
+ updatedAt: zod_1.z.date(),
15
+ });
@@ -2,13 +2,24 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MusicTrackSchema = void 0;
4
4
  const zod_1 = require("zod");
5
+ const common_1 = require("../../common");
6
+ const MusicTrackAudioFileSchema = common_1.AttachedFileSchema.pick({
7
+ uuid: true,
8
+ url: true,
9
+ mimeType: true,
10
+ }).extend({
11
+ duration: zod_1.z.number().nullable(),
12
+ originalName: zod_1.z.string().nullable().optional(),
13
+ });
5
14
  exports.MusicTrackSchema = zod_1.z.object({
6
15
  uuid: zod_1.z.string(),
7
16
  title: zod_1.z.string(),
8
17
  audioId: zod_1.z.string(),
9
18
  audioUrl: zod_1.z.string(),
19
+ audioFile: MusicTrackAudioFileSchema.nullable().optional(),
10
20
  coverUrl: zod_1.z.string(),
11
21
  prompt: zod_1.z.string().nullable(),
22
+ fullLyrics: zod_1.z.string().nullable().optional(),
12
23
  tags: zod_1.z.string(),
13
24
  duration: zod_1.z.number(),
14
25
  waveformPeaks: zod_1.z.array(zod_1.z.number()),
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FindMusicPlaylistsQuery = void 0;
4
+ const zod_1 = require("zod");
5
+ const command_response_schema_1 = require("../../common/models/command-response.schema");
6
+ const music_playlist_schema_1 = require("../models/music-playlist.schema");
7
+ var FindMusicPlaylistsQuery;
8
+ (function (FindMusicPlaylistsQuery) {
9
+ FindMusicPlaylistsQuery.RequestSchema = zod_1.z
10
+ .object({
11
+ userId: zod_1.z.string().uuid().optional(),
12
+ unregisteredUserId: zod_1.z.string().uuid().optional(),
13
+ })
14
+ .refine((data) => {
15
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
16
+ }, {
17
+ message: 'At least userId or unregisteredUserId must be present',
18
+ path: ['userId', 'unregisteredUserId'],
19
+ });
20
+ FindMusicPlaylistsQuery.ResponseSchema = (0, command_response_schema_1.ICommandResponseSchema)(zod_1.z.array(music_playlist_schema_1.MusicPlaylistSchema));
21
+ })(FindMusicPlaylistsQuery || (exports.FindMusicPlaylistsQuery = FindMusicPlaylistsQuery = {}));
@@ -16,5 +16,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./find-music-job-by-id.query"), exports);
18
18
  __exportStar(require("./find-music-jobs.query"), exports);
19
+ __exportStar(require("./find-music-playlists.query"), exports);
19
20
  __exportStar(require("./get-music-config.query"), exports);
20
21
  __exportStar(require("./get-music-config-with-vendors.query"), exports);
@@ -3,17 +3,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MUSIC_AMQP_ROUTES = void 0;
4
4
  exports.MUSIC_AMQP_ROUTES = {
5
5
  EXECUTE: 'tools.music.execute.rpc',
6
+ EDIT: 'tools.music.edit.rpc',
6
7
  GET_PRICE: 'tools.music.get-price.rpc',
7
8
  GENERATE_LYRICS: 'tools.music.generate-lyrics.rpc',
9
+ BOOST_STYLE: 'tools.music.boost-style.rpc',
8
10
  CONVERT_TO_WAV: 'tools.music.convert-to-wav.rpc',
9
11
  CONFIG: 'tools.music.config.rpc',
10
12
  CONFIG_WITH_VENDORS: 'tools.music.config-with-vendors.rpc',
11
13
  GET_JOB: 'tools.music.jobs.get.rpc',
12
14
  LIST_JOBS: 'tools.music.jobs.list.rpc',
15
+ LIST_PLAYLISTS: 'tools.music.playlists.list.rpc',
13
16
  SET_REACTION: 'tools.music.jobs.set-reaction.rpc',
14
17
  UPDATE_TITLE: 'tools.music.jobs.update-title.rpc',
15
18
  UPDATE_FAVORITE: 'tools.music.jobs.update-favorite.rpc',
16
19
  UPDATE_JOB: 'tools.music.jobs.update.rpc',
20
+ CREATE_PLAYLIST: 'tools.music.playlists.create.rpc',
21
+ UPDATE_PLAYLIST: 'tools.music.playlists.update.rpc',
22
+ DELETE_PLAYLIST: 'tools.music.playlists.delete.rpc',
23
+ ADD_TRACK_TO_PLAYLIST: 'tools.music.playlists.add-track.rpc',
24
+ REMOVE_TRACK_FROM_PLAYLIST: 'tools.music.playlists.remove-track.rpc',
17
25
  SOFT_DELETE: 'tools.music.jobs.soft-delete.rpc',
18
26
  SOFT_DELETE_ALL: 'tools.music.jobs.soft-delete-all.rpc',
19
27
  RETRY: 'tools.music.jobs.retry.rpc',
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ import { ICommandResponseSchema } from '../../common/models/command-response.schema';
3
+ import { MusicPlaylistSchema } from '../models/music-playlist.schema';
4
+
5
+ export namespace AddTrackToMusicPlaylistCommand {
6
+ export const RequestSchema = z
7
+ .object({
8
+ playlistId: z.string().uuid(),
9
+ trackId: z.string().uuid(),
10
+ userId: z.string().uuid().optional(),
11
+ unregisteredUserId: z.string().uuid().optional(),
12
+ })
13
+ .refine(
14
+ (data) => {
15
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
16
+ },
17
+ {
18
+ message: 'At least userId or unregisteredUserId must be present',
19
+ path: ['userId', 'unregisteredUserId'],
20
+ },
21
+ );
22
+ export type Request = z.infer<typeof RequestSchema>;
23
+
24
+ export const ResponseSchema = ICommandResponseSchema(MusicPlaylistSchema);
25
+ export type Response = z.infer<typeof ResponseSchema>;
26
+ }
@@ -0,0 +1,19 @@
1
+ import { z } from 'zod';
2
+ import { ICommandResponseSchema } from '../../common/models/command-response.schema';
3
+
4
+ export namespace BoostMusicStyleCommand {
5
+ export const RequestSchema = z.object({
6
+ userId: z.string().uuid().nullable().optional(),
7
+ unregisteredUserId: z.string().uuid().nullable().optional(),
8
+ userBalance: z.number(),
9
+ content: z.string().min(1).max(3000),
10
+ });
11
+ export type Request = z.infer<typeof RequestSchema>;
12
+
13
+ export const ResponseSchema = ICommandResponseSchema(
14
+ z.object({
15
+ result: z.string(),
16
+ }),
17
+ );
18
+ export type Response = z.infer<typeof ResponseSchema>;
19
+ }
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ import { ICommandResponseSchema } from '../../common/models/command-response.schema';
3
+ import { MusicPlaylistSchema } from '../models/music-playlist.schema';
4
+
5
+ export namespace CreateMusicPlaylistCommand {
6
+ export const RequestSchema = z
7
+ .object({
8
+ title: z.string().min(1).max(80).trim(),
9
+ userId: z.string().uuid().optional(),
10
+ unregisteredUserId: z.string().uuid().optional(),
11
+ })
12
+ .refine(
13
+ (data) => {
14
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
15
+ },
16
+ {
17
+ message: 'At least userId or unregisteredUserId must be present',
18
+ path: ['userId', 'unregisteredUserId'],
19
+ },
20
+ );
21
+ export type Request = z.infer<typeof RequestSchema>;
22
+
23
+ export const ResponseSchema = ICommandResponseSchema(MusicPlaylistSchema);
24
+ export type Response = z.infer<typeof ResponseSchema>;
25
+ }
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ import { ICommandResponseSchema } from '../../common/models/command-response.schema';
3
+
4
+ export namespace DeleteMusicPlaylistCommand {
5
+ export const RequestSchema = z
6
+ .object({
7
+ uuid: z.string().uuid(),
8
+ userId: z.string().uuid().optional(),
9
+ unregisteredUserId: z.string().uuid().optional(),
10
+ })
11
+ .refine(
12
+ (data) => {
13
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
14
+ },
15
+ {
16
+ message: 'At least userId or unregisteredUserId must be present',
17
+ path: ['userId', 'unregisteredUserId'],
18
+ },
19
+ );
20
+ export type Request = z.infer<typeof RequestSchema>;
21
+
22
+ export const ResponseSchema = ICommandResponseSchema(z.boolean());
23
+ export type Response = z.infer<typeof ResponseSchema>;
24
+ }
@@ -0,0 +1,13 @@
1
+ import { z } from 'zod';
2
+ import { ICommandResponseSchema } from '../../common/models/command-response.schema';
3
+ import { MusicEditActionResultSchema, MusicEditRequestSchema, MusicJobSchema } from '../models';
4
+
5
+ export namespace EditMusicCommand {
6
+ export const RequestSchema = MusicEditRequestSchema;
7
+ export type Request = z.infer<typeof RequestSchema>;
8
+
9
+ export const ResponseSchema = ICommandResponseSchema(
10
+ z.union([MusicJobSchema, MusicEditActionResultSchema]),
11
+ );
12
+ export type Response = z.infer<typeof ResponseSchema>;
13
+ }
@@ -3,12 +3,17 @@ import { ICommandResponseSchema } from '../../common/models/command-response.sch
3
3
  import { LocaleSchema } from '../../common/models/locale.schema';
4
4
  import { MusicJobSchema } from '../models/music-job.schema';
5
5
  import { MusicJobParamsSchema } from '../models';
6
+ import { MUSIC_GENERATION_ACTION_TYPE } from '../enums';
6
7
 
7
8
  export namespace GenerateMusicCommand {
8
9
  export const RequestSchema = z.object({
9
10
  locale: LocaleSchema,
10
11
  userId: z.string().uuid().nullable().optional(),
11
12
  unregisteredUserId: z.string().uuid().nullable().optional(),
13
+ actionType: z
14
+ .nativeEnum(MUSIC_GENERATION_ACTION_TYPE)
15
+ .optional()
16
+ .default(MUSIC_GENERATION_ACTION_TYPE.GENERATE),
12
17
  modelId: z.string(),
13
18
  params: MusicJobParamsSchema,
14
19
  tokenReservationId: z.string().uuid(),
@@ -1,12 +1,19 @@
1
+ export * from './add-track-to-music-playlist.command';
2
+ export * from './create-music-playlist.command';
3
+ export * from './delete-music-playlist.command';
4
+ export * from './edit-music.command';
1
5
  export * from './delete-music-job-by-uuid.command';
2
6
  export * from './delete-all-music-jobs.command';
7
+ export * from './remove-track-from-music-playlist.command';
3
8
  export * from './retry-music-job.command';
4
9
  export * from './set-reaction-to-music-job.command';
5
10
  export * from './generate-music.command';
6
11
  export * from './get-music-price.command';
7
12
  export * from './update-music-job-title.command';
8
13
  export * from './update-music-job-favorite.command';
14
+ export * from './update-music-playlist.command';
9
15
  export * from './convert-to-wav.command';
10
16
  export * from './generate-lyrics.command';
17
+ export * from './boost-music-style.command';
11
18
  export * from './music-model';
12
19
  export * from './update-published-status-music-jobs.command';
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ import { ICommandResponseSchema } from '../../common/models/command-response.schema';
3
+ import { MusicPlaylistSchema } from '../models/music-playlist.schema';
4
+
5
+ export namespace RemoveTrackFromMusicPlaylistCommand {
6
+ export const RequestSchema = z
7
+ .object({
8
+ playlistId: z.string().uuid(),
9
+ trackId: z.string().uuid(),
10
+ userId: z.string().uuid().optional(),
11
+ unregisteredUserId: z.string().uuid().optional(),
12
+ })
13
+ .refine(
14
+ (data) => {
15
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
16
+ },
17
+ {
18
+ message: 'At least userId or unregisteredUserId must be present',
19
+ path: ['userId', 'unregisteredUserId'],
20
+ },
21
+ );
22
+ export type Request = z.infer<typeof RequestSchema>;
23
+
24
+ export const ResponseSchema = ICommandResponseSchema(MusicPlaylistSchema);
25
+ export type Response = z.infer<typeof ResponseSchema>;
26
+ }
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ import { ICommandResponseSchema } from '../../common/models/command-response.schema';
3
+ import { MusicPlaylistSchema } from '../models/music-playlist.schema';
4
+
5
+ export namespace UpdateMusicPlaylistCommand {
6
+ export const RequestSchema = z
7
+ .object({
8
+ uuid: z.string().uuid(),
9
+ title: z.string().min(1).max(80).trim(),
10
+ userId: z.string().uuid().optional(),
11
+ unregisteredUserId: z.string().uuid().optional(),
12
+ })
13
+ .refine(
14
+ (data) => {
15
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
16
+ },
17
+ {
18
+ message: 'At least userId or unregisteredUserId must be present',
19
+ path: ['userId', 'unregisteredUserId'],
20
+ },
21
+ );
22
+ export type Request = z.infer<typeof RequestSchema>;
23
+
24
+ export const ResponseSchema = ICommandResponseSchema(MusicPlaylistSchema);
25
+ export type Response = z.infer<typeof ResponseSchema>;
26
+ }
@@ -4,3 +4,6 @@ export * from './music-vocal-gender.enum';
4
4
  export * from './music-pricing-rule-type.enum';
5
5
  export * from './suno-mode-type.enum';
6
6
  export * from './music-action-type.enum';
7
+ export * from './music-audio-action-type.enum';
8
+ export * from './music-generation-action-type.enum';
9
+ export * from './music-lyrics-structure.enum';
@@ -1,3 +1,10 @@
1
1
  export enum MUSIC_ACTION_TYPE {
2
2
  LYRICS = 'LYRICS',
3
+ BOOST_STYLE = 'BOOST_STYLE',
4
+ REMOVE_VOCALS = 'REMOVE_VOCALS',
5
+ EXTRACT_VOCALS = 'EXTRACT_VOCALS',
6
+ COVER = 'COVER',
7
+ EXTEND = 'EXTEND',
8
+ ADD_INSTRUMENTAL = 'ADD_INSTRUMENTAL',
9
+ ADD_VOCALS = 'ADD_VOCALS',
3
10
  }
@@ -0,0 +1,8 @@
1
+ export enum MUSIC_AUDIO_ACTION_TYPE {
2
+ REMOVE_VOCALS = 'removeVocals',
3
+ EXTRACT_VOCALS = 'extractVocals',
4
+ COVER = 'cover',
5
+ EXTEND = 'extend',
6
+ ADD_INSTRUMENTAL = 'addInstrumental',
7
+ ADD_VOCALS = 'addVocals',
8
+ }
@@ -0,0 +1,6 @@
1
+ export enum MUSIC_GENERATION_ACTION_TYPE {
2
+ GENERATE = 'generate',
3
+ GIFT = 'gift',
4
+ BACKGROUND = 'background',
5
+ GENERATE_LYRICS = 'generateLyrics',
6
+ }
@@ -0,0 +1,5 @@
1
+ export enum MUSIC_LYRICS_STRUCTURE {
2
+ VERSE_CHORUS = 'verse_chorus',
3
+ WITH_BRIDGE = 'with_bridge',
4
+ FREE = 'free',
5
+ }
@@ -3,4 +3,5 @@ export * from './music-config-with-vendors.schema';
3
3
  export * from './music-job.schema';
4
4
  export * from './music-model.schema';
5
5
  export * from './music-model-with-vendor.schema';
6
+ export * from './music-playlist.schema';
6
7
  export * from './music-track.schema';
@@ -1,10 +1,12 @@
1
1
  import { z } from 'zod';
2
2
  import { AiVendorSchema } from '../../ai-vendor';
3
3
  import { MusicModelWithVendorSchema } from './music-model-with-vendor.schema';
4
+ import { MusicAudioActionPricesSchema } from './music-config.schema';
4
5
 
5
6
  export const MusicConfigWithVendorsSchema = z.object({
6
7
  vendors: z.array(AiVendorSchema),
7
8
  models: z.array(MusicModelWithVendorSchema),
9
+ audioActionPrices: MusicAudioActionPricesSchema,
8
10
  });
9
11
 
10
12
  export type MusicConfigWithVendors = z.infer<typeof MusicConfigWithVendorsSchema>;
@@ -1,8 +1,16 @@
1
1
  import { z } from 'zod';
2
2
  import { MusicModelSchema } from './music-model.schema';
3
+ import { MUSIC_AUDIO_ACTION_TYPE } from '../enums';
4
+
5
+ export const MusicAudioActionPricesSchema = z.record(
6
+ z.nativeEnum(MUSIC_AUDIO_ACTION_TYPE),
7
+ z.number(),
8
+ );
3
9
 
4
10
  export const MusicConfigSchema = z.object({
5
11
  models: z.array(MusicModelSchema),
12
+ audioActionPrices: MusicAudioActionPricesSchema,
6
13
  });
7
14
 
8
15
  export type MusicConfig = z.infer<typeof MusicConfigSchema>;
16
+ export type MusicAudioActionPrices = z.infer<typeof MusicAudioActionPricesSchema>;
@@ -1,7 +1,12 @@
1
1
  import { z } from 'zod';
2
2
  import { JOB_STATUS } from '../../tools';
3
3
  import { USER_REACTION } from '../../common';
4
- import { MUSIC_VOCAL_GENDER } from '../enums';
4
+ import {
5
+ MUSIC_AUDIO_ACTION_TYPE,
6
+ MUSIC_GENERATION_ACTION_TYPE,
7
+ MUSIC_LYRICS_STRUCTURE,
8
+ MUSIC_VOCAL_GENDER,
9
+ } from '../enums';
5
10
  import { MusicTrackSchema } from './music-track.schema';
6
11
  import { SUNO_MODE_TYPE } from '../enums/suno-mode-type.enum';
7
12
 
@@ -31,6 +36,172 @@ export const MusicJobParamsSchema = z.discriminatedUnion('mode', [
31
36
 
32
37
  export type MusicJobParams = z.infer<typeof MusicJobParamsSchema>;
33
38
 
39
+ export const MusicLyricsParamsSchema = z.object({
40
+ prompt: z.string().min(1).max(1000),
41
+ style: z.string().min(1).max(200).optional(),
42
+ structure: z.nativeEnum(MUSIC_LYRICS_STRUCTURE),
43
+ });
44
+ export type MusicLyricsParams = z.infer<typeof MusicLyricsParamsSchema>;
45
+
46
+ export const MusicBackgroundParamsSchema = z.object({
47
+ prompt: z.string().min(1).max(450),
48
+ style: z.string(),
49
+ });
50
+ export type MusicBackgroundParams = z.infer<typeof MusicBackgroundParamsSchema>;
51
+
52
+ export const MusicSeparateVocalsParamsSchema = z.object({
53
+ externalId: z.string().uuid(),
54
+ audioId: z.string().min(1),
55
+ });
56
+ export type MusicSeparateVocalsParams = z.infer<typeof MusicSeparateVocalsParamsSchema>;
57
+
58
+ export const MusicUploadCoverParamsSchema = z.object({
59
+ audioId: z.string().uuid(),
60
+ uploadUrl: z.string().url(),
61
+ style: z.string().min(1).max(1000),
62
+ prompt: z.string().min(1).max(5000).optional(),
63
+ title: z.string().min(1).max(80).optional(),
64
+ negativeTags: z.string().max(1000).optional(),
65
+ vocalGender: z.nativeEnum(MUSIC_VOCAL_GENDER).optional(),
66
+ instrumental: z.boolean().optional(),
67
+ });
68
+ export type MusicUploadCoverParams = z.infer<typeof MusicUploadCoverParamsSchema>;
69
+
70
+ export const MusicUploadExtendParamsSchema = z.object({
71
+ audioId: z.string().uuid(),
72
+ uploadUrl: z.string().url(),
73
+ continueAt: z.number().positive(),
74
+ prompt: z.string().min(1).max(5000),
75
+ style: z.string().min(1).max(1000).optional(),
76
+ title: z.string().min(1).max(80).optional(),
77
+ negativeTags: z.string().max(1000).optional(),
78
+ vocalGender: z.nativeEnum(MUSIC_VOCAL_GENDER).optional(),
79
+ instrumental: z.boolean().optional(),
80
+ });
81
+ export type MusicUploadExtendParams = z.infer<typeof MusicUploadExtendParamsSchema>;
82
+
83
+ export const MusicAddInstrumentalParamsSchema = z.object({
84
+ audioId: z.string().uuid(),
85
+ uploadUrl: z.string().url(),
86
+ style: z.string().min(1).max(1000),
87
+ title: z.string().min(1).max(80).optional(),
88
+ negativeTags: z.string().max(1000).optional(),
89
+ vocalGender: z.nativeEnum(MUSIC_VOCAL_GENDER).optional(),
90
+ });
91
+ export type MusicAddInstrumentalParams = z.infer<typeof MusicAddInstrumentalParamsSchema>;
92
+
93
+ export const MusicAddVocalsParamsSchema = z.object({
94
+ audioId: z.string().uuid(),
95
+ uploadUrl: z.string().url(),
96
+ prompt: z.string().min(1).max(5000),
97
+ style: z.string().min(1).max(1000),
98
+ title: z.string().min(1).max(80).optional(),
99
+ negativeTags: z.string().max(1000).optional(),
100
+ vocalGender: z.nativeEnum(MUSIC_VOCAL_GENDER).optional(),
101
+ });
102
+ export type MusicAddVocalsParams = z.infer<typeof MusicAddVocalsParamsSchema>;
103
+
104
+ export const MusicEditRequestSchema = z
105
+ .object({
106
+ actionType: z.nativeEnum(MUSIC_AUDIO_ACTION_TYPE),
107
+ modelId: z.string().uuid().optional(),
108
+ params: z.unknown(),
109
+ userId: z.string().optional(),
110
+ unregisteredUserId: z.string().optional(),
111
+ userBalance: z.number(),
112
+ })
113
+ .superRefine((data, ctx) => {
114
+ const requiresModel = ![
115
+ MUSIC_AUDIO_ACTION_TYPE.REMOVE_VOCALS,
116
+ MUSIC_AUDIO_ACTION_TYPE.EXTRACT_VOCALS,
117
+ ].includes(data.actionType);
118
+
119
+ if (requiresModel && !data.modelId) {
120
+ ctx.addIssue({
121
+ code: z.ZodIssueCode.custom,
122
+ message: 'modelId is required',
123
+ path: ['modelId'],
124
+ });
125
+ }
126
+
127
+ const paramsValidation =
128
+ data.actionType === MUSIC_AUDIO_ACTION_TYPE.REMOVE_VOCALS ||
129
+ data.actionType === MUSIC_AUDIO_ACTION_TYPE.EXTRACT_VOCALS
130
+ ? MusicSeparateVocalsParamsSchema.safeParse(data.params)
131
+ : data.actionType === MUSIC_AUDIO_ACTION_TYPE.COVER
132
+ ? MusicUploadCoverParamsSchema.safeParse(data.params)
133
+ : data.actionType === MUSIC_AUDIO_ACTION_TYPE.EXTEND
134
+ ? MusicUploadExtendParamsSchema.safeParse(data.params)
135
+ : data.actionType === MUSIC_AUDIO_ACTION_TYPE.ADD_INSTRUMENTAL
136
+ ? MusicAddInstrumentalParamsSchema.safeParse(data.params)
137
+ : MusicAddVocalsParamsSchema.safeParse(data.params);
138
+
139
+ if (!paramsValidation.success) {
140
+ for (const issue of paramsValidation.error.issues) {
141
+ ctx.addIssue({
142
+ ...issue,
143
+ path: ['params', ...issue.path],
144
+ });
145
+ }
146
+ }
147
+ });
148
+ export type MusicEditRequest = z.infer<typeof MusicEditRequestSchema>;
149
+
150
+ export const MusicEditActionResultSchema = z.object({
151
+ actionType: z.nativeEnum(MUSIC_AUDIO_ACTION_TYPE),
152
+ url: z.string(),
153
+ vocalUrl: z.string().optional(),
154
+ instrumentalUrl: z.string().optional(),
155
+ originUrl: z.string().optional(),
156
+ price: z.number(),
157
+ });
158
+ export type MusicEditActionResult = z.infer<typeof MusicEditActionResultSchema>;
159
+
160
+ export const MusicAnyJobParamsSchema = z.union([
161
+ MusicJobParamsSchema,
162
+ MusicUploadCoverParamsSchema,
163
+ MusicUploadExtendParamsSchema,
164
+ MusicAddInstrumentalParamsSchema,
165
+ MusicAddVocalsParamsSchema,
166
+ ]);
167
+ export type MusicAnyJobParams = z.infer<typeof MusicAnyJobParamsSchema>;
168
+
169
+ export const MusicExecuteRequestSchema = z
170
+ .object({
171
+ actionType: z
172
+ .nativeEnum(MUSIC_GENERATION_ACTION_TYPE)
173
+ .optional()
174
+ .default(MUSIC_GENERATION_ACTION_TYPE.GENERATE),
175
+ modelId: z.string().uuid().optional(),
176
+ params: z.unknown(),
177
+ })
178
+ .superRefine((data, ctx) => {
179
+ if (data.actionType !== MUSIC_GENERATION_ACTION_TYPE.GENERATE_LYRICS && !data.modelId) {
180
+ ctx.addIssue({
181
+ code: z.ZodIssueCode.custom,
182
+ message: 'modelId is required',
183
+ path: ['modelId'],
184
+ });
185
+ }
186
+
187
+ const paramsValidation =
188
+ data.actionType === MUSIC_GENERATION_ACTION_TYPE.GENERATE_LYRICS
189
+ ? MusicLyricsParamsSchema.safeParse(data.params)
190
+ : data.actionType === MUSIC_GENERATION_ACTION_TYPE.BACKGROUND
191
+ ? MusicBackgroundParamsSchema.safeParse(data.params)
192
+ : MusicJobParamsSchema.safeParse(data.params);
193
+
194
+ if (!paramsValidation.success) {
195
+ for (const issue of paramsValidation.error.issues) {
196
+ ctx.addIssue({
197
+ ...issue,
198
+ path: ['params', ...issue.path],
199
+ });
200
+ }
201
+ }
202
+ });
203
+ export type MusicExecuteRequest = z.infer<typeof MusicExecuteRequestSchema>;
204
+
34
205
  export const MusicJobSchema = z.object({
35
206
  uuid: z.string(),
36
207
  prompt: z.string(),
@@ -42,7 +213,7 @@ export const MusicJobSchema = z.object({
42
213
  error: z.string().nullable(),
43
214
  modelId: z.string(),
44
215
  price: z.number(),
45
- params: MusicJobParamsSchema,
216
+ params: MusicAnyJobParamsSchema,
46
217
  tracks: z.array(MusicTrackSchema),
47
218
  attempts: z.array(z.any()),
48
219
  userId: z.string().nullable().optional(),
@@ -0,0 +1,15 @@
1
+ import { z } from 'zod';
2
+ import { MusicTrackSchema } from './music-track.schema';
3
+
4
+ export const MusicPlaylistSchema = z.object({
5
+ uuid: z.string().uuid(),
6
+ title: z.string(),
7
+ tracks: z.array(MusicTrackSchema).optional(),
8
+ trackCount: z.number(),
9
+ userId: z.string().uuid().nullable().optional(),
10
+ unregisteredUserId: z.string().uuid().nullable().optional(),
11
+ createdAt: z.date(),
12
+ updatedAt: z.date(),
13
+ });
14
+
15
+ export type MusicPlaylist = z.infer<typeof MusicPlaylistSchema>;
@@ -1,12 +1,24 @@
1
1
  import { z } from 'zod';
2
+ import { AttachedFileSchema } from '../../common';
3
+
4
+ const MusicTrackAudioFileSchema = AttachedFileSchema.pick({
5
+ uuid: true,
6
+ url: true,
7
+ mimeType: true,
8
+ }).extend({
9
+ duration: z.number().nullable(),
10
+ originalName: z.string().nullable().optional(),
11
+ });
2
12
 
3
13
  export const MusicTrackSchema = z.object({
4
14
  uuid: z.string(),
5
15
  title: z.string(),
6
16
  audioId: z.string(),
7
17
  audioUrl: z.string(),
18
+ audioFile: MusicTrackAudioFileSchema.nullable().optional(),
8
19
  coverUrl: z.string(),
9
20
  prompt: z.string().nullable(),
21
+ fullLyrics: z.string().nullable().optional(),
10
22
  tags: z.string(),
11
23
  duration: z.number(),
12
24
  waveformPeaks: z.array(z.number()),
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ import { ICommandResponseSchema } from '../../common/models/command-response.schema';
3
+ import { MusicPlaylistSchema } from '../models/music-playlist.schema';
4
+
5
+ export namespace FindMusicPlaylistsQuery {
6
+ export const RequestSchema = z
7
+ .object({
8
+ userId: z.string().uuid().optional(),
9
+ unregisteredUserId: z.string().uuid().optional(),
10
+ })
11
+ .refine(
12
+ (data) => {
13
+ return Boolean(data.userId) !== Boolean(data.unregisteredUserId);
14
+ },
15
+ {
16
+ message: 'At least userId or unregisteredUserId must be present',
17
+ path: ['userId', 'unregisteredUserId'],
18
+ },
19
+ );
20
+ export type Request = z.infer<typeof RequestSchema>;
21
+
22
+ export const ResponseSchema = ICommandResponseSchema(z.array(MusicPlaylistSchema));
23
+ export type Response = z.infer<typeof ResponseSchema>;
24
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './find-music-job-by-id.query';
2
2
  export * from './find-music-jobs.query';
3
+ export * from './find-music-playlists.query';
3
4
  export * from './get-music-config.query';
4
5
  export * from './get-music-config-with-vendors.query';
@@ -1,16 +1,24 @@
1
1
  export const MUSIC_AMQP_ROUTES = {
2
2
  EXECUTE: 'tools.music.execute.rpc',
3
+ EDIT: 'tools.music.edit.rpc',
3
4
  GET_PRICE: 'tools.music.get-price.rpc',
4
5
  GENERATE_LYRICS: 'tools.music.generate-lyrics.rpc',
6
+ BOOST_STYLE: 'tools.music.boost-style.rpc',
5
7
  CONVERT_TO_WAV: 'tools.music.convert-to-wav.rpc',
6
8
  CONFIG: 'tools.music.config.rpc',
7
9
  CONFIG_WITH_VENDORS: 'tools.music.config-with-vendors.rpc',
8
10
  GET_JOB: 'tools.music.jobs.get.rpc',
9
11
  LIST_JOBS: 'tools.music.jobs.list.rpc',
12
+ LIST_PLAYLISTS: 'tools.music.playlists.list.rpc',
10
13
  SET_REACTION: 'tools.music.jobs.set-reaction.rpc',
11
14
  UPDATE_TITLE: 'tools.music.jobs.update-title.rpc',
12
15
  UPDATE_FAVORITE: 'tools.music.jobs.update-favorite.rpc',
13
16
  UPDATE_JOB: 'tools.music.jobs.update.rpc',
17
+ CREATE_PLAYLIST: 'tools.music.playlists.create.rpc',
18
+ UPDATE_PLAYLIST: 'tools.music.playlists.update.rpc',
19
+ DELETE_PLAYLIST: 'tools.music.playlists.delete.rpc',
20
+ ADD_TRACK_TO_PLAYLIST: 'tools.music.playlists.add-track.rpc',
21
+ REMOVE_TRACK_FROM_PLAYLIST: 'tools.music.playlists.remove-track.rpc',
14
22
  SOFT_DELETE: 'tools.music.jobs.soft-delete.rpc',
15
23
  SOFT_DELETE_ALL: 'tools.music.jobs.soft-delete-all.rpc',
16
24
  RETRY: 'tools.music.jobs.retry.rpc',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@purpleschool/gptbot-tools",
3
- "version": "0.2.48",
3
+ "version": "0.2.50",
4
4
  "main": "build/index.js",
5
5
  "types": "build/index.d.ts",
6
6
  "scripts": {
@@ -12,7 +12,7 @@
12
12
  "license": "ISC",
13
13
  "description": "",
14
14
  "dependencies": {
15
- "@purpleschool/rugpt-lib-common": "^0.0.21",
15
+ "@purpleschool/rugpt-lib-common": "^0.0.72-es-add-test",
16
16
  "zod": "^3.25.67"
17
17
  }
18
18
  }