diff --git a/chertex.sh b/chertex.sh index 02072a8..978751d 100755 --- a/chertex.sh +++ b/chertex.sh @@ -84,8 +84,8 @@ if [ $# -eq 1 ]; then fi #### Special treatment for thesis - # If $jobname is thesis, fetch some external assets if [[ ${PWD} == "/media/bay/taha/chepec/thesis" && $jobname == "thesis" ]]; then + # Fetch external assets by reading any assets.external files in assets/ tree echo " -------------------------------" echo " Getting external assets" echo " -------------------------------" @@ -108,9 +108,58 @@ if [ $# -eq 1 ]; then done < "$assets" fi done + + # Create low-res photos on-the-fly from existing photos/ + echo " -------------------------------" + echo " Create low-res photos tree" + echo " -------------------------------" + # copy existing photos to assets/photos/.lowres/ path + # to save time, rsync only if highres photo has more recent timestamp (otherwise, keep lowres photo without overwriting) + # Note: rsync usually looks at file timestamp and size, and if either has changed, copies the file (simplified explanation) + # in this case, I'd like rsync to only compare timestamps and disregard size + # rsync can't do that. We need to use a different tool. See e.g. + # https://superuser.com/questions/260092/rsync-switch-to-only-compare-timestamps + # copy only the "large" photos that have file modtimes more recent than the last time this operation was run + photoslastrun="/media/bay/taha/chepec/thesis/assets/photos/.lowres/lastrun" + if [ ! -f "$photoslastrun" ]; then + # if, for some reason, the lastrun file does not exist + # copy over everything and then create the file + rsync -av /media/bay/taha/chepec/thesis/assets/photos/* /media/bay/taha/chepec/thesis/assets/photos/.lowres/ --exclude /media/bay/taha/chepec/thesis/assets/photos/.lowres/ + touch "$photoslastrun" + fi + # cd and use --parents arg to preserve directory structure in .lowres target + cd /media/bay/taha/chepec/thesis/assets/photos + newphotos="$(find . -type f -cnewer $photoslastrun ! -path './.lowres/*')" + if [ -n "$newphotos" ]; then + for newphoto in $newphotos; do + cp --parents $newphoto .lowres/ + done + # cd - also creates output (the current wd). Redirect to null suppresses the output. + cd - >/dev/null + fi + # in the low-res tree, find any photo larger than specific size (500kB) + largephotos="$(find /media/bay/taha/chepec/thesis/assets/photos/.lowres/ -size +500k)" + for largephotofilename in $largephotos; do + # for the next statement to work reliably, we should probably convert other formats to JPEG + # detect file extension, and based on it, convert to jpg using mogrify + largephotobase=$(basename -- "$largephotofilename") # just the filename (with extension, sans parents) + largephototype=${largephotobase#*.} # file extension only + largephotoname=${largephotofilename%.*} # path without extension + largephotobasename=${largephotobase%.*} # basename without extension + if [ ! "$largephototype" == "jpg" ] && [ ! "$largephototype" == "jpeg" ] && [ ! "$largephototype" == "JPG" ] && [ ! "$largephototype" == "JPEG" ]; then + echo " Converting $largephotobase to JPG format" + mogrify -format jpg $largephotofilename + # remove the now unnecessary non-jpg file from .lowres/ + rm "$largephotofilename" + fi + # convert photo in-place (overwrite) with new one roughly 300kb in size + # https://stackoverflow.com/questions/6917219/imagemagick-scale-jpeg-image-with-a-maximum-file-size + echo " Shrinking $largephotobasename.jpg" + convert $largephotoname.jpg -define jpeg:extent=300kb $largephotoname.jpg + done fi # short delay to enable on-screen reading of previous echo - simpledelay.sh 1 + simpledelay.sh 2 ## Handle knitr or pgfSweave jobs (each requires separate treatment)