Add script to download books from https://github.com/standardebooks/ and keep them up to date.

This commit is contained in:
Danny Bautista 2019-05-27 12:22:07 -04:00 committed by Alex Cabal
parent e967da9605
commit 235e1a1388
3 changed files with 131 additions and 0 deletions

7
scripts/README.md Normal file
View file

@ -0,0 +1,7 @@
# sync-ebooks
To use, call this script with the directory where your ebooks go as its last argument. For example `sync-ebooks /standardebooks.org/ebooks` or if you want to clone them into this repository `sync-ebooks ebooks`. If you want progress output, use -v, and if you want detailed git progress output use -vv.
# deploy-ebook-to-www
To use, call this script with the directories of the books you want to deploy as its arguments. For example, to deploy all ebooks after using sync-ebooks, run `deploy-ebook-to-www /standardebooks.org/ebooks/*`. To deploy only The Time Machine by H.G Wells, you would run `deploy-ebook-to-www /standardebooks.org/ebooks/h-g-wells_the-time-machine`. Note that deploy-ebook-to-www assumes that your webroot is in /standardebooks.org/. To output progress information, use -v or --verbose.

122
scripts/sync-ebooks Executable file
View file

@ -0,0 +1,122 @@
#!/bin/bash
set -e
set -u
set -o pipefail
usage(){
fmt <<EOF
DESCRIPTION
Syncs books from standardebooks.org GitHub org to specified folder.
USAGE
${0##*/} [-h] [-v|-vv] [-u] DIRECTORY
-h displays this message
-v displays general progress updates
-vv displays progress updates and verbose git output
DIRECTORY should be where the repositories should go.
EXAMPLE
${0##*/} /standardebooks.org/ebooks
EOF
exit
}
# Terminate on CTRL-C
trap ctrl_c INT
ctrl_c() {
printf "** Trapped CTRL-C\n"
exit
}
verbosity=0
update_only="false"
while getopts ":hvu" option; do
case "${option}" in
h) usage ;;
v) verbosity=$((verbosity + 1)) ;;
u) update_only="true" ;;
?) usage ;;
esac
done
shift "$((OPTIND -1))"
if [ -z "$*" ]; then
usage
fi
if ! [ -d "$*" ]; then
>&2 printf "%s does not exist.\n" "$*"
exit
fi
if ! cd "$*"; then
>&2 printf "Couldn't cd into %s.\n" "$*"
exit
fi
if [ "${verbosity}" -gt 0 ]; then
printf "** Updating local repositories. **\n"
fi
for item in ./*; do
[ -e "${item}" ] || break
if [ "${verbosity}" -gt 0 ]; then
printf "Updating %s\n" "${item}"
fi
if [ "${verbosity}" -gt 1 ]; then
git -C "${item}" fetch -v
else
git -C "${item}" fetch -q
fi
done
if [ "${update_only}" = "true" ]; then
exit
fi
if [ "${verbosity}" -gt 0 ]; then
printf "** Cloning remote repositories. **\n"
printf "Fetching repository urls"
fi
page=1
urls=""
pageurls="placeholder"
while [ -n "${pageurls}" ]; do
pageurls=$(curl -s "https://api.github.com/orgs/standardebooks/repos?per_page=100&page=${page}" \
| awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "clone_url") {print $4} }')
urls=$(printf "%s\n%s" "${urls}" "${pageurls}")
page=$((page + 1))
if [ "${verbosity}" -gt 0 ]; then
printf "."
fi
done
if [ "${verbosity}" -gt 0 ]; then
printf "\n"
fi
urls=$(printf "%s\n" "${urls}" | grep -v -e "/tools.git\$" -e "/web.git\$" -e "/manual.git\$" | awk 'NF')
printf "%s\n" "${urls}" | while IFS= read -r repourl; do
[ -n "${repourl}" ] || continue
[ -d "${repourl##*/}" ] && continue
if [ "${verbosity}" -gt 0 ]; then
printf "Cloning %s\n" "${repourl}"
fi
if [ "${verbosity}" -gt 1 ]; then
git clone -v --bare "${repourl}"
else
git clone -q --bare "${repourl}"
fi
if ! [ -d "${repourl##*/}" ]; then
>&2 printf "%s wasn't cloned." "${repourl}"
fi
done