Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

TwistedでYouTubeのビデオをダウンロードする

おわ。なんか簡単だった。

from twisted.web import client
from twisted.web import error
from twisted.internet import reactor
import re

const_video_url_params_re = re.compile(r'player2\.swf\?([^"]+)"', re.M)
const_video_url_real_str = 'http://www.youtube.com/get_video?%s'

def _finish(data):
    print 'finish'
    reactor.stop()

def _err(error):
    print error
    if reactor.running:
        reactor.stop()

def downloadFlv(url, file):
    
    def _parseFlvUrl(data):
        match = const_video_url_params_re.search(data)
        param = match.group(0)
        url =  const_video_url_real_str %  param
        return url
    
    def _downloadPage(url):
        client.downloadPage(url, file).addCallback(_finish).addErrback(_err)

    client.getPage(url).addCallback(_parseFlvUrl).addCallback(_downloadPage).addErrback(_err)

if __name__ == '__main__':
    downloadFlv('http://jp.youtube.com/watch?v=wAJyU2zf7b4', '/tmp/test.flv')
    reactor.run()

redirectされたurlじゃないとだめかと思ったけどそのままいけるようだ。
ちなみにtwistedでredirectされたurlを取り出すにはfolowRedirect=FalseにしてErrbackでPageRedirectErrorを参照してlocaltionをかっぱらってくるといける。

うくく。