【Mac】Platypus で遊ぶ – ProgressBar
Platypus で imageDL というアプリを作っている。
imageDL は、画像ブログの画像のリンク先を抽出し、リンク先の画像をダウンロードし、最終的に zip にまとめて保存する。
いかにもスクリプト覚えたての猿が書きそうな代物で恐縮だが、このようなアプリにふさわしいインターフェイスは、プログレスバーではないかと思う。
ブログレスバー
Platypus の「Profiles」メニュー、「Load Example」から、その名も「ProgressBar」というサンプルをロードできる。
スクリプト は以下のようになっている。
#!/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% ずつしか動かせなかったが、なかなか満足なものが出来た。