FlashAir(W-04)の画像をGoogle Photos(Picasa Web)のアルバムにアップロードするスクリプトを改善
前回、FlashAir(W-04)の画像をGoogle Photos(Picasa Web)のアルバムにアップロードするスクリプトを作りました。
で、テストして成功したと喜んでおりましたが、なんだか遅い。
特に、猫写真を撮る際は連写をするため、何枚もアップロードしなければなりませんが、遅すぎる。
原因は簡単。
FlashAirから画像リストを取得、ダウンロード済みかどうか確認し、1枚ダウンロード、PicasaWebにアクセスするためのトークンをゲット、ようやくアップロード、日付ディレクトリに移動、最初に戻る。
というのをいちいち繰り返していたため、遅いのです。
もちろんアップロード中にカメラの電源を消すことも出来ません。
で、FlashAirからの画像ダウンロードを全て行ってから、PicasaWebにアップロードするようにアルゴリズムを変更します。
アルゴリズムといっても、単にスクリプトの行を入れ替えただけ。
#!/bin/bash #初期変数一覧 #Flashairのアドレス FLASHAIR_IP="http://192.168.x.161" #DCIMフォルダの名称 DCIM_FOLDER="CANON" #現在のディレクトリに移動 cd `dirname $0` #プロセスIDを保存 echo $$ > pid_flashair.txt #DCIMフォルダのURLを生成 WGET_PRE_URL=${FLASHAIR_IP}"/DCIM/" while : do #Flashairを死活監視 ALIVE=$(/usr/bin/wget -nv --spider --timeout 60 -t 1 ${FLASHAIR_IP} 2>&1 | grep -c '200 OK') #もし死活監視で生きていたら if [ $ALIVE -eq 1 ]; then #配列を初期化 echo "Flashair - Format Arrys." DCIM_LIST=() JPG_LIST=() FLASHAIR_DONE=() #DCIM配下のディレクトリを配列に代入 echo "Flashair - get under DCIM directory list." DCIM_LIST=(`/usr/bin/wget ${WGET_PRE_URL} -q -O - | grep 'wlansd.push({"r_uri"' | sed -e 's/wlansd.push({"r_uri":"//' -e 's/", "fname":"/\//' -e 's/", "fsize".*//' | grep ${DCIM_FOLDER}`) #フォルダの数だけループ処理を実施 echo "Flashair - Starting loop under DCIM directory." DCIM_LOOP=${#DCIM_LIST[@]} DCIM_LOOP=$((DCIM_LOOP - 1)) while [ $DCIM_LOOP -ge 0 ]; do #フォルダの中のファイルを配列に代入 echo "Flashair - Get file list under "${DCIM_LIST[DCIM_LOOP]} JPG_LIST=(`/usr/bin/wget ${FLASHAIR_IP}${DCIM_LIST[${DCIM_LOOP}]} -q -O - | grep 'wlansd.push({"r_uri"' | sed -e 's/wlansd.push({"r_uri":"//' -e 's/", "fname":"/\//' -e 's/", "fsize".*//'`) #ファイルの数だけループ echo "Flashair - Starting loop under "${DCIM_LIST[DCIM_LOOP]} JPG_LOOP=${#JPG_LIST[@]} JPG_LOOP=$((JPG_LOOP - 1)) while [ $JPG_LOOP -ge 0 ]; do #アップ済みのファイルかどうかをチェック echo "Flashair - Check FLASHAIR_DONE "${JPG_LIST[JPG_LOOP]} if ! `cat flashair_done.txt | grep -q "${JPG_LIST[JPG_LOOP]}"` ; then #アップ済みになかった場合の処理 #wgetによるファイルの取得 echo "Flashair - Get file "${JPG_LIST[JPG_LOOP]} /usr/bin/wget -q -N --no-host-directories --no-directories ${FLASHAIR_IP}${JPG_LIST[JPG_LOOP]} #flashair_done.txtにファイル名を追加 echo "Flashair - Output to flashair_done.txt "${JPG_LIST[JPG_LOOP]} echo ${JPG_LIST[JPG_LOOP]} >> flashair_done.txt fi JPG_LOOP=$((JPG_LOOP - 1)) done DCIM_LOOP=$((DCIM_LOOP - 1)) #ダウンロードした全てのJPGを2048pxにリサイズ echo "Flashair - Resize Images" /usr/bin/mogrify -resize 2048x2048 -quality 100 *.JPG #ディレクトリ上にあるJPGファイルをpicasaweb APIでアップロード echo "Flashair - Uploading Images" ./upload_images_in_dir.sh #ディレクトリ上にあるJPGファイルを日付ディレクトリで整理 echo "Flashair - Move Images to YMD directory " /usr/bin/exiftool -q '-Directory < CreateDate' -d %Y%m%d *.JPG done fi sleep 10 done
そう、リサイズ、アップロード、ディレクトリ整理を一つだけループの外に置いただけ。
これだけでだいぶ早くなりましたし、アップロードが始まったのを見て、カメラの電源も切ることが出来るようになりました。