diff --git a/xkcdlock b/xkcdlock index ed9859b..c3fe659 100755 --- a/xkcdlock +++ b/xkcdlock @@ -28,7 +28,7 @@ [[ "$TRACE" ]] && set -x set -eo pipefail -readonly SCRIPT_NAME=$(basename $0) +readonly SCRIPT_NAME=$(basename "$0") # screensaver executable LOCK_BIN="swaylock" @@ -58,7 +58,6 @@ FONT_PATH="${HOME}/.local/share/fonts/${FONT_FILE}" URL_FONT="https://github.com/ipython/xkcd-font/raw/master/xkcd-script/font/xkcd-script.ttf" declare -a DEPS=("xrandr" "awk" "curl" "convert" "fold" "recode" "sed") -declare -a DEPS_LOCKER=("i3lock" "swaylock") DOWNLOAD_DISCLAIMER="\nThe downloaded images will end up in your current working directory.\n\ Since we are using restricted bash, we can not change path.\n\ @@ -69,21 +68,21 @@ log() { echo "$@" >&2 fi - logger -p user.notice -t $SCRIPT_NAME "$@" + logger -p user.notice -t "$SCRIPT_NAME" "$@" } error() { echo "$@" >&2 - logger -p user.error -t $SCRIPT_NAME "$@" + logger -p user.error -t "$SCRIPT_NAME" "$@" } # does not work with restricted bash (bash -r/rbash) get_script_path() { - echo $(dirname $(readlink -f $0)) + dirname "$(readlink -f "$0")" } show_help() { - printf "\n xkcdlock ${VERSION}\n\n\ + printf "\n xkcdlock %s\n\n\ Available options are:\n\n \ -d Download images to current working directory\n \ -h Show this help\n \ @@ -91,11 +90,11 @@ show_help() { -l Lock program: one of i3lock/swaylock\n \ -m Mode: latest | random default: random\n \ -v Be verbose\n \ - -V Show version\n\n" + -V Show version\n\n" ${VERSION} } show_version() { - printf "\n xkcdlock ${VERSION}\n\n" + printf "\n xkcdlock %s\n\n" ${VERSION} } @@ -118,22 +117,24 @@ check_dependencies() { xkcd_get_latest_image() { log "Looking for latest image" - local img_url=$(curl -s https://xkcd.com/index.html | \ - awk '/Image URL \(for hotlinking\/embedding\): / {print $5}' | \ - awk 'BEGIN{FS="<";} {print $1}') + local img_url + img_url=$(curl -s https://xkcd.com/index.html | \ + awk '/Image URL \(for hotlinking\/embedding\): / {print $5}' | \ + awk 'BEGIN{FS="<";} {print $1}') if [[ -z $img_url ]]; then error "Can not download latest image, using fallback image" local img_fn="${IMG_DEFAULT}" else log "Downloading: $img_url" - curl -sO --max-time 6 "$img_url" - if [[ 0="$?" ]]; then - local img_fn=$(echo "$img_url" | awk 'BEGIN{FS="/";} {print $5}') + if curl -sO --max-time 6 "$img_url"; then + local img_fn + img_fn=$(echo "$img_url" | awk 'BEGIN{FS="/";} {print $5}') else error "Can not download latest image, using fallback image" - local img_fn="${IMG_DEFAULT}" + local img_fn + img_fn="${IMG_DEFAULT}" fi fi @@ -141,7 +142,8 @@ xkcd_get_latest_image() { } xkcd_get_img_name() { - local fn=$(echo "$img_url_hotlink" | awk 'BEGIN{FS="/";} {print $5}') + local fn + fn=$(echo "$img_url_hotlink" | awk 'BEGIN{FS="/";} {print $5}') IFS='.' read -r -a array <<< "${fn}" fn="${array[0]}"_"${i}"."${array[-1]}" echo "$fn" @@ -164,9 +166,10 @@ xkcd_get_img_nr() { xkcd_get_all_images() { VERBOSE="1" log "Looking for latest image" - local nimg_latest=$(curl -s https://xkcd.com/index.html | \ - awk '/Permanent link to this comic: / {print $6}' | \ - awk 'BEGIN{FS="/";} {print $4}') + local nimg_latest + nimg_latest=$(curl -s https://xkcd.com/index.html | \ + awk '/Permanent link to this comic: / {print $6}' | \ + awk 'BEGIN{FS="/";} {print $4}') if [[ -z "$nimg_latest" ]]; then VERBOSE=1 @@ -176,9 +179,11 @@ xkcd_get_all_images() { log "Found: $nimg_latest" fi - for ((i=1; i<=$nimg_latest; i++)); do - local img_url_hotlink=$(xkcd_get_hotlink_url $i) - local img_name=$(xkcd_get_img_name $img_url_hotlink $i) + for ((i=1; i<=nimg_latest; i++)); do + local img_url_hotlink + img_url_hotlink=$(xkcd_get_hotlink_url "$i") + local img_name + img_name=$(xkcd_get_img_name "$img_url_hotlink" "$i") if [[ -e "$img_name" ]]; then log "$img_name exists. Skipping download" @@ -186,13 +191,12 @@ xkcd_get_all_images() { fi log "Downloading #${i} ${img_url_hotlink} (${img_name})" - $(curl -s $img_url_hotlink -o $img_name) - if (( 0 != "$?" )); then + if ! curl -s "$img_url_hotlink" -o "$img_name"; then error "Failed to download ${i}" fi if [ "${img_name: -3}" == "jpg" ]; then - convert_image $img_name + convert_image "$img_name" fi done @@ -201,41 +205,48 @@ xkcd_get_all_images() { xkcd_get_hotlink_url() { local url="https://xkcd.com/$i" - local url_hotlink="$(curl -sL $url | awk '/Image URL \(for hotlinking\/embedding\): / {print $5}')" - echo $url_hotlink + local url_hotlink + url_hotlink="$(curl -sL $url | awk '/Image URL \(for hotlinking\/embedding\): / {print $5}')" + echo "$url_hotlink" } xkcd_get_img_tooltip() { - local url="https://xkcd.com/$1" - echo $(curl -sL $url | grep -A 1 '
' | awk -F "\"" '/src=/ {print $4}' | recode html..UTF8) + local url + url="https://xkcd.com/$1" + curl -sL "$url" | grep -A 1 '
' | awk -F "\"" '/src=/ {print $4}' | recode html..UTF8 } xkcd_format_tooltip() { - local text=$(echo $text | fold -s -w $TOOLTIP_MAX_LINE_LEN) + local text + text=$(echo "$1" | fold -s -w $TOOLTIP_MAX_LINE_LEN) echo "$text" } get_nscreens() { - local nscreens=$(xrandr -q | awk '/ connected/ {count++} END {print count}') + local nscreens + nscreens=$(xrandr -q | awk '/ connected/ {count++} END {print count}') echo "$nscreens" } screen_get_smallest_resolution() { - local res=$(xrandr -q | awk '/*/ {print $1}' \ - | awk 'BEGIN{FS="x";} NR==1 || $1max {line=$0; max=$1}; END {print line}') + local res + res=$(xrandr -q | awk '/\*/ {print $1}' \ + | awk 'BEGIN{FS="x";} NR==1 || $1>max {line=$0; max=$1}; END {print line}') echo "$res" } get_random_image() { - local img_fn="$(find $IMG_PATH -type f | sort -R | head -n1 )" + local img_fn + img_fn="$(find "$IMG_PATH" -type f | sort -R | head -n1 )" if ! [[ -e "$img_fn" ]]; then error "Could not find image to display" @@ -248,15 +259,16 @@ convert_image() { local img_name_len=$((${#img_name} - 4)) local img_name_png=${img_name:0:$img_name_len}".png" log "Converting $img_name to $img_name_png" - $(convert $img_name $img_name_png) - $(rm -f $img_name) + convert "$img_name" "$img_name_png" + rm -f "$img_name" } image_add_text() { - local tmp_file=$(mktemp) + local tmp_file + tmp_file=$(mktemp) - log "Adding \""${2}"\" to ${1} and saving image to ${tmp_file}" - $(convert "${1}" -font "${5}" -gravity "${3}" -pointsize "${7}" -fill "${4}" $8 -annotate "${6}" "${2}" "${tmp_file}") + log "Adding ${2} to ${1} and saving image to ${tmp_file}" + convert "${1}" -font "${5}" -gravity "${3}" -pointsize "${7}" -fill "${4}" $8 -annotate "${6}" "${2}" "${tmp_file}" if ! [[ -e "$tmp_file" ]]; then error "Could not find image with text overlay" @@ -268,18 +280,22 @@ image_add_text() { target_image_size() { IFS='x' - read -a strarr <<< "$1" - local img_size_x=`expr "${strarr[0]}" - $IMAGE_PADDING_PX` - local img_size_y=`expr "${strarr[1]}" - $IMAGE_PADDING_PX` - local img_size="${img_size_x}x${img_size_y}" + read -r -a strarr <<< "$1" + local img_size_x + img_size_x=$((strarr[0] - IMAGE_PADDING_PX)) + local img_size_y + img_size_y=$((strarr[1] - IMAGE_PADDING_PX)) + local img_size + img_size="${img_size_x}x${img_size_y}" echo "$img_size" } resize_image() { - local tmp_file=$(mktemp) + local tmp_file + tmp_file=$(mktemp) log "Resizing $img_fn to $2 and saving image to $tmp_file" - convert -adaptive-resize $2 $img_fn $tmp_file + convert -adaptive-resize "$2" "$img_fn" "$tmp_file" if ! [[ -e "$tmp_file" ]]; then error "Could not find resized image" @@ -290,10 +306,11 @@ resize_image() { } center_image() { - local tmp_file=$(mktemp) + local tmp_file + tmp_file=$(mktemp) log "Centering $tmp_file and saving image to $tmp_file" - $(convert $tmp_file_r -gravity center -background $BG_COLOUR -extent $res $tmp_file) + convert "$tmp_file_r" -gravity center -background "$BG_COLOUR" -extent "$res" "$tmp_file" if ! [[ -e "$tmp_file" ]]; then error "Could not find centered image" @@ -304,30 +321,40 @@ center_image() { } prepare_image() { - local res=$(screen_get_highest_resolution) - local img_name=$(xkcd_get_img_name_from_file $img_fn) - local img_nr=$(xkcd_get_img_nr $img_name) - local text=$(xkcd_get_img_tooltip $img_nr) - img_tooltip=$(xkcd_format_tooltip $text) + local res + res=$(screen_get_highest_resolution) + local img_name + img_name=$(xkcd_get_img_name_from_file "$img_fn") + local img_nr + img_nr=$(xkcd_get_img_nr "$img_name") + local text + text=$(xkcd_get_img_tooltip "$img_nr") + local img_tooltip_text + img_tooltip_text=$(xkcd_format_tooltip "$text") - local img_target_size=$(target_image_size $res) - local tmp_file_r=$(resize_image $img_fn $img_target_size) - local tmp_file_c=$(center_image $tmp_file_r $res) - local tmp_file_t1=$(image_add_text "${tmp_file_c}" "${img_nr}" "Northeast" "green" "${FONT_PATH}" "+50+50" "50") - local tmp_file_t2=$(image_add_text "${tmp_file_t1}" "${img_tooltip}" "Southwest" "red" "${FONT_PATH}" "+0+0" "30" " -undercolor '#00000080' ") + local img_target_size + img_target_size=$(target_image_size "$res") + local tmp_file_r + tmp_file_r=$(resize_image "$img_fn" "$img_target_size") + local tmp_file_c + tmp_file_c=$(center_image "$tmp_file_r" "$res") + local tmp_file_t1 + tmp_file_t1=$(image_add_text "${tmp_file_c}" "${img_nr}" "Northeast" "green" "${FONT_PATH}" "+50+50" "50") + local tmp_file_t2 + tmp_file_t2=$(image_add_text "${tmp_file_t1}" "${img_tooltip_text}" "Southwest" "red" "${FONT_PATH}" "+0+0" "30" " -undercolor '#00000080' ") echo "$tmp_file_t2" } screen_lock() { - local img_fn_final=$(prepare_image $img_fn) + local img_fn_final + img_fn_final=$(prepare_image "$img_fn") log "Locking screen with $img_fn" - $LOCK_BIN -i $img_fn_final + $LOCK_BIN -i "$img_fn_final" } main() { - local locker=$(which $LOCK_BIN) local OPTIND while getopts "h?i:l:vVm:dy" opt; do @@ -342,12 +369,13 @@ main() { exit 0 ;; i) - local img_fn="${OPTARG}" - local r=$(screen_lock $img_fn) + local img_fn + img_fn="${OPTARG}" + screen_lock "$img_fn" exit 0 ;; l) - if [[ "sway"="${OPTARG}" ]]; then + if [[ "sway" = "${OPTARG}" ]]; then LOCK_BIN="swaylock" echo "Not yet implemented since we have no xrandr with wayland" exit 1 @@ -364,7 +392,7 @@ main() { exit 0 ;; y) - r=$(xkcd_get_all_images) + xkcd_get_all_images exit 0 esac done @@ -377,11 +405,15 @@ main() { fi case "$IMG_CHOICE" in - "latest") local img_fn=$(xkcd_get_latest_image);; - "random") local img_fn=$(get_random_image);; + "latest") + local img_fn + img_fn=$(xkcd_get_latest_image);; + "random") + local img_fn + img_fn=$(get_random_image);; esac - screen_lock $img_fn + screen_lock "$img_fn" } main "$@"