2012年1月5日

Eye-Fi でアップロード先に FTPS サーバを指定できる

たそがれねこ
普段 Eye-Fi からは ASUS Eee Pad Transformer TF101 へ画像を送っていて、画像を溜め込んでいる。
端末自体が 32GB あることもあってすぐにはパンクしないものの、ずっと Android に突っ込みっぱなしも微妙なので取りあえずどっかに退避させたかった。

まあ Picasa とかでもいいんだけど、Eye-Fi からアップロードすると 2048px には縮小できないし、どうやら FTP / FTPS サーバへのアップロードにも対応しているようなので Python で FTPS サーバを作ってみた。

pyftpdlib を使ってます。
#!/usr/bin/python
# -*- utf8 -*-

PORT       = 990
USERNAME   = 'yourname'
PASSWORD   = 'password'
BASE_PATH  = '/path/to/ftp/root'
SSL_KEY    = '/path/to/keyfile.key'
SSL_CERT   = '/path/to/certfile.crt'
PASV_PORTS = range(65500, 65535)

import os, datetime, shutil
from subprocess import Popen, PIPE
from pyftpdlib import ftpserver
from pyftpdlib.contrib.handlers import TLS_FTPHandler

class MyTLS_FTPHandler(TLS_FTPHandler):
  def on_file_received(self, file):
    date = None
    p = Popen(["dcraw", "-i", "-v", file], stdout=PIPE)
    for line in p.stdout:
      if line[:10] == "Timestamp:":
        date = datetime.datetime.strptime(line[11:].rstrip(), "%a %b %d %H:%M:%S %Y")
    if date:
      dest_path = BASE_PATH + "/" + date.strftime("%Y-%m-%d")
      if not os.path.exists(dest_path):
        os.makedirs(dest_path)
      filename = os.path.basename(file)
      if filename[len(filename)-9:] == ".JPG.jpeg":
        filename = filename[0:len(filename)-5]
      shutil.move(file, dest_path + "/" + filename)

def main():
  authorizer = ftpserver.DummyAuthorizer()
  authorizer.add_user(USERNAME, PASSWORD, BASE_PATH, perm='elradfmw')
  ftp_handler = MyTLS_FTPHandler
  ftp_handler.keyfile = SSL_KEY
  ftp_handler.certfile = SSL_CERT
  ftp_handler.passive_ports = PASV_PORTS
  ftp_handler.authorizer = authorizer
  ftpd = ftpserver.FTPServer(('', PORT), ftp_handler)
  ftpd.serve_forever()

if __name__ == '__main__':
  main()
普通にファイルをアップロードしたいだけであれば MyTLS_FTPHandler のところ全部必要なくてほとんどサンプルのままでいい感じになるはず。PASV_PORTS に指定した範囲のポートで PASV モードが動くので最低限ここのポートの範囲と PORT に指定したポートだけ空いていれば上手く動く。

自分が使うにあたって「撮影日でフォルダ分けしたい」というのがあったので、dcraw を使ってタイムスタンプを取得した上で JPEG ファイルと RAW ファイル(自分の場合は ARW 形式)を日付フォルダ内に突っ込むようにしてある。

で、作ってみたものの Eye-Fi の Android アプリからアップロードさせると何故かすげー遅い
だから結局 Eye-Fi からはアップロードさせずに AndFTP からアップロードさせるようにして使ってる。
AndFTP からアップロードした場合は全然遅くないので Eye-Fi のアプリがなんか変だと思う。

今は普通に FTPS サーバで受け取ってるだけだけど、ここから好きなサイズに縮小して Picasa に投げたりも当然できるのでちょっと変なことでも簡単にできそうでいい感じ。
Clip to Evernote