require 'uuidtools'
class Media < Application
before :login_required
before :localize_methods, :only => [:new]
before :cleanse_empty_data_references, :only => [:create]
provides :html, :only => [:create]
# This default action (see router.rb) is just fodder to feed our redirect.
# no one should be doing anything here except uploading.
def index
MERB_LOGGER.info('--BAD-URI')
redirect 'http://api.jamlab.com/'
end
# GET /media/new
def new
@upid = UUID.random_create.to_s
render
end
# POST /media
# POST /media.xml
def create
@media = [params[:medium].delete(:data)].flatten
@media.map! do |medium|
Medium.new(medium.update(params[:medium])).to_hash
end
relay = MediaRelay.new(@media, :cookies => {_session_id_key => cookies[_session_id_key]})
@media = relay.response
if relay.success?
provides :xml, :yaml, :js, :plist
case request.format
when :html : redirect(base_url(params[:medium][:project_id]))
when :js : redirect(finish_url(params[:medium][:project_id]))
when :xml : success_headers(@media, :xml); @media.to_xml
when :yaml : success_headers(@media, :yaml); @media.to_yaml
when :plist : success_headers(@media, :plist);@media.to_plist
end
else
provides :xml, :yaml, :plist
session['flash'][:warning] = "#{relay.status} #{relay.reason}" if session["flash"]
case request.format
when :html : redirect request.env['HTTP_REFERER'] || Merb::Server.config[:jamlab_uri]
when :xml : @media.to_xml
when :yaml : @media.to_yaml
when :plist : @media.to_plist
end
end
end
def progress
only_provides :yaml, :js
@upstatus = Mongrel::Uploads.check(params[:upload_id])
finishing = Mongrel::Uploads.instance_variable_get(:@counters)
return if @upstatus.nil? && finishing && !finishing.empty?
case request.format
when yaml : @upstatus.to_yaml
when :js : render_js
end
end
protected
def cleanse_empty_data_references
params[:medium][:data].delete("")
end
def base_url(project_id)
"http://#{Merb::Server.config[:jamlab_uri]}/projects/#{project_id}/versions"
end
def finish_url(project_id)
"http://#{Merb::Server.config[:jamlab_uri]}/projects/#{project_id}/media/finish"
end
def success_headers(media,format)
headers['Location'] = media.to_a.map{ |medium| location(medium,format) }.join(', ')
@status = 201
end
def location(medium,format=nil)
"#{base_url(params[:medium][:project_id])}/#{medium.id}#{format ? ".#{format}" : ''}"
end
end