【Mac】Platypus で遊ぶ – ProgressBar

2019年2月21日

Platypus で imageDL というアプリを作っている。
 imageDL は、画像ブログの画像のリンク先を抽出し、リンク先の画像をダウンロードし、最終的に zip にまとめて保存する。
 いかにもスクリプト覚えたての猿が書きそうな代物で恐縮だが、このようなアプリにふさわしいインターフェイスは、プログレスバーではないかと思う。

ブログレスバー

 Platypus の「Profiles」メニュー、「Load Example」から、その名も「ProgressBar」というサンプルをロードできる。
 スクリプト は以下のようになっている。

📝 ProgressBar.sh
#!/bin/sh

/usr/bin/say "This example shows you can control the progress bar."
echo "PROGRESS:0"
echo "Doing something"
sleep 1
echo "PROGRESS:10"
sleep 1
echo "PROGRESS:20"
sleep 1
echo "Showing Details"
echo "DETAILS:SHOW"
sleep 1
echo "PROGRESS:30"
sleep 1
echo "Hiding Details"
sleep 1
echo "DETAILS:HIDE"
sleep 1
echo "Doing something else"
echo "PROGRESS:40"
sleep 1
echo "PROGRESS:50"
sleep 1
echo "PROGRESS:60"
sleep 1
echo "And now for something completely different"
echo "PROGRESS:70"
sleep 1
echo "Quitting application in 2 seconds"
sleep 2
echo "QUITAPP"
echo "PROGRESS:80"
sleep 1
echo "PROGRESS:90"
sleep 1
echo "PROGRESS:100"
echo "Done"

要するに、 PROGRESS:数字(改行) と出力すれば、数字の位置までバーが動くということらしい。上の Profile をアプリに書き出して実行すると、 DETAILS:SHOW でディテールの小窓が表示され、 DETAILS:HIDE で小窓が隠れるのを確認できる。
 また、 QUITAPP と出力された時点でアプリは終了する。つまり、その後の PROGRESS:80、90、100 というのは実行されない。
 PROGRESS や QUITAPP は、ダブルクオートで囲む。

簡単そうだ。

imageDLprogress

「Interface」に「Progress Bar」を選択する。
「Accept dropped items」のセッティングは「Accept dropped text」にのみチェックを入れた。
 実行ファイルとして dl.sh というのをバンドルする。
 最初に実行されるスクリプトは、この dl.sh へ処理を渡すだけのものだ。

#!/bin/sh

URL=`cat -`
if ! test -z "$URL"; then
	if echo "$URL" | grep -sq "^http"; then
		sh dl.sh "$URL"
	else
		exit 0
	fi
else
	exit 0
fi

dl.sh は、記事のタイトルの抜き出す部分と、画像リンクの抽出部分を grep -o で書き直した。

📝 dl.sh
#!/bin/sh

saveLoc=~/Desktop

if ! test -e ./dlTmp; then
	mkdir ./dlTmp
else
    rm -rf ./dlTmp
    mkdir ./dlTmp
fi
cd ./dlTmp

url="${1}"
/usr/local/bin/wget --quiet "${url}"
/usr/local/bin/nkf -w * >utf.txt

# 記事タイトルの取得
blogtitle=`cat utf.txt | tr -d '\n' | grep -o "<title>[^<]*</title>" | sed -e 's/<[^>]*>//g' -e 's/^ *//'`

echo $blogtitle

# リンクの取得
grep -o "<a href=\"[^<]*\"" utf.txt | tr '"' '\n' | tr '=' '\n' | grep -E 'jpg$|jpeg$|png$|gif$' > list.txt

# リストの行数を数える。
maisu=`wc -l list.txt | sed -e 's/list.txt//' -e 's/ //g'`
i=0
echo "PROGRESS:0"

for file in `cat list.txt`
do
	/usr/local/bin/wget --quiet $file
	i=`echo "$((i + 1))"`
	echo 'ダウンロード数:'"$i"
	per=`echo "scale=1; $i/$maisu*100" | bc`
	echo "PROGRESS:$per"
done

zip -0 -q "${blogtitle}".zip *.jpg *.gif *.png *.jpeg
if test $?;then
	cp "${blogtitle}".zip "$saveLoc"/
	cd ../
fi

百分率を PROGRESS で出力すればブログレスバーが動くはずだ。
 画像の URL は list.txt に書き出される。
  wc -l link.txt でダウンロードする予定の数を求める。
 百分率は、

百分率 = 現在のダウンロード数 ÷ ダウンロード予定の数 × 100

で出てくるはずだ。が、ふつうに計算したのでは、小数点以下を切り捨てた数字が返される。
 i をダウンロードが完了した数。
 maisu がダウンロードする予定の枚数とすると、以下のようになるはずだが、結果は 0 になってしまう。

echo $((i / maisu * 100))⏎
0

小数点を出すには

echo "scale=1; $i / $maisu * 100" | bc

こういう書き方をするらしい。
 こちらの、シェルbash で小数の計算するコマンド – それマグで!さまの記事を参考にさせていただきました。

[Create App] でアプリにしてみる。

10% ずつしか動かせなかったが、なかなか満足なものが出来た。