From cdc93e9effc091506af6188dddd3f1a18037aebc Mon Sep 17 00:00:00 2001 From: Michael Pfaff Date: Fri, 24 Apr 2020 13:16:45 -0400 Subject: [PATCH] Add script --- fiddledl.sh | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100755 fiddledl.sh diff --git a/fiddledl.sh b/fiddledl.sh new file mode 100755 index 0000000..8b321ee --- /dev/null +++ b/fiddledl.sh @@ -0,0 +1,187 @@ +############################################################################### +# Copyright 2020 Michael Pfaff. See LICENSE.md for license. +############################################################################### + +#!/usr/bin/env bash + +set -eE + +_context='script init' + +function trap_error { + echo "Error occurred during $_context on line $1" 1>&2 +} + +trap 'trap_error $LINENO' ERR + +############################################################################### +# BEGIN CODE BY Teddy Skarin +# https://github.com/fearside/ProgressBar/blob/master/progressbar.sh +############################################################################### + +# 1. Create ProgressBar function +# 1.1 Input is currentState($1) and totalState($2) +function ProgressBar { +# Process data + let _progress=(${1}*100/${2}*100)/100 + let _done=(${_progress}*4)/10 + let _left=40-$_done +# Build progressbar string lengths + _done=$(printf "%${_done}s") + _left=$(printf "%${_left}s") + +# 1.2 Build progressbar strings and print the ProgressBar line +# 1.2.1 Output example: +# 1.2.1.1 Progress : [########################################] 100% +printf "\rProgress : [${_done// /#}${_left// /-}] ${_progress}%%" + +} + +#"} fixes stupid vim highlighting +############################################################################### +# END CODE BY Teddy Skarin +############################################################################### + +true=1 +false=0 + +_name="" +_fiddleId="" +_firstRevision="" +_lastRevision="" + +fail=$false + +while getopts ":hn:i:l:f:" opt; do + case ${opt} in + h ) + echo "Usage:" + echo " fiddledl -h" + echo " fiddledl -n NAME -i FIDDLE_ID -l LAST_REVISION [-f FIRST_REVISION]" + echo "" + echo "Options:" + echo " -h" + echo " Show this help message." + echo " -n NAME" + echo " A friendly name to append to the result directory to assist in finding later." + echo " -i FIDDLE_ID" + echo " The id of the fiddle you want to download." + echo " -l LAST_REVISION" + echo " The last revision of the fiddle you would like to download." + echo " -f FIRST_REVISION" + echo " The first revision of the fiddle you would like to download." + exit 0 + ;; + n ) + _name=$OPTARG + echo "Name: $_name" + ;; + i ) + _fiddleId=$OPTARG + echo "FiddleId: $_fiddleId" + ;; + l ) + _lastRevision=$OPTARG + echo "Last revision: $_lastRevision" + ;; + f ) + _firstRevision=$OPTARG + echo "First revision: $_firstRevision" + ;; + \? ) + echo "Unrecognized option: $OPTARG" 1>&2 + exit 64 + ;; + : ) + echo "Missing argument: $OPTARG requires an argument" 1>&2 + exit 64 + ;; + esac +done +shift $((OPTIND -1)) + +if [[ ! -n $_name ]]; then + echo "Name not specified. Only fiddleId will be used for directory name." +fi + +if [[ ! -n $_fiddleId ]]; then + echo "fiddleId must be specified." + #fail=$true + exit 64 +fi + +if [[ ! -n $_lastRevision ]]; then + echo "Last revision was not specified. First revision will be ignored and only the last revision will be downloaded." + #fail=$true +fi + +if [[ ! -n $_firstRevision ]]; then + if [[ -n $_lastRevision ]]; then + echo "First revision not specified. Will be 1." + _firstRevision=1 + fi +fi + +read -p "Are you sure? [y/N] " -n 1 -r +echo # (optional) move to a new line +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 +fi + +if [[ ! -n $_name ]]; then + _dir="${_fiddleId}" +else + _dir="${_fiddleId}-${_name}" +fi + +mkdir "$_dir" + +if [[ -n $_lastRevision ]]; then + echo "Downloading..." + + # start jobs in background + for (( i=_firstRevision; i<=_lastRevision; i++)); do + curl "https://fiddle.jshell.net/${_fiddleId}/${i}/show/" -H "Referer: http://fiddle.jshell.net/${_fiddleId}/${i}/" --output "${_dir}/${i}.html" >> /dev/null 2>&1 & + done + + let _total=$((_lastRevision - _firstRevision)) + + # wait for jobs, counting as we go so we can track progress + while (( $(jobs | wc -l) > 0 )); do + _jobCount=$(jobs | wc -l) + let _doneCount=$(( _total - _jobCount)) + #let _progress=$(( _doneCount / _total * 100)) + #echo "$_progress% | $_doneCount/$_total ($_jobCount remaining)" + ProgressBar $_doneCount $_total + jobs > /dev/null + sleep 0.1 + done + echo "" + + echo "Patching..." + + # patch files + for (( i=_firstRevision; i<=_lastRevision; i++)); do + { sed -i .scriptendfunk -e 's;//]]>;;g' "${_dir}/${i}.html"; sed -i .unpatched -e 's "// "https:// g' "${_dir}/${i}.html"; sed -i .stockcss -e 's;;;g' "${_dir}/${i}.html"; } & + done + + # we run three different processes on each file, hence 3. + #let _total=$(( _total * 3 )) + + # wait for jobs, counting as we go so we can track progress + while (( $(jobs | wc -l) > 0 )); do + _jobCount=$(jobs | wc -l) + let _doneCount=$(( _total - _jobCount)) + #let _progress=$(( _doneCount / _total * 100)) + #echo "$_progress% | $_doneCount/$_total ($_jobCount remaining)" + ProgressBar $_doneCount $_total + jobs > /dev/null + sleep 0.1 + done + echo "" +else + curl "https://fiddle.jshell.net/${_fiddleId}/show/" -H "Referer: http://fiddle.jshell.net/${_fiddleId}/" --output "${_dir}/latest.html" + sed -i .scriptendfunk -e 's;//]]>;;g' "${_dir}/latest.html" + sed -i .unpatched -e 's "// "https:// g' "${_dir}/latest.html" + sed -i .stockcss -e 's;;;g' "${_dir}/latest.html" +fi