86 lines
3.3 KiB
Ruby
86 lines
3.3 KiB
Ruby
require 'json'
|
|
require 'resque'
|
|
require 'resque-retry'
|
|
require 'net/http'
|
|
require 'digest/md5'
|
|
|
|
module JamRuby
|
|
class JamTracksBuilder
|
|
extend JamRuby::ResqueStats
|
|
attr_accessor :jam_track_right_id, :bitrate
|
|
@queue = :jam_tracks_builder
|
|
|
|
def log
|
|
@log || Logging.logger[JamTracksBuilder]
|
|
end
|
|
|
|
def self.perform(jam_track_right_id, bitrate=48)
|
|
jam_track_builder = JamTracksBuilder.new()
|
|
jam_track_builder.jam_track_right_id = jam_track_right_id
|
|
jam_track_builder.bitrate=bitrate
|
|
jam_track_builder.run
|
|
end
|
|
|
|
def run
|
|
self.bitrate ||= 48
|
|
begin
|
|
log.info("jam_track_builder job starting. jam_track_right_id #{jam_track_right_id}, bitrate: #{self.bitrate}")
|
|
begin
|
|
@jam_track_right = JamTrackRight.find(jam_track_right_id)
|
|
|
|
# bailout check
|
|
if @jam_track_right.signed?(bitrate)
|
|
log.debug("package is already signed. bailing")
|
|
return
|
|
end
|
|
|
|
# compute the step count
|
|
total_steps = @jam_track_right.jam_track.stem_tracks.count + 1 # the '1' represents the jkz.py invocation
|
|
|
|
# track that it's started ( and avoid db validations )
|
|
signing_started_at = Time.now
|
|
signing_started_model_symbol = bitrate == 48 ? :signing_started_at_48 : :signing_started_at_44
|
|
last_step_at = Time.now
|
|
JamTrackRight.where(:id => @jam_track_right.id).update_all(signing_started_model_symbol => signing_started_at, :should_retry => false, packaging_steps: total_steps, current_packaging_step: 0, last_step_at: last_step_at)
|
|
# because we are skipping 'after_save', we have to keep the model current for the notification. A bit ugly...
|
|
@jam_track_right.current_packaging_step = 0
|
|
@jam_track_right.packaging_steps = total_steps
|
|
@jam_track_right[signing_started_model_symbol] = signing_started_at
|
|
@jam_track_right.should_retry = false
|
|
@jam_track_right.last_step_at = Time.now
|
|
SubscriptionMessage.jam_track_signing_job_change(@jam_track_right)
|
|
JamRuby::JamTracksManager.save_jam_track_right_jkz(@jam_track_right, self.bitrate)
|
|
|
|
# If bitrate is 48 (the default), use that URL. Otherwise, use 44kHz:
|
|
length = (self.bitrate==48) ? @jam_track_right.url_48.size() : @jam_track_right.url_44.size()
|
|
md5 = Digest::MD5.new
|
|
@jam_track_right.finish_sign(length, md5.to_s, self.bitrate)
|
|
|
|
log.info "Signed #{self.bitrate}kHz jamtrack to #{@jam_track_right[:url]}"
|
|
rescue Exception => e
|
|
# record the error in the database
|
|
post_error(e)
|
|
# and let the job fail, alerting ops too
|
|
raise
|
|
end
|
|
end
|
|
end
|
|
|
|
# set @error_reason before you raise an exception, and it will be sent back as the error reason
|
|
# otherwise, the error_reason will be unhandled-job-exception
|
|
def post_error(e)
|
|
begin
|
|
# if error_reason is null, assume this is an unhandled error
|
|
unless @error_reason
|
|
@error_reason = "unhandled-job-exception"
|
|
@error_detail = e.to_s
|
|
end
|
|
@jam_track_right.finish_errored(@error_reason, @error_detail)
|
|
|
|
rescue Exception => e
|
|
log.error "unable to post back to the database the error #{e}"
|
|
end
|
|
end
|
|
end
|
|
end
|