100T硬盤資源管理分享
主機(jī)
蝸牛星際4盤位
萬由810A+i510400T+64G+MATX+被動(dòng)散熱+SN570固態(tài)
硬盤
4 * 10T
4 * 16T
系統(tǒng)
CentOS 8
磁盤管理
參考LVMRAID(7)
軟件
Samba cockpit libvirt podman jallyfin you-get weboSpider youtube-dl ImageMagick frp
Samba設(shè)置
[nas]
comment = nas
path = /data
writeable = yes
create mask = 0664
directory mask = 0775
資源元數(shù)據(jù)采集
爬某個(gè)電影網(wǎng)站, 記錄分類 演員 日期等元數(shù)據(jù)信息, 做好歸檔和創(chuàng)建目錄
[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 '開始拉取數(shù)據(jù)...'
##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數(shù)據(jù)拉取失敗,退出當(dāng)前任務(wù)!\033[0m" && exit)
#fi
touch_jav() {
#獲取標(biāo)題,并去除特殊符號(hào)
echo '正在獲取標(biāo)題...'
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'`
#獲取番號(hào)
echo '正在獲取番號(hào)ID...'
ID=`echo $TITLE | cut -d\( -f2 | cut -d\) -f1`
[ -z $ID ] && echo -e "\033[31m數(shù)據(jù)拉取失敗,退出當(dāng)前任務(wù)!\033[0m" && exit
#檢查重復(fù)
echo '檢查重復(fù)...'
ls -d /data/hdd/JAV/\(${ID}\)*
if [ $? -eq 0 ];then
echo -e "\033[33m此番號(hào)已存在,退出當(dāng)前任務(wù)!\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"
#獲取標(biāo)簽
echo '正在獲取標(biāo)簽...'
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
#獲取發(fā)布日期
echo '正在獲取發(fā)布日期...'
JAV_DATE=`grep -A1 發(fā)行日期 /tmp/jav_web_source.html | grep -v 發(fā)行日期 | sed 's/.*>2/2/' | sed 's/<.*//' | head -1`
#將標(biāo)題信息存入臨時(shí)文件
echo '格式化數(shù)據(jù)...'
echo ${TITLE} > /tmp/full_title_tmp.txt
echo ${TAG} >> /tmp/full_title_tmp.txt
echo ${ACTOR} >> /tmp/full_title_tmp.txt
#格式化數(shù)據(jù)
dos2unix /tmp/full_title_tmp.txt
#整合標(biāo)題名
FULL_TITLE=`cat /tmp/full_title_tmp.txt | tr '\n' _ | sed 's/_$//g'`
#判斷標(biāo)題名是否過長(zhǎng),如果超過80個(gè)字符,刪除標(biāo)題后面字符,再重新生成標(biāo)題名
while [ `sed -n '1p' /tmp/full_title_tmp.txt | wc -L` -ge 80 ]
do
sed -i '1s/...$//' /tmp/full_title_tmp.txt
done
#判斷演員名是否過長(zhǎng),如果超過60個(gè)字符,刪除標(biāo)題后面字符,再重新生成標(biāo)題名
while [ `sed -n '3p' /tmp/full_title_tmp.txt | wc -L` -ge 60 ]
do
sed -i '3s/..$//' /tmp/full_title_tmp.txt
done
# 確定最終標(biāo)題名
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
#開始創(chuàng)建JAV目錄
echo "正在創(chuàng)建目錄 ${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}"
# 驗(yàn)證是否獲取成功
#{ [ -n $TITLE ] && [ -n $IMAGE_URL ] && [ -f "/data/hdd/JAV/${FULL_TITLE}/${FULL_TITLE}.jpg" ] && echo -e "\033[31m ${str}\033[0m" '文件驗(yàn)證成功' } || { echo -e "\033[31m ${str}\033[0m" '數(shù)據(jù)獲取失敗,請(qǐng)手動(dòng)獲取文件數(shù)據(jù)' && 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 文件驗(yàn)證成功\033[0m"
else
echo -e "\033[31m 數(shù)據(jù)獲取失敗,請(qǐng)手動(dòng)獲取文件數(shù)據(jù)\033[0m"
echo "手動(dòng)執(zhí)行"
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為發(fā)行日期
echo '更改發(fā)行日期...'
echo $FULL_TITLE | grep $ID \
&& find "/data/hdd/JAV/$FULL_TITLE" -exec touch -m -d "${JAV_DATE}" '{}' \; \
|| echo -e "\033[31m日期錯(cuò)誤\033[0m"
# chattr增加文件權(quán)限
# echo '增加文件權(quán)限...'
# 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鏈接到j(luò)av_web_source.html
for i in `ls -t /data/ssd/Downloads/tmp/*.htm*`
do
ln -f -s "${i}" /tmp/jav_web_source.html
# 調(diào)用touch_jav
touch_jav
done
IFS="$OLDIFS"
# 清空本地臨時(shí)文件
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數(shù)據(jù)拉取失敗,退出當(dāng)前任務(wù)!\033[0m" && exit)
# 調(diào)用touch_jav
# curl -kL ${URL} > /tmp/jav_web_source.html
touch_jav
fi
使用:
資源下載
略
資源生成
根據(jù)封面生成海報(bào)文件, 生成nfo文件, 創(chuàng)建鏈接文件用于瀏覽
[tiera@server bin]$ cat gen_index.sh
#!/bin/bash
# 將下載完成的指定文件移動(dòng)到影片目錄中, 并調(diào)用gen_poster生成海報(bào) 調(diào)用gen_nfo生成元數(shù)據(jù)文件 生成available的鏈接文件
# 參數(shù)1是文件,參數(shù)2是番號(hào)
file=$1
id=$2
target_dir=`getdir $2`
# 目標(biāo)目錄不存在,需要初始化目錄
[[ ! -d $target_dir ]] && echo '目錄不存在 exit' && exit 2
# 目標(biāo)目錄已經(jīng)有視頻文件,判斷退出
ls ${target_dir}/*.mp4 2> /dev/null && echo '已有視頻文件 exit' && exit 1
# 判斷視頻文件是否包含空格,應(yīng)去除掉空格
echo $file | grep ' ' 2> /dev/null && echo '文件名包含空格,去除掉空格重新運(yùn)行 exit' && exit 3
# 移動(dòng)視頻文件
mv $file $target_dir && echo '移動(dòng) OK'
# 鏈接目錄
ln -s $target_dir /data/hdd/JAV_thumbnail/available/ && echo '創(chuàng)建鏈接目錄 OK'
gen_poster.sh $target_dir && echo '生成海報(bào) OK'
gen_nfo.sh $target_dir && echo '生成元數(shù)據(jù)文件 OK'
[tiera@server bin]$ cat gen_poster.sh
#!/bin/bash
# 目標(biāo)目錄
target=$1
# 找到目錄中的視頻文件
video_file=$(find ${target} -type f -size +500M | head -1)
echo "video filename: ${video_file}"
# 定義海報(bào)文件名字
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}"
# 不用執(zhí)行下去的情況判斷
#if [[ ! -f ${poster_file} -o -z ${poster_file} ]];then
#echo "ERROR"
#exit
#fi
# 準(zhǔn)備生成海報(bào)
cp ${thumb_file} /tmp/source.jpg
# 生成海報(bào)
podman run --rm -v /tmp:/imgs docker.io/dpokidov/imagemagick /imgs/source.jpg -crop 379x538+420+0 /imgs/dest.jpg
# 復(fù)制海報(bào)文件到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系統(tǒng)
Everything
設(shè)置添加目錄
開啟匹配目錄
添加篩選器 jav 勾選正則表達(dá)式 內(nèi)容: \(.*-.*\).*_.*\.jpg
搜索匹配路徑 查找圖片
視圖超大圖標(biāo) 按修改日期排序
大致如下(實(shí)際使用時(shí)為封面預(yù)覽):
使用技巧 可以空格按多個(gè)關(guān)鍵字找 !不匹配 |或查找
前綴加元數(shù)據(jù)的目錄是所有影片 加資源鏈接目錄是已下載好的
高級(jí)條件查找
可以按分類條件和精細(xì)程度查找演員
比如要看胖的 瘦的 高的 矮的
[tiera@server bin]$ cat search_actress.sh
#!/bin/bash
# 輸入N個(gè)類別參數(shù), 按照類型找女優(yōu)名字, 如果加入-e參數(shù) 可以查多次出現(xiàn)的類別, 加入-ee參數(shù) 必須是單體作品女優(yōu)
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
可以認(rèn)出資源目錄的nfo文件, 和海報(bào)文件. 不需額外配置
Jellyfin不支持正則,多關(guān)鍵字. 故很少用
demo
http://www.juminhee.com:9090
tmp/tmp