PQI Air Cardのowncloud同期スクリプト書いてみた

何度目になるかわかりませんが、PQI Air Cardネタです。

以前からPQI Air Cardで自動同期する方法を模索しており、前回まででPythonとcURLをクロスコンパイルして導入しました。

なお、用途としてはデジカメの撮影画像やPS4のスクリーンショットなどを自動的にowncloudに同期したい、という感じです。

せっかくPythonとCurlを導入したので、今回は自動同期のスクリプトをPythonで書いてみることにしました。

流れ

  1. ネットワークに接続されるまで待機
  2. curlでowncloud側のファイル一覧を取得
  3. 対象のファイルがowncloudに存在しなければ送信

2と3はcurlコマンドで実現可能ですので、subprocessからcurlを呼ぶことで全て任せました。

send_picture.py

#!/usr/bin/env python2.7
# -*- coding:utf-8 -*-

import os, subprocess, json, time, urllib

path = os.path.abspath(os.path.dirname(__file__))

if subprocess.check_output("ps").count("python") > 1:
print "Another sync process is running."
exit(0)

while "192.168" not in subprocess.check_output("ifconfig"):
time.sleep(3)

with open(path + "/config.json", "r") as f:
configs = json.loads(f.read())
for index, config in enumerate(configs):
for key, value in config.items():
configs[index][key] = value.encode("utf-8")

with open(path + "/suffixes.json", "r") as f:
suffixes = json.loads(f.read())

def list_owncloud_pics(config):
precmd = "curl -k -X PROPFIND -u {username}:{password} \"{url}\""
cmd = precmd.format(**config)
print cmd
raw = subprocess.check_output(cmd, shell=True)

def is_file_name(elem):
for suffix in suffixes:
if elem.endswith(suffix):
return True
files = list(filter(is_file_name, raw.replace("<", "/").split("/")))
return list(map(lambda f: urllib.unquote(f), files))

def push_file(config, picture):
precmd = "curl -k -X PUT -u {username}:{password} \"{url}/{picture}\" --data-binary @\"{destination}/{picture}\""
cmd = precmd.format(picture=picture, **config)
print cmd
subprocess.call(cmd, shell=True)

def backup(config):
uploaded = list_owncloud_pics(config)
dirpath = config["destination"]
files = os.listdir(dirpath)
for picture in files:
if True not in map(lambda suffix: picture.endswith(suffix.encode("utf-8")), suffixes):
continue
if picture in uploaded:
continue
push_file(config, picture)

while True:
for config in configs:
backup(config)
print "sleeping..."
time.sleep(10)

config.json

[{
"url": "https://yourowncloud.com",
"username": "username",
"password": "password",
"destination": "/path/to/your/picture_dir"
}]

suffixes.json

[".JPG", ".jpg", ".PNG", ".png", ".jpeg"]

なぐり書きしたプログラムなので非常にお粗末で申し訳ないですが、一応私の環境では動作しているのでお許しください。。

注意点として、まずPQI Air Cardではこれを走らせる事しか考えていないので、複数起動防止としてpsでPythonプロセスが走っているかチェックを行っています。

また、ifconfigで192.168..の文字列が出力されるかでネットワーク疎通のチェックを行っているので、環境によっては普通に動きません・・・

エラー処理も全く書いていないので、失敗するとプログラムが止まります。

当方ではautorun.shとcronで毎分起動することでなんとか運用していますが、暇があればもう少し改良したいですねぇ〜

試してみた

Linuxのowncloudをインストールした環境で、自動同期を試してみました。

PS4のスクリーンショットのディレクトリをconfig.jsonに登録してしばらく待ってみると、ちゃんとPQI Air Card内の画像が手元のPCにダウンロードされているのが確認できました。

screenshot-from-2016-10-17-18-42-26

これで、ようやく家でも出先でも快適なSDカードライフが送れそうです…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です