欢迎光临散文网 会员登陆 & 注册

100T硬盘资源管理分享

2022-10-07 16:21 作者:提依拉  | 我要投稿

主机

蜗牛星际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

100T硬盘资源管理分享的评论 (共 条)

分享到微博请遵守国家法律