require 'mechanize' module Smotri # :nodoc: class Uploader START_URL = 'http://smotri.com/' =begin rdoc In order to create a valid uploader instance pass credentials of some registered account. =end def initialize(username, password) @username = username @password = password make_agent end =begin rdoc Logs into the site using credentials passed to constructor. Returns true value on success and false value if login failed. =end def login @agent.get START_URL form = @agent.page.form_with(:id => 'login') form.login = @username form.password = @password form.submit login_successful? end =begin rdoc Checks login status. Returns true value if logged in and false value otherwise. =end def login_successful? !! @agent.page.at('.users-office') end =begin rdoc Uploads video file and returns video link on success. On failure returns false value. +params+ must contain following values: :title name of the video :path file system path where video file is located +params+ may contain following options: :category category name (one of the predefined on the site) :keywords list of tags assigned to video separated by commas :description some info about the video :privacy indicates video visibility and should be "public" or "private" (default) :password set password authentication for video :commentable pass true value in order to allow comments :downloadale pass true to grant video downloading =end def upload(params = {}) get_upload_page if upload_file(params) link = video_link fill_details(params) if navigate_to_edit(link) fill_details(params) end return link end rescue false end private def make_agent @agent = Mechanize.new do |a| a.user_agent_alias = 'Mac Safari' a.max_history = 1 end end def get_upload_page @agent.page.link_with(:href => %r{/upload}).click @agent.get @agent.page.at('//iframe[contains(@src, "upload")]')[:src] end def upload_file(params) form = upload_form return false unless form form.file_upload_with(:name => 'upload').file_name = params[:path] form.title = params[:title] form.tags = params[:keywords] if params[:keywords] category = form.field_with(:name => 'rubric') option = category.options.detect {|opt| opt.text =~ /#{params[:category] || 'nonexistent'}/ } || category.options[1] option.select form.submit @agent.get @agent.page.body.match(/window.parent.parent.location\s*=\s*["']([^'"]+)/)[1] end def navigate_to_edit(link) tries = 0 loop do sleep 5 @agent.get link if edit_link = @agent.page.link_with(:href => %r{/video/edit}) edit_link.click return true else tries += 1 if tries > 3 return false else sleep rand(15) end end end end def fill_details(params) form = @agent.page.form_with(:id => 'video_edit') return unless form form.action = @agent.page.uri.to_s form.radiobutton_with(:name => 'visible', :value => (params[:privacy] == 'public' ? '0' : '1')).check form.description = params[:description] if params[:password] form.checkbox_with(:name => 'option').check form.password = params[:password] form.confirm_password = params[:password] end form.checkbox_with(:name => 'allow_download').send(params[:downloadale] ? :check : :uncheck) form.checkbox_with(:name => 'deny_comments').send(params[:commentable] ? :uncheck : :check) form.delete_field! 'allow_notify' #form.add_field! 'submit_mv_form.x', rand(30) #form.add_field! 'submit_mv_form.y', rand(30) form.submit end def upload_form @agent.page.form_with :id => 'video_upload' end def video_link if link = @agent.page.at('#videolinktext') link[:value] end end end end