require 'mechanize' module Mivim # :nodoc: class Uploader =begin rdoc In order to create valid uploader instance pass credentials of the registered account. =end def initialize(username, password) @agent = Mechanize.new do |a| a.user_agent_alias = 'Mac Safari' a.max_history = 1 end @username = username @password = password 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('http://video.miwim.fr/login') form = @agent.page.form_with(:name => 'loginForm') form.username = @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('#userinfo #userinfo-title') end =begin rdoc Uploads video file and returns URL on success. On failure returns false value. +params+ must contain following values: :title name of the video :keywords list of tags assigned to video :description some info about the video :category video channel name (one of the predefined on the site) :path file system path where video file is located It is possible to use short category name like "Tech" for "Hi-Tech, science" +params+ may contain following values: :privacy indicates video visibility and should be "private" (default) or "public" =end def upload(params = {}) @params = params fill_info upload_file if has_upload_form? video_link rescue false end private def fill_info @agent.get('/upload') form = @agent.page.form_with(:name => 'theForm') form.field_myvideo_title = @params[:title] form.field_myvideo_keywords = @params[:keywords] form.field_myvideo_descr = @params[:description] form.checkboxes_with(:name => 'chlist[]').each do |category| category_name = category.node.at('.//following-sibling::text()').text.strip if category_name.include? @params[:category] category.check @params[:category_id] = category.value break end end form.add_field! 'submit.x', rand(30) form.add_field! 'submit.y', rand(30) form.submit end def has_upload_form? !! @agent.page.at('form#form_upload') end def upload_file form = @agent.page.form_with(:name => 'form_upload') form.action = '/upload' form.delete_field!('no_script') rescue nil form.delete_field!('upload_range') rescue nil form.add_field! 'chlist[]', @params[:category_id] form.radiobutton_with(:name => 'field_privacy', :value => (@params[:privacy] || 'private')).check form.submit @agent.get("/ubr_link_upload.php?config_file=ubr_default_config.php&rnd_id=#{Time.now.to_i}") upload_id = @agent.page.root.to_s.match(/startUpload\("([^"]+)"/)[1] @agent.get("/ubr_set_progress.php?upload_id=#{upload_id}") form.action = "/cgi-bin/ubr_upload.pl?upload_id=#{upload_id}" form.file_uploads.first.file_name = @params[:path] form.submit @agent.get("/upload?upload_id=#{upload_id}") end def video_link @agent.page.at('input[name="video_link"]')[:value] rescue nil end end end