jam-cloud/ruby/bin/mix_cron.rb

98 lines
2.7 KiB
Ruby
Raw Normal View History

2013-06-30 20:55:03 +00:00
# Ensure the cron is using the proper version of ruby, and simply run this with:
# ruby mix_cron.rb
#
require 'faraday'
require 'json'
require 'tempfile'
MIXER_EXECUTABLE = "/usr/local/bin/audiomixerapp"
S3CMD = "s3cmd"
# FIXME: This should probably come from an environments file or something
BASE_URL = "http://www.jamkazam.com"
# This must be present on requests from the cron to prevent hackers from
# hitting these routes.
CRON_TOKEN = "2kkl39sjjf3ijdsflje2923j"
AUDIOMIXER_LOG_FILE = "/var/log/audiomixer"
MIX_CRON_WATCH_FILE = "/var/run/mix_cron"
# Don't do anything if the cron is arleady running. There's a theoretical race
# condition here, but it should never actually be a problem because the cron should
# only run every minute or two.
if File.exist?(MIX_CRON_WATCH_FILE)
psret = `ps axuw | grep mix_cron.rb | grep ruby`
unless psret.empty?
puts "Cron still running"
exit
end
end
`touch #{MIX_CRON_WATCH_FILE}`
# Get the next manifest to mix
response = Faraday.get "#{BASE_URL}/mixes/next", :token => CRON_TOKEN
if response.status > 299
puts "Error response getting next mix: #{response.status}, #{response.body}"
do_exit
end
# This just means no mixes available.
if response.status == 204
do_exit
end
if response.status != 200
puts "Unexpected response received: #{response.status}, #{response.body}"
do_exit
end
json = JSON.parse(response.body)
# This needs to download all the vorbis files, mix and then upload
# the finished one, and tell the server about that.
json['manifest']['files'].map! do |file|
file['filename'] = Dir::Tmpname.make_tmpname ['/tmp/', '.ogg'], nil
file_response = Faraday.get file.url
if file_response.status != 200
puts "Error downloading url: #{file.url}"
do_exit
end
File.open(file['filename'], 'wb') { |fp| fp.write(file_response.body) }
end
output_filename = "/tmp/mixout-#{json['id']}.ogg"
IO.popen("#{MIXER_EXECUTABLE} #{output_filename} vorbis >>& #{AUDIOMIXER_LOG_FILE}", "w") do |f|
f.puts JSON.generate(json)
f.close
end
# First maybe make sure the length is reasonable or something? I bet sox can check that (duration i mean).
# FIXME?: Need to check that the put succeeded before carrying on. Probably can use the exit code or some such.
# Or maybe just do an ls to sanity check it.
`#{S3CMD} -P put #{output_filename} #{json['destination']}`
finish_response = Faraday.put "#{BASE_URL}/mixes/finish", :token => CRON_TOKEN, :id => json['id']
if finish_response.status != 204
puts "Error calling finish on server for mix_id #{json['id']}: #{finish_response.status}, #{finish_response.body}"
do_exit
end
puts "Mix complete and uploaded to: #{json['destination']}"
do_exit
def do_exit
`rm -f #{MIX_CRON_WATCH_FILE}`
end