runapi-suno 0.2.7 → 0.2.9

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.
@@ -5,15 +5,8 @@ module RunApi
5
5
  module Validators
6
6
  module_function
7
7
 
8
- MUSIC_PROMPT_SHAPE_ERROR = "choose a valid vocal_mode: auto_lyrics, exact_lyrics, or instrumental"
9
-
10
8
  def validate_text_to_music!(params, resource)
11
- validate_music_prompt_shape!(params, resource)
12
- require_param!(resource, params, :model)
13
- validate_optional!(resource, params, :vocal_mode, Types::VOCAL_MODES)
14
- validate_optional!(resource, params, :model, Types::MODELS)
15
- validate_optional!(resource, params, :vocal_gender, Types::VOCAL_GENDERS)
16
- validate_optional!(resource, params, :persona_type, Types::PERSONA_TYPES)
9
+ resource.send(:validate_contract!, CONTRACT["text-to-music"], params)
17
10
  end
18
11
 
19
12
  def validate_extend_music!(params, resource)
@@ -40,13 +33,7 @@ module RunApi
40
33
  end
41
34
 
42
35
  def validate_cover_audio!(params, resource)
43
- require_param!(resource, params, :upload_url)
44
- require_param!(resource, params, :model)
45
- validate_music_prompt_shape!(params, resource)
46
- validate_optional!(resource, params, :vocal_mode, Types::VOCAL_MODES)
47
- validate_optional!(resource, params, :model, Types::MODELS)
48
- validate_optional!(resource, params, :vocal_gender, Types::VOCAL_GENDERS)
49
- validate_optional!(resource, params, :persona_type, Types::PERSONA_TYPES)
36
+ resource.send(:validate_contract!, CONTRACT["cover-audio"], params)
50
37
  end
51
38
 
52
39
  def validate_add_instrumental!(params, resource)
@@ -62,8 +49,7 @@ module RunApi
62
49
  end
63
50
 
64
51
  def validate_separate_audio_stems!(params, resource)
65
- require_all!(resource, params, :task_id, :audio_id)
66
- validate_optional!(resource, params, :type, Types::SEPARATE_AUDIO_STEMS_TYPES)
52
+ resource.send(:validate_contract!, CONTRACT["separate-audio-stems"], params)
67
53
  end
68
54
 
69
55
  def validate_generate_midi!(params, resource)
@@ -87,10 +73,18 @@ module RunApi
87
73
  end
88
74
 
89
75
  def validate_replace_section!(params, resource)
90
- require_all!(resource, params, :task_id, :audio_id, :lyrics, :tags, :title, :infill_start_time, :infill_end_time)
91
- if param(resource, params, :infill_end_time).to_f <= param(resource, params, :infill_start_time).to_f
76
+ resource.send(:validate_contract!, CONTRACT["replace-section"], params)
77
+ validate_replace_section_source!(params, resource)
78
+ start_time = replace_section_time!(params, resource, :infill_start_time)
79
+ end_time = replace_section_time!(params, resource, :infill_end_time)
80
+ if end_time <= start_time
92
81
  raise Core::ValidationError, "infill_end_time must be greater than infill_start_time"
93
82
  end
83
+
84
+ duration = end_time - start_time
85
+ return if duration.between?(6, 60)
86
+
87
+ raise Core::ValidationError, "replacement duration must be between 6 and 60 seconds"
94
88
  end
95
89
 
96
90
  def validate_create_mashup!(params, resource)
@@ -98,12 +92,7 @@ module RunApi
98
92
  unless upload_url_list.is_a?(Array) && upload_url_list.size == 2
99
93
  raise Core::ValidationError, "upload_url_list must contain exactly 2 URLs"
100
94
  end
101
- require_param!(resource, params, :model)
102
- validate_music_prompt_shape!(params, resource)
103
- validate_optional!(resource, params, :vocal_mode, Types::VOCAL_MODES)
104
- validate_optional!(resource, params, :model, Types::MODELS)
105
- validate_optional!(resource, params, :vocal_gender, Types::VOCAL_GENDERS)
106
- validate_optional!(resource, params, :persona_type, Types::PERSONA_TYPES)
95
+ resource.send(:validate_contract!, CONTRACT["create-mashup"], params)
107
96
  end
108
97
 
109
98
  def validate_text_to_sound!(params, resource)
@@ -148,28 +137,6 @@ module RunApi
148
137
  require_param!(resource, params, :description)
149
138
  end
150
139
 
151
- def validate_music_prompt_shape!(params, resource)
152
- mode = param(resource, params, :vocal_mode).to_s
153
- has_prompt = truthy_presence?(param(resource, params, :prompt))
154
- has_lyrics = truthy_presence?(param(resource, params, :lyrics))
155
- has_style = truthy_presence?(param(resource, params, :style))
156
- has_title = truthy_presence?(param(resource, params, :title))
157
-
158
- valid_shape = case mode
159
- when "auto_lyrics"
160
- has_prompt && !has_lyrics && !has_style && !has_title
161
- when "exact_lyrics"
162
- !has_prompt && has_lyrics && has_style && has_title
163
- when "instrumental"
164
- !has_prompt && !has_lyrics && has_style && has_title
165
- else
166
- false
167
- end
168
- return if valid_shape
169
-
170
- raise Core::ValidationError, MUSIC_PROMPT_SHAPE_ERROR
171
- end
172
-
173
140
  def validate_extend_music_prompt_shape!(params, resource)
174
141
  return unless truthy_presence?(param(resource, params, :lyrics))
175
142
 
@@ -187,6 +154,30 @@ module RunApi
187
154
  raise Core::ValidationError, "lyrics can only be used when extending uploaded audio with custom parameters"
188
155
  end
189
156
 
157
+ def validate_replace_section_source!(params, resource)
158
+ has_existing_source = %i[task_id audio_id].any? { |key| truthy_presence?(param(resource, params, key)) }
159
+ has_uploaded_source = %i[upload_url model].any? { |key| truthy_presence?(param(resource, params, key)) }
160
+
161
+ if has_existing_source && has_uploaded_source
162
+ raise Core::ValidationError, "task_id/audio_id cannot be combined with upload_url/model"
163
+ end
164
+
165
+ if has_existing_source
166
+ require_all!(resource, params, :task_id, :audio_id)
167
+ elsif has_uploaded_source
168
+ require_all!(resource, params, :upload_url, :model)
169
+ else
170
+ raise Core::ValidationError, "task_id and audio_id, or upload_url and model are required"
171
+ end
172
+ end
173
+
174
+ def replace_section_time!(params, resource, key)
175
+ value = param(resource, params, key)
176
+ return value.to_f if value.is_a?(Numeric)
177
+
178
+ raise Core::ValidationError, "#{key} must be a number"
179
+ end
180
+
190
181
  def require_all!(resource, params, *keys)
191
182
  keys.each { |key| require_param!(resource, params, key) }
192
183
  end
data/lib/runapi/suno.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "runapi/core"
4
4
  require_relative "suno/types"
5
+ require_relative "suno/contract_gen"
5
6
  require_relative "suno/validators"
6
7
  require_relative "suno/resources/text_to_music"
7
8
  require_relative "suno/resources/extend_music"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runapi-suno
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - RunAPI
@@ -15,18 +15,18 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.2.6
18
+ version: 0.2.13
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: 0.2.6
26
- description: The suno ai api Ruby SDK is the language-specific package for Suno on
27
- RunAPI. Use this suno ai api package for song generation, lyrics, vocal, extension,
28
- and audio transformation flows when your application needs JSON request bodies,
29
- task status lookup, and consistent RunAPI errors in Ruby.
25
+ version: 0.2.13
26
+ description: The Suno Ruby SDK is the language-specific package for Suno on RunAPI.
27
+ Use this package for song generation, lyrics, vocals, extension, and audio transformation
28
+ workflows when your application needs request bodies, task status lookup, and consistent
29
+ RunAPI errors in Ruby.
30
30
  email:
31
31
  - contact@runapi.ai
32
32
  executables: []
@@ -39,6 +39,7 @@ files:
39
39
  - lib/runapi-suno.rb
40
40
  - lib/runapi/suno.rb
41
41
  - lib/runapi/suno/client.rb
42
+ - lib/runapi/suno/contract_gen.rb
42
43
  - lib/runapi/suno/resources/add_instrumental.rb
43
44
  - lib/runapi/suno/resources/add_vocals.rb
44
45
  - lib/runapi/suno/resources/boost_style.rb
@@ -66,9 +67,11 @@ homepage: https://runapi.ai/models/suno
66
67
  licenses:
67
68
  - Apache-2.0
68
69
  metadata:
70
+ runapi_slug: suno
69
71
  homepage_uri: https://runapi.ai/models/suno
70
72
  documentation_uri: https://github.com/runapi-ai/suno-sdk/blob/main/ruby/README.md
71
73
  source_code_uri: https://github.com/runapi-ai/suno-sdk
74
+ bug_tracker_uri: https://github.com/runapi-ai/suno-sdk/issues
72
75
  changelog_uri: https://github.com/runapi-ai/suno-sdk/blob/main/CHANGELOG.md
73
76
  rdoc_options: []
74
77
  require_paths:
@@ -86,5 +89,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
89
  requirements: []
87
90
  rubygems_version: 4.0.10
88
91
  specification_version: 4
89
- summary: Suno AI API Ruby SDK for RunAPI
92
+ summary: Suno API Ruby SDK for RunAPI
90
93
  test_files: []