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をかっぱらってくるといける。
うくく。