Files
arch/gnome-dotfiles/.config/scripts/fastfetch-random-wife.sh

188 lines
5.5 KiB
Bash
Raw Permalink Normal View History

2026-03-31 20:13:15 +08:00
# 脚本功能:
# 从随机老婆图片生成 API 下载图片并使用 Fastfetch 展示。
# 特性:支持 NSFW 模式,支持自动补货,支持已用图片归档与自动清理。
# ================= 配置区域 =================
# [开关] 强力清理 Fastfetch 内部缓存
# true = 每次运行后清理 ~/.cache/fastfetch/images/ (防止转码缓存膨胀)
# false = 保留 Fastfetch 内部缓存
CLEAN_CACHE_MODE=true
# 每次补货下载多少张
DOWNLOAD_BATCH_SIZE=10
# 最大库存上限 (待展示区)
MAX_CACHE_LIMIT=100
# 库存少于多少张时开始补货
MIN_TRIGGER_LIMIT=60
# [新增] used 目录最大存放数量
# 超过此数量将按照时间顺序删除最旧的文件
MAX_USED_LIMIT=50
# ===========================================
# --- 0. 参数解析与模式设置 ---
NSFW_MODE=false
# 检查环境变量
if [ "$NSFW" = "1" ]; then
NSFW_MODE=true
fi
ARGS_FOR_FASTFETCH=()
for arg in "$@"; do
if [ "$arg" == "--nsfw" ]; then
NSFW_MODE=true
else
ARGS_FOR_FASTFETCH+=("$arg")
fi
done
# --- 1. 目录配置 ---
# 根据模式区分缓存目录和锁文件
if [ "$NSFW_MODE" = true ]; then
CACHE_DIR="$HOME/.cache/fastfetch_waifu_nsfw"
LOCK_FILE="/tmp/fastfetch_waifu_nsfw.lock"
else
CACHE_DIR="$HOME/.cache/fastfetch_waifu"
LOCK_FILE="/tmp/fastfetch_waifu.lock"
fi
# 定义已使用目录
USED_DIR="$CACHE_DIR/used"
mkdir -p "$CACHE_DIR"
mkdir -p "$USED_DIR"
# --- 2. 核心函数 ---
get_random_url() {
local TIMEOUT="--connect-timeout 5 --max-time 15"
RAND=$(( ( RANDOM % 3 ) + 1 ))
if [ "$NSFW_MODE" = true ]; then
# === NSFW API ===
case $RAND in
1) curl -s $TIMEOUT "https://api.waifu.im/search?included_tags=waifu&is_nsfw=true" | jq -r '.images[0].url' ;;
2) curl -s $TIMEOUT "https://api.waifu.pics/nsfw/waifu" | jq -r '.url' ;;
3) curl -s $TIMEOUT "https://api.waifu.pics/nsfw/neko" | jq -r '.url' ;;
esac
else
# === SFW (正常) API ===
case $RAND in
1) curl -s $TIMEOUT "https://api.waifu.im/search?included_tags=waifu&is_nsfw=false" | jq -r '.images[0].url' ;;
2) curl -s $TIMEOUT "https://nekos.best/api/v2/waifu" | jq -r '.results[0].url' ;;
3) curl -s $TIMEOUT "https://api.waifu.pics/sfw/waifu" | jq -r '.url' ;;
esac
fi
}
download_one_image() {
URL=$(get_random_url)
if [[ "$URL" =~ ^http ]]; then
# 使用带时间戳的随机文件名
FILENAME="waifu_$(date +%s%N)_$RANDOM.jpg"
TARGET_PATH="$CACHE_DIR/$FILENAME"
curl -s -L --connect-timeout 5 --max-time 15 -o "$TARGET_PATH" "$URL"
# 简单校验
if [ -s "$TARGET_PATH" ]; then
if command -v file >/dev/null 2>&1; then
if ! file --mime-type "$TARGET_PATH" | grep -q "image/"; then
rm -f "$TARGET_PATH"
fi
fi
else
rm -f "$TARGET_PATH"
fi
fi
}
background_job() {
(
flock -n 200 || exit 1
# 1. 补货检查
CURRENT_COUNT=$(find "$CACHE_DIR" -maxdepth 1 -name "*.jpg" 2>/dev/null | wc -l)
if [ "$CURRENT_COUNT" -lt "$MIN_TRIGGER_LIMIT" ]; then
for ((i=1; i<=DOWNLOAD_BATCH_SIZE; i++)); do
download_one_image
sleep 0.5
done
fi
# 2. 清理过多库存
FINAL_COUNT=$(find "$CACHE_DIR" -maxdepth 1 -name "*.jpg" 2>/dev/null | wc -l)
if [ "$FINAL_COUNT" -gt "$MAX_CACHE_LIMIT" ]; then
DELETE_START_LINE=$((MAX_CACHE_LIMIT + 1))
ls -tp "$CACHE_DIR"/*.jpg 2>/dev/null | tail -n +$DELETE_START_LINE | xargs -I {} rm -- "{}"
fi
) 200>"$LOCK_FILE"
}
# --- 3. 主程序逻辑 ---
shopt -s nullglob
FILES=("$CACHE_DIR"/*.jpg)
NUM_FILES=${#FILES[@]}
shopt -u nullglob
SELECTED_IMG=""
if [ "$NUM_FILES" -gt 0 ]; then
# 有库存,随机选一张
RAND_INDEX=$(( RANDOM % NUM_FILES ))
SELECTED_IMG="${FILES[$RAND_INDEX]}"
# 后台补货
background_job >/dev/null 2>&1 &
else
# 没库存,提示语更改
echo "库存不够啦!正在去搬运新的图片,请稍等哦..."
download_one_image
shopt -s nullglob
FILES=("$CACHE_DIR"/*.jpg)
shopt -u nullglob
if [ ${#FILES[@]} -gt 0 ]; then
SELECTED_IMG="${FILES[0]}"
background_job >/dev/null 2>&1 &
fi
fi
# 运行 Fastfetch
if [ -n "$SELECTED_IMG" ] && [ -f "$SELECTED_IMG" ]; then
# 显示图片
fastfetch --logo "$SELECTED_IMG" --logo-preserve-aspect-ratio true "${ARGS_FOR_FASTFETCH[@]}"
# === 新增逻辑:移动到 used 目录 ===
mv "$SELECTED_IMG" "$USED_DIR/"
# === 新增逻辑:检查 used 目录数量并清理 ===
USED_COUNT=$(find "$USED_DIR" -maxdepth 1 -name "*.jpg" 2>/dev/null | wc -l)
if [ "$USED_COUNT" -gt "$MAX_USED_LIMIT" ]; then
# 计算需要保留的文件行数 (跳过最新的 MAX_USED_LIMIT 个)
SKIP_LINES=$((MAX_USED_LIMIT + 1))
# ls -tp 按时间倒序排列(新->旧)tail 取出旧文件xargs 删除
ls -tp "$USED_DIR"/*.jpg 2>/dev/null | tail -n +$SKIP_LINES | xargs -I {} rm -- "{}"
fi
# 检查是否开启清理 Fastfetch 内部缓存 (仅清理缩略图缓存,不删原图)
if [ "$CLEAN_CACHE_MODE" = true ]; then
rm -rf "$HOME/.cache/fastfetch/images"
fi
else
# 失败提示语更改
echo "呜呜... 图片下载失败了,这次只能先显示默认的 Logo 啦 QAQ"
fastfetch "${ARGS_FOR_FASTFETCH[@]}"
fi