]> gitweb.michael.orlitzky.com - dead/whatever-dl.git/commitdiff
Added the OGG/Vorbis format parsing to Bliptv.
authorMichael Orlitzky <michael@orlitzky.com>
Mon, 7 Dec 2009 17:46:04 +0000 (12:46 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 7 Dec 2009 17:46:04 +0000 (12:46 -0500)
Created a test case for the OGG/Vorbis parsing.
Renamed an existing Bliptv test which was copied incorrectly.

src/websites/bliptv.rb
test/bliptv_test.rb
test/fixtures/bliptv/2788616.htm [new file with mode: 0644]

index 9322356a9e92353a31782e3a89c27500946b3939..74f656d540a56e8f2e2272585e44a1be04f0baf3 100644 (file)
@@ -48,6 +48,14 @@ class Bliptv < Website
       return matches[1]
     end
 
+    # I've seen some free software videos encoded as OGG/Vorbis, too.    
+    video_url_regex = /"Ogg Theora\/Vorbis \(\.ogg\)", "attribute" : "(.*?\.ogg)/i
+    matches = video_url_regex.match(page_data)
+
+    if not matches.nil?
+      return matches[1]
+    end
+
     # If that didn't work, try the WMV format, which is occasionally
     # used for the source as well.
     video_url_regex = /"Windows Media \(\.wmv\)", "attribute" : "(.*?\.wmv)/i
@@ -60,7 +68,7 @@ class Bliptv < Website
     
     # If neither of the source formats are present, just grab the
     # video URL from the Flash variable and be done with it.
-    video_url_regex = /setPrimaryMediaUrl\("(.*?\.(flv|mov|wmv|mp4))/i
+    video_url_regex = /setPrimaryMediaUrl\("(.*?\.(flv|mov|wmv|mp4|ogg))/i
     matches = video_url_regex.match(page_data)
 
     if matches.nil?
index 8a763fe7d06fa548b00ab29a3e784107aa36481d..ef2d84a57d33ea0f945063fceb87db4bee5b9f41 100644 (file)
@@ -129,8 +129,8 @@ class BliptvTest < Test::Unit::TestCase
   end
 
 
-  def test_parse_mp4_video_url
-    # And why not check one of the MP4 pages, too?
+  def test_parse_default_video_url
+    # Check one of the pages without alternatives.
     
     btv = Bliptv.new(nil)
 
@@ -143,5 +143,22 @@ class BliptvTest < Test::Unit::TestCase
     test_result = btv.send('parse_video_url', page_data)
     assert_equal('http://blip.tv/file/get/Kantel-UbiUndPythonDemo816.flv', test_result)
   end
+
+
+  def test_parse_ogg_video_url
+    # Make sure the OGG/Vorbis parsing works.
+    
+    btv = Bliptv.new(nil)
+
+    page_data = nil
+
+    File.open('test/fixtures/bliptv/2788616.htm') do |f|
+      page_data = f.read
+    end
+
+    test_result = btv.send('parse_video_url', page_data)
+    assert_equal('http://blip.tv/file/get/Fosslc-StateOfPostGIS596.ogg', test_result)
+  end
+
   
 end
diff --git a/test/fixtures/bliptv/2788616.htm b/test/fixtures/bliptv/2788616.htm
new file mode 100644 (file)
index 0000000..fafd4d8
--- /dev/null
@@ -0,0 +1,867 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+       <head>  
+               <!--global stylesheet-->
+               <link rel="stylesheet" type="text/css" href="http://a.blip.tv/skin/mercury/global.css?v=1.32.6996" media="screen" />
+               
+               <!--common stylesheet-->
+               <link rel="stylesheet" type="text/css" href="http://a.blip.tv/skin/mercury/common.css?v=1.15.5136" media="screen" />
+
+               <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+               <title>
+                       
+                               State of PostGIS
+                        
+                       </title>
+
+               
+                       <!-- Facebook share tags -->
+                       
+
+                       
+                               
+                                       <meta name="description" content="State of PostGIS by Paul Ramsey" />
+                               
+
+                                       <meta name="title" content="State of PostGIS | fosslc"/>
+
+                               
+                                       <meta name="video_type" content="application/x-shockwave-flash" />
+                               
+                                       <meta name="video_width" content="1024" />
+                                       <meta name="video_height" content="768" />
+
+                               
+                                       <link rel="image_src" href="http://a.images.blip.tv/Fosslc-StateOfPostGIS188.png" />
+                                       <link rel="videothumbnail" href="http://a.images.blip.tv/Fosslc-StateOfPostGIS188.png" />
+                               
+
+                               
+                                       <link rel="video_src" href="http://blip.tv/play/AYGrtgcC" />
+                               
+                               
+                       <!-- End Facebook share tags -->
+               
+                       
+               <meta http-equiv="keywords" name="keywords" content="application,postgis,geospatial,database,spatial,osgeo" />
+               
+                               
+               <meta name="x-debug-action" content="file_view" />
+               
+               <meta name="robots" content="all" />
+
+               <!--format_inc_header-->
+               
+
+
+
+
+<script>
+        var Pokkari = {
+        
+               AttachEvent: function(foo, bar, action) {
+                       $(document).ready(action);
+               }
+        
+        };
+        
+               var Class = {
+                       create: function() {
+                               return function() {
+                                       this.initialize.apply(this, arguments);
+                               }
+                       }
+               }
+</script>
+
+<script type="text/javascript" src="http://a.blip.tv/scripts/jquery-latest.js?v=1.5.2755"></script>
+<script type="text/javascript" src="http://a.blip.tv/scripts/jquery-ui.min.js?v=1.2.8285"></script>
+<script type="text/javascript" src="http://a.blip.tv/scripts/pokkariCaptcha.js?v=1.2.804"></script>
+<script type="text/javascript" src="http://a.blip.tv/scripts/url.js?v=1.7.2304"></script>
+<script type="text/javascript" src="http://a.blip.tv/scripts/pokkariPlayer.js?v=13.586.4419"></script>
+<script type="text/javascript" src="http://a.blip.tv/scripts/uuid.js?v=1.1.6977"></script>
+
+
+
+
+
+
+
+<script type="text/javascript" src="http://a.blip.tv/scripts/BLIP.js?v=1.2.1433"></script>
+<script type="text/javascript" src="http://a.blip.tv/scripts/BLIP/Delegate.js?v=1.3.4216"></script>
+<script type="text/javascript" src="http://a.blip.tv/scripts/BLIP/Control.js?v=1.2.6853"></script>
+<script type="text/javascript" src="http://a.blip.tv/scripts/BLIP/Controls/Navigation.js?v=1.3.1428"></script>
+<script type="text/javascript" src="http://a.blip.tv/scripts/BLIP/Controls/FastUserMenu.js?v=1.1.5424"></script>
+
+
+<script type="text/javascript" src="http://a.blip.tv/scripts/BLIP/Dashboard.js?v=ALLAN.333560.5265"></script>
+
+
+<script>
+       var navigation = new BLIP.Controls.Navigation();
+</script>
+
+                       
+                       
+                       
+                       
+
+
+
+
+<link rel="alternate" type="application/rss+xml" title="blip.tv RSS" href="http://blip.tv/rss" />
+
+
+               <!--/format_inc_header-->               
+               
+               <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="blip.tv" />
+               
+                       
+               
+               
+
+       </head>
+       <body>
+<!-- include: templ/blipnew/format.pthml -->
+               <div id="Header">
+                       <!-- User stuff -->
+                       
+                               <div id="HeaderUsername">
+                                       Hi there, <a href="/users/create/">Sign up!</a> <span id="Divider">|</span> <a href="/users/login/?return_url=/?file_type%3Dflv%3Bsort%3Ddate%3Bdate%3D%3Bid%3D2788616%3Bs%3Dfile">Login</a>
+                               </div>
+                       
+                       <!-- /User stuff -->                    
+                       <div class="Clear"></div>
+                       <div id="HeaderNavWrapper">
+                               <a href="http://blip.tv"><img src="http://a.blip.tv/skin/mercury/images/logo.gif?v=1.3.6149" id="Logo" alt="blip.tv" /></a>                                     
+                               <div id="HeaderNavMenuWrapper">
+                                       <div class="HeaderNavMenu" onMouseOver="navigation.show(this)" onMouseOut="navigation.hide(this)">                                      <div class="MajorLink"><a href="http://blip.tv/popular">Browse</a></div>
+                                       <ul>
+                                               <li><a href="http://blip.tv/recent">Recent Episodes</a></li>
+                                               <li><a href="http://blip.tv/popular">Popular Episodes</a></li>
+                                               <li class="LastItem"><a href="http://blip.tv/random">Random Episodes</a></li>
+                                       </ul>
+                               </div>
+                                       <div class="HeaderNavMenu" onMouseOver="navigation.show(this)" onMouseOut="navigation.hide(this)">
+                                       <div class="MajorLink"><a href="http://blip.tv/dashboard">Dashboard</a></div>
+                                       <ul>
+                                               <li><a href="http://blip.tv/dashboard">Overview</a></li>
+                                               <li><a href="http://blip.tv/dashboard/episodes">Episodes</a></li>
+                                               <li><a href="http://blip.tv/dashboard/players">Players</a></li>
+                                               <li><a href="http://blip.tv/dashboard/distribution">Distribution</a></li>
+                                               <li><a href="http://blip.tv/dashboard/ads">Advertising</a></li>
+                                               <li class="LastItem"><a href="http://blip.tv/dashboard/stats">Statistics</a></li>
+                                       </ul>
+                               </div>
+                                       <div class="HeaderNavMenu" onMouseOver="navigation.show(this)" onMouseOut="navigation.hide(this)">
+                                       <div class="MajorLink"><a href="http://blip.tv/dashboard/upload">Upload</a></div>
+                                       <ul>
+                                               <li><a href="http://blip.tv/dashboard/upload">Web upload</a></li>
+                                               <li><a href="http://blip.tv/tools/">Desktop upload client</a></li>
+                                               <li class="LastItem"><a href="http://blip.tv/dashboard/ftp/">FTP upload</a></li>
+                                       </ul>
+                               </div>
+                                       <div class="HeaderNavMenu" onMouseOver="navigation.show(this)" onMouseOut="navigation.hide(this)">
+                                       <div class="MajorLink"><a href="http://blip.tv/help">Help</a></div>
+                                       <ul>
+                                               <li><a href="http://blip.tv/help">Overview</a></li>
+                                               <li><a href="http://blip.tv/help/forum">Troubleshooting</a></li>
+                                               <li><a href="http://blip.tv/faq">FAQ</a></li>
+                                               <li><a href="http://blip.tv/learning">Learning Center</a></li>
+                                               <li class="LastItem"><a href="http://blip.tv/help/#supportform">Contact support</a></li>
+                                       </ul>
+                               </div>
+                                       <div class="Clear"></div>
+                               </div>
+                               <div class="Clear"></div>
+                       </div>
+                       <div id="HeaderSearch">
+                               <form method="get" action="/search">
+                                       <div id="SearchQuery">
+                                               <input type="text" name="q">
+                                       </div>
+                                       <div id="SearchQuerySubmit">
+                                               <input type="submit" value="Search blip.tv">
+                                       </div>
+                               </form>
+                               <div class="Clear"></div>
+                       </div>
+                       <div class="Clear"></div>
+               </div>
+
+               <div class="Clear"></div>
+
+       <div id="Wrapper">
+               <div class="Clear"></div>
+
+               <!-- Sides & Tables anteater -->
+
+               
+                       <table cellpadding="0" cellspacing="0" border="0" id="main_table">
+
+                                       
+                                       <td id="body" valign="top">
+                                       <!-- main -->
+                                               </td></tr></table>
+<meta name="title" content="" />
+<meta name="description" content="" />
+<link rel="image_src" href="http://a.images.blip.tv/" />
+<link rel="video_src" href="http://blip.tv/file/"/>
+<meta name="video_height" content="" />
+<meta name="video_width" content="" />
+<meta name="video_type" content="application/x-shockwave-flash" />
+
+  
+            
+    <div class="masthed" id="post_masthed_2808483">
+       <!-- include: templ/blipnew/posts_inc_masthed.pthml -->
+
+
+
+
+
+\r
+
+     </div>
+       
+       
+       <link rel="image_src" href="http://a.images.blip.tv/Fosslc-StateOfPostGIS188.png" />
+    <script src="http://a.blip.tv/scripts/DoSomething.js?v=1.2.8041"></script>
+    <script src="http://a.blip.tv/scripts/FeaturedContent.js?v=1.5.6562"></script>
+    <script src="http://a.blip.tv/scripts/EpisodeFlipper.js?v=1.7.8391"></script>
+    <script src="http://a.blip.tv/scripts/AttributeTable.js?v=1.2.3160"></script>
+    <script src="http://a.blip.tv/scripts/DoSomethingActions.js?v=1.7.5945"></script>
+    <script src="http://a.blip.tv/scripts/TextCompact.js?v=1.2.6726"></script>
+    <script src="http://a.blip.tv/scripts/pokkariComments.js?v=1.2.212"></script>
+    <script src="http://a.blip.tv/scripts/bookmarks-episode.js?v=1.3.7421"></script>
+    <script type="text/javascript" src="http://m2.fwmrm.net/g/lib/1.1/js/fwjslib.js?version=1.1"></script>
+       <script>
+                               
+       function toggleReport(itemType, itemId){
+               $('#ReportMeBabyWrapper').toggle();
+               $("#ReportMeBabyContents").load('/'+ itemType + '/report_form/' + itemId + '/?no_wrap=1', function() {
+                       $("#reportButton").click(function() {
+                               if($("#report_form_2808483 :selected").attr("id") != "reason_null") {
+                               var serializedData = $("#report_form_2808483").serialize();
+                               $.post("/posts/report_inappropriate?skin=xmlhttprequest", serializedData, function(response) {
+                                               $("#ReportError").hide();
+                                               $('#ReportMeBabyWrapper').hide();
+                               }, "text");     
+                               } else {
+                                       shakeReport();
+                                       $("#ReportError").show();
+                               }
+                       });
+
+
+                       $("#reportClose").click(function() {
+                               $('#ReportMeBabyWrapper').hide();
+                       });
+                       
+               });
+       }
+
+    function modifyReportMeSizes() {
+           document.getElementById("ReportMeBabyContents").style.height = "320px";
+           document.getElementById("ReportMeBaby").style.height = "340px";
+           document.getElementById("ReportMeBabyBG").style.height = "360px";    
+       }
+
+       function shakeReport() {
+               $("#ReportMeBaby").animate({marginLeft:'+=5'},50);
+               $("#ReportMeBaby").animate({marginLeft:'-=10'},50);
+               $("#ReportMeBaby").animate({marginLeft:'+=10'},50);
+               $("#ReportMeBaby").animate({marginLeft:'-=10'},50);
+               $("#ReportMeBaby").animate({marginLeft:'+=10'},50);
+               $("#ReportMeBaby").animate({marginLeft:'-=5'},50);
+       }
+
+       function getFlashMovie(movieName) {
+               var isIE = navigator.appName.indexOf("Microsoft") != -1;
+               return (isIE) ? window[movieName] : document[movieName];
+       }
+
+       function getUpdate(type, arg1, arg2) {
+               switch(type) {
+                       case "item":
+                               var item = player.getPlayer().getCurrentItem();
+                               checkInfo(item);
+                       break;
+               }
+       }
+
+       function checkInfo(item)
+       {
+               if(item.posts_id != 2808483) {
+                       $("#BackTo").show();
+               }
+       }
+       
+       function goBack() {
+               PokkariPlayerOptions.useDocumentWrite = false;
+               player.render();
+               $("#BackTo").hide();
+       }
+       </script>
+       <!--[if lte IE 6]>
+       <style>
+   /*<![CDATA[*/       
+       #ReportMeBaby {
+               position:absolute;
+               top: 600px;
+       }
+
+       #ReportMeBabyBG {
+               position:absolute;
+               top: 600px;
+               background: #777;
+       }
+
+   /*]]>*/
+       </style>
+       <![endif]-->
+
+       <!-- Digg Thumbnail Hack -->
+       <!--
+               <img src='http://blip.tv/uploadedFiles/Fosslc-StateOfPostGIS188.png'>
+       -->
+
+       <div id="PageContainer">
+               <div id="BackTo"><a href="javascript:void(0);" onClick="goBack();"><img src="http://a.blip.tv/skin/mercury/images/backto.gif?v=1.2.3306" id="BackToButton"></a></div><div id="EpisodeTitle">State of PostGIS</div>
+               <div class="Clear"></div>
+               <div id="ContentPanel">
+                       <div class="Clear"></div>
+                       <div id="video_player" class="embed" style="height:100%">
+       <script type="text/javascript">
+               PokkariPlayerOptions.useShowPlayer = true;
+               PokkariPlayerOptions.useDocumentWrite = true;
+               PokkariPlayerOptions.maxWidth = 624;
+               PokkariPlayerOptions.maxHeight = 351;
+               PokkariPlayerOptions.forceAspectWidth = true; // Forces pokkariPlayer to always keep width for aspect resize
+               PokkariPlayerOptions.showPlayerOptions = { 
+                       allowm4v: false,
+                       smallPlayerMode: false,
+                       playerUrl: 'http://a.blip.tv/scripts/flash/showplayer.swf'
+               };              
+
+               var player = PokkariPlayer.GetInstanceByMimeType("video/x-flv,video/flv","Web", 0);
+
+               if (player instanceof PokkariQuicktimePlayer) {
+                       // Quicktime player will hold up the whole document if a video not marked for streaming is loaded.
+                       PokkariPlayerOptions.useDocumentWrite = false;
+               }
+
+               player.setPrimaryMediaUrl("http://blip.tv/file/get/Fosslc-StateOfPostGIS127.flv?referrer=blip.tv&source=1");
+               player.setPermalinkUrl("http://blip.tv/file/view/2788616?referrer=blip.tv&source=1");
+               player.setSiteUrl("http://blip.tv");
+               player.setAdvertisingType("preroll_freewheel,overlay_freewheel,postroll_freewheel");
+               player.setPostsId(2808483);
+               player.setUsersId(357135);
+               player.setUsersLogin("fosslc");
+               player.setPostsTitle("State of PostGIS");
+               player.setContentRating("TV-G");
+               player.setDescription("State of PostGIS by Paul Ramsey");
+               player.setTopics("postgis, geospatial, database, spatial, osgeo");
+               player.setPlayerTarget(document.getElementById('video_player'));
+               player.setUsersFeedUrl("http://fosslc.blip.tv/rss");
+               player.setAutoPlay(true);
+               // By setting the size rediculously large, we'll trick PokkariPlayer in resizing with aspect.
+               player.setWidth(500000);
+               player.setHeight(375000);
+
+               player.setGuid("FEC13EEE-C576-11DE-94DF-C6C4A2FB69E1");
+               player.setThumbnail("http://a.images.blip.tv/Fosslc-StateOfPostGIS188.png");
+
+               
+               if (player instanceof PokkariQuicktimePlayer) {
+                       Pokkari.AttachEvent(window,"load",function() { player.render(); });
+               }
+               else {
+                       player.render();
+               }
+       </script>
+</div>
+
+
+                       
+                               <div id="EpisodeDescription">
+                               <div class="Clear"></div>
+                               
+                               <div id="ContentRating">
+                                       <img src="/skin/mercury/images/contentratings/TV-G.gif">
+                               </div>
+                               
+                               <script>if (typeof(player) != 'undefined' && player instanceof PokkariQuicktimePlayer) {
+                                       document.write("<div style='float:left; margin: 8px 10px 5px 5px;'><a href='http://www.apple.com/quicktime/download/'><img src='http://a.blip.tv/images/quicktime.gif?v=1.2.2128' width='88' height='31' border='0' /></a></div>");
+                               }</script>
+                               State of PostGIS by Paul Ramsey
+                       </div>
+                       <div class="Clear"></div>
+                       <div id="EP_and_Format_Bar">
+                               
+                               Play episode as :
+                                       <select id="SelectFormat" size="1" onchange="if(this.value) { window.location.href = this.value; }">
+                                               <option>Select a format</option>
+                                               
+                                                               <option value="/file/2788616?filename=Fosslc-StateOfPostGIS596.ogg">Source &mdash; Ogg Theora/Vorbis (.ogg)</option>
+                                               
+                                                               <option value="/file/2788616?filename=Fosslc-StateOfPostGIS127.flv">Web &mdash; Flash Video (.flv)</option>
+                                               
+                                       </select>
+                       </div>
+                       <div>
+                               <div id="CommentsTitle"><a href="http://blip.tv/comments/?attached_to=post2808483&skin=rss"><img src="http://a.blip.tv/skin/mercury/images/comment_rss.gif?v=1.2.8216" align="right"></a></div>
+                       </div>
+                       <div id="Comments">
+                       
+                                       <div id="CommentsList">
+       
+                               <div id ="CommentEmpty" class="CommentEntry">
+                                       <div class="CommentUserIcon"><img src="http://a.blip.tv/skin/mercury/images/user_icon.gif?v=1.2.6105"></div>
+                                       <div class="CommentText">
+                                               <span class="Said">Oh, look at that.</span>
+                                               <div class="Clear"></div>
+
+                                               <div class="CommentTextBody">
+                                                       No one has commented yet. Be the first!
+                                               </div>
+                                       </div>
+                               </div>
+                               <div class="Clear"></div>
+       
+
+        </div>
+                                       
+               
+                       <div class="Clear"></div>
+                       <div class="MetaPanelSectionTitle" id="LeaveCommentTitle"></div>
+                       <div class="Clear"></div>
+                       <div class="CommentEntry">
+                                       <div class="CommentUserIcon"><img src="http://a.blip.tv/skin/mercury/images/error_triangle.gif?v=1.2.4438"></div>
+                                       <div class="CommentText">
+                                               <div class="CommentTextBody">
+                                                       Hey! You must be logged in to add comments. <a href="/users/login">Login</a> or <a href="/users/create">Register</a>.
+                                               </div>
+                                       </div>
+                                       <div class="Clear"></div>
+                               </div>
+               
+               <a name="comment_form"></a>
+       
+
+                       
+                       </div>
+
+                       <div class="Clear"></div>
+                       <div id="QuickLinks">
+                               <div id="QL_Links">
+                                       <span id="QL_Title">Quick Links</span>
+                                       <a href="http://fosslc.blip.tv/rss" title="Get this show's rss feed with enclosures"><img src="http://a.blip.tv/skin/mercury/images/ql_rss.gif?v=1.2.8117">RSS Feed</a>
+                                       <a href="http://www.channels.com/autosubscribe?feed_url=http://fosslc.blip.tv/rss" title="Subscribe on channels.com"><img src="http://a.blip.tv/skin/mercury/images/ql_rss.gif?v=1.2.8117">channels.com</a>
+                                       
+                                       <a href="itpc://fosslc.blip.tv/rss/itunes/" title="Subscribe to this show in iTunes"><img src="http://a.blip.tv/skin/mercury/images/ql_itunes.gif?v=1.2.7181">iTunes Feed</a>
+                                       
+                                       <a href="http://blip.tv/file/get/Fosslc-StateOfPostGIS127.flv"><img src="http://a.blip.tv/skin/mercury/images/ql_file.gif?v=1.3.8844">Download</a>                              
+                                       <a href="javascript: void(0);" onClick="toggleReport('file','2788616');"><img src="http://a.blip.tv/skin/mercury/images/report.gif?v=1.2.8220">Tattle</a>
+                               </div>
+                       </div>
+                       <div class="Clear"></div>
+               </div>
+               <div id="MetaPanel">
+                       <div id="ReportMeBabyWrapper"><div id="ReportMeBabyBG"></div><div id="ReportMeBaby"><div id="ReportMeBabyContents"></div></div></div>
+                       <div id="ShowInfo">
+                               <div id="ShowIcon">
+                                       <a href="http://fosslc.blip.tv/" title="Go to show page">
+                                               <img src="http://a.blip.tv/skin/mercury/images/user_icon.gif?v=1.2.742" width="55" height="55"/>
+                                       </a>
+                               </div>
+                               <div id="ShowTitleWrapper"><div id="ShowTitle"><a href="http://fosslc.blip.tv/">fosslc</a></div></div>
+                               <div class="Clear"></div>
+                               <div id="ShowInfoLinks">
+
+                                       <a href="http://fosslc.blip.tv/">Visit show page &rsaquo;</a>
+                                       <a href="http://fosslc.blip.tv/posts?view=archive&nsfw=dc">All episodes &rsaquo;</a>
+                               </div>
+                               <div class="Clear"></div>                               
+                       </div>
+                       <div class="Clear"></div>
+
+                       <div class="MetaPanelSectionTitle" id="EpisodeListTitle"></div>
+                       <div class="Clear"></div>
+                       <div id="EpisodeFlipperWrapper">
+                               <div id="EpisodeTopBumper">You've reached the newest episode.</div>
+                               <div id="EpisodeItemHolderWrapper">
+                                       <div id="EpisodeFlipperLoading"><img src="http://a.blip.tv/skin/mercury/images/spinner.gif?v=1.2.8964"></div>
+                                       <div id="EpisodeItemHolder">
+                                       </div>
+                               </div>
+                               <div id="EpisodeBottomBumper">You've reached the oldest episode.</div>
+                               <div class="Clear"></div>
+                       </div>
+
+                       <div id="EpisodeFlipperButtons">                        
+                               <a href="javascript:EpisodeFlipper.older();" id="ep_flip_next"><img src="http://a.blip.tv/skin/mercury/images/ep_next.gif?v=1.3.2396" id="ep_next"></a>
+                               <a href="javascript:EpisodeFlipper.newer();" id="ep_flip_prev"><img src="http://a.blip.tv/skin/mercury/images/ep_prev.gif?v=1.3.3280" id="ep_prev"></a>
+                               <div class="Clear"></div>
+                       </div>
+                       <div class="Clear"></div>
+
+                       <div id="DS_MenuHolder">
+                               <div class="Clear"></div>
+                       </div>
+                       <div id="DS_MenuHolderTrailer"></div>
+                       <div id="Something">
+                               <div id="SomethingTop"></div>
+                               <div class="Clear"></div>
+                               <div id="SomethingContentsWrapper">
+                                       <div id="SomethingError"></div>
+                                       <div id="SomethingContents"><img src="http://a.blip.tv/skin/mercury/images/spinner.gif?v=1.2.8964"></div>
+                                       <div id="SomethingClose"><a href="javascript:EpisodePageWriter.closeSomething();"><img src="http://a.blip.tv/skin/mercury/images/something_close.gif?v=1.2.4221"></a></div>
+                               </div>
+                               <div class="Clear"></div>
+                               <div id="SomethingBottom"></div>
+                       </div>
+                       <div class="Clear"></div>
+                       <div id="FeaturedContent">
+                       </div>
+                       <div id="FC_Refresh"><a href="javascript:FeaturedContent.refresh();"><img src="http://a.blip.tv/skin/mercury/images/handpicked_refresh.gif?v=1.4.5430"></a></div>
+                       <div class="Clear"></div>
+                       <div id="FilesAndLinks"></div>
+                       <div class="Clear"></div>
+                       <div id="Metadata"></div>
+                       <script type="text/javascript">
+
+
+                               var EpisodePageWriter = {
+
+                                       closeSomething : function() {
+                                               $("#Something").slideUp("fast");
+                                       },
+
+                                       openSomething : function() {
+                                               $("#Something").slideDown("fast");
+                                       },
+
+                                       showSomething: function(url,callback) {
+                                               var self = this;
+                                               
+                                               $("#SomethingError").empty();
+                                               
+                                               if (typeof(DoSomethingActions) == "undefined") {
+                                                       $.getScript("http://a.blip.tv/scripts/DoSomethingActions.js?v=1.7.5945",
+                                                               function() { window.setTimeout(function() {
+                                                                               self.showSomething(url,callback);
+                                                                       }, 100);                        
+                                                               }
+                                                       );
+                                               }
+                                               else {
+                                                       this.closeSomething();
+                                                       $('#SomethingContents').load(url, function() {
+                                                               self.openSomething();
+                                                               if (callback) {
+                                                                       callback();
+                                                               }
+                                                       });
+                                               }
+                                       },
+
+                               
+                                       email : function () {
+                                               var self = this;
+                                               this.showSomething("/dosomething/share?no_wrap=1 #Email", function() {
+                                                       self.insertCaptcha();
+                                                       DoSomethingActions.emailSender.initialize(2808483);
+                                               });
+                                       },
+
+                                       embedShowPlayer: function() {
+                                               
+                                               this.showSomething("/dosomething/embed?no_wrap=1 #ShowPlayer", function() { DoSomethingActions.playerSelector.load(2808483, 357135); });
+                                               
+                                       },
+
+                                       embedLegacyPlayer : function() {
+                                               this.showSomething("/dosomething/embed?no_wrap=1 #LegacyPlayer", function () {
+                                                       DoSomethingActions.legacySelector.initialize(2788616);
+                                               });
+                                       },
+
+                                       embedWordpress : function() {
+                                               this.showSomething("/dosomething/embed?no_wrap=1 #Wordpress", function() {
+                                                       DoSomethingActions.wordpressSelector.initialize(2808483);
+                                               });
+                                       },
+                                       
+                                       insertCaptcha : function() {
+                                               var uuid = new UUID();
+                                               $("#captchaHere").html("<input type='hidden' name='captchas_guid' value='" + uuid + "' />\n" + "<img src='/captchas/" + uuid + "' id='CaptchaImg' />\n");
+                                       },
+                                       
+                                       blog : function() {
+                                               this.showSomething("/users/blogging_info?posts_id=2808483&no_wrap=1", function() {                                              
+                                                       DoSomethingActions.crosspostSelector.initialize();
+                                               });
+                                       },
+                                       
+                                       subscribeInNewWindow: function(url) {
+                                               var nW = window.open(url,"_blank", '');
+                                               nW.focus();
+                                       },
+
+                                       subscribeRss: function() {
+                                               this.showSomething("/dosomething/subscribe?no_wrap=1&safeusername=fosslc #Rss");
+                                       },
+
+                                       subscribeChannels: function() {
+                                               this.subscribeInNewWindow("http://www.channels.com/autosubscribe?feed_url=http://fosslc.blip.tv/rss");
+                                       },
+
+                                       subscribeItunes: function() {
+                                               this.subscribeInNewWindow("itpc://fosslc.blip.tv/rss/itunes/");
+                                       },
+
+                                       subscribeMiro: function() {
+                                               this.subscribeInNewWindow("http://subscribe.getmiro.com/?url1=http%3A//fosslc.blip.tv/rss");
+                                       },
+
+                                       subscribePando: function() {
+                                               this.subscribeInNewWindow(
+                                                       PokkariPandoPlayer.getSubscribeUrl("http://fosslc.blip.tv/rss/pando","fosslc")
+                                               );
+                                       },
+
+                                       myspace: function() {
+                                               $.getScript('/players/embed/?posts_id=2808483&skin=json&callback=EpisodePageWriter.myspaceSubmit');
+                                       },
+
+                                       myspaceSubmit: function(params) {
+                                               if (params && params.length && params[0] && params[0].code) {
+                                                       var code = encodeURIComponent("<div class='BlipEmbed'>" + params[0].code + "</div><div class='BlipDescription'><p>State of PostGIS by Paul Ramsey</p></div>");
+                                                       window.open('http://www.myspace.com/Modules/PostTo/Pages/?T=State%20of%20PostGIS&C=' + code);
+                                               }
+                                       }
+
+                               };
+
+
+                               var DSO = {
+                                       "verbs" : [
+                                       
+                                               {"verb" : "<img src='http://a.blip.tv/skin/mercury/images/ds_verb_share.gif?v=1.2.8787'>", "preposition" : "with", "nouns" : [
+                                                       {"noun" : "Email", "action" : function(){EpisodePageWriter.email();}},
+                                                       {"noun" : "Cross-posting", "action" : function(){EpisodePageWriter.blog();}},
+                                                       {"noun" : "Del.icio.us", "action" : function(){ window.open('http://del.icio.us/post?url=http://blip.tv/file/2788616')}},
+                                                       {"noun" : "Digg", "action" : function() { window.open('http://digg.com/submit?phase=2&url=http://blip.tv/file/2788616/&title=State%20of%20PostGIS')}},
+                                                       {"noun" : "Facebook", "action" : function() {u=location.href;t=document.title;window.open('http://www.facebook.com/sharer.php?u='+encodeURIComponent(u)+'&t='+encodeURIComponent(t),'sharer','toolbar=0,status=0,width=626,height=436');return false;}},
+                                                       {"noun" : "Lycos", "action" : function() { window.open('http://mix.lycos.com/bookmarklet.php?url='+escape(window.location.href),'lyMixBookmarklet', 'width=550,height=400')}},
+                                                       {"noun" : "MySpace", "action" : function() { EpisodePageWriter.myspace(); }},
+                                                       {"noun" : "Newsvine", "action" : function() { window.open('http://www.newsvine.com/_tools/seed&amp;save?u=http://blip.tv/file/2788616&amp;h=file')}},
+                                                       {"noun" : "Reddit", "action" : function() { window.open('http://reddit.com/submit?url=http://blip.tv/file/2788616&amp;name=file')}},
+                                                       {"noun" : "StumbleUpon", "action" : function() { window.open('http://www.stumbleupon.com/submit?url=http://blip.tv/file/2788616&amp;name=file')}},
+                                                       ]},
+
+                                               {"verb" : "<img src='http://a.blip.tv/skin/mercury/images/ds_verb_embed.gif?v=1.2.7171'>", "preposition" : "with", "nouns" : [
+                                                       {"noun" : "Show Player", "action" : function(){EpisodePageWriter.embedShowPlayer();}},
+                                                       {"noun" : "Legacy Player", "action" : function(){EpisodePageWriter.embedLegacyPlayer();}},
+                                                       {"noun" : "Wordpress.com", "action" : function(){EpisodePageWriter.embedWordpress();}}
+                                                       ]},
+
+                                               {"verb" : "<img src='http://a.blip.tv/skin/mercury/images/ds_verb_subscribe.gif?v=1.2.7199'>", "preposition" : "with", "nouns" : [
+                                                       {"noun" : "RSS", "action" : function() { EpisodePageWriter.subscribeRss(); }},
+                                                       
+                                                       {"noun" : "iTunes", "action" : function() { EpisodePageWriter.subscribeItunes(); }},
+                                                       
+                                                       {"noun" : "Channels.com", "action" : function() {EpisodePageWriter.subscribeChannels(); }},
+                                                       {"noun" : "Miro", "action" : function() { EpisodePageWriter.subscribeMiro(); }}
+                                               ]}]
+                                       };
+
+                               var ATOf = {
+                               "name" : "Files and Links",
+                               "src" : "http://a.blip.tv/skin/mercury/images/files_at.gif?v=1.2.4914",
+                               "attributes" : [
+                    
+                                               {"name" : "Thumbnail", "attribute" : "http://a.images.blip.tv/Fosslc-StateOfPostGIS188.png", "type" :
+                                                       [{"link" : "http://a.images.blip.tv/Fosslc-StateOfPostGIS188.png", "selectable" : 1}]
+                                               },
+                    
+                                       
+                                               {"name" : "Ogg Theora/Vorbis (.ogg)", "attribute" : "http://blip.tv/file/get/Fosslc-StateOfPostGIS596.ogg", "type" :
+                                                       [{"link" : "http://blip.tv/file/get/Fosslc-StateOfPostGIS596.ogg", "selectable" : 1}]
+                                               },
+                                       
+                                               {"name" : "Flash Video (.flv)", "attribute" : "http://blip.tv/file/get/Fosslc-StateOfPostGIS127.flv", "type" :
+                                                       [{"link" : "http://blip.tv/file/get/Fosslc-StateOfPostGIS127.flv", "selectable" : 1}]
+                                               }
+                                       
+                               ]};
+
+                               var ATOm = {
+                               "name" : "Metadata",
+                               "src" : "http://a.blip.tv/skin/mercury/images/metadata_at.gif?v=1.2.4777",
+                               "attributes" : [
+                                       {"name" : "Date", "attribute" : "Oct 30, 2009 01:09pm", "type" :
+                                               [{"link" : "", "selectable" : 0}]
+                                       },
+                                       {"name" : "Category", "attribute" : "Technology", "type" :
+                                               [{"link" : "/posts/?category=7&category_name=Technology", "selectable" : 0}]
+                                       },
+                                       
+                                       {"name" : "Tags", "attribute" : "<a href='http://blip.tv/topics/view/postgis' title='Find more content marked \"postgis\"' rel='tag'>postgis</a>, <a href='http://blip.tv/topics/view/geospatial' title='Find more content marked \"geospatial\"' rel='tag'>geospatial</a>, <a href='http://blip.tv/topics/view/database' title='Find more content marked \"database\"' rel='tag'>database</a>, <a href='http://blip.tv/topics/view/spatial' title='Find more content marked \"spatial\"' rel='tag'>spatial</a>, <a href='http://blip.tv/topics/view/osgeo' title='Find more content marked \"osgeo\"' rel='tag'>osgeo</a> ", "type" :
+                                               [{"link" : "", "selectable" : 0}]
+                                       },
+                                       
+                                       
+                                       {"name" : "License", "attribute" : "No license (All rights reserved)", "type" :
+                                               [{"rel" : "license", "link" : "", "selectable" : 0}]
+                                       },
+                                       
+                                       {"name" : "ogg filesize", "attribute" : "122213341 Bytes", "type" :
+                                               [{"link" : "", "selectable" : 0}]
+                                       },
+                                       
+                                       {"name" : "Flash filesize", "attribute" : "120686009 Bytes", "type" :
+                                               [{"link" : "", "selectable" : 0}]
+                                       }
+                                       
+
+                               ]};
+
+                               TextCompact.compact("#ShowTitle", 40);
+                               
+                               $(document).ready(function(){                   
+                                       EpisodeFlipper.initialize(document.getElementById("EpisodeItemHolder"), "2808483", "357135", "1256922573");
+                                       DoSomething.embed(DSO, "DS_MenuHolder");
+                                       FeaturedContent.embed("http://blip.tv/posts/?bookmarked_by=hotepisodes&skin=json&callback=?&version=2 ", "http://blip.tv/posts/?bookmarked_by=hotepisodes&skin=json&callback=?&version=2 ", "FeaturedContent");
+                                       AttributeTable.embed(ATOf, "FilesAndLinks", "#555555","#CCCCCC");
+                                       AttributeTable.embed(ATOm, "Metadata", "#555555", "#CCCCCC");
+                               });
+                               
+
+                       </script>
+                       <div class="Clear"></div>
+                                               
+                       <div id="AdCode">
+                                <span id="medium_rectangle" class="_fwph">
+                                <form id="_fw_form_medium_rectangle" style="display:none">
+                                <input type="hidden" name="_fw_input_medium_rectangle" id="_fw_input_medium_rectangle" value="w=300&h=250&envp=g_js&sflg=-nrpl;" />
+                                </form>
+                                <span id="_fw_container_medium_rectangle_companion" class="_fwac"></span>
+                                <span id="_fw_container_medium_rectangle" class="_fwac">
+                                        <script src="http://2822.v.fwmrm.net/ad/g/1?nw=10274&pvrn=Insert Random Number Here&csid=display&resp=ad;;ptgt=s&envp=g_js&slid=Rectangle&w=300&h=250" language="javascript"></script><noscript><iframe src="http://2822.v.fwmrm.net/ad/g/1?nw=10274&pvrn=Insert Random Number Here&csid=display&resp=ad;;ptgt=s&envp=g_iframe&slid=Rectangle&w=300&h=250" width="300" height="250" border="0" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe></noscript>
+                                </span>
+                                </span>                        
+                       </div>
+                       <div class="Clear"></div>
+                        
+               </div>
+               <div class="Clear"></div>
+       </div>
+       <div class="Clear"></div>
+
+  
+
+  <!-- end unless deleted -->
+
+
+
+
+
+
+
+<div style="display:block;">
+       <table width="950px" height="100%">
+               <tr>
+                       <td>&nbsp;</td>
+                       <td>&nbsp;
+
+                                       </td>
+                               </tr>
+                       </table>
+               
+
+       </div>
+       <div class="Clear"></div>
+       <div id="Footer">
+               <div class="FooterColumn FooterBorder">
+                       <div class="FooterColumnContents">
+                               <h4>About blip.tv</h4>
+                               <span class="FooterBabble">We help creative people be creative.</span> <a href="/about/" class="FooterBabble">More about us &rsaquo;</a>
+                       </div>
+               </div>
+               <div class="FooterColumn FooterBorder">
+                       <div class="FooterColumnContents">
+                               <h4>You</h4>
+                               <div class="ColumnHalf">
+                                       <a href="http://blip.tv/dashboard/">Dashboard</a>
+                                       <a href="http://blip.tv/file/post/">Publishing</a>
+                                       <a href="http://blip.tv/blogs/list/">Distribution</a>
+                               </div>
+                               <div class="ColumnHalf">
+                                       <a href="http://blip.tv/prefs/advertising_manage/">Advertising</a>
+                                       <a href="http://blip.tv/users/stats/">Statistics</a>
+                                       <a href="http://blip.tv/">Showpage</a>
+                                       <a href="http://blip.tv/prefs/security/">Account</a>
+                               </div>
+
+                       </div>
+               </div>
+               <div class="FooterColumn FooterBorder">
+                       <div class="FooterColumnContents">
+                               <h4>Help</h4>
+                               <span class="FooterBabble"><a href="http://blip.tv/learning/" class="FooterBabble">The Learning Center</a> is for those new to Web show production on blip.tv. Check out our <a href="/help/" class="FooterBabble">Help Section</a> for more information about how to use the blip.tv service.</span>
+                       </div>
+               </div>
+               <div class="FooterColumn">
+                       <div class="FooterColumnContents">
+                               <h4>Us</h4>
+                               <div class="ColumnHalf">
+                                       <a href="http://blog.blip.tv/">Our Blog</a>
+                                       <a href="http://blip.tv/careers/" class="Highlight">Careers at blip</a>
+                                       <a href="http://blip.tv/advertisers/">Advertise on blip</a>
+                               </div>
+                               <div class="ColumnHalf">
+                                       <a href="http://blip.tv/tos/">Terms of Use</a>
+                                       <a href="http://blip.tv/dmca/">Copyright Policy</a>
+                                       <a href="http://blip.tv/about/api/">Developers</a>
+                               </div>
+                       </div>
+                       <div class="Clear"></div>
+                       
+                       <script type="text/javascript">
+                       var browserVersion = navigator.appVersion;
+                       if(browserVersion.substring(5,11)=="iPhone"){
+                               document.write("<div id=\"Navigation\">");
+                               document.write("<a href=\"http://blip.tv/?skin=iphone\" class=\"LastLink\">Blip Mobile Site</a>");
+                               document.write("</div>");
+                               document.write("<div class=\"Clear\"></div>");
+                       }
+                       </script>
+
+                       <div class="FooterColumnContents">
+                               <p>Copyright &copy; 2009 Blip Networks Inc.</p>
+                       </div>
+                       </div>
+               </div>
+       
+       <script type="text/javascript">
+               var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
+               document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+       </script>
+       <script type="text/javascript">
+               var pageTracker = _gat._getTracker("UA-713068-1");
+               pageTracker._initData();
+               pageTracker._trackPageview();
+       </script>
+       
+       <!-- Start Quantcast tag -->
+       <script type="text/javascript" src="http://edge.quantserve.com/quant.js"></script>
+       <script type="text/javascript">_qacct="p-1fp7VX_6qS9mM";quantserve();</script>
+       <noscript>
+               <a href="http://www.quantcast.com/p-1fp7VX_6qS9mM" target="_blank"><img src="http://pixel.quantserve.com/pixel/p-1fp7VX_6qS9mM.gif" style="display: none;" border="0" height="1" width="1" alt="Quantcast"/></a>
+       </noscript>
+       <!-- End Quantcast tag -->
+       </body>
+</html>