2
This commit is contained in:
187
kde-dotfiles/.config/scripts/fastfetch-random-wife.sh
Normal file
187
kde-dotfiles/.config/scripts/fastfetch-random-wife.sh
Normal file
@ -0,0 +1,187 @@
|
||||
# 脚本功能:
|
||||
# 从随机老婆图片生成 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
|
||||
Reference in New Issue
Block a user