Doge log

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

Twistedで作るローカルYoutubeサーバ その4

sshというかmanhole。
Youtubeのファイルを定期的にローカルに落としてくるのはいいけどどうやってダウンロードするファイルを設定するの?
ということでmanholeを使います。
キモス!
Twistedにはmanholeというおもろい機能がついています。
こいつは動作しているサーバ内のobjectにアクセスできたりする代物でsshでログインするとpython shellが立ち上がります。

shell.py
from twisted.cred import portal, checkers
from twisted.conch import manhole, manhole_ssh

def getManholeFactory(namespace, **passwords):
    realm = manhole_ssh.TerminalRealm()
    def getManhole(_): 
        return manhole.Manhole(namespace)
    realm.chainedProtocolFactory.protocolFactory = getManhole
    p = portal.Portal(realm)
    p.registerChecker(checkers.InMemoryUsernamePasswordDatabaseDontUse(**passwords))
    f = manhole_ssh.ConchFactory(p)
    return f

manholeを返す関数を作ってtacで設定する。

server.tac(抜粋)
strports.service("2222", shell.getManholeFactory(globals(), admin='admin')).setServiceParent(application)

これだけ。すげー簡単。
Checkerは簡単にInMemoryなものを使います。
namespaceはpython shellが立ち上がった時のglobalの部分にあたります。
(copyできるものじゃないとだめ)
ユーザ名とパスワードはFactoryの第2引数でセット。
この例だとユーザ名:admin、パスワード:admin。
こいつにアクセスすると

$ssh -p 2222 localhost -l admin
admin@localhost's password: 

と聞かれるのでパスワードを入力するとpython shellが立ち上がります。

>>>
>>> setting
<module 'setting' from '/Users/matsu/Documents/pywork/youtube/setting.pyc'>
>>> dir(setting)
['__builtins__', '__doc__', '__file__', '__name__', 'repo', 'video']
>>> setting.repo
'/tmp'
>>> 

このようにsetting部にもアクセスできます。
downloader対象はvideoをキューとして動くのでここから追加してやります。

>>> setting.video.append('http://jp.youtube.com/watch?v=WOxd_qO8Qd0')

これで一定時間後downloderが拾ってダウンロードし、VideoItemを作成してWebの画面上にリンクができるようになります。
つーか普通にWebから入力させろ!って話なんだけどね。
次回は全ソース貼ります。
うくく。