#!/bin/sh
# author jjm2473

# the script will be excuted when `argon.@global[0].bing_background == '1'`
# defaults to 'bing' to be compatible with old config
WEB_PIC_SRC="$(uci -q get argon.@global[0].online_wallpaper || echo 'bing')"
CACHE="/var/run/argon_${WEB_PIC_SRC}.url"
WRLOCK="/var/lock/argon_${WEB_PIC_SRC}.lock"

fetch_pic_url() {
	case "$WEB_PIC_SRC" in
	bing)
		local picpath="$(wget -T3 -qO- \
			"https://www.bing.com/HPImageArchive.aspx?format=js&n=1" |
			jsonfilter -qe '@.images[0].url')"
		[ -n "${picpath}" ] && echo "//www.bing.com${picpath}"
		;;
	ghser)
		echo "https://api.ghser.com/random/api.php"
		;;
	unsplash)
		local pic_id="$(wget -T3 --spider \
			"https://source.unsplash.com/1920x1080/daily?wallpapers" 2>&1 |
			grep -Eo "photo-\w+-\w+" | head -n1)"
		[ -n "${pic_id}" ] && echo "https://images.unsplash.com/${pic_id}?fm=jpg&fit=crop&w=1920&h=1080"
		;;
	unsplash_*)
		local collection_id="${WEB_PIC_SRC#unsplash_}"
		local pic_id="$(wget -T3 --spider \
			"https://source.unsplash.com/collection/${collection_id}/1920x1080" 2>&1 |
			grep -Eo "photo-\w+-\w+" | head -n1)"
		[ -n "${pic_id}" ] && echo "https://images.unsplash.com/${pic_id}?fm=jpg&fit=crop&w=1920&h=1080"
		;;
	wallhaven)
		wget -T3 -qO- \
			"https://wallhaven.cc/api/v1/search?resolutions=1920x1080&sorting=random" |
			jsonfilter -qe "@.data[0].path"
		;;
	esac
}

try_update() {
	local lock="$WRLOCK"
	exec 200>"$lock"

	if flock -n 200 >"/dev/null" 2>&1; then
		local picurl="$(fetch_pic_url)"
		if [ -n "$picurl" ]; then
			echo "$picurl" | tee "$CACHE"
		else
			if [ -s "$CACHE" ]; then
				cat "$CACHE"
			else
				touch "$CACHE"
			fi
		fi
		flock -u 200 >"/dev/null" 2>&1
	elif [ -s "$CACHE" ]; then
		cat "$CACHE"
	fi
}

get_url() {
	if [ -f "$CACHE" ]; then
		local idle_t="$(($(date '+%s') - $(date -r "$CACHE" '+%s' 2>/dev/null || echo '0')))"
		if [ -s "$CACHE" ]; then
			if [ "$idle_t" -le 43200 ]; then
				cat "$CACHE"
				return
			fi
		else
			if [ "$idle_t" -le 120 ]; then
				return
			fi
		fi
	fi
	try_update
}

get_url
