VRFS-2782 : Support multiple bitrates throughout models, managers, up loaders and builders.

This commit is contained in:
Steven Miers 2015-02-26 17:00:01 -06:00
parent ef287187ba
commit bd08b40e71
7 changed files with 63 additions and 31 deletions

View File

@ -23,6 +23,12 @@ class JamTrackTrackUploader < CarrierWave::Uploader::Base
end
def filename
"#{model.store_dir}/#{model.filename}" if model.id
if model.id
if mounted_as==:url_48
"#{model.store_dir}/#{model.filename}"
else
"#{model.store_dir}/#{mounted_as}/#{model.filename}"
end
end
end
end

View File

@ -12,13 +12,13 @@ module JamRuby
@@log = Logging.logger[JamTracksManager]
class << self
def save_jam_track_jkz(user, jam_track)
def save_jam_track_jkz(user, jam_track, bitrate=48)
jam_track_right = jam_track.right_for_user(user)
raise ArgumentError if jam_track_right.nil?
save_jam_track_right_jkz(jam_track_right)
save_jam_track_right_jkz(jam_track_right, bitrate)
end
def save_jam_track_right_jkz(jam_track_right)
def save_jam_track_right_jkz(jam_track_right, bitrate=48)
jam_track = jam_track_right.jam_track
#py_root = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "..", "jamtracks"))
py_root = APP_CONFIG.jamtracks_dir
@ -31,7 +31,7 @@ module JamRuby
# use the jam_track_track ID as the filename.ogg/.wav, because it's important metadata
nm = jam_track_track.id + File.extname(jam_track_track.filename)
track_filename = File.join(tmp_dir, nm)
track_url = jam_track_track.sign_url
track_url = jam_track_track.sign_url(120, bitrate)
copy_url_to_file(track_url, track_filename)
copy_url_to_file(track_url, File.join(".", nm))
jam_file_opts << " -i '#{track_filename}+#{jam_track_track.part}'"
@ -54,11 +54,14 @@ module JamRuby
#puts "stdout: #{out}, stderr: #{err}"
raise ArgumentError, "Error calling python script: #{err}" if err.present?
raise ArgumentError, "Error calling python script: #{out}" if out && (out.index("No track files specified") || out.index("Cannot find file"))
jam_track_right[:url]
#raise ArgumentError, "output_jkz is empty #{output_jkz}" unless File.exists?(output_jkz)
jam_track_right.url_48.store!(File.open(output_jkz, "rb"))
if bitrate==48
jam_track_right.url_48.store!(File.open(output_jkz, "rb"))
else
jam_track_right.url_44.store!(File.open(output_jkz, "rb"))
end
jam_track_right.signed=true
jam_track_right.downloaded_since_sign=false
jam_track_right.private_key=File.read("#{tmp_dir}/skey.pem")

View File

@ -114,7 +114,7 @@ module JamRuby
jam_track_rights.where("user_id=?", user).first
end
def self.list_downloads(user, limit = 100, since = 0)
def self.list_downloads(user, limit = 100, since = 0, bitrate = 48)
since = 0 unless since || since == '' # guard against nil
downloads = []
@ -122,16 +122,23 @@ module JamRuby
.limit(limit)
.where('jam_track_rights.id > ?', since)
.each do |jam_track_right|
downloads << {
download = {
:type => "jam_track",
:id => jam_track_right.id.to_s,
:jam_track_id => jam_track_right.jam_track_id,
:length => jam_track_right.length_48,
:md5 => jam_track_right.md5_48,
:url => jam_track_right.url_48,
:created_at => jam_track_right.created_at,
:next => jam_track_right.id
}
if(bitrate==48)
download[:length] = jam_track_right.length_48
download[:md5] = jam_track_right.md5_48
download[:url] = jam_track_right.url_48
else
download[:length] = jam_track_right.length_44
download[:md5] = jam_track_right.md5_44
download[:url] = jam_track_right.url_44
end
downloads << download
end
next_id = downloads[-1][:next] if downloads.length > 0

View File

@ -62,12 +62,17 @@ module JamRuby
else
raise "Error sending notification #{self.errors}"
end
end
def finish_sign(length, md5)
def finish_sign(length, md5, bitrate)
self.last_signed_at = Time.now
self.length = length
self.md5 = md5
if bitrate==48
self.length_48 = length
self.md5_48 = md5
else
self.length_44 = length
self.md5_44 = md5
end
self.signed = true
self.error_count = 0
self.error_reason = nil
@ -91,30 +96,41 @@ module JamRuby
def delete_s3_files
remove_url_48!
remove_url_44!
end
def enqueue
def enqueue(bitrate=48)
begin
JamTrackRight.where(:id => self.id).update_all(:signing_queued_at => Time.now, :signing_started_at => nil, :last_signed_at => nil)
Resque.enqueue(JamTracksBuilder, self.id)
Resque.enqueue(JamTracksBuilder, self.id, bitrate: bitrate)
true
rescue Exception => e
puts "e: #{e}"
# implies redis is down. we don't update started_at by bailing out here
false
end
end
# if the job is already signed, just queued up for signing, or currently signing, then don't enqueue... otherwise fire it off
def enqueue_if_needed
def enqueue_if_needed(bitrate=48)
state = signing_state
if state == 'SIGNED' || state == 'SIGNING' || state == 'QUEUED'
false
else
enqueue
enqueue(bitrate)
true
end
end
# @return true if signed && file exists for the bitrate specifed:
def ready?(bitrate=48)
if bitrate==48
self.signed && self.url_48.present? && self.url_48.file.exists?
else
self.signed && self.url_44.present? && self.url_44.file.exists?
end
end
# returns easy to digest state field
# SIGNED - the package is ready to be downloaded
# ERROR - the package was built unsuccessfully

View File

@ -7,7 +7,7 @@ require 'digest/md5'
module JamRuby
class JamTracksBuilder
extend JamRuby::ResqueStats
attr_accessor :bitrate
@queue = :jam_tracks_builder
def log
@ -16,9 +16,10 @@ module JamRuby
attr_accessor :jam_track_right_id
def self.perform(jam_track_right_id)
def self.perform(jam_track_right_id, bitrate)
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
@ -38,12 +39,11 @@ module JamRuby
# track that it's started ( and avoid db validations )
JamTrackRight.where(:id => @jam_track_right.id).update_all(:signing_started_at => Time.now, :should_retry => false)
JamRuby::JamTracksManager.save_jam_track_right_jkz(@jam_track_right)
JamRuby::JamTracksManager.save_jam_track_right_jkz(@jam_track_right, bitrate)
length = @jam_track_right.url_48.size()
length = 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)
@jam_track_right.finish_sign(length, md5.to_s, bitrate)
log.info "Signed jamtrack to #{@jam_track_right[:url]}"

View File

@ -67,7 +67,7 @@ describe JamTrackRight do
jam_track_track = FactoryGirl.create(:jam_track_track)
jam_track = jam_track_track.jam_track
uploader = JamTrackTrackUploader.new(jam_track_track, :url)
uploader = JamTrackTrackUploader.new(jam_track_track, :url_48)
uploader.store!(File.open(ogg_path, 'rb'))
jam_track_track.save!

View File

@ -47,7 +47,7 @@ describe JamTrackTrack do
it "uploads to s3 with correct name, and then downloads via signed URL" do
jam_track_track = FactoryGirl.create(:jam_track_track)
uploader = JamTrackTrackUploader.new(jam_track_track, :url)
uploader = JamTrackTrackUploader.new(jam_track_track, :url_48)
uploader.store!(File.open(TRACK_NAME)) # uploads file
jam_track_track.save!