FlashAir(W-04)の画像をGoogle Photos(Picasa Web)のアルバムにアップロードするスクリプトを改善

前回、FlashAir(W-04)の画像をGoogle Photos(Picasa Web)のアルバムにアップロードするスクリプトを作りました。

gentoolinux.hatenablog.com

で、テストして成功したと喜んでおりましたが、なんだか遅い。
特に、猫写真を撮る際は連写をするため、何枚もアップロードしなければなりませんが、遅すぎる。

原因は簡単。
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

そう、リサイズ、アップロード、ディレクトリ整理を一つだけループの外に置いただけ。
これだけでだいぶ早くなりましたし、アップロードが始まったのを見て、カメラの電源も切ることが出来るようになりました。