* VRFS-801 - closer to all fixes required for mixing

This commit is contained in:
Seth Call 2014-01-13 13:44:28 +00:00
parent 8f5b021464
commit 50595d155c
9 changed files with 75 additions and 43 deletions

View File

@ -14,7 +14,6 @@ module JamRuby
def init
puts "Init self.client #{self.clients}"
self.clients ||= 10000
self.sources ||= 1000
self.queue_size ||= 102400

View File

@ -17,14 +17,23 @@ module JamRuby
mix.recording = recording
mix.manifest = manifest.to_json
mix.save
mix.url = construct_filename(recording.id, mix.id)
mix.url = construct_filename(mix.created_at, recording.id, mix.id)
if mix.save
Resque.enqueue(AudioMixer, mix.id, mix.sign_put)
mix.enqueue
end
mix
end
def enqueue
Resque.enqueue(AudioMixer, self.id, self.sign_put)
end
def can_download?(some_user)
!ClaimedRecording.find_by_user_id_and_recording_id(some_user.id, recording_id).nil?
end
def errored(reason, detail)
self.error_reason = reason
self.error_detail = detail
@ -45,7 +54,7 @@ module JamRuby
end
def s3_url
s3_manager.s3_url(filename)
s3_manager.s3_url(url)
end
def is_completed
@ -54,11 +63,11 @@ module JamRuby
def sign_url(expiration_time = 120)
# expire link in 1 minute--the expectation is that a client is immediately following this link
s3_manager.sign_url(filename, {:expires => expiration_time, :response_content_type => 'audio/ogg', :secure => false})
s3_manager.sign_url(self.url, {:expires => expiration_time, :response_content_type => 'audio/ogg', :secure => false})
end
def sign_put(expiration_time = 3600 * 24)
s3_manager.sign_url(filename, {:expires => expiration_time, :content_type => 'audio/ogg', :secure => false}, :put)
s3_manager.sign_url(self.url, {:expires => expiration_time, :content_type => 'audio/ogg', :secure => false}, :put)
end
private
@ -69,14 +78,12 @@ module JamRuby
def filename
# construct a path for s3
Mix.construct_filename(self.recording.id, self.id)
Mix.construct_filename(self.created_at, self.recording.id, self.id)
end
def self.construct_filename(recording_id, id)
def self.construct_filename(created_at, recording_id, id)
raise "unknown ID" unless id
"recordings/#{recording_id}/mix-#{id}.ogg"
"recordings/#{created_at.strftime('%m-%d-%Y')}/#{recording_id}/mix-#{id}.ogg"
end
end
end

View File

@ -86,13 +86,13 @@ module JamRuby
recorded_track.next_part_to_upload = 0
recorded_track.file_offset = 0
recorded_track.save
recorded_track.url = construct_filename(recording.id, track.client_track_id)
recorded_track.url = construct_filename(recorded_track.created_at, recording.id, track.client_track_id)
recorded_track.save
recorded_track
end
def sign_url(expiration_time = 120)
s3_manager.sign_url(url, {:expires => expiration_time, :response_content_type => 'audio/ogg', :secure => false})
s3_manager.sign_url(self.url, {:expires => expiration_time, :response_content_type => 'audio/ogg', :secure => false})
end
def upload_start(length, md5)
@ -128,7 +128,7 @@ module JamRuby
end
def upload_sign(content_md5)
s3_manager.upload_sign(filename, content_md5, next_part_to_upload, upload_id)
s3_manager.upload_sign(url, content_md5, next_part_to_upload, upload_id)
end
def upload_part_complete(part, offset)
@ -154,17 +154,17 @@ module JamRuby
private
def delete_s3_files
s3_manager.delete(filename)
s3_manager.delete(url)
end
def filename
# construct a path for s3
RecordedTrack.construct_filename(self.recording.id, self.client_track_id)
RecordedTrack.construct_filename(self.created_at, self.recording.id, self.client_track_id)
end
def self.construct_filename(recording_id, client_track_id)
def self.construct_filename(created_at, recording_id, client_track_id)
raise "unknown ID" unless client_track_id
"recordings/#{recording_id}/track-#{client_track_id}.ogg"
"recordings/#{created_at.strftime('%m-%d-%Y')}/#{recording_id}/track-#{client_track_id}.ogg"
end
end
end

View File

@ -49,6 +49,7 @@ module JamRuby
raise "no timeline specified" unless @manifest[:timeline]
raise "no recording_id specified" unless @manifest[:recording_id]
raise "no mix_id specified" unless @manifest[:mix_id]
end
@ -79,9 +80,9 @@ module JamRuby
@error_detail = "url #{filename}, error=#{e}"
raise e
end
end
@@log.debug("downloaded #{download_filename}")
filename = download_filename
file[:filename] = download_filename
end
@ -103,7 +104,7 @@ module JamRuby
# write the manifest object to file, to pass into audiomixer
def prepare_manifest
@manifest_file = Dir::Tmpname.make_tmpname( ["#{Dir.tmpdir}/audiomixer-manifest-#{@manifest['recording_id']}", '.json'], nil)
@manifest_file = Dir::Tmpname.make_tmpname( ["#{Dir.tmpdir}/audiomixer-manifest-#{@manifest[:recording_id]}", '.json'], nil)
File.open(@manifest_file,"w") do |f|
f.write(@manifest.to_json)
end
@ -113,7 +114,7 @@ module JamRuby
# make a suitable location to store the output mix, and pass the chosen filepath into the manifest
def prepare_output
@output_filename = Dir::Tmpname.make_tmpname( ["#{Dir.tmpdir}/audiomixer-output-#{@manifest['recording_id']}", '.ogg'], nil)
@output_filename = Dir::Tmpname.make_tmpname( ["#{Dir.tmpdir}/audiomixer-output-#{@manifest[:recording_id]}", '.ogg'], nil)
# update manifest so that audiomixer writes here
@manifest[:output][:filename] = @output_filename
@ -123,7 +124,7 @@ module JamRuby
# make a suitable location to store an output error file, which will be populated on failure to help diagnose problems.
def prepare_error_out
@error_out_filename = Dir::Tmpname.make_tmpname( ["#{Dir.tmpdir}/audiomixer-error-out-#{@manifest['recording_id']}", '.ogg'], nil)
@error_out_filename = Dir::Tmpname.make_tmpname( ["#{Dir.tmpdir}/audiomixer-error-out-#{@manifest[:recording_id]}", '.ogg'], nil)
# update manifest so that audiomixer writes here
@manifest[:error_out] = @error_out_filename
@ -203,6 +204,12 @@ module JamRuby
mix = Mix.find(mix_id)
begin
# bailout check
if mix.completed
@@log.debug("mix is already completed. bailing")
return
end
@manifest = symbolize_keys(JSON.parse(mix.manifest))
@manifest[:mix_id] = mix_id # slip in the mix_id so that the job can add it to the ogg comments
@ -215,25 +222,16 @@ module JamRuby
# write the manifest to file, so that it can be passed to audiomixer as an filepath argument
prepare
result = execute(@manifest_file)
execute(@manifest_file)
if result
if $? == 0
postback
post_success(mix)
@@log.info("audiomixer job successful. mix_id #{mix_id}")
else
parse_error_out
error_msg = "audiomixer job failed status=#{$?} error_reason=#{error_reason} error_detail=#{error_detail}"
@@log.info(error_msg)
raise error_msg
end
if $? == 0
postback
post_success(mix)
@@log.info("audiomixer job successful. mix_id #{mix_id}")
else
@@log.error("unable to find audiomixer")
parse_error_out
error_msg = "audiomixer job failed status=#{$?} error_reason=#{error_reason} error_detail=#{error_detail}"
@@log.info(error_msg)
@error_reason = "unable-find-appmixer"
@error_detail = APP_CONFIG.audiomixer_path
raise error_msg
end
rescue Exception => e
@ -250,8 +248,20 @@ module JamRuby
private
def execute(manifest_file)
unless File.exist? APP_CONFIG.audiomixer_path
@@log.error("unable to find audiomixer")
error_msg = "audiomixer job failed status=#{$?} error_reason=#{error_reason} error_detail=#{error_detail}"
@@log.info(error_msg)
@error_reason = "unable-find-appmixer"
@error_detail = APP_CONFIG.audiomixer_path
raise error_msg
end
audiomixer_cmd = "#{APP_CONFIG.audiomixer_path} #{manifest_file}"
@@log.debug("executing #{audiomixer_cmd}")
system(audiomixer_cmd)

View File

@ -11,11 +11,9 @@ describe IcecastLimit do
it "save" do
limit.clients = 9999
limit.save
puts limit.inspect
#limit.dumpXml
limit.errors.any?.should be_false
v = IcecastLimit.find(limit.id)
puts v.inspect
end
=begin

View File

@ -42,7 +42,7 @@ describe RecordedTrack do
it "gets a url for the track" do
@recorded_track = RecordedTrack.create_from_track(@track, @recording)
@recorded_track.save.should be_true
@recorded_track.url.should == "recordings/#{@recording.id}/track-#{@track.client_track_id}.ogg"
@recorded_track.url.should == "recordings/#{@recorded_track.created_at.strftime('%m-%d-%Y')}/#{@recording.id}/track-#{@track.client_track_id}.ogg"
end
it "signs url" do

View File

@ -222,6 +222,22 @@ describe AudioMixer do
@mix.length.should == 0
@mix.md5.should == 'd41d8cd98f00b204e9800998ecf8427e' # that's the md5 of a touched file, which is what the stubbed :execute does
end
it "bails out with no error if already completed" do
with_resque do
@mix = Mix.schedule(@recording, local_files_manifest)
end
@mix.reload
@mix.completed.should be_true
with_resque do
@mix.enqueue
end
@mix.reload
@mix.completed.should be_true
end
end
end

View File

@ -39,7 +39,9 @@ class ApiMixesController < ApiController
end
def download
# XXX: needs to permission check
@mix = Mix.find(params[:id])
raise PermissionError, "You can only download a mix you didn't claim" unless @mix.can_download? current_user
redirect_to @mix.sign_url
end

View File

@ -35,7 +35,7 @@ module JamWebEventMachine
end
end
if Rails.application.config.websocket_gateway_enable
if Rails.application.config.websocket_gateway_enable && !$rails_rake_task
Thread.new { JamWebsockets::Server.new.run :port => Rails.application.config.websocket_gateway_port,
:emwebsocket_debug => Rails.application.config.websocket_gateway_internal_debug,
@ -82,4 +82,4 @@ module JamWebEventMachine
end
end
JamWebEventMachine.start unless $rails_rake_task
JamWebEventMachine.start