Youtube Downloader

หลักการทำงาน : ไฟล์ 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>

Future Works

Tips

jQuery flush message

<script type="text/javascript">
var auto_refresh = setInterval(function () {
    $('#load_tweets').load('url/add').fadeIn("slow");
}, 10000); // refresh every 10000 milliseconds
</script>

Yahoo API

  1. http://gdata.youtube.com/feeds/api/videos/videoid

Feature

  • Inspiration : delicious
  • Menu
    • Fresh Download
    • Popular Download (day, month, year)
    • Explore Tags
  • Search tags
  • Stats
  • Yahoo Metadata :
    • title
    • thumbnail
    • time
    • catagory
    • created
    • views
    • tagging
    • user
 
youtubedownloader.txt · Last modified: 2010/02/03 17:49 by klainfo · [Old revisions]
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki