Getting Video on to Spoutvideo
<corsconfiguration> <corsrule> <allowedorigin>http://entry.quipper.com</allowedorigin> <allowedmethod>POST</allowedmethod> </corsrule> </corsconfiguration>
= hidden_field_tag 'key', "" = hidden_field_tag 'AWSAccessKeyId', VideoManager.s3_key = hidden_field_tag 'acl', 'private' = hidden_field_tag 'success_action_redirect', "" = hidden_field_tag 'policy', @form.policy = hidden_field_tag 'signature', @form.signature = hidden_field_tag 'Content-Type', ''
# VideoManager::FormData def document { expiration: expiration_date, conditions: [ { bucket: VideoManager.bucket}, ["starts-with", "$key", ""], { acl: :private }, { success_action_redirect: "" }, ["starts-with", "$Content-Type", ""], ["content-length-range", 0, CONTENT_LENGTH] ] } end
key = () -> stamp = +new Date() return "#{$form.data('organization-id')}-#{stamp}-#{filename()}"
xhr.onload = createVideoObject // createVideoObject = () -> jQuery.post "/beta/organizations/#{$form.data('organization-id')}/media/videos", 'key': $form.find("#key").val(), 'state': 'pending', 'title': unescape(FILENAME.replace(/.\w+$/, '')) (data) -> addRecordToTable(data)
Video is now on Amazon S3
The upload was non-blocking
The user has a 'pending' video record
POST https://api.sproutvideo.com/v1/videos
Body must be multipart/form-data
FUSE-based file system backed by Amazon S3
mkdir /quipper-videos
s3fs bucketname /quipper-videos
mkdir /quipper-videos
s3fs bucketname /quipper-videos
# RUNNER def VideoProcessor.main while true Dir[DRIVE].each do |path| process(path) end sleep SLEEP_TIME end end
# PROCESSOR def VideoProcessor.process(path) unless exists?(path) redis.sadd(LOG_KEY, path) Video.new(path).send_to_sproutvideo end end
POST video file to Sproutvideo, passing notification URL and the title.
def send_to_sproutvideo begin resp = Sproutvideo::Video.create(path, notification_url: notification_url, title: parser.title, requires_signed_embeds: true) if resp.success? update_video(resp.body) else update_video({error: resp.body[:error], state: 'error'}) end rescue => e VideoProcessor.redis.hset(VideoProcessor::ERRORS_KEY, path, e.to_s) update_video({error: e.to_s}) ensure # Delete file, even if Sproutvideo is unable to process file. File.delete(path) end end end
Sproutvideo POSTs to passed notification URL when video has been processed.
def notification_url "#{ENV['SPROUTVIDEO_NOTIFICATION_DOMAIN']}/beta/organizations/#{parser.organization_id}/media/video_processed?key=#{filename}" end
{ "created_at": "2012-12-20T00:07:54-05:00", "updated_at": "2012-12-20T00:07:54-05:00", "height": null, "width": null, "description": "An new video", "id": "a098d2bbd33e1c328", "sd_video_file_size": 0, "plays": 0, "title": "new upload.mov", "source_video_file_size": 0, "hd_video_file_size": 0, "embed_code": "<iframe class="sproutvideo-player" type="text/html" src="http://videos.sproutvideo.com/embed/a098d2bbd33e1c328/7ca00d6d622a8e8d?type=sd" width="630" height="354" frameborder="0"></iframe>", "state": "inspecting", "security_token": "7ca00d6d622a8e8d", "progress": 0, "tags": [], "duration": null, "password": null, "privacy": 2, "requires_signed_embeds": false, "assets": { "videos": { "hd_video_url": null, "sd_video_url": null, "source_video_url": null }, "thumbnails": [], "poster_frames": []