Module: RunApi::Suno::Validators

Defined in:
lib/runapi/suno/validators.rb

Class Method Summary collapse

Class Method Details

.param(resource, params, key) ⇒ Object



189
190
191
# File 'lib/runapi/suno/validators.rb', line 189

def param(resource, params, key)
  resource.send(:param, params, key)
end

.replace_section_time!(params, resource, key) ⇒ Object

Raises:

  • (Core::ValidationError)


174
175
176
177
178
179
# File 'lib/runapi/suno/validators.rb', line 174

def replace_section_time!(params, resource, key)
  value = param(resource, params, key)
  return value.to_f if value.is_a?(Numeric)

  raise Core::ValidationError, "#{key} must be a number"
end

.require_all!(resource, params, *keys) ⇒ Object



181
182
183
# File 'lib/runapi/suno/validators.rb', line 181

def require_all!(resource, params, *keys)
  keys.each { |key| require_param!(resource, params, key) }
end

.require_param!(resource, params, key) ⇒ Object

Raises:

  • (Core::ValidationError)


185
186
187
# File 'lib/runapi/suno/validators.rb', line 185

def require_param!(resource, params, key)
  raise Core::ValidationError, "#{key} is required" if param(resource, params, key).nil?
end

.truthy?(value) ⇒ Boolean

Returns:

  • (Boolean)


197
198
199
# File 'lib/runapi/suno/validators.rb', line 197

def truthy?(value)
  [true, 1, "1", "true", "TRUE", "True"].include?(value)
end

.truthy_presence?(value) ⇒ Boolean

Returns:

  • (Boolean)


201
202
203
204
205
# File 'lib/runapi/suno/validators.rb', line 201

def truthy_presence?(value)
  return !value.empty? if value.respond_to?(:empty?)

  !value.nil?
end

.validate_add_instrumental!(params, resource) ⇒ Object



39
40
41
42
43
# File 'lib/runapi/suno/validators.rb', line 39

def validate_add_instrumental!(params, resource)
  require_all!(resource, params, :upload_url, :title, :negative_tags, :tags, :model)
  validate_optional!(resource, params, :model, Types::MODELS)
  validate_optional!(resource, params, :vocal_gender, Types::VOCAL_GENDERS)
end

.validate_add_vocals!(params, resource) ⇒ Object



45
46
47
48
49
# File 'lib/runapi/suno/validators.rb', line 45

def validate_add_vocals!(params, resource)
  require_all!(resource, params, :upload_url, :lyrics, :title, :negative_tags, :style, :model)
  validate_optional!(resource, params, :model, Types::MODELS)
  validate_optional!(resource, params, :vocal_gender, Types::VOCAL_GENDERS)
end

.validate_boost_style!(params, resource) ⇒ Object



136
137
138
# File 'lib/runapi/suno/validators.rb', line 136

def validate_boost_style!(params, resource)
  require_param!(resource, params, :description)
end

.validate_check_voice!(params, resource) ⇒ Object



128
129
130
# File 'lib/runapi/suno/validators.rb', line 128

def validate_check_voice!(params, resource)
  require_param!(resource, params, :task_id)
end

.validate_convert_audio!(params, resource) ⇒ Object



59
60
61
# File 'lib/runapi/suno/validators.rb', line 59

def validate_convert_audio!(params, resource)
  require_all!(resource, params, :task_id, :audio_id)
end

.validate_cover_audio!(params, resource) ⇒ Object



35
36
37
# File 'lib/runapi/suno/validators.rb', line 35

def validate_cover_audio!(params, resource)
  resource.send(:validate_contract!, CONTRACT["cover-audio"], params)
end

.validate_create_mashup!(params, resource) ⇒ Object



90
91
92
93
94
95
96
# File 'lib/runapi/suno/validators.rb', line 90

def validate_create_mashup!(params, resource)
  upload_url_list = param(resource, params, :upload_url_list)
  unless upload_url_list.is_a?(Array) && upload_url_list.size == 2
    raise Core::ValidationError, "upload_url_list must contain exactly 2 URLs"
  end
  resource.send(:validate_contract!, CONTRACT["create-mashup"], params)
end

.validate_extend_music!(params, resource) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/runapi/suno/validators.rb', line 12

def validate_extend_music!(params, resource)
  unless %i[task_id audio_id audio_url upload_url].any? { |key| param(resource, params, key) }
    raise Core::ValidationError, "task_id, audio_id, audio_url, or upload_url is required"
  end
  require_param!(resource, params, :parameter_mode)
  require_param!(resource, params, :model)

  validate_optional!(resource, params, :parameter_mode, Types::PARAMETER_MODES)
  if param(resource, params, :parameter_mode) == "custom"
    require_param!(resource, params, :style)
    require_param!(resource, params, :title)
    require_param!(resource, params, :continue_at)
  end
  validate_extend_music_prompt_shape!(params, resource)
  validate_optional!(resource, params, :model, Types::MODELS)
  validate_optional!(resource, params, :vocal_gender, Types::VOCAL_GENDERS)
  validate_optional!(resource, params, :persona_type, Types::PERSONA_TYPES)
end

.validate_extend_music_prompt_shape!(params, resource) ⇒ Object

Raises:

  • (Core::ValidationError)


140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/runapi/suno/validators.rb', line 140

def validate_extend_music_prompt_shape!(params, resource)
  return unless truthy_presence?(param(resource, params, :lyrics))

  if truthy_presence?(param(resource, params, :prompt))
    raise Core::ValidationError, "prompt cannot be combined with lyrics"
  end

  if truthy?(param(resource, params, :instrumental))
    raise Core::ValidationError, "lyrics cannot be used when instrumental is true"
  end

  upload_mode = %i[audio_url upload_url].any? { |key| truthy_presence?(param(resource, params, key)) }
  return if param(resource, params, :parameter_mode) == "custom" && upload_mode

  raise Core::ValidationError, "lyrics can only be used when extending uploaded audio with custom parameters"
end

.validate_generate_artwork!(params, resource) ⇒ Object



31
32
33
# File 'lib/runapi/suno/validators.rb', line 31

def validate_generate_artwork!(params, resource)
  require_param!(resource, params, :task_id)
end

.validate_generate_lyrics!(params, resource) ⇒ Object



67
68
69
# File 'lib/runapi/suno/validators.rb', line 67

def validate_generate_lyrics!(params, resource)
  require_param!(resource, params, :prompt)
end

.validate_generate_midi!(params, resource) ⇒ Object



55
56
57
# File 'lib/runapi/suno/validators.rb', line 55

def validate_generate_midi!(params, resource)
  require_param!(resource, params, :task_id)
end

.validate_generate_persona!(params, resource) ⇒ Object



132
133
134
# File 'lib/runapi/suno/validators.rb', line 132

def validate_generate_persona!(params, resource)
  require_all!(resource, params, :task_id, :audio_id, :name, :description)
end

.validate_generate_voice!(params, resource) ⇒ Object



123
124
125
126
# File 'lib/runapi/suno/validators.rb', line 123

def validate_generate_voice!(params, resource)
  require_all!(resource, params, :task_id, :verify_url)
  validate_optional!(resource, params, :singer_skill_level, Types::SINGER_SKILL_LEVELS)
end

.validate_get_timestamped_lyrics!(params, resource) ⇒ Object



71
72
73
# File 'lib/runapi/suno/validators.rb', line 71

def validate_get_timestamped_lyrics!(params, resource)
  require_all!(resource, params, :task_id, :audio_id)
end

.validate_optional!(resource, params, key, allowed) ⇒ Object



193
194
195
# File 'lib/runapi/suno/validators.rb', line 193

def validate_optional!(resource, params, key, allowed)
  resource.send(:validate_optional!, params, key, allowed)
end

.validate_regenerate_validation_phrase!(params, resource) ⇒ Object



119
120
121
# File 'lib/runapi/suno/validators.rb', line 119

def validate_regenerate_validation_phrase!(params, resource)
  require_param!(resource, params, :task_id)
end

.validate_replace_section!(params, resource) ⇒ Object

Raises:

  • (Core::ValidationError)


75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/runapi/suno/validators.rb', line 75

def validate_replace_section!(params, resource)
  resource.send(:validate_contract!, CONTRACT["replace-section"], params)
  validate_replace_section_source!(params, resource)
  start_time = replace_section_time!(params, resource, :infill_start_time)
  end_time = replace_section_time!(params, resource, :infill_end_time)
  if end_time <= start_time
    raise Core::ValidationError, "infill_end_time must be greater than infill_start_time"
  end

  duration = end_time - start_time
  return if duration.between?(6, 60)

  raise Core::ValidationError, "replacement duration must be between 6 and 60 seconds"
end

.validate_replace_section_source!(params, resource) ⇒ Object



157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/runapi/suno/validators.rb', line 157

def validate_replace_section_source!(params, resource)
  has_existing_source = %i[task_id audio_id].any? { |key| truthy_presence?(param(resource, params, key)) }
  has_uploaded_source = %i[upload_url model].any? { |key| truthy_presence?(param(resource, params, key)) }

  if has_existing_source && has_uploaded_source
    raise Core::ValidationError, "task_id/audio_id cannot be combined with upload_url/model"
  end

  if has_existing_source
    require_all!(resource, params, :task_id, :audio_id)
  elsif has_uploaded_source
    require_all!(resource, params, :upload_url, :model)
  else
    raise Core::ValidationError, "task_id and audio_id, or upload_url and model are required"
  end
end

.validate_separate_audio_stems!(params, resource) ⇒ Object



51
52
53
# File 'lib/runapi/suno/validators.rb', line 51

def validate_separate_audio_stems!(params, resource)
  resource.send(:validate_contract!, CONTRACT["separate-audio-stems"], params)
end

.validate_text_to_music!(params, resource) ⇒ Object



8
9
10
# File 'lib/runapi/suno/validators.rb', line 8

def validate_text_to_music!(params, resource)
  resource.send(:validate_contract!, CONTRACT["text-to-music"], params)
end

.validate_text_to_sound!(params, resource) ⇒ Object



98
99
100
101
102
103
104
105
106
# File 'lib/runapi/suno/validators.rb', line 98

def validate_text_to_sound!(params, resource)
  require_all!(resource, params, :prompt, :model)
  validate_optional!(resource, params, :model, Types::SOUND_MODELS)
  validate_optional!(resource, params, :sound_key, Types::SOUND_KEYS)
  tempo = param(resource, params, :sound_tempo)
  if tempo && !(1..300).cover?(tempo.to_i)
    raise Core::ValidationError, "sound_tempo must be between 1 and 300"
  end
end

.validate_visualize_music!(params, resource) ⇒ Object



63
64
65
# File 'lib/runapi/suno/validators.rb', line 63

def validate_visualize_music!(params, resource)
  require_all!(resource, params, :task_id, :audio_id)
end

.validate_voice_to_validation_phrase!(params, resource) ⇒ Object

Raises:

  • (Core::ValidationError)


108
109
110
111
112
113
114
115
116
117
# File 'lib/runapi/suno/validators.rb', line 108

def validate_voice_to_validation_phrase!(params, resource)
  require_all!(resource, params, :voice_url, :vocal_start_seconds, :vocal_end_seconds)
  validate_optional!(resource, params, :language, Types::VALIDATION_PHRASE_LANGUAGES)

  start_seconds = param(resource, params, :vocal_start_seconds).to_i
  end_seconds = param(resource, params, :vocal_end_seconds).to_i
  return if end_seconds > start_seconds

  raise Core::ValidationError, "vocal_end_seconds must be greater than vocal_start_seconds"
end