GoodReaderにファイルをアップロードするスクリプト

iphone/ipadのGoodReaderはWifi経由でファイルをアップロードできるサーバー機能がついているが、ブラウザを毎回開くのが面倒。

goodreaderに繋いだ先のページのソースを見ると

<form style="font-size:9pt" name="upload" action="_______HTMLFORMFILEUPLOADVIAHTTP_______" method="POST" enctype="multipart/form-data">
Select file to upload:&nbsp;
<input type="file" name="filename" size="40" onChange="this.form.submit.style.visibility='visible'"><br>
<input type="submit" name="submit" value="Upload selected file" style="visibility: hidden">
</form>

みたいのがあるので、この3,4行目についてcurlの-Fオプション(form)で指定してやることになる。@をつけるとファイルの内容で置換される。
アップロード先のディレクトリはどうやらリファラで判別しているらしい。

以上をシェルスクリプトにしてみた。

sendGoodReader

#!/bin/sh
usage(){
    echo "usage: $0 ipad_ip_addr file1 [file2...]"
}

DIRNAME=

if [ $# -lt 2 ]; then
    usage
    exit 1
fi
host="$1"
shift
for f in "$@"; do
    curl --referer "http://$host:8080/My%20Documents/$DIRNAME" -F submit="Upload selected file" -F "filename=@$f" "$host:8080/_______HTMLFORMFILEUPLOADVIAHTTP_______"
done

使い方:

wifiサーバを立ち上げると http:://10.0.1.123:8080 みたいなアドレスが表示されるので、
$ ./sendGoodReader 10.0.1.123 foo.pdf
みたいにすると転送出来る。
このままだとMy Documents直下にアップロードされる。6行目をDIRNAME=Uploadとかに変えてあらかじめiphone(ipad)側にUploadという名のディレクトリをMy Documents直下に作っておくとそこにアップロードされる。

とりあえずmac (Mavericks)から使う限りではファイル名が日本語だったり空白を含んでいても*1大丈夫だった。
Web上のpdfをSafariからプレビューで開いてやると、タイトルバーのアイコンをターミナルにドラッグ&ドロップでフルパスがペーストされるので、それと組み合わせることで気軽にGoodReaderに送れるようになった。

11/11 編集: 複数のファイルを指定出来るよう変更

12/31 追記:

arpコマンドを使うとbonjourホスト名?からipアドレスを引けるようなので、それを使ってホストを探すバージョンを作った。
sendGoodReader

#!/bin/sh
usage(){
    echo "usage: $0 file1 [file2...]"
}

DIRNAME=Upload
HOSTNAME=Nos-no-iPad.local

if [ $# -lt 1 ]; then
    usage
    exit 1
fi

host=$(arp $HOSTNAME | head -n 1 | sed 's/.*(\(.*\)).*/\1/')
for f in "$@"; do
    curl --referer "http://$host:8080/My%20Documents/$DIRNAME" -F submit="Upload selected file" -F "filename=@$f" "$host:8080/_______HTMLFORMFILEUPLOADVIAHTTP_______"
done

上のDIRNAMEとHOSTNAMEを適当に書き換えてやる*2と、
$ sendGoodreader foo.pdf bar.pdf
として使えるはず。

参考:
http://takuya-1st.hatenablog.jp/entry/20121121/1353495415
http://curl.haxx.se/docs/httpscripting.html

*1:もちろん""で囲うとかすること

*2:HOSTNAMEはgoodreaderでwifi立ち上げた画面に書いてあるはず