rendered paste body.htaccess:
Options -Indexes
RewriteEngine on
RewriteRule videoloader/(...........).flv videoloader.php?id=$1
RewriteRule videoloader/(...........)/.*.flv videoloader.php?id=$1
videoloader.php:
<?php
include "dbinfo.php";
ini_set ('display_errors', '0');
function headers()
{
header('Content-Transfer-Encoding: Binary');
header('Content-type: video/x-flv');
// change the above to whatever is appropriate
header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Last-Modified: Wed, 11 Apr 2020 02:32:57 GMT");
header('Accept-Ranges:bytes');
header("Pragma: no-cache");
}
$id = $_GET['id'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
headers();
$t = getTCode($id,$useragent);
$contentlength = getContentLength($id,$t);
header("$contentlength");
$url = "http://www.youtube.com/get_video?video_id=" . $id . "&t=" . $t;
set_time_limit(0);
readfile_chunked($url);
?>
dbinfo.php:
<?
require_once("curl_http_client.php");
$useragent = $_SERVER['HTTP_USER_AGENT'];
////////////////////////
// streaming settings //
////////////////////////
$packetsize = 4096;
$prebufferpackets = 2;
$bufferpackets =1;
function getTCode($videoid,$useragent= "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11")
{
$curl = &new Curl_HTTP_Client();
$curl->set_user_agent($useragent);
$referrer = "http://www.youtube.com/watch?v=" . $videoid;
set_time_limit (600);
$data = $curl->fetch_url($referrer);
//echo $data;
// search for our &t=
$array1 = explode ("&t=", $data);
$array2 = explode ('&', $array1[1]);
$t = $array2[0];
//echo "\nt =" . $t . "/n";
return $t;
}
function getContentLength($videoid,$t)
{
$url = "http://www.youtube.com/get_video?video_id=" . $videoid . "&t=" . $t;
$array = get_headers($url);
$count = count($array);
for ($i=0; $i < $count; $i++)
{
if (strpos($array[$i], "Length"))
{
if ($array[$i] != "Content-Length: 0")
{
return($array[$i]);
}
}
}
return "Content-Length: 0";
}
function readfile_chunked($filename) {
global $packetsize;
global $prebufferpackets;
global $bufferpackets;
$chunksize = $bufferpackets;; // it will stream for every packet. how many packets per echo
$tobuffer = $prebufferpackets; // how much times chunksize we want to buffer for the initial request
$first = 1;
$buffer = '';
$handle = fopen($filename, 'rb');
if ($handle === false)
{
return false;
}
while (!feof($handle))
{
$buffer = '';
set_time_limit(0);
if ($first == 1) { $todo = $chunksize * $tobuffer; $first =0;} else { $todo = $chunksize; }
for ($i=0; $i<$todo; $i++)
{
$buffer .= fread($handle, $packetsize);
}
echo $buffer;
ob_flush();
flush();
}
$status = fclose($handle);
return $status;
}
?>
curl_http_client.php:
<?php
/**
* @version $Id$
* @package dinke.net
* @copyright © 2007 Dinke.net
* @author Dragan Dinic <dragan@dinke.net>
*/
/**
* Curl based HTTP Client
* Simple but effective OOP wrapper around Curl php lib.
* Contains common methods needed
* for getting data from url, setting referrer, credentials,
* sending post data, managing cookies, etc.
*
* Samle usage:
* $curl = &new Curl_HTTP_Client();
* $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
* $curl->set_user_agent($useragent);
* $curl->store_cookies("/tmp/cookies.txt");
* $post_data = array('login' => 'pera', 'password' => 'joe');
* $html_data = $curl->send_post_data(http://www.foo.com/login.php, $post_data);
*/
class Curl_HTTP_Client
{
/**
* Curl handler
* @access private
* @var resource
*/
var $ch ;
/**
* set debug to true in order to get usefull output
* @access private
* @var string
*/
var $debug = false;
/**
* Contain last error message if error occured
* @access private
* @var string
*/
var $error_msg;
/**
* Curl_HTTP_Client constructor
* @param boolean debug
* @access public
*/
function Curl_HTTP_Client($debug = false)
{
$this->debug = $debug;
// initialize curl handle
$this->ch = curl_init();
//set various options
//set error in case http return code bigger than 300
curl_setopt($this->ch, CURLOPT_FAILONERROR, true);
// allow redirects
curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
//hack to make code work on windows
//if(strpos(PHP_OS,"WIN") !== false)
{
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);
}
}
/**
* Set username/pass for basic http auth
* @param string user
* @param string pass
* @access public
*/
function set_credentials($username,$password)
{
curl_setopt($this->ch, CURLOPT_USERPWD, "$username:$password");
}
/**
* Set referrer
* @param string referrer url
* @access public
*/
function set_referrer($referrer_url)
{
curl_setopt($this->ch, CURLOPT_REFERER, $referrer_url);
}
/**
* Set client's useragent
* @param string user agent
* @access public
*/
function set_user_agent($useragent)
{
curl_setopt($this->ch, CURLOPT_USERAGENT, $useragent);
}
/**
* Set to receive output headers in all output functions
* @param boolean true to include all response headers with output, false otherwise
* @access public
*/
function include_response_headers($value)
{
curl_setopt($this->ch, CURLOPT_HEADER, $value);
}
/**
* Set proxy to use for each curl request
* @param string proxy
* @access public
*/
function set_proxy($proxy)
{
curl_setopt($this->ch, CURLOPT_PROXY, $proxy);
}
/**
* Send post data to target URL
* return data returned from url or false if error occured
* @param string url
* @param array assoc post data array ie. $foo['post_var_name'] = $value
* @param string ip address to bind (default null)
* @param int timeout in sec for complete curl operation (default 10)
* @return string data
* @access public
*/
function send_post_data($url, $postdata, $ip=null, $timeout=600)
{
//set various curl options first
// set url to post to
curl_setopt($this->ch, CURLOPT_URL,$url);
// return into a variable rather than displaying it
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER,true);
//bind to specific ip address if it is sent trough arguments
if($ip)
{
if($this->debug)
{
echo "Binding to ip $ip\n";
}
curl_setopt($this->ch,CURLOPT_INTERFACE,$ip);
}
//set curl function timeout to $timeout
curl_setopt($this->ch, CURLOPT_TIMEOUT, $timeout);
//set method to post
curl_setopt($this->ch, CURLOPT_POST, true);
//generate post string
$post_array = array();
if(!is_array($postdata))
{
return false;
}
foreach($postdata as $key=>$value)
{
$post_array[] = urlencode($key) . "=" . urlencode($value);
}
$post_string = implode("&",$post_array);
if($this->debug)
{
echo "Post String: $post_string\n";
}
// set post string
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post_string);
//and finally send curl request
$result = curl_exec($this->ch);
if(curl_errno($this->ch))
{
if($this->debug)
{
echo "Error Occured in Curl\n";
echo "Error number: " .curl_errno($this->ch) ."\n";
echo "Error message: " .curl_error($this->ch)."\n";
}
return false;
}
else
{
return $result;
}
}
/**
* fetch data from target URL
* return data returned from url or false if error occured
* @param string url
* @param string ip address to bind (default null)
* @param int timeout in sec for complete curl operation (default 5)
* @return string data
* @access public
*/
function fetch_url($url, $ip=null, $timeout=600)
{
// set url to post to
curl_setopt($this->ch, CURLOPT_URL,$url);
//set method to get
curl_setopt($this->ch, CURLOPT_HTTPGET,true);
// return into a variable rather than displaying it
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER,true);
//bind to specific ip address if it is sent trough arguments
if($ip)
{
if($this->debug)
{
echo "Binding to ip $ip\n";
}
curl_setopt($this->ch,CURLOPT_INTERFACE,$ip);
}
//set curl function timeout to $timeout
curl_setopt($this->ch, CURLOPT_TIMEOUT, $timeout);
//and finally send curl request
$result = curl_exec($this->ch);
if(curl_errno($this->ch))
{
if($this->debug)
{
echo "Error Occured in Curl\n";
echo "Error number: " .curl_errno($this->ch) ."\n";
echo "Error message: " .curl_error($this->ch)."\n";
}
return false;
}
else
{
return $result;
}
}
/**
* Fetch data from target URL
* and store it directly to file
* @param string url
* @param resource value stream resource(ie. fopen)
* @param string ip address to bind (default null)
* @param int timeout in sec for complete curl operation (default 5)
* @return boolean true on success false othervise
* @access public
*/
function fetch_into_file($url, $fp, $ip=null, $timeout=600)
{
// set url to post to
curl_setopt($this->ch, CURLOPT_URL,$url);
//set method to get
curl_setopt($this->ch, CURLOPT_HTTPGET, true);
// store data into file rather than displaying it
curl_setopt($this->ch, CURLOPT_FILE, $fp);
//bind to specific ip address if it is sent trough arguments
if($ip)
{
if($this->debug)
{
echo "Binding to ip $ip\n";
}
curl_setopt($this->ch, CURLOPT_INTERFACE, $ip);
}
//set curl function timeout to $timeout
curl_setopt($this->ch, CURLOPT_TIMEOUT, $timeout);
//and finally send curl request
$result = curl_exec($this->ch);
if(curl_errno($this->ch))
{
if($this->debug)
{
echo "Error Occured in Curl\n";
echo "Error number: " .curl_errno($this->ch) ."\n";
echo "Error message: " .curl_error($this->ch)."\n";
}
return false;
}
else
{
return true;
}
}
/**
* Send multipart post data to the target URL
* return data returned from url or false if error occured
* (contribution by vule nikolic, vule@dinke.net)
* @param string url
* @param array assoc post data array ie. $foo['post_var_name'] = $value
* @param array assoc $file_field_array, contains file_field name = value - path pairs
* @param string ip address to bind (default null)
* @param int timeout in sec for complete curl operation (default 30 sec)
* @return string data
* @access public
*/
function send_multipart_post_data($url, $postdata, $file_field_array=array(), $ip=null, $timeout=600)
{
//set various curl options first
// set url to post to
curl_setopt($this->ch, CURLOPT_URL, $url);
// return into a variable rather than displaying it
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
//bind to specific ip address if it is sent trough arguments
if($ip)
{
if($this->debug)
{
echo "Binding to ip $ip\n";
}
curl_setopt($this->ch,CURLOPT_INTERFACE,$ip);
}
//set curl function timeout to $timeout
curl_setopt($this->ch, CURLOPT_TIMEOUT, $timeout);
//set method to post
curl_setopt($this->ch, CURLOPT_POST, true);
// disable Expect header
// hack to make it working
$headers = array("Expect: ");
curl_setopt($this->ch, CURLOPT_HTTPHEADER, $headers);
// initialize result post array
$result_post = array();
//generate post string
$post_array = array();
$post_string_array = array();
if(!is_array($postdata))
{
return false;
}
foreach($postdata as $key=>$value)
{
$post_array[$key] = $value;
$post_string_array[] = urlencode($key)."=".urlencode($value);
}
$post_string = implode("&",$post_string_array);
if($this->debug)
{
echo "Post String: $post_string\n";
}
// set post string
//curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post_string);
// set multipart form data - file array field-value pairs
if(!empty($file_field_array))
{
foreach($file_field_array as $var_name => $var_value)
{
if(strpos(PHP_OS, "WIN") !== false) $var_value = str_replace("/", "\\", $var_value); // win hack
$file_field_array[$var_name] = "@".$var_value;
}
}
// set post data
$result_post = array_merge($post_array, $file_field_array);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $result_post);
//and finally send curl request
$result = curl_exec($this->ch);
if(curl_errno($this->ch))
{
if($this->debug)
{
echo "Error Occured in Curl\n";
echo "Error number: " .curl_errno($this->ch) ."\n";
echo "Error message: " .curl_error($this->ch)."\n";
}
return false;
}
else
{
return $result;
}
}
/**
* Set file location where cookie data will be stored and send on each new request
* @param string absolute path to cookie file (must be in writable dir)
* @access public
*/
function store_cookies($cookie_file)
{
// use cookies on each request (cookies stored in $cookie_file)
curl_setopt ($this->ch, CURLOPT_COOKIEJAR, $cookie_file);
}
/**
* Get last URL info
* usefull when original url was redirected to other location
* @access public
* @return string url
*/
function get_effective_url()
{
return curl_getinfo($this->ch,CURLINFO_EFFECTIVE_URL);
}
/**
* Get http response code
* @access public
* @return int
*/
function get_http_response_code()
{
return curl_getinfo($this->ch,CURLINFO_HTTP_CODE);
}
/**
* Return last error message and error number
* @return string error msg
* @access public
*/
function get_error_msg()
{
$err = "Error number: " .curl_errno($this->ch) ."\n";
$err .="Error message: " .curl_error($this->ch)."\n";
return $err;
}
}
?>