Module: RunApi::Suno::Validators

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

Class Method Summary collapse

Class Method Details

.param(resource, params, key) ⇒ Object



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

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

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

Raises:

  • (Core::ValidationError)


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

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



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

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

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

Raises:

  • (Core::ValidationError)


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

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

.truthy?(value) ⇒ Boolean

Returns:

  • (Boolean)


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

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

.truthy_presence?(value) ⇒ Boolean

Returns:

  • (Boolean)


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

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



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

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

.validate_check_voice!(params, resource) ⇒ Object



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

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

.validate_convert_audio!(params, resource) ⇒ Object



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

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



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

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)


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

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



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

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

.validate_generate_midi!(params, resource) ⇒ Object



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

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

.validate_generate_persona!(params, resource) ⇒ Object



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

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

.validate_generate_voice!(params, resource) ⇒ Object



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

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



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

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

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



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

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

.validate_regenerate_validation_phrase!(params, resource) ⇒ Object



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

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

.validate_replace_section!(params, resource) ⇒ Object

Raises:

  • (Core::ValidationError)


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

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



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

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
54
# File 'lib/runapi/suno/validators.rb', line 51

def validate_separate_audio_stems!(params, resource)
  require_all!(resource, params, :task_id, :audio_id)
  validate_optional!(resource, params, :type, Types::SEPARATE_AUDIO_STEMS_TYPES)
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



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

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



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

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)


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

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