หลักการทำงาน : ไฟล์ youtube.cgi ไปเรียก yt.sh
youtube.cgi
#!/fs/home/chakkrit_ta/.local/bin/python # programmed by klainfo import cgi import cgitb import os from subprocess import call import time from urlparse import urlparse,parse_qs cgitb.enable() form = cgi.FieldStorage() print "Content-type: text/html\n" if(form.has_key('url')): url = form['url'].value t = time.time() vid = '' fmt = ('17','34','22')[1] if '&' in url: vid = [k[2:] for k in urlparse(url).query.split('&') if k[:2] == 'v='][0] else: vid = urlparse(url).query[2:] output = open('output.log','w') call(['/bin/bash','yt.sh',vid,fmt],0,None,None,output) redirect = open('output.log','r').read() print redirect else: print 'Don\'t hack me'
yt.sh
#!/bin/bash # programmed by klainfo vidID=$1 fmt=$2 filename=$fn".flv" geturl() { echo "GET $1 HTTP/1.1";echo "Host: $2";echo;echo;echo '^C'; } hostl=`geturl /watch youtube.com | nc youtube.com 80 | grep Location | sed 's|Location: http://\([^/]*\)/.*|\1|' | tr -d '\r\n'` watch="/watch?v="$vidID tid=`geturl $watch $hostl | nc youtube.com 80 | grep '"t":' | sed 's/.*"t": "\([^"]*\)".*/\1/'` #echo "Locating video file" get_video="/get_video?video_id="$vidID"&t="$tid"&el=detailpage&ps=&fmt=$fmt" url=`geturl $get_video $hostl | nc youtube.com 80 | grep Location | sed 's/Location: \(.*\)$/\1/' | tr -d '\r\n'` echo $url #wget 'http://www.youtube.com'$get_video -O video.flv #wget -O - -t 7 -w 5 --waitretry=14 --random-wait '--user-agent=Mozilla/5.0' -e robots=off $url > $filename
SQL table
[ id | vid | target | title | viewcount | thumbnail | time | expired | download | created_on | updated_on ]
controller/video.php
<?php class Video extends Controller { function Video() { parent::Controller(); $this->load->helper('date'); $this->load->helper('url'); } function add() { $baseurl = 'http://tera.thaigrid.or.th/~chakkrit_ta/cgi-bin/youtube.cgi?url='; $addnew = false; $url = $this->input->post('videourl'); if( $url != '' ) { $parts = parse_url($url); parse_str($parts['query']); $vid = $v; $dl = new Downloader(); $dl->get_where(array('vid'=> $vid)); if( $dl->count() > 0) { if( $dl->expired > now() ) { $ans = Array( 'vid' => $dl->vid, 'title' => $dl->title, 'time' => $dl->time, 'viewcount' => $dl->viewcount, 'thumbnail' => $dl->thumbnail, 'download' => $dl->download, 'target' => $dl->target, 'error' => false ); echo json_encode($ans); }else{ $addnew = true; } }else{ $addnew = true; } if ( $addnew){ $response = @file_get_contents($baseurl.$url); if( strlen($response) < 10 ){ $ans = Array( 'error' => true, 'message' => 'The URL request is invalid.' ); echo json_encode($ans); } else { $metadata = @file_get_contents('http://gdata.youtube.com/feeds/api/videos/'.$vid.'?alt=json'); $metadata = json_decode($metadata); $parts = parse_url($response); parse_str($parts['query']); $dl->vid = $vid; $dl->target = $response; $dl->title = $metadata->entry->title->{'$t'}; $dl->thumbnail = $metadata->entry->{'media$group'}->{'media$thumbnail'}[0]->{'url'}; $dl->time = $metadata->entry->{'media$group'}->{'media$thumbnail'}[0]->{'time'}; $dl->viewcount = intval($metadata->entry->{'yt$statistics'}->{'viewCount'}); $dl->expired = $expire; $dl->download = 0; $dl->save(); $ans = array( 'vid' => $vid, 'title' => $metadata->entry->title->{'$t'}, 'thumbnail' => $metadata->entry->{'media$group'}->{'media$thumbnail'}[0]->{'url'}, 'time' => $metadata->entry->{'media$group'}->{'media$thumbnail'}[0]->{'time'}, 'viewcount' => intval($metadata->entry->{'yt$statistics'}->{'viewCount'}), 'download' => 0, 'error' => false ); echo json_encode($ans); } } } else { redirect('/','refresh',301); } } function to($vid='') { $dl = new Downloader(); $dl->get_where(array('vid'=> $vid)); $target = ''; if( $dl->count() > 0) { //echo $dl->title; $dl->download += 1; $target = $dl->target; $dl->save(); header('Location: '.$target); } else { redirect('/','refresh',301); } } }
model/downloader.php
<?php class Downloader extends DataMapper { var $created_field = 'created_on'; var $updated_field = 'updated_on'; var $validation = array( array( 'field' => 'vid', 'label' => 'Video id', 'rules' => array('required','unique') ), array( 'field' => 'expired', 'label' => 'Expired', 'rules' => array('required') ) ); function Downloader(){ parent::DataMapper(); } } ?>
view/main_view.php
<html> <head> <title>Wget.in: Free URL Shortener | Youtube Downloader</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="google-site-verification" content="yQzZ8gkepo0McY5YuHAbfSnBReAAsgGzmBSxrvfQYmM" /> <script type="text/javascript" src="public/jquery.js"></script> <style type="text/css"> body { background-color: #fff; margin: 40px; font-family: Lucida Grande, Verdana, Sans-serif; font-size: 14px; color: #4F5155; } a { color: #003399; background-color: transparent; font-weight: normal; } h1 { color: #444; background-color: transparent; border-bottom: 1px solid #D0D0D0; font-size: 16px; font-weight: bold; margin: 24px 0 2px 0; padding: 5px 0 6px 0; } code { font-family: Monaco, Verdana, Sans-serif; font-size: 12px; background-color: #f9f9f9; border: 1px solid #D0D0D0; color: #002166; display: block; margin: 14px 0 14px 0; padding: 12px 10px 12px 10px; } input { font-family: Monaco, Verdana, Sans-serif; font-size: 25px; border: 1px solid #D0D0D0; color: #002166; padding: 12px 10px 12px 10px; } img { background-color: #FFFFFF; background-image: url(public/loader.gif); background-repeat: no-repeat; background-position: center center; } </style> <script> $(function() { $('input#download').click(function() { $('#videobox').html('<p><img src="public/loader.gif" /></p>') $.post('video/add/',{ videourl: $('#videourl').val() }, function(data){ if( data.error == true ) $('#videobox').html('<p style="color:red;font-size:30;">"'+data.message+'"</p>'); else $('#videobox').html('<a style="font-size:30" href="video/to/'+data.vid+'">'+data.title+'</a><p>ดาวน์โหลด : '+data.download+' ครั้ง , มีคนชมแล้ว : '+data.viewcount+' ครั้ง'); },'json'); return false; }); }); </script> </head> <body> <a href="/" style="text-decoration:none; color:black"><h2>Wget.in : 100% No Ads.</h2></a> <h1>YouTube Downloader Prototype</h1> <cod e> <center> <form method="POST" > <input type="text" id="videourl" name="videourl" value="http://youtube.com/watch?v=" style="width:700px" /> <input type="submit" id="download" value="Download" /><br /> <!--<input type="radio" name="format" value="mobile" />Mobile <input type="radio" name="format" checked="true" value="normal" />Normal <input type="radio" name="format" value="hidef" />High Definition--> <p><div id="videobox"></div></p> </form> </center> </cod e> <cod e>For the further infomation, please contact me <a href="http://www.twitter.com/klainfo">klainfo</a></cod e> <center> <p style="font-size:10px;">Update 01-Feb-2010. Powered by <a href="http://www.klainfo.com">klainfo</a>. Page rendered in {elapsed_time} seconds</p> <script type="text/javascript" language="javascript1.1" src="http://tracker.stats.in.th/tracker.php?uid=17952"></script><noscript><a target="_blank" href="http://www.stats.in.th/">www.Stats.in.th</a></noscript> <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"> try { var pageTracker = _gat._getTracker("UA-7256751-8"); pageTracker._trackPageview(); } catch(err) {}</script> </center> </body> </html>
<script type="text/javascript"> var auto_refresh = setInterval(function () { $('#load_tweets').load('url/add').fadeIn("slow"); }, 10000); // refresh every 10000 milliseconds </script>