]> gitweb.michael.orlitzky.com - dead/whatever-dl.git/commitdiff
Initial commit.
authorMichael Orlitzky <michael@orlitzky.com>
Fri, 13 Jun 2008 03:17:16 +0000 (23:17 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Fri, 13 Jun 2008 03:17:16 +0000 (23:17 -0400)
15 files changed:
bin/whatever-dl [new file with mode: 0755]
makefile [new file with mode: 0644]
src/string.rb [new file with mode: 0644]
src/website.rb [new file with mode: 0644]
src/websites/howcast.rb [new file with mode: 0644]
src/websites/redtube.rb [new file with mode: 0644]
src/websites/youporn.rb [new file with mode: 0644]
test/fixtures/youporn/page_data-65778.html [new file with mode: 0644]
test/howcast_test.rb [new file with mode: 0644]
test/redtube_test.rb [new file with mode: 0644]
test/remote_test_suite.rb [new file with mode: 0644]
test/test_suite.rb [new file with mode: 0644]
test/website_test.rb [new file with mode: 0644]
test/youporn_remote_test.rb [new file with mode: 0644]
test/youporn_test.rb [new file with mode: 0644]

diff --git a/bin/whatever-dl b/bin/whatever-dl
new file mode 100755 (executable)
index 0000000..c20b8bd
--- /dev/null
@@ -0,0 +1,66 @@
+#!/usr/bin/ruby -w
+#
+# whatever-dl, a script to download online (web-based) videos.
+#
+# 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
+#
+
+# All of the website classes are located in one
+# directory, so we can 'require' them automatically.
+Dir.glob('src/websites/*.rb').each do |r|
+  require r
+end
+
+
+# Only actually do something if this script was called
+# directly (i.e. not from the tests).
+if (__FILE__ == $0) then
+  if (ARGV.length < 1) then
+    # If the user didn't give us a URL, yell
+    # at him or her.
+    puts 'Usage: whatever-dl <url>'
+    Kernel.exit(1)
+  end
+
+  # Check the URL against each website's class.
+  # The class will know whether or not the URL
+  # "belongs" to its website.
+
+  site = nil
+  
+  Website.subclasses.each do |w|
+    if w.owns_url?(ARGV[0])
+      site = w.new()
+      break
+    end
+  end
+
+  if site.nil?
+    puts 'Invalid URL.'
+    exit(1)
+  end
+  
+  video_url = site.get_video_url(ARGV[0])
+
+  if video_url.nil?
+    puts 'Error retrieving video URL.'
+    exit(2)
+  end
+
+  # *classy*
+  Kernel.exec("wget \"#{video_url}\"")
+end
diff --git a/makefile b/makefile
new file mode 100644 (file)
index 0000000..9e702a3
--- /dev/null
+++ b/makefile
@@ -0,0 +1,7 @@
+.PHONY : test
+
+test:
+       ruby test/test_suite.rb
+
+remote_test:
+       ruby test/remote_test_suite.rb
diff --git a/src/string.rb b/src/string.rb
new file mode 100644 (file)
index 0000000..4d14345
--- /dev/null
@@ -0,0 +1,31 @@
+#
+# 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
+#
+
+# Augment the String class with a (left) pad method
+class String
+  def pad_left(pad_char, to_length)
+    chars_to_pad = to_length - self.length
+    
+    if chars_to_pad <= 0 then
+      # Don't do anything if the string is already long enough
+      return self
+    else
+      return (pad_char * chars_to_pad) + self
+    end
+  end
+end
diff --git a/src/website.rb b/src/website.rb
new file mode 100644 (file)
index 0000000..dad2264
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# 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
+#
+
+# This class keeps track of all its subclasses
+# We use this to loop through every "website" in an
+# attempt to determine to which site a URL belongs.
+class Website
+  def self.inherited(subclass)
+    if superclass.respond_to? :inherited
+      superclass.inherited(subclass)
+    end
+
+    @subclasses ||= []
+    @subclasses << subclass
+  end
+
+  def self.subclasses
+    @subclasses
+  end
+
+  # This should be overridden in any class that wants
+  # to claim ownership of a URL.
+  def self.owns_url?(url)
+    return false
+  end
+
+  # Same here. We want to default to nil unless overridden.
+  def get_video_url(url)
+    return nil
+  end
+end
diff --git a/src/websites/howcast.rb b/src/websites/howcast.rb
new file mode 100644 (file)
index 0000000..c07d848
--- /dev/null
@@ -0,0 +1,43 @@
+#
+# 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 Howcast < Website
+
+  VALID_HOWCAST_URL_REGEX = /^(http:\/\/)?(www\.)?howcast\.com\/videos\/(\d+)-(.+)$/
+
+  def self.owns_url?(url)
+    return url =~ VALID_HOWCAST_URL_REGEX
+  end
+
+  
+  def get_video_url(url)
+    # This regex just pulls out the video id
+    id_regex = /\/(\d+)-/
+    matches = id_regex.match(url)
+
+    if matches.nil?
+      raise StandardError.new('The URL is a valid Howcast URL, but does not match on the digit portion of the regex. Since the digit portion is a subset of the "valid" regex, this should never occur.')
+    end
+
+    video_id = matches[1]
+    return "http://media.howcast.com/system/videos/#{video_id}/#{video_id}.flv"
+  end
+
+end
diff --git a/src/websites/redtube.rb b/src/websites/redtube.rb
new file mode 100644 (file)
index 0000000..9ecdcec
--- /dev/null
@@ -0,0 +1,130 @@
+#
+# 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
+#
+# 
+# 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'
+
+# 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}"
+  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
+
+
+  # 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
+
+
+  # Part 2 of the magic. Sum the digits of the result
+  # of the first magic.
+  def more_magic(file_string)
+    magic = self.int_magic(file_string).to_s
+    
+    ret = 0
+    
+    0.upto(magic.length - 1) do |a|
+      ret += magic[a,1].to_i
+    end
+
+    return ret
+  end
+
+
+  # Complete fricking mystery
+  def get_file_name(file_string)
+    map = ['R', '1', '5', '3', '4', '2', 'O', '7', 'K', '9', 'H', 'B', 'C', 'D', 'X', 'F', 'G', 'A', 'I', 'J', '8', 'L', 'M', 'Z', '6', 'P', 'Q', '0', 'S', 'T', 'U', 'V', 'W', 'E', 'Y', 'N']
+
+    # The stupid variable names I copied from the
+    # source script. Considering myself disclaimed.
+    my_int = self.more_magic(file_string)
+    new_char = '0' + my_int.to_s
+    
+    if my_int >= 10 then
+      new_char = my_int.to_s
+    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 
+
+end
diff --git a/src/websites/youporn.rb b/src/websites/youporn.rb
new file mode 100644 (file)
index 0000000..ef2fb28
--- /dev/null
@@ -0,0 +1,76 @@
+#
+# 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'
+
+# Needed to download the page, which is in turn
+# needed because it contains the video URL.
+require 'net/http'
+require 'uri'
+
+
+class Youporn < Website
+
+  VALID_YOUPORN_URL_REGEX = /^(http:\/\/)?(www\.)?youporn\.com\/watch\/(\d+)$/
+  
+  def self.owns_url?(url)
+    return url =~ VALID_YOUPORN_URL_REGEX
+  end
+
+  
+  def get_video_url(url)
+    page_data = self.get_page_data(url)
+    video_url = self.parse_video_url(page_data)
+    return video_url
+  end
+
+  
+  protected;
+
+  # Get the FLV file URL from the HTML page for this movie.
+  # They don't obfuscate it or anything, so we assume here
+  # that the first "download" url ending in ".flv" is the
+  # movie file we want.
+  def parse_video_url(page_data)    
+    flv_regex = /http:\/\/download\.youporn\.com\/.*?\.flv/
+    matches = flv_regex.match(page_data)
+    flv_url = matches[0] if not matches.nil?
+    
+    return flv_url
+  end
+
+  
+  def get_page_data(url)
+    uri = URI.parse(url)
+    
+    response = Net::HTTP.start(uri.host, uri.port) do |http|
+      # Bypass the stupid age verification.
+      form_data = 'user_choice=Enter'
+      http.post(uri.path, form_data, self.get_headers(url))
+    end
+    
+    return response.body
+  end
+
+  # Build the header hash from the URL we're requesting.
+  def get_headers(url)
+    headers = { 'Referer' => url }
+  end
+
+  
+end
diff --git a/test/fixtures/youporn/page_data-65778.html b/test/fixtures/youporn/page_data-65778.html
new file mode 100644 (file)
index 0000000..23477a9
--- /dev/null
@@ -0,0 +1,1747 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+
+
+
+
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="ROBOTS" content="NOARCHIVE" />
+<meta name="title" content="YOUPORN - moaning mom fucked at night" />
+
+
+       
+
+
+       
+       
+
+<meta name="description" content="Watch this video. 07min 46sec. Rated 3.22 / 5.00 with 988949 views." />
+<meta name="medium" content="video" />
+
+<link rel="image_src" href="http://files.youporn.com/images/fb-thumb2.png" />
+
+<title>YouPorn.com Lite (BETA) - moaning mom fucked at night - Free Porn Videos</title>
+
+<link rel="shortcut icon" href="http://files.youporn.com/images/favicon4.ico" /> 
+
+<!--yui css-->
+<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.4.0/build/reset-fonts-grids/reset-fonts-grids.css" /> 
+<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.4.0/build/tabview/assets/tabview.css" />
+<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.4.0/build/container/assets/container.css" /> 
+
+<!--site css-->
+<link rel="stylesheet" type="text/css" href="http://css.youporn.com/r/20080512.1.1/css/csshacks.css" />
+<link rel="stylesheet" type="text/css" href="http://css.youporn.com/r/20080512.1.24/css/watch9.css" /> 
+
+</head>
+
+<body>
+<div id="toolbarcontainer">
+
+       
+
+
+
+       
+
+
+
+       
+
+
+
+       
+
+
+<div id="toolbar" class="multicolumn clearfix">
+       <div id="toolbar-nav" class="column">
+               
+               <a href="/" class="current">Video</a>   <span class="seperator"> | </span>
+               
+               
+                       <a href="http://youporn.videobox.com/?t=tab2">Premium</a><span class="seperator"> | </span>
+               
+               
+               <a href="/dating">Dating</a><span class="seperator"> | </span>
+
+               
+               
+                       
+                               <a href="http://www.youpornmate.com/?DF=0&AFNO=1-0-595000-337838&UHNSMTY=431">Cams</a>
+                       
+               
+               <span class="seperator"> | </span>
+               
+               
+                       <a href="http://chat.youporn.com/yp.html">Chat</a>
+               <span class="seperator"> | </span>
+                       
+               
+               
+               <a href="/sexblogs">SexBlogs</a>
+
+       </div>
+       <div class="rcolumn">
+               <div style="display: none;" id="toolbarnologin">
+                       <a href="/login?previous=http%3A%2F%2Fwww.youporn.com%2Fwatch%2F65778">Login</a><span class="seperator"> | </span>
+                       <a href="/register?previous=http%3A%2F%2Fwww.youporn.com%2Fwatch%2F65778">Register</a>
+               </div>
+               <div style="display: none;" id="toolbarloggedin">
+
+                       <span id="toolbarusername" class="greeting"></span><span class="seperator"> | </span>
+                       <a href="/favorites">Favorites</a><span class="seperator"> | </span>
+                       <a href="/logout?previous=http%3A%2F%2Fwww.youporn.com%2Fwatch%2F65778">Logout</a>
+               </div>
+       </div>
+</div> 
+
+</div>
+
+<div id="doc2" class="yui-skin-sam">
+       <!--header-->
+       <div id="hd">
+               
+               
+               <div class="multicolumn clearfix">
+                       <!--logo-->
+                       <div class="lcolumn">
+                               <a href="/">
+                                                                                       <img src="http://files.youporn.com/images/logowhite.png" width="329" height="86" alt="logo" />
+
+                                                                       </a>
+                       </div>
+                       
+                       <!--search box-->
+                       <div class="rcolumn">
+                               <form method="get" action="/search">
+       <input type="text" name="query" value="" class="query" /> 
+       <select name="type" class="query">
+               <option value="straight">Straight</option>
+               <option value="gay">Gay</option>
+
+               <option value="cocks">Cocks</option>
+       </select>
+       <input type="submit" value="Search" class="searchbutton" />
+</form>
+                       </div>          
+               </div>
+               
+               <!-- notice area -->
+               
+       </div>
+       <!--end: header-->
+
+       
+       <!--body-->
+       <div id="bd">
+               
+               <!--video display area-->
+               <div id="videoArea" class="yui-g">
+                       <h1>
+                                                                       <img src="http://ss-1.youporn.com/screenshot/06/57/screenshot/65778_small.jpg" alt="." />
+                                                               moaning mom fucked at night
+                       </h1>
+
+                       <div class="multicolumn clearfix">
+
+                               <!--video player-->
+                               <div class="lcolumn mainleftcolumn">    
+                                                                                       <p id="player"></p>
+                                                                               
+                                       
+                               </div>
+                               
+                               <!--primary ads-->
+                               <div class="lcolumn">   
+                                       <div id="primaryAdTop"></div>
+                                       <div id="primaryAdBottom"></div>                                        
+                               </div>
+                       </div>
+
+               </div>
+               <!--end: video display area-->
+               
+               <!--non video content area-->
+               <div id="contentArea" class="yui-g">
+                       <!--tabview to show general video information-->
+                       <div id="videoInfoTabview" class="yui-navset tabview" video="65778" thumbnails="8" dirsplit="06/57/">
+                               <ul class="yui-nav">
+                                       <li class="selected"><a href="#general"><em>General</em></a></li>
+
+                                       <li><a href="#links1"><em>Links (20)</em></a></li>
+                               </ul>                                   
+                               <div class="yui-content">
+                                       <div id="general">
+                                               <div class="multicolumn clearfix">
+       <div class="column">
+               <div id="download">
+                       <h2>Download:</h2>
+
+                       <ul>
+                               
+                                       
+                                       
+                                               <li>
+                                                       
+                                                               <p><a href="http://download.youporn.com/download/112911/flv/65778_moaning_mom_fucked_at_night.flv?t=dd">FLV - Flash Video format</a> (19,799 KB)</p>
+                                                       
+                                                       <!-- <p class="playerdownload">Watch using <a href="http://www.download.com/VLC-Media-Player/3000-2194_4-10672218.html" target="_blank">VLC media player</a></p> -->
+                                               </li>
+                                       
+                                       
+                               
+                                       
+                                       
+                                       
+                               
+                       </ul>
+               </div>
+
+               <div id="details">
+                       <h2>Details:</h2>
+                       <ul>
+                               <li><span>Duration:</span> 07min 46sec</li>
+                               <li><span>Views:</span> 988,949 total (587 today)
+                               <li><span>Rating:</span> 3.22 / 5.00 (1,049 ratings)</li>
+
+                               <li><span>Submitted:</span> <a href="http://www.sexyamateurshots.com" target="_blank">Amateur Videos</a></li>
+                               <li><span>Date:</span> Tue Sep 25 15:33:19 2007</li>
+                       </ul>
+               </div>
+       </div>
+       <div class="column">
+
+               <div id="rating" class="hidden">
+                       <h2>Rate this video:</h2>
+                       <div id="ratingStars">
+                               <img id="ratingStar1" src="http://static.youporn.com/images/rating.gif" />
+                               <img id="ratingStar2" src="http://static.youporn.com/images/rating.gif" />
+                               <img id="ratingStar3" src="http://static.youporn.com/images/rating.gif" />
+                               <img id="ratingStar4" src="http://static.youporn.com/images/rating.gif" />
+                               <img id="ratingStar5" src="http://static.youporn.com/images/rating.gif" />
+
+                       </div>
+                       <div id="ratingStatus"></div>
+               </div>
+               
+               <div id="favorites">
+                       <input id="favoritesButton" type="button" class="hidden" value="Save to Favorites" />
+                       <div id="favoritesStatus"></div>
+               </div>
+               
+               <div id="share">
+                       <script type="text/javascript">
+                               function fbs_click() {
+                                       u=location.href;
+                                       t=document.title;
+                                       window.open('http://ads-dev.youporn.com/www/delivery/ck.php?oaparams=2__bannerid=298__log=yes__cb=0__maxdest=http://www.facebook.com/sharer.php?u='+encodeURIComponent(u)+'&t='+encodeURIComponent(t),'sharer','toolbar=0,status=0,width=626,height=436');
+                                       return false;
+                               }
+                       </script>
+
+                       <a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.youporn.com%2Fwatch%2F65778" onclick="return fbs_click()" target="_blank" class="fb_share_link">Share on Facebook</a>             
+               </div>
+       </div>
+</div>
+
+                                       </div>                  
+                                       <div id="links">
+                                                                                                       <h2>Sites linking to this video:</h2>
+                                                       <ul>
+                                                                                                                       <li>3672 visits from <a href="http://www.chauffeurdebuzz.com/sexy/youporn-com-1029-10195.htm" target="_blank" rel="nofollow">http://www.chauffeurdebuzz.com/sexy/youporn-com-1029-10195.htm</a></li>
+
+                                                                                                                       <li>2862 visits from <a href="http://www.foundrymusic.com/opieanthony/displayheadline.cfm/id/12074/div/opieanthony/headline/Monday_Links__Return_to_The_XM_Studio__Turn_on_Your_Paltalk__Roland_sings_Poison__Iron_Sheik_Audio_Clips__New_Videos_Online.html" target="_blank" rel="nofollow">http://www.foundrymusic.com/opieanthony/displayheadline.cfm/i...</a></li>
+                                                                                                                       <li>1366 visits from <a href="http://www.existenz.se/out.php?id=6959" target="_blank" rel="nofollow">http://www.existenz.se/out.php?id=6959</a></li>
+                                                                                                                       <li>1153 visits from <a href="http://www.encyclopediadramatica.com/OH_GOD_BILL" target="_blank" rel="nofollow">http://www.encyclopediadramatica.com/OH_GOD_BILL</a></li>
+                                                                                                                       <li>1005 visits from <a href="http://www.tribalwar.com/forums/showthread.php?t=513379" target="_blank" rel="nofollow">http://www.tribalwar.com/forums/showthread.php?t=513379</a></li>
+                                                                                                                       <li>815 visits from <a href="http://www.theisonews.com/forums/viewtopic.php?t=150512" target="_blank" rel="nofollow">http://www.theisonews.com/forums/viewtopic.php?t=150512</a></li>
+
+                                                                                                                       <li>743 visits from <a href="http://www.loveallaround.com/showthread.php?t=3140" target="_blank" rel="nofollow">http://www.loveallaround.com/showthread.php?t=3140</a></li>
+                                                                                                                       <li>662 visits from <a href="http://www.b9board.com/viewtopic.php?t=389239" target="_blank" rel="nofollow">http://www.b9board.com/viewtopic.php?t=389239</a></li>
+                                                                                                                       <li>611 visits from <a href="http://www.shacknews.com/laryn.x?story=49476" target="_blank" rel="nofollow">http://www.shacknews.com/laryn.x?story=49476</a></li>
+                                                                                                                       <li>517 visits from <a href="http://foros.zackyfiles.com/showthread.php?t=541762" target="_blank" rel="nofollow">http://foros.zackyfiles.com/showthread.php?t=541762</a></li>
+                                                                                                                       <li>461 visits from <a href="http://www.foundrymusic.com/opieanthony/displayheadline.cfm/id/12074/headline/Monday_Links__Return_to_The_XM_Studio__Turn_on_Your_Paltalk__Roland_sings_Poison__Iron_Sheik_Audio_Clips__New_Videos_Online.html" target="_blank" rel="nofollow">http://www.foundrymusic.com/opieanthony/displayheadline.cfm/i...</a></li>
+
+                                                                                                                       <li>443 visits from <a href="http://forum.phun.org/showthread.php?t=227481" target="_blank" rel="nofollow">http://forum.phun.org/showthread.php?t=227481</a></li>
+                                                                                                                       <li>406 visits from <a href="http://www.mustangworld.com/forums/showthread.php?t=505730" target="_blank" rel="nofollow">http://www.mustangworld.com/forums/showthread.php?t=505730</a></li>
+                                                                                                                       <li>377 visits from <a href="http://www.uselessjunk.net/viewtopic.php?t=230995" target="_blank" rel="nofollow">http://www.uselessjunk.net/viewtopic.php?t=230995</a></li>
+                                                                                                                       <li>356 visits from <a href="http://www.tribalwar.com/forums/showthread.php?t=524565" target="_blank" rel="nofollow">http://www.tribalwar.com/forums/showthread.php?t=524565</a></li>
+                                                                                                                       <li>321 visits from <a href="http://www.keithandthegirl.com/forums/showthread.php?t=8041" target="_blank" rel="nofollow">http://www.keithandthegirl.com/forums/showthread.php?t=8041</a></li>
+
+                                                                                                                       <li>318 visits from <a href="http://www.chud.com/forum/showthread.php?t=104988" target="_blank" rel="nofollow">http://www.chud.com/forum/showthread.php?t=104988</a></li>
+                                                                                                                       <li>317 visits from <a href="http://forum.football365.com/index.php?t=msg&th=483191&start=0&" target="_blank" rel="nofollow">http://forum.football365.com/index.php?t=msg&amp;th=483191&am...</a></li>
+                                                                                                                       <li>312 visits from <a href="http://community.livejournal.com/wtf_inc/" target="_blank" rel="nofollow">http://community.livejournal.com/wtf_inc/</a></li>
+                                                                                                                       <li>305 visits from <a href="http://existenz.se/out.php?id=6959" target="_blank" rel="nofollow">http://existenz.se/out.php?id=6959</a></li>
+
+                                                       
+                                                       </ul>
+                                                                                               
+                                               <p>To appear here, link to this video from your site/blog and send at least 3 hits.</p>
+                                       </div>
+                               </div>
+                       </div>
+               
+                       <!--tabview to show related videos-->
+                       <div id="moreVideosTabview" class="yui-navset tabview">
+                               <ul class="yui-nav">
+
+                                       <li class="selected"><a href="#related"><em>Related Videos</em></a></li>
+                               </ul>                                   
+                               <div class="yui-content">
+                                       
+
+<div id="related">     
+        
+               <div>
+                       
+                       
+                                                       
+
+                               <ul class="videorow clearfix">
+
+                               <li>
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/62088/mom-fucked-in-a-motel/?from=related3&al=1&from_id=65778" class="thumblink">
+       <img id="related1" src="http://ss-1.youporn.com/screenshot/06/20/screenshot/62088_large.jpg" num="8" width="120" height="90" class="thumb" />
+
+</a>
+<p class="title"><a href="/watch/62088/mom-fucked-in-a-motel/?from=related3&al=1&from_id=65778">Mom fucked in a motel </a></p>
+<p class="duration">07min 03sec</p>
+<p class="views">3,328,439 views</p>
+
+       <p class="rating">4.21 / 5.00 rating</p>
+
+
+                               </li>
+
+                               
+
+                               
+                                                       
+
+                               
+
+                               <li>
+
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/4214/horny-mom-gets-fucked-on-the-pool-table/?from=related3&al=1&from_id=65778" class="thumblink">
+       <img id="related2" src="http://ss-3.youporn.com/screenshot/42/screenshot/4214_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/4214/horny-mom-gets-fucked-on-the-pool-table/?from=related3&al=1&from_id=65778">Horny mom gets fucked on the pool table </a></p>
+<p class="duration">07min 49sec</p>
+<p class="views">2,485,143 views</p>
+
+       <p class="rating">3.76 / 5.00 rating</p>
+
+
+                               </li>
+
+                               
+
+                               
+                                                       
+
+                               
+
+                               <li>
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/49544/moaning-blond-fucked-hard/?from=related3&al=1&from_id=65778" class="thumblink">
+       <img id="related3" src="http://ss-3.youporn.com/screenshot/04/95/screenshot/49544_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/49544/moaning-blond-fucked-hard/?from=related3&al=1&from_id=65778">Moaning blond fucked hard </a></p>
+<p class="duration">07min 35sec</p>
+<p class="views">1,914,622 views</p>
+
+       <p class="rating">4.25 / 5.00 rating</p>
+
+
+                               </li>
+
+                               
+
+                               
+                                                       
+
+                               
+
+                               <li>
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/1993/rough-homemade-porn/?from=related3&al=1&from_id=65778" class="thumblink">
+       <img id="related4" src="http://ss-2.youporn.com/screenshot/19/screenshot/1993_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/1993/rough-homemade-porn/?from=related3&al=1&from_id=65778">Rough Homemade Porn </a></p>
+
+<p class="duration">09min 04sec</p>
+<p class="views">1,975,166 views</p>
+
+       <p class="rating">4.45 / 5.00 rating</p>
+
+
+                               </li>
+
+                               
+
+                               
+                                                       
+
+                               
+
+                               <li>
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/50764/dirty-talking-during-sex/?from=related3&al=1&from_id=65778" class="thumblink">
+
+       <img id="related5" src="http://ss-2.youporn.com/screenshot/05/07/screenshot/50764_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/50764/dirty-talking-during-sex/?from=related3&al=1&from_id=65778">Dirty talking during sex </a></p>
+<p class="duration">03min 55sec</p>
+<p class="views">916,883 views</p>
+
+       <p class="rating">4.21 / 5.00 rating</p>
+
+
+                               </li>
+
+                               
+
+                               
+                                                       
+
+                               
+
+                               <li class="last">
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/5289/old-married-couple-fucking-on-homemade-video/?from=related3&al=1&from_id=65778" class="thumblink">
+       <img id="related6" src="http://ss-1.youporn.com/screenshot/52/screenshot/5289_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/5289/old-married-couple-fucking-on-homemade-video/?from=related3&al=1&from_id=65778">Old married couple fucking on homemade video </a></p>
+<p class="duration">09min 19sec</p>
+<p class="views">1,605,968 views</p>
+
+       <p class="rating">4.13 / 5.00 rating</p>
+
+
+                               </li>
+
+                               
+                                       </ul>
+                                       <ul class="videorow clearfix">
+                               
+
+                               
+                                                       
+
+                               
+
+                               <li>
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/5562/sweet-milf-mom-gets-her-bald-pussy-fucked-hardcore/?from=related3&al=1&from_id=65778" class="thumblink">
+       <img id="related7" src="http://ss-1.youporn.com/screenshot/55/screenshot/5562_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/5562/sweet-milf-mom-gets-her-bald-pussy-fucked-hardcore/?from=related3&al=1&from_id=65778">Sweet milf mom gets her bald pussy fucked hardcore </a></p>
+
+<p class="duration">03min 42sec</p>
+<p class="views">1,733,580 views</p>
+
+       <p class="rating">3.71 / 5.00 rating</p>
+
+
+                               </li>
+
+                               
+
+                               
+                                                       
+
+                               
+
+                               <li>
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/18352/50-people-fuck-at-disco/?from=related2&al=1&from_id=65778" class="thumblink">
+
+       <img id="related8" src="http://ss-2.youporn.com/screenshot/01/83/screenshot/18352_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/18352/50-people-fuck-at-disco/?from=related2&al=1&from_id=65778">50 People fuck at disco </a></p>
+<p class="duration">22min 32sec</p>
+<p class="views">3,357,244 views</p>
+
+       <p class="rating">4.52 / 5.00 rating</p>
+
+
+                               </li>
+
+                               
+
+                               
+                                                       
+
+                               
+
+                               <li>
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/4224/couple-fuck-in-night-vision-homemade-video/?from=related2&al=1&from_id=65778" class="thumblink">
+       <img id="related9" src="http://ss-1.youporn.com/screenshot/42/screenshot/4224_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/4224/couple-fuck-in-night-vision-homemade-video/?from=related2&al=1&from_id=65778">Couple fuck in night vision homemade video </a></p>
+<p class="duration">07min 51sec</p>
+<p class="views">1,195,961 views</p>
+
+       <p class="rating">4.34 / 5.00 rating</p>
+
+
+                               </li>
+
+                               
+
+                               
+                                                       
+
+                               
+
+                               <li>
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/15669/chick-fucked-at-a-party/?from=related2&al=1&from_id=65778" class="thumblink">
+       <img id="related10" src="http://ss-1.youporn.com/screenshot/01/56/screenshot/15669_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/15669/chick-fucked-at-a-party/?from=related2&al=1&from_id=65778">CHICK fucked at a party </a></p>
+<p class="duration">04min 59sec</p>
+<p class="views">2,009,239 views</p>
+
+       <p class="rating">4.16 / 5.00 rating</p>
+
+
+                               </li>
+
+                               
+
+                               
+                                                       
+
+                               
+
+                               <li>
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/149059/moaning-housewife-fucked/?from=related2&al=1&from_id=65778" class="thumblink">
+       <img id="related11" src="http://ss-2.youporn.com/screenshot/14/90/screenshot/149059_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/149059/moaning-housewife-fucked/?from=related2&al=1&from_id=65778">moaning housewife fucked </a></p>
+
+<p class="duration">04min 39sec</p>
+<p class="views">373,104 views</p>
+
+       <p class="rating">3.85 / 5.00 rating</p>
+
+
+                               </li>
+
+                               
+
+                               
+                                                       
+
+                               
+
+                               <li class="last">
+                                       
+                                               
+                                       
+                                       
+                                       
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+               
+       
+
+
+       
+
+
+
+       
+
+
+<a href="/watch/126543/hard-fuck-at-home/?from=related2&al=1&from_id=65778" class="thumblink">
+
+       <img id="related12" src="http://ss-1.youporn.com/screenshot/12/65/screenshot/126543_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/126543/hard-fuck-at-home/?from=related2&al=1&from_id=65778">Hard fuck at home </a></p>
+<p class="duration">03min 14sec</p>
+<p class="views">513,287 views</p>
+
+       <p class="rating">3.78 / 5.00 rating</p>
+
+
+                               </li>
+
+                                                                       </ul>
+                               
+
+                               
+                       
+               </div>
+               
+               
+       
+</div>
+                               </div>
+                       </div>                  
+
+                       <!--tabview to show featured videos-->
+                       <div id="moreVideosTabview2" class="yui-navset tabview">
+                               <ul class="yui-nav">
+                                       <li class="selected"><a href="#featured"><em>Featured Videos</em></a></li>                                                      
+                               </ul>                                   
+                               <div class="yui-content">
+
+                                       
+
+<div id="featured">
+       
+               
+               
+                                       
+
+                       <ul class="videorow clearfix">
+
+                       <li>
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/1441/fucked-while-cleaning-the-toilet-part-3/?from=featured2" class="thumblink">
+       <img id="featured1" src="http://ss-2.youporn.com/screenshot/14/screenshot/1441_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/1441/fucked-while-cleaning-the-toilet-part-3/?from=featured2">Fucked while cleaning the toilet (part 3) </a></p>
+<p class="duration">02min 40sec</p>
+<p class="views">541,262 views</p>
+
+       <p class="rating">4.17 / 5.00 rating</p>
+
+
+                       </li>
+
+                       
+
+                       
+                                       
+
+                       
+
+                       <li>
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/6572/chick-gets-fucked-anally/?from=featured2" class="thumblink">
+       <img id="featured2" src="http://ss-3.youporn.com/screenshot/65/screenshot/6572_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/6572/chick-gets-fucked-anally/?from=featured2">chick gets fucked anally </a></p>
+
+<p class="duration">02min 23sec</p>
+<p class="views">912,591 views</p>
+
+       <p class="rating">4.27 / 5.00 rating</p>
+
+
+                       </li>
+
+                       
+
+                       
+                                       
+
+                       
+
+                       <li>
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/152752/hosed-down/?from=featured2" class="thumblink">
+
+       <img id="featured3" src="http://ss-2.youporn.com/screenshot/15/27/screenshot/152752_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/152752/hosed-down/?from=featured2">Hosed Down </a></p>
+<p class="duration">00min 38sec</p>
+<p class="views">842,653 views</p>
+
+       <p class="rating">4.14 / 5.00 rating</p>
+
+
+                       </li>
+
+                       
+
+                       
+                                       
+
+                       
+
+                       <li>
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/5289/old-married-couple-fucking-on-homemade-video/?from=featured2" class="thumblink">
+       <img id="featured4" src="http://ss-1.youporn.com/screenshot/52/screenshot/5289_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/5289/old-married-couple-fucking-on-homemade-video/?from=featured2">Old married couple fucking on homemade video </a></p>
+<p class="duration">09min 19sec</p>
+<p class="views">1,605,968 views</p>
+
+       <p class="rating">4.13 / 5.00 rating</p>
+
+
+                       </li>
+
+                       
+
+                       
+                                       
+
+                       
+
+                       <li>
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/1151/woman-gets-her-pussy-licked/?from=featured2" class="thumblink">
+       <img id="featured5" src="http://ss-3.youporn.com/screenshot/11/screenshot/1151_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/1151/woman-gets-her-pussy-licked/?from=featured2">Woman gets her pussy licked </a></p>
+<p class="duration">07min 27sec</p>
+<p class="views">564,487 views</p>
+
+       <p class="rating">4.18 / 5.00 rating</p>
+
+
+                       </li>
+
+                       
+
+                       
+                                       
+
+                       
+
+                       <li class="last">
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/36653/bar-tender-blow-job/?from=featured2" class="thumblink">
+       <img id="featured6" src="http://ss-3.youporn.com/screenshot/03/66/screenshot/36653_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/36653/bar-tender-blow-job/?from=featured2">bar tender blow job </a></p>
+
+<p class="duration">11min 59sec</p>
+<p class="views">1,276,585 views</p>
+
+       <p class="rating">4.25 / 5.00 rating</p>
+
+
+                       </li>
+
+                       
+                               </ul>
+                               <ul class="videorow clearfix">
+
+                       
+
+                       
+                                       
+
+                       
+
+                       <li>
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/2944/naked-lesbian/?from=featured2" class="thumblink">
+       <img id="featured7" src="http://ss-2.youporn.com/screenshot/29/screenshot/2944_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/2944/naked-lesbian/?from=featured2">Naked lesbian </a></p>
+<p class="duration">03min 17sec</p>
+<p class="views">373,739 views</p>
+
+       <p class="rating">4.06 / 5.00 rating</p>
+
+
+                       </li>
+
+                       
+
+                       
+                                       
+
+                       
+
+                       <li>
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/43451/ein-wahres-fickfest/?from=featured2" class="thumblink">
+       <img id="featured8" src="http://ss-3.youporn.com/screenshot/04/34/screenshot/43451_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/43451/ein-wahres-fickfest/?from=featured2">ein wahres fickfest </a></p>
+<p class="duration">17min 21sec</p>
+<p class="views">750,321 views</p>
+
+       <p class="rating">4.48 / 5.00 rating</p>
+
+
+                       </li>
+
+                       
+
+                       
+                                       
+
+                       
+
+                       <li>
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/37304/satisfaction-femalworld-version/?from=featured2" class="thumblink">
+       <img id="featured9" src="http://ss-3.youporn.com/screenshot/03/73/screenshot/37304_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/37304/satisfaction-femalworld-version/?from=featured2">Satisfaction femalworld version </a></p>
+
+<p class="duration">06min 47sec</p>
+<p class="views">151,262 views</p>
+
+       <p class="rating">4.25 / 5.00 rating</p>
+
+
+                       </li>
+
+                       
+
+                       
+                                       
+
+                       
+
+                       <li>
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/29282/la-novata/?from=featured2" class="thumblink">
+
+       <img id="featured10" src="http://ss-3.youporn.com/screenshot/02/92/screenshot/29282_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/29282/la-novata/?from=featured2">La Novata </a></p>
+<p class="duration">03min 03sec</p>
+<p class="views">339,264 views</p>
+
+       <p class="rating">4.15 / 5.00 rating</p>
+
+
+                       </li>
+
+                       
+
+                       
+                                       
+
+                       
+
+                       <li>
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/101242/tiamaria-blowjob/?from=featured2" class="thumblink">
+       <img id="featured11" src="http://ss-2.youporn.com/screenshot/10/12/screenshot/101242_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/101242/tiamaria-blowjob/?from=featured2">tiamaria blowjob </a></p>
+<p class="duration">04min 11sec</p>
+<p class="views">417,043 views</p>
+
+       <p class="rating">4.27 / 5.00 rating</p>
+
+
+                       </li>
+
+                       
+
+                       
+                                       
+
+                       
+
+                       <li class="last">
+                               
+
+
+       
+
+
+
+       
+
+
+
+
+       
+       
+       
+
+
+
+
+       
+
+
+<a href="/watch/45516/german-guy-fucks-british-slut/?from=featured2" class="thumblink">
+       <img id="featured12" src="http://ss-1.youporn.com/screenshot/04/55/screenshot/45516_large.jpg" num="8" width="120" height="90" class="thumb" />
+</a>
+<p class="title"><a href="/watch/45516/german-guy-fucks-british-slut/?from=featured2">German guy fucks british slut </a></p>
+<p class="duration">08min 04sec</p>
+<p class="views">1,358,161 views</p>
+
+       <p class="rating">4.18 / 5.00 rating</p>
+
+
+                       </li>
+
+                                                       </ul>
+                       
+
+                       
+               
+       
+</div>
+                               </div>
+                       </div>          
+
+                       <!--tabview to show featured videos-->
+
+                       <div id="moreVideosTabview3" class="yui-navset tabview">
+                               <ul class="yui-nav">
+                                       <li class="selected"><a href="#youpornplus"><em>Premium Videos</em></a></li>                                                    
+                               </ul>                                   
+                               <div class="yui-content">
+                                       <div id="youpornplus">
+                       
+                       <h2>Watch over 4000 DVDs or 25000 videos at <a href="http://youporn.videobox.com/?t=pv_intro2">YouPorn Plus+</a> for only 9.95 per month.</h2>
+
+               
+               
+               
+                       
+                               
+                                       
+                                               
+                                                               
+                                       
+                               
+                               <ul class="clearfix">
+                                       
+                                               <li>
+                                                       
+                                                               
+                                                       
+                                                       
+                                                       
+                                                       
+                                                               
+                                                       
+                                                       <a href="/click/videobox?video_id=65778&banner_id=306&videobox_url=http%3A%2F%2Fyouporn.videobox.com%2Fflash.jtp%3Fid%3D80740%26t%3Dpv_listing9%26vid%3D65778"><img src="http://server321.files.youporn.com/e1/videobox/image07/content/39/80739/front_149x212.jpg" width="149" height="212" /></a>
+                                                       <h1><a href="/click/videobox?video_id=65778&banner_id=306&videobox_url=http%3A%2F%2Fyouporn.videobox.com%2Fflash.jtp%3Fid%3D80740%26t%3Dpv_listing9%26vid%3D65778">Cheating Housewives #2</a></h1>
+                                               </li>
+                                       
+                                               <li>
+                                                       
+                                                               
+                                                       
+                                                       
+                                                       
+                                                       
+                                                               
+                                                       
+                                                       <a href="/click/videobox?video_id=65778&banner_id=306&videobox_url=http%3A%2F%2Fyouporn.videobox.com%2Fflash.jtp%3Fid%3D50933%26t%3Dpv_listing9%26vid%3D65778"><img src="http://server321.files.youporn.com/e1/videobox/image04/content/32/50932/front_149x212.jpg" width="149" height="212" /></a>
+                                                       <h1><a href="/click/videobox?video_id=65778&banner_id=306&videobox_url=http%3A%2F%2Fyouporn.videobox.com%2Fflash.jtp%3Fid%3D50933%26t%3Dpv_listing9%26vid%3D65778">Hungary for Cock</a></h1>
+
+                                               </li>
+                                       
+                                               <li>
+                                                       
+                                                               
+                                                       
+                                                       
+                                                       
+                                                       
+                                                               
+                                                       
+                                                       <a href="/click/videobox?video_id=65778&banner_id=306&videobox_url=http%3A%2F%2Fyouporn.videobox.com%2Fflash.jtp%3Fid%3D80374%26t%3Dpv_listing9%26vid%3D65778"><img src="http://server321.files.youporn.com/e1/videobox/image05/content/73/80373/front_149x212.jpg" width="149" height="212" /></a>
+                                                       <h1><a href="/click/videobox?video_id=65778&banner_id=306&videobox_url=http%3A%2F%2Fyouporn.videobox.com%2Fflash.jtp%3Fid%3D80374%26t%3Dpv_listing9%26vid%3D65778">Young Pink #6</a></h1>
+                                               </li>
+                                       
+                                               <li>
+                                                       
+                                                               
+                                                       
+                                                       
+                                                       
+                                                       
+                                                               
+                                                       
+                                                       <a href="/click/videobox?video_id=65778&banner_id=306&videobox_url=http%3A%2F%2Fyouporn.videobox.com%2Fflash.jtp%3Fid%3D81149%26t%3Dpv_listing9%26vid%3D65778"><img src="http://server321.files.youporn.com/e1/videobox/image04/content/48/81148/front_149x212.jpg" width="149" height="212" /></a>
+                                                       <h1><a href="/click/videobox?video_id=65778&banner_id=306&videobox_url=http%3A%2F%2Fyouporn.videobox.com%2Fflash.jtp%3Fid%3D81149%26t%3Dpv_listing9%26vid%3D65778">Whale Tail #1</a></h1>
+
+                                               </li>
+                                       
+                                               <li class="last">
+                                                       
+                                                               
+                                                       
+                                                       
+                                                       
+                                                       
+                                                               
+                                                       
+                                                       <a href="/click/videobox?video_id=65778&banner_id=306&videobox_url=http%3A%2F%2Fyouporn.videobox.com%2Fflash.jtp%3Fid%3D73777%26t%3Dpv_listing9%26vid%3D65778"><img src="http://server321.files.youporn.com/e1/videobox/image04/content/76/73776/front_149x212.jpg" width="149" height="212" /></a>
+                                                       <h1><a href="/click/videobox?video_id=65778&banner_id=306&videobox_url=http%3A%2F%2Fyouporn.videobox.com%2Fflash.jtp%3Fid%3D73777%26t%3Dpv_listing9%26vid%3D65778">Intensitivity #4</a></h1>
+                                               </li>
+                                       
+                               </ul>
+                               <img src='http://ads-dev.youporn.com/www/delivery/lg.php?bannerid=306&amp;campaignid=29&amp;cb=65778' width='0' height='0' alt='' style='width: 0px; height: 0px;' />
+                       
+               
+       </div>                          </div>
+
+                       </div>          
+                       
+                       <!--tabview to show comments-->
+                       <div id="commentsTabview" class="yui-navset tabview">
+                               <ul class="yui-nav">
+                                       <li class="selected"><a href="#comments"><em>Comments (0)</em></a></li> 
+                                       
+                               </ul>                   
+                               <div class="yui-content">
+                                       <div id="comments">
+                                               
+       <h2>Comments have been disabled for this video.</h2>
+
+                                       </div>
+                                       
+                               </div>
+                       </div>  
+               </div>
+               <!--end: non video content area-->
+       </div>  
+       <!--end: body-->
+       
+       <!--footer-->
+       <div id="ft">
+
+               <div id="footerAdContainer">
+                       <div id="footerAd"></div>
+               </div>
+               <div id="footer">
+       YouPorn 2006-2008 <a href="/terms">Terms of Service</a> | <a href="/dmca">DMCA</a> | Contact: <span id="support_email_field"></span><noscript>youporn@gmail.com</noscript>
+
+       <script type="text/javascript">
+       <!--
+       document.getElementById('support_email_field').innerHTML =
+               // obfuscate! :D
+               'sup' +
+               'port' +
+               // obfuscate! :)
+               '@' +
+               'you' +
+               // obfuscate! :(
+               'porn.com';
+       // -->
+       </script>
+</div> 
+
+       </div>  
+       <!--end: footer-->
+</div>
+
+<script type="text/javascript">
+       function btdna(params) {
+               return params['url'];
+       }
+</script>
+
+       <script type="text/javascript" src="/geo/dna/btdna.js?v=3"></script>
+
+
+       <script type="text/javascript" src="http://js.youporn.com/r/20080512.1.1/script/swfobject2.js"></script>
+
+       
+
+
+       
+       
+
+
+
+       
+
+
+
+<script type="text/javascript">
+       // 20080327 - convert URL into DNA URL, if DNA is installed -WK
+       var player_url = 'http://download.youporn.com/download/112911/flv/65778_moaning_mom_fucked_at_night.flv';
+       
+
+       document.getElementById('player').innerHTML = 'You need to get the latest <a href="http://www.macromedia.com/go/getflashplayer">Flash Player</a> to see this video.';
+       
+       var so = new SWFObject('http://static.youporn.com/player/etologyplayer4-tmp.swf','mpl','600','470','8');
+       so.addParam('allowfullscreen','true');
+       so.addVariable('file', encodeURIComponent(player_url));
+       so.addVariable('et_url','http://pages.etology.com/xml/29112.php');
+       so.addVariable('height','470');
+       so.addVariable('width','600');
+       so.addVariable('location','http://static.youporn.com/player/etologyplayer4-tmp.swf');
+       so.addVariable('showdigits','false');
+       so.addVariable('bufferlength','3');
+       so.addVariable('type','flv');
+       so.addVariable('usekeys','false');
+       so.addVariable('autostart', 'true');
+       so.write('player');
+</script>
+
+
+
+
+<script type="text/javascript" src="http://yui.yahooapis.com/2.4.0/build/yahoo-dom-event/yahoo-dom-event.js"></script> 
+<script type="text/javascript" src="http://yui.yahooapis.com/2.2.2/build/connection/connection-min.js"></script>
+<script type="text/javascript" src="http://yui.yahooapis.com/2.4.0/build/element/element-beta-min.js"></script>
+<script type="text/javascript" src="http://yui.yahooapis.com/2.4.0/build/tabview/tabview-min.js"></script> 
+<script type="text/javascript" src="http://yui.yahooapis.com/2.4.0/build/container/container-min.js"></script> 
+
+<script type="text/javascript" src="http://yui.yahooapis.com/2.4.1/build/get/get-beta-min.js" ></script> 
+<script type="text/javascript" src="http://js.youporn.com/r/20080512.1.1/script/global.js"></script>
+
+<script type="text/javascript" src="http://js.youporn.com/r/20080512.1.3/script/toolbar-r1.js"></script>
+<script type="text/javascript" src="/geo/toolbar/toolbar.js?v=20080512.1.1"></script>
+<script type="text/javascript" src="http://js.youporn.com/r/20080512.1.1/script/tabs7.js"></script>
+
+<!--
+<script type="text/javascript" src="http://js.youporn.com/r/20080512.1.1/script/comments6-r1.js"></script>
+<script type="text/javascript">
+       YAHOO.youporn.comments.init(65778, 'youporn.com', 'en');
+</script>
+-->
+
+<script type="text/javascript" src="http://js.youporn.com/r/20080512.1.1/script/rater.js"></script>
+<script type="text/javascript">
+       YAHOO.youporn.rater.create({
+               video_id:    65778,
+               containerEl: 'rating',
+               statusEl:    'ratingStatus',
+               starsEl:     ['ratingStar1','ratingStar2','ratingStar3','ratingStar4','ratingStar5']
+       });
+
+</script>
+
+<script type="text/javascript" src="http://js.youporn.com/r/20080512.1.1/script/favorites-r5.js"></script>
+<script type="text/javascript">
+       YAHOO.youporn.favorites.init(65778);
+</script>
+
+<script type="text/javascript" src="http://js.youporn.com/r/20080512.1.1/script/thumbchange-r3.js"></script>
+<script type="text/javascript">
+       YAHOO.youporn.thumbchange.register(12, 'related');
+       YAHOO.youporn.thumbchange.register(12, 'featured');
+</script>
+
+<script type="text/javascript" src="http://js.youporn.com/r/20080512.1.5/script/ads2.js"></script>
+<script type="text/javascript">
+       var random_number = new Date().getTime();
+       
+               
+                       
+                               YAHOO.youporn.ads.add('primaryAdTop', "<ifr" + "ame id='a3767c68' name='a3767c68' src='http://ads-dev.youporn.com/www/delivery/afr.php?zoneid=3&amp;target=_blank&amp;cb=" + random_number + "' framespacing='0' frameborder='no' scrolling='no' width='300' height='250'></ifr" + "ame>");
+                               YAHOO.youporn.ads.add('primaryAdBottom', "<ifr" + "ame id='ad669ddb' name='ad669ddb' src='http://ads-dev.youporn.com/www/delivery/afr.php?zoneid=5&amp;target=_blank&amp;cb=" + random_number + "' framespacing='0' frameborder='no' scrolling='no' width='300' height='210'></ifr" + "ame>");
+                       
+               
+       
+
+       
+               
+                       YAHOO.youporn.ads.add('footerAd', "<ifr" + "ame id='a9085da8' name='a9085da8' src='http://ads-dev.youporn.com/www/delivery/afr.php?zoneid=6&amp;target=_blank&amp;cb=" + random_number + "' framespacing='0' frameborder='no' scrolling='no' width='768' height='245'></ifr" + "ame>");                 
+                       //YAHOO.youporn.ads.add('footerAd', '<ifr' + 'ame name="brazzer_ad" src="http://tour.brazzers.com/ads/dynamic/custom/youporn5" width="732" height="230" scrolling="no" frameborder="0" allowtransparency="true" marginheight="0" marginwidth="0"></ifr' + 'ame>');              
+               
+       
+       
+       
+               
+                       // YAHOO.youporn.ads.add('secondaryAd', "<ifr" + "ame id='afa7ff2b' name='afa7ff2b' src='http://ads-dev.youporn.com/www/delivery/afr.php?zoneid=4&amp;target=_blank&amp;cb=" + random_number + "' framespacing='0' frameborder='no' scrolling='no' width='306' height='265'></ifr" + "ame>");
+               
+       
+       
+       YAHOO.youporn.ads.load('videoInfoTabview');
+</script>
+
+<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
+</script>
+<script type="text/javascript">
+
+_uacct = "UA-163988-4";
+
+urchinTracker();
+</script>
+
+<!-- Start Quantcast tag -->
+<script type="text/javascript" src="http://edge.quantserve.com/quant.js"></script>
+<script type="text/javascript">_qacct="p-5dyKuNJnE-WzY";quantserve();</script>
+<noscript>
+<a href="http://www.quantcast.com/p-5dyKuNJnE-WzY" target="_blank"><img src="http://pixel.quantserve.com/pixel/p-5dyKuNJnE-WzY.gif" style="display: none;" border="0" height="1" width="1" alt="Quantcast"/></a>
+</noscript>
+<!-- End Quantcast tag -->
+
+
+<script type="text/javascript" src="http://js.youporn.com/r/20080512.1.3/script/tracker-r1.js"></script>
+<script type="text/javascript">
+       YAHOO.youporn.tracker.write(location.href, document.referrer);
+</script>
+
+<!-- www30 -->
+</body>
+
+</html>
diff --git a/test/howcast_test.rb b/test/howcast_test.rb
new file mode 100644 (file)
index 0000000..5aa0e62
--- /dev/null
@@ -0,0 +1,30 @@
+# Unit tests for the Howcast class.
+# This class is easy because get_video_url is
+# just a string interpolation (we don't have to
+# test that).
+
+require 'test/unit'
+require 'src/websites/howcast'
+
+class HowcastTest < Test::Unit::TestCase
+
+  def test_owns_howcast_urls
+    
+    assert(Howcast.owns_url?('http://www.howcast.com/videos/6807-2twr'))
+    assert(Howcast.owns_url?('www.howcast.com/videos/6807-2dgfdg'))
+    assert(Howcast.owns_url?('http://howcast.com/videos/6807-cse'))
+    assert(Howcast.owns_url?('howcast.com/videos/6807-asdgasd'))
+  end
+
+  
+  def test_doesnt_own_redtube_urls
+    assert(!Howcast.owns_url?('http://www.redtube.com/6807'))
+    assert(!Howcast.owns_url?('www.redtube.com/6807'))
+    assert(!Howcast.owns_url?('http://redtube.com/6807'))
+    assert(!Howcast.owns_url?('redtube.com/6807'))
+  end
+
+  def test_doesnt_own_misc_urls
+    assert(!Howcast.owns_url?('http://www.howcast.com/abc'))
+  end
+end
diff --git a/test/redtube_test.rb b/test/redtube_test.rb
new file mode 100644 (file)
index 0000000..a929f61
--- /dev/null
@@ -0,0 +1,38 @@
+# Unit tests for the Redtube class. Basically just checking
+# the results of get_video_url for known ids.
+
+require 'test/unit'
+require 'src/websites/redtube'
+
+class RedtubeTest < Test::Unit::TestCase
+
+  def test_owns_redtube_urls
+    assert(Redtube.owns_url?('http://www.redtube.com/6807'))
+    assert(Redtube.owns_url?('www.redtube.com/6807'))
+    assert(Redtube.owns_url?('http://redtube.com/6807'))
+    assert(Redtube.owns_url?('redtube.com/6807'))
+  end
+
+  
+  def test_doesnt_own_howcast_urls
+    assert(!Redtube.owns_url?('http://www.howcast.com/6807'))
+    assert(!Redtube.owns_url?('www.howcast.com/6807'))
+    assert(!Redtube.owns_url?('http://howcast.com/6807'))
+    assert(!Redtube.owns_url?('howcast.com/6807'))
+  end
+
+  
+  def test_doesnt_own_misc_urls
+    assert(!Redtube.owns_url?('http://redtube/123'))
+    assert(!Redtube.owns_url?('www.redtube.com/abc'))
+  end
+
+  
+  def test_get_video_url
+    rt = Redtube.new()
+
+    test_result = rt.get_video_url('http://www.redtube.com/6807')
+    assert_equal("http://dl.redtube.com/_videos_t4vn23s9jc5498tgj49icfj4678/0000006/X57OBH08G.flv", test_result)
+  end
+
+end
diff --git a/test/remote_test_suite.rb b/test/remote_test_suite.rb
new file mode 100644 (file)
index 0000000..200e795
--- /dev/null
@@ -0,0 +1 @@
+require 'test/youporn_remote_test'
diff --git a/test/test_suite.rb b/test/test_suite.rb
new file mode 100644 (file)
index 0000000..5b01b0e
--- /dev/null
@@ -0,0 +1,4 @@
+require 'test/howcast_test'
+require 'test/redtube_test'
+require 'test/website_test'
+require 'test/youporn_test'
diff --git a/test/website_test.rb b/test/website_test.rb
new file mode 100644 (file)
index 0000000..e523b1f
--- /dev/null
@@ -0,0 +1,20 @@
+# Tests common to all websites.
+require 'test/unit'
+
+# All of the website classes are located in one
+# directory, so we can 'require' them automatically.
+Dir.glob('src/websites/*.rb').each do |r|
+  require r
+end
+
+class WebsiteTest < Test::Unit::TestCase
+
+  def test_doesnt_own_misc_urls
+    Website.subclasses.each do |w|
+      assert(!w.owns_url?('6807'))
+      assert(!w.owns_url?('www'))
+      assert(!w.owns_url?('http'))
+    end
+  end
+
+end
diff --git a/test/youporn_remote_test.rb b/test/youporn_remote_test.rb
new file mode 100644 (file)
index 0000000..1a8dda0
--- /dev/null
@@ -0,0 +1,21 @@
+# Remote Youporn tests. Actually hit their website
+# and attempt to parse the data returned.
+
+require 'test/unit'
+require 'src/websites/youporn'
+
+class YoupornRemoteTest < Test::Unit::TestCase
+  
+  def test_get_page_data
+    yp = Youporn.new()
+
+    # We can't rely on the fixture here, because Youporn might
+    # change their page layout. Instead, check that we can actually
+    # find the FLV URL on this page.
+    page_data = yp.send('get_page_data', 'http://www.youporn.com/watch/65778')
+    
+    test_result = yp.get_video_url(page_data)
+    assert_equal('http://download.youporn.com/download/112911/flv/65778_moaning_mom_fucked_at_night.flv', test_result)
+  end
+    
+end
diff --git a/test/youporn_test.rb b/test/youporn_test.rb
new file mode 100644 (file)
index 0000000..59c14d5
--- /dev/null
@@ -0,0 +1,22 @@
+# Unit tests for the Youporn class. Basically just checking
+# the results of parse_video_url for now.
+
+require 'test/unit'
+require 'src/websites/youporn'
+
+class YoupornTest < Test::Unit::TestCase
+
+  def test_parse_video_url
+    yp = Youporn.new()
+    
+    page_data = nil
+    
+    File.open('test/fixtures/youporn/page_data-65778.html') do |f|
+      page_data = f.read
+    end
+    
+    test_result = yp.send('parse_video_url', page_data)
+    assert_equal('http://download.youporn.com/download/112911/flv/65778_moaning_mom_fucked_at_night.flv', test_result)
+  end
+    
+end