139 lines
4.5 KiB
Ruby
139 lines
4.5 KiB
Ruby
class JamRuby::JamTrackTrack
|
|
|
|
# add a custom validation
|
|
|
|
attr_accessor :preview_generate_error
|
|
|
|
validate :preview
|
|
|
|
def preview
|
|
if preview_generate_error
|
|
errors.add(:preview_start_time, preview_generate_error)
|
|
end
|
|
end
|
|
|
|
|
|
# this is used by active admin/jam-admin
|
|
def preview_start_time_raw
|
|
if self.preview_start_time.nil? || self.preview_start_time.nil?
|
|
''
|
|
else
|
|
seconds = self.preview_start_time.to_f/1000
|
|
time = Time.at(seconds)
|
|
time.strftime("%M:%S:#{(self.preview_start_time % 1000).to_s.rjust(3, '0')}")
|
|
end
|
|
end
|
|
|
|
# this is used by active admin/jam-admin
|
|
def preview_start_time_raw=(new_value)
|
|
|
|
value = nil
|
|
if new_value == nil || new_value == ''
|
|
value = nil
|
|
else
|
|
if new_value && new_value.kind_of?(String) && new_value.include?(':')
|
|
bits = new_value.split(':')
|
|
if bits.length != 3
|
|
raise "format of preview start time must be MM:SS:MLS"
|
|
end
|
|
|
|
value = (bits[0].to_i * 60000) + (bits[1].to_i * 1000) + (bits[2].to_i)
|
|
|
|
else
|
|
raise "format of preview start time must be MM:SS:MLS"
|
|
end
|
|
end
|
|
|
|
if !value.nil? && value != self.preview_start_time
|
|
self.preview_start_time = value
|
|
generate_preview
|
|
else
|
|
self.preview_start_time = value
|
|
end
|
|
end
|
|
|
|
def generate_preview
|
|
|
|
begin
|
|
Dir.mktmpdir do |tmp_dir|
|
|
|
|
input = File.join(tmp_dir, 'in.ogg')
|
|
output = File.join(tmp_dir, 'out.ogg')
|
|
output_mp3 = File.join(tmp_dir, 'out.mp3')
|
|
|
|
start = self.preview_start_time.to_f / 1000
|
|
stop = start + 20
|
|
|
|
raise 'no track' unless self["url_44"]
|
|
|
|
s3_manager.download(self.url_by_sample_rate(44), input)
|
|
|
|
command = "sox \"#{input}\" \"#{output}\" trim #{sprintf("%.3f", start)} =#{sprintf("%.3f", stop)}"
|
|
|
|
@@log.debug("trimming using: " + command)
|
|
|
|
sox_output = `#{command}`
|
|
|
|
result_code = $?.to_i
|
|
|
|
if result_code != 0
|
|
@@log.debug("fail #{result_code}")
|
|
@preview_generate_error = "unable to execute cut command #{sox_output}"
|
|
else
|
|
# now create mp3 off of ogg preview
|
|
|
|
convert_mp3_cmd = "#{APP_CONFIG.ffmpeg_path} -i \"#{output}\" -ab 192k \"#{output_mp3}\""
|
|
|
|
@@log.debug("converting to mp3 using: " + convert_mp3_cmd)
|
|
|
|
convert_output = `#{convert_mp3_cmd}`
|
|
|
|
result_code = $?.to_i
|
|
|
|
if result_code != 0
|
|
@@log.debug("fail #{result_code}")
|
|
@preview_generate_error = "unable to execute mp3 convert command #{convert_output}"
|
|
else
|
|
ogg_digest = ::Digest::MD5.file(output)
|
|
mp3_digest = ::Digest::MD5.file(output_mp3)
|
|
self["preview_md5"] = ogg_md5 = ogg_digest.hexdigest
|
|
self["preview_mp3_md5"] = mp3_md5 = mp3_digest.hexdigest
|
|
|
|
@@log.debug("uploading ogg preview to #{self.preview_filename('ogg')}")
|
|
s3_public_manager.upload(self.preview_filename(ogg_md5, 'ogg'), output, content_type: 'audio/ogg', content_md5: ogg_digest.base64digest)
|
|
@@log.debug("uploading mp3 preview to #{self.preview_filename('mp3')}")
|
|
s3_public_manager.upload(self.preview_filename(mp3_md5, 'mp3'), output_mp3, content_type: 'audio/mpeg', content_md5: mp3_digest.base64)
|
|
|
|
self.skip_uploader = true
|
|
|
|
original_ogg_preview_url = self["preview_url"]
|
|
original_mp3_preview_url = self["preview_mp3_url"]
|
|
|
|
# and finally update the JamTrackTrack with the new info
|
|
self["preview_url"] = self.preview_filename(ogg_md5, 'ogg')
|
|
self["preview_length"] = File.new(output).size
|
|
# and finally update the JamTrackTrack with the new info
|
|
self["preview_mp3_url"] = self.preview_filename(mp3_md5, 'mp3')
|
|
self["preview_mp3_length"] = File.new(output_mp3).size
|
|
self.save!
|
|
|
|
# if all that worked, now delete old previews, if present
|
|
begin
|
|
s3_public_manager.delete(original_ogg_preview_url) if original_ogg_preview_url && original_ogg_preview_url != self["preview_url"]
|
|
s3_public_manager.delete(original_mp3_preview_url) if original_mp3_preview_url && original_mp3_preview_url != track["preview_mp3_url"]
|
|
rescue
|
|
puts "UNABLE TO CLEANUP OLD PREVIEW URL"
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
rescue Exception => e
|
|
@@log.error("error in sox command #{e.to_s}")
|
|
@preview_generate_error = e.to_s
|
|
end
|
|
|
|
end
|
|
|
|
end
|