116 lines
2.3 KiB
Bash
116 lines
2.3 KiB
Bash
#!/usr/bin/env sh
|
||
set -eu
|
||
|
||
ROOT_DIR="$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)"
|
||
CALENDAR_DIR="$ROOT_DIR/calendar"
|
||
INTERVAL_MINUTES=60
|
||
RUN_ONCE=false
|
||
|
||
print_usage() {
|
||
cat <<'EOF'
|
||
用法:
|
||
sh scripts/refresh-kindle-backgrounds.sh [选项]
|
||
|
||
作用:
|
||
1. 构建 calendar Web 产物
|
||
2. 生成主题背景图到 calendar/kindle-backgrounds/
|
||
3. 默认每 60 分钟重跑一次;加 --once 只跑一轮
|
||
|
||
选项:
|
||
--interval-minutes <n> 自动生成间隔,默认 60 分钟
|
||
--once 只生成一轮
|
||
-h, --help 查看帮助
|
||
|
||
示例:
|
||
sh scripts/refresh-kindle-backgrounds.sh --once
|
||
sh scripts/refresh-kindle-backgrounds.sh --interval-minutes 30
|
||
EOF
|
||
}
|
||
|
||
log() {
|
||
printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1"
|
||
}
|
||
|
||
validate_positive_integer() {
|
||
value=$1
|
||
name=$2
|
||
|
||
case "$value" in
|
||
''|*[!0-9]*)
|
||
echo "$name 必须是正整数:$value" >&2
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
if [ "$value" -le 0 ]; then
|
||
echo "$name 必须大于 0:$value" >&2
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
refresh_once() {
|
||
log "开始生成 Kindle 背景图到 $CALENDAR_DIR/kindle-backgrounds"
|
||
(
|
||
cd "$CALENDAR_DIR"
|
||
npm run export:themes
|
||
)
|
||
log "背景图生成完成"
|
||
}
|
||
|
||
sleep_until_next_run() {
|
||
interval_seconds=$((INTERVAL_MINUTES * 60))
|
||
now_epoch=$(date '+%s')
|
||
next_epoch=$(( ((now_epoch / interval_seconds) + 1) * interval_seconds ))
|
||
sleep_seconds=$((next_epoch - now_epoch))
|
||
|
||
if [ "$sleep_seconds" -le 0 ]; then
|
||
sleep_seconds=$interval_seconds
|
||
fi
|
||
|
||
log "等待 ${sleep_seconds} 秒后执行下一轮生成"
|
||
sleep "$sleep_seconds"
|
||
}
|
||
|
||
while [ "$#" -gt 0 ]; do
|
||
case "$1" in
|
||
--interval-minutes)
|
||
shift
|
||
INTERVAL_MINUTES=${1:?"missing interval minutes"}
|
||
;;
|
||
--once)
|
||
RUN_ONCE=true
|
||
;;
|
||
-h|--help)
|
||
print_usage
|
||
exit 0
|
||
;;
|
||
*)
|
||
echo "未知参数: $1" >&2
|
||
echo >&2
|
||
print_usage >&2
|
||
exit 1
|
||
;;
|
||
esac
|
||
shift
|
||
done
|
||
|
||
validate_positive_integer "$INTERVAL_MINUTES" "interval-minutes"
|
||
|
||
while true; do
|
||
if refresh_once; then
|
||
:
|
||
else
|
||
status=$?
|
||
log "本轮背景图生成失败,退出码:$status"
|
||
if [ "$RUN_ONCE" = true ]; then
|
||
exit "$status"
|
||
fi
|
||
fi
|
||
|
||
if [ "$RUN_ONCE" = true ]; then
|
||
break
|
||
fi
|
||
|
||
sleep_until_next_run
|
||
done
|