100T硬盘资源管理分享
主机
蜗牛星际4盘位
万由810A+i510400T+64G+MATX+被动散热+SN570固态
硬盘
4 * 10T
4 * 16T
系统
CentOS 8
磁盘管理
参考LVMRAID(7)
软件
Samba cockpit libvirt podman jallyfin you-get weboSpider youtube-dl ImageMagick frp
Samba设置
[nas]
comment = nas
path = /data
writeable = yes
create mask = 0664
directory mask = 0775
资源元数据采集
爬某个电影网站, 记录分类 演员 日期等元数据信息, 做好归档和创建目录
[tiera@server bin]$ cat touch_jav.sh
#!/bin/bash
URL=$1
#if [ $1 == 'local' ];then
#cp "$(ls -rt /data/ssd/Downloads/tmp/*.htm* | awk 'END{print}')" /tmp/jav_web_source.html
#else
#echo '开始拉取数据...'
##curl -kL ${URL} > /tmp/jav_web_source.html
#ssh tiera@www.tierama.com "curl -kL ${URL} > /tmp/jav_web_source.html" \
#&& scp tiera@www.tierama.com:/tmp/jav_web_source.html /tmp/jav_web_source.html \
# || (echo -e "\033[31m数据拉取失败,退出当前任务!\033[0m" && exit)
#fi
touch_jav() {
#获取标题,并去除特殊符号
echo '正在获取标题...'
TITLE=`grep 'JAVLibrary</title>' /tmp/jav_web_source.html | sed 's/<title>//g' | sed 's/\ -\ JAVLibrary<\/title>//g' | sed 's/\ /)/' | sed 's/^/(/g' | sed 's/://g' | sed 's/\*//g' | sed 's/?//g' | sed 's/\ /-/g'`
#获取番号
echo '正在获取番号ID...'
ID=`echo $TITLE | cut -d\( -f2 | cut -d\) -f1`
[ -z $ID ] && echo -e "\033[31m数据拉取失败,退出当前任务!\033[0m" && exit
#检查重复
echo '检查重复...'
ls -d /data/hdd/JAV/\(${ID}\)*
if [ $? -eq 0 ];then
echo -e "\033[33m此番号已存在,退出当前任务!\033[0m"
return 1
fi
#获取封面图片链接
echo '正在获取封面图片URL...'
IMAGE_URL=https://`grep video_jacket_img /tmp/jav_web_source.html | sed 's/.*src=\"\/\///g' | sed 's/\.jpg.*/\.jpg/g' | sed 's/.*src=\"https:\/\///g'`
echo "封面URL为: $IMAGE_URL"
#获取标签
echo '正在获取标签...'
TAG=`grep 'category tag' /tmp/jav_web_source.html | sed 's/rel="category tag">/\n/g' | sed 's/<\/a><\/span>/\n/g' | grep -Ev '<|>' | tr '\n' , | sed 's/,$//g' | sed 's/\ //g'`
#获取演员名
echo '正在获取演员列表...'
ACTOR=`grep 'span class="star"' /tmp/jav_web_source.html | sed 's/rel="tag">/\n/g' | sed 's/<\/a><\/span>/\n/g' | grep -Ev '<|>' | tr '\n' , | sed 's/,$//g' | sed 's/\ //g'`
# 更新actress.db
grep 'span class="star"' /tmp/jav_web_source.html | sed 's/<a\ href=\"vl_star\.php?s=/\n/g' | sed 's/<\/span>\ <span\ id=\"star/\n/g' | grep 'rel="tag"' | sed 's/" rel="tag">/|/g' | sed 's/<\/span>\ <span\ id=\"alias[[:digit:]]*\"\ class=\"alias\">/|/g' | sed 's/<\/a>//g' >> /data/hdd/JAV_thumbnail/lib/actress.db
sort -u /data/hdd/JAV_thumbnail/lib/actress.db -o /data/hdd/JAV_thumbnail/lib/actress.db
#获取发布日期
echo '正在获取发布日期...'
JAV_DATE=`grep -A1 发行日期 /tmp/jav_web_source.html | grep -v 发行日期 | sed 's/.*>2/2/' | sed 's/<.*//' | head -1`
#将标题信息存入临时文件
echo '格式化数据...'
echo ${TITLE} > /tmp/full_title_tmp.txt
echo ${TAG} >> /tmp/full_title_tmp.txt
echo ${ACTOR} >> /tmp/full_title_tmp.txt
#格式化数据
dos2unix /tmp/full_title_tmp.txt
#整合标题名
FULL_TITLE=`cat /tmp/full_title_tmp.txt | tr '\n' _ | sed 's/_$//g'`
#判断标题名是否过长,如果超过80个字符,删除标题后面字符,再重新生成标题名
while [ `sed -n '1p' /tmp/full_title_tmp.txt | wc -L` -ge 80 ]
do
sed -i '1s/...$//' /tmp/full_title_tmp.txt
done
#判断演员名是否过长,如果超过60个字符,删除标题后面字符,再重新生成标题名
while [ `sed -n '3p' /tmp/full_title_tmp.txt | wc -L` -ge 60 ]
do
sed -i '3s/..$//' /tmp/full_title_tmp.txt
done
# 确定最终标题名
FULL_TITLE=`cat /tmp/full_title_tmp.txt | tr '\n' _ | sed 's/_$//g' | tr -d \/`
while [ ${#FULL_TITLE} -ge 95 ]
do
FULL_TITLE=`echo ${FULL_TITLE} | sed 's/..$//'`
done
#开始创建JAV目录
echo "正在创建目录 ${FULL_TITLE}"
result=$(echo ${FULL_TITLE} | grep '(.*).*_.*')
if [ "$result" != "" ];then
mkdir "/data/hdd/JAV/${FULL_TITLE}"
fi
#下载封面图...
echo '正在下载封面图...'
wget --no-check-certificate -O "/data/hdd/JAV/${FULL_TITLE}/${FULL_TITLE}.jpg" "${IMAGE_URL}"
#ssh tiera@www.tierama.com "wget -O /tmp/jav.jpg "${IMAGE_URL}"" \
#&& scp tiera@www.tierama.com:/tmp/jav.jpg "/data/hdd/JAV/${FULL_TITLE}/${FULL_TITLE}.jpg"
#curl -k -o "/data/jav/${FULL_TITLE}/${FULL_TITLE}.jpg" "${IMAGE_URL}"
# 验证是否获取成功
#{ [ -n $TITLE ] && [ -n $IMAGE_URL ] && [ -f "/data/hdd/JAV/${FULL_TITLE}/${FULL_TITLE}.jpg" ] && echo -e "\033[31m ${str}\033[0m" '文件验证成功' } || { echo -e "\033[31m ${str}\033[0m" '数据获取失败,请手动获取文件数据' && exit 1 }
if [ -f "/data/hdd/JAV/${FULL_TITLE}/${FULL_TITLE}.jpg" -a $(ls -s --block-size=k "/data/hdd/JAV/${FULL_TITLE}/${FULL_TITLE}.jpg" | cut -d'K' -f1) -gt 10 ];then
echo -e "\033[32m 文件验证成功\033[0m"
else
echo -e "\033[31m 数据获取失败,请手动获取文件数据\033[0m"
echo "手动执行"
echo -e "wget --no-check-certificate -O \"/data/hdd/JAV/${FULL_TITLE}/${FULL_TITLE}.jpg\" \"${IMAGE_URL}\""
echo -e "find \"/data/hdd/JAV/$FULL_TITLE\" -exec touch -m -d "${JAV_DATE}" '{}' \;"
exit 9
fi
#更改文件mtime为发行日期
echo '更改发行日期...'
echo $FULL_TITLE | grep $ID \
&& find "/data/hdd/JAV/$FULL_TITLE" -exec touch -m -d "${JAV_DATE}" '{}' \; \
|| echo -e "\033[31m日期错误\033[0m"
# chattr增加文件权限
# echo '增加文件权限...'
# sudo chattr +a /data/hdd/JAV/${FULL_TITLE}/ \
# && sudo chattr +i "/data/hdd/JAV/${FULL_TITLE}/${FULL_TITLE}.jpg" \
# && echo '完成'
echo -e '\n\n\n\n'
# Also copy jpg file to SSD
cp -p "/data/hdd/JAV/${FULL_TITLE}/${FULL_TITLE}.jpg" /data/ssd/JAV_thumbnail/all_jpg/
}
if [ $1 == 'local' ];then
OLDIFS="$IFS"
IFS=$'\n'
# 使用本地html链接到jav_web_source.html
for i in `ls -t /data/ssd/Downloads/tmp/*.htm*`
do
ln -f -s "${i}" /tmp/jav_web_source.html
# 调用touch_jav
touch_jav
done
IFS="$OLDIFS"
# 清空本地临时文件
rm -f /data/ssd/Downloads/tmp/*
else
# 通过URL下载jav_web_source.html
#ssh tiera@www.tierama.com "curl -kL ${URL} > /tmp/jav_web_source.html" \
#&& scp tiera@www.tierama.com:/tmp/jav_web_source.html /tmp/jav_web_source.html \
#|| (echo -e "\033[31m数据拉取失败,退出当前任务!\033[0m" && exit)
# 调用touch_jav
# curl -kL ${URL} > /tmp/jav_web_source.html
touch_jav
fi
使用:
资源下载
略
资源生成
根据封面生成海报文件, 生成nfo文件, 创建链接文件用于浏览
[tiera@server bin]$ cat gen_index.sh
#!/bin/bash
# 将下载完成的指定文件移动到影片目录中, 并调用gen_poster生成海报 调用gen_nfo生成元数据文件 生成available的链接文件
# 参数1是文件,参数2是番号
file=$1
id=$2
target_dir=`getdir $2`
# 目标目录不存在,需要初始化目录
[[ ! -d $target_dir ]] && echo '目录不存在 exit' && exit 2
# 目标目录已经有视频文件,判断退出
ls ${target_dir}/*.mp4 2> /dev/null && echo '已有视频文件 exit' && exit 1
# 判断视频文件是否包含空格,应去除掉空格
echo $file | grep ' ' 2> /dev/null && echo '文件名包含空格,去除掉空格重新运行 exit' && exit 3
# 移动视频文件
mv $file $target_dir && echo '移动 OK'
# 链接目录
ln -s $target_dir /data/hdd/JAV_thumbnail/available/ && echo '创建链接目录 OK'
gen_poster.sh $target_dir && echo '生成海报 OK'
gen_nfo.sh $target_dir && echo '生成元数据文件 OK'
[tiera@server bin]$ cat gen_poster.sh
#!/bin/bash
# 目标目录
target=$1
# 找到目录中的视频文件
video_file=$(find ${target} -type f -size +500M | head -1)
echo "video filename: ${video_file}"
# 定义海报文件名字
poster_file=${video_file%.*}.jpg
echo "poster filename: ${poster_file}"
# 找到封面文件
thumb_file=$(find ${target} -type f -name '*.jpg' | grep "(.*-.*).*(.*-.*)" | head -1)
echo "thumb filename: ${thumb_file}"
# 不用执行下去的情况判断
#if [[ ! -f ${poster_file} -o -z ${poster_file} ]];then
#echo "ERROR"
#exit
#fi
# 准备生成海报
cp ${thumb_file} /tmp/source.jpg
# 生成海报
podman run --rm -v /tmp:/imgs docker.io/dpokidov/imagemagick /imgs/source.jpg -crop 379x538+420+0 /imgs/dest.jpg
# 复制海报文件到target
cp /tmp/dest.jpg ${poster_file}
[tiera@server bin]$ cat gen_nfo.sh
#!/bin/bash
source_dir=$1
movie_file=$(find ${source_dir}/ -type f -size +500M | head -1)
thumb_file=$(find ${source_dir}/ -name '(*-*)*_*.jpg' | head -1)
nfo_file=${movie_file%.*}.nfo
original_filename=$(echo ${movie_file} | awk -F'/' '{print $NF}')
title=$(echo ${source_dir} | sed 's/\/$//g' | awk -F'/' '{print $NF}' | sed 's/(//g' | sed 's/)/ /g' | awk -F'_' '{print $1}')
# 日期
premiered=$(/usr/bin/ls --time-style=+%F -l ${thumb_file} | awk '{print $(NF-1)}')
# 类别
genre=$(echo ${source_dir} | sed 's/\/$//g' | awk -F'/' '{print $NF}' | awk -F'_' '{print $2}' | tr ',' ' ')
# 演员
actor=$(echo ${source_dir} | sed 's/\/$//g' | awk -F'/' '{print $NF}' | awk -F'_' '{print $3}' | tr ',' ' ')
# title
nfo_demo1="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>
<movie>
<title>${title}</title>
<premiered>${premiered}</premiered>"
# all genre
nfo_demo2=$(for i in ${genre};do echo " <genre>${i}</genre>";done)
# all acctress name
nfo_demo3=$(for i in ${actor};do echo " <actor><name>$i</name><thumb/><profile/></actor>";done)
# video filename
nfo_demo4=" <original_filename>${original_filename}</original_filename>
</movie>"
echo -e "${nfo_demo1}
${nfo_demo2}
${nfo_demo3}
${nfo_demo4}" > ${nfo_file}
客户端
Windows系统
Everything
设置添加目录
开启匹配目录
添加筛选器 jav 勾选正则表达式 内容: \(.*-.*\).*_.*\.jpg
搜索匹配路径 查找图片
视图超大图标 按修改日期排序
大致如下(实际使用时为封面预览):
使用技巧 可以空格按多个关键字找 !不匹配 |或查找
前缀加元数据的目录是所有影片 加资源链接目录是已下载好的
高级条件查找
可以按分类条件和精细程度查找演员
比如要看胖的 瘦的 高的 矮的
[tiera@server bin]$ cat search_actress.sh
#!/bin/bash
# 输入N个类别参数, 按照类型找女优名字, 如果加入-e参数 可以查多次出现的类别, 加入-ee参数 必须是单体作品女优
rm -f /tmp/result*.txt
i=1
if [ "$1" == '-e' ];then
shift
until [ $# -eq 0 ]
do
ls /data/ssd/JAV_thumbnail/all_jpg/ | grep $1 | grep -v '精选' | awk -F'_' '{print $3}' | sed 's/\.jpg//g' | tr ',' '\n' | grep -Ev '^$' | sort | uniq -d > /tmp/result${i}.txt
((i++))
shift
# [[ $# -eq 0 ]] && break
done
elif [ "$1" == '-ee' ];then
shift
until [ $# -eq 0 ]
do
ls /data/ssd/JAV_thumbnail/all_jpg/ | grep $1 | grep -v '精选' | grep '单体作品' | awk -F'_' '{print $3}' | sed 's/\.jpg//g' | tr ',' '\n' | grep -Ev '^$' | sort | uniq -d > /tmp/result${i}.txt
((i++))
shift
done
else
# for i in $(seq 1 5)
until [ $# -eq 0 ]
do
ls /data/ssd/JAV_thumbnail/all_jpg/ | grep $1 | awk -F'_' '{print $3}' | sed 's/\.jpg//g' | tr ',' '\n' | grep -Ev '^$' | sort | uniq > /tmp/result${i}.txt
((i++))
shift
# [[ $# -eq 0 ]] && break
done
fi
((i--))
cat /tmp/result*.txt | sort | uniq -c | grep "$i "
Jellyfin
可以认出资源目录的nfo文件, 和海报文件. 不需额外配置
Jellyfin不支持正则,多关键字. 故很少用
demo
http://www.juminhee.com:9090
tmp/tmp