X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2Fwebsites%2Fredtube.rb;h=78480c96c9969b5c21416b20506f9c8f98e93b64;hb=8e886df259246365023322b78f58e4037cb536a4;hp=9ecdceccd7d1575a0167d3d84738a048b10fba3a;hpb=168ef3b2ccf5b97d561a3c542a18e8e7587de291;p=dead%2Fwhatever-dl.git diff --git a/src/websites/redtube.rb b/src/websites/redtube.rb index 9ecdcec..78480c9 100644 --- a/src/websites/redtube.rb +++ b/src/websites/redtube.rb @@ -14,117 +14,64 @@ # GNU General Public License for more details. # # http://www.fsf.org/licensing/licenses/gpl.html -# -# -# NOTE: -# -# All credit belongs to whomever reverse-engineered the Redtube -# Flash applet in the first place. I took the algorithm from this -# script: -# -# http://userscripts.org/scripts/review/8691 -# -# and merely cleaned it up a bit while porting it to Ruby. -# -# The Redtube class needs the extra string methods.. -require 'src/string' require 'src/website' +require 'cgi' + -# This class handles the algorithm magic needed to get -# the URL from a Redtube video id. class Redtube < Website VALID_REDTUBE_URL_REGEX = /^(http:\/\/)?(www\.)?redtube\.com\/(\d+)$/ - + def self.owns_url?(url) return url =~ VALID_REDTUBE_URL_REGEX end - # The only public method. This calls the other parts - # of the algorithm and, with any luck, we wind up with - # the URL to the video. - def get_video_url(url) - # First, parse the video ID out of the URL. - video_id = /\d+/.match(url)[0] - - padded_id = video_id.to_s.pad_left('0', 7) - - video_dir = self.get_video_dir(video_id) - file_name = self.get_file_name(padded_id) - - # This mess is actually the only directory out of - # which they serve videos. - return 'http://dl.redtube.com/_videos_t4vn23s9jc5498tgj49icfj4678/' + - "#{video_dir}/#{file_name}" + def get_video_url() + page_data = self.get_page_data(@url) + begin + # We prefer to parse the HTML5 version because it can come in a + # nicer container format. + return parse_html5_src(page_data) + rescue StandardError + return self.parse_hashlink(page_data) + end end - - protected - VIDEO_FILE_EXTENSION = '.flv' - - # Not sure what they're thinking with this one. - def get_video_dir(video_id) - return (video_id.to_f / 1000.0).floor.to_s.pad_left('0', 7) - end + protected; + def parse_video_id() + return /\d+/.match(@url)[0] + end - # The first part of the algorithmic magic. Multiply each - # digit of the padded video id by the index of the - # following digit, and sum them up. - def int_magic(padded_video_id) - ret = 0 - 0.upto(6) do |a| - ret += padded_video_id[a,1].to_i * (a+1) - end - - return ret - end + def parse_html5_src(page_data) + html5_src_regex = /\"= 10 then - new_char = my_int.to_s + if matches.nil? or matches.length < 2 + raise StandardError.new("Could not parse the 'hashlink' Flash variable.") end - - file_name = map[file_string[3] - 48 + my_int + 3] - file_name += new_char[1,1] - file_name += map[file_string[0] - 48 + my_int + 2] - file_name += map[file_string[2] - 48 + my_int + 1] - file_name += map[file_string[5] - 48 + my_int + 6] - file_name += map[file_string[1] - 48 + my_int + 5] - file_name += new_char[0,1] - file_name += map[file_string[4] - 48 + my_int + 7] - file_name += map[file_string[6] - 48 + my_int + 4] - file_name += VIDEO_FILE_EXTENSION - - return file_name - end + + # The hashlink variable /is/ the video URL, but it's encoded. + return CGI::unescape(matches[1]) + end end