# # Copyright Michael Orlitzky # # http://michael.orlitzky.com/ # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # http://www.fsf.org/licensing/licenses/gpl.html # require 'src/website' class Vimeo < Website VALID_VIMEO_URL_REGEX = /^(http:\/\/)?(www\.)?vimeo\.com\/(moogaloop\.swf\?clip_id=)?(\d+)/ def self.owns_url?(url) return url =~ VALID_VIMEO_URL_REGEX end def get_video_url() # First, figure out the video id from the URL. # Then, use the video id to construct the video details URL. # Get the video details page, and parse the resulting XML for # the junk we need to construct the video URL. Note that the file # URL given in the XML is *not* valid. video_id = self.parse_video_id() details_url = "http://vimeo.com/moogaloop/load/clip:#{video_id}/local" details_data = get_page_data(details_url) request_signature = parse_request_signature(details_data) request_signature_expires = parse_request_signature_expires(details_data) quality = parse_quality(details_data) referer = "http://a.vimeocdn.com/p/flash/moogaloop/5.1.15/moogaloop.swf" referer += "?v=1.0.0" referer += "&time=#{request_signature_expires}" self.headers['Referer'] = referer video_url = "http://player.vimeo.com/play_redirect?clip_id=#{video_id}" video_url += "&sig=#{request_signature}" video_url += "&time=#{request_signature_expires}" video_url += "&quality=#{quality}" video_url += "&codecs=H264,VP8,VP6" return video_url end def get_video_filename() # The default behavior is no good here, use the video # id with an extension tacked onto it. return (self.parse_video_id() + '.flv') end protected; def parse_video_id() video_id = nil # First, try to get the video id from the end of the URL. video_id_regex = /\/(\d+)$/ matches = video_id_regex.match(@url) if matches.nil? # If that didn't work, the URL must be of the clip_id= form. video_id_regex = /clip_id\=(\d+)/ matches = video_id_regex.match(@url) video_id = matches[1] if not matches.nil? || matches.length < 1 else video_id = matches[1] if not matches.nil? || matches.length < 1 end return video_id end def parse_request_signature(page_data) # It's XML. rs_regex = /(.*?)<\/request_signature>/ matches = rs_regex.match(page_data) request_signature = matches[1] if not matches.nil? || matches.length < 1 return request_signature end def parse_request_signature_expires(page_data) rse_regex = /(.*?)<\/request_signature_expires>/ matches = rse_regex.match(page_data) rse = matches[1] if not matches.nil? || matches.length < 1 return rse end def parse_quality(page_data) quality_regex = /([01])<\/isHD>/ matches = quality_regex.match(page_data) is_hd = matches[1] if not matches.nil? || matches.length < 1 if is_hd == '1' then # High-definition return "hd" else # Standard-definition return "sd" end end end