有闲情的大佬可以再优化下。
具体功能是:
qbittorrent下载完成后调用BaiduPCS-Go上传到百度网盘,之前论坛里有rclone上传的脚本,不过微软网盘给的小气。还是百度就很大,就是会吃某些视频,懂得都懂,至于存什么。哎嘿~。
目前脚本已知bug:
1.会出现某些任务路径非法的提示,目测是BaiduPCS-Go的问题,暂时不知道怎么解决。
2.日志文件有点乱,反正能看。
3.没有上传完成后自动删除功能。(因为可能会因为上传出现上传失败的问题,所以种子留下了,等待人工效验。反正我是会大概看一下有没有上传失败的。)
运行命令是bash /downloads/up.sh "%F" ""
使用方法:
上传脚本然后
qbittorrent设置-》启用“torrent 完成时运行外部程序”->输入“bash /downloads/up.sh "%F" ""”->保存
替换为实际路径,注意用双引号保持数据完整性。
其他的,代码里面注释很多,自己看着改应该没问题吧?
[ol]#!/bin/bash
# 定义一些全局变量
LOCK_FILE="/downloads/upload_script.lock"
QUEUE_FILE="/downloads/upload_queue.txt"
LOG_FILE="/downloads/upload_log.txt"
ERROR_LOG_FILE="/downloads/upload_error_log.txt"
CACHE_FILE="/downloads/upload_cache.txt"
BAIDUPCS_GO_LOG="/downloads/BAIDUPCS-GO_LOG.txt"
# 记录日志的函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}
# 记录带时间戳的日志到 BAIDUPCS_GO_LOG
log_to_baidupcs_log() {
echo "$(date +"%Y-%m-%d %H:%M:%S") - $1" >> "$BAIDUPCS_GO_LOG"
}
# 记录错误日志的函数
error_log() {
local error_message="$1"
local error_task="$2"
local error_step="$3"
local error_action="$4"
echo "$(date '+%Y-%m-%d %H:%M:%S') - Task: ${error_task}, Step: ${error_step}, Error: ${error_message}, Action: ${error_action}" >> $ERROR_LOG_FILE
}
# 添加任务到队列的函数
add_to_queue() {
local task="$1"
local path="$2"
echo ""${task}" "${path}"" >> $QUEUE_FILE
}
# 读取队列并缓存的函数
load_cache() {
if [ -f $QUEUE_FILE ]; then
cat $QUEUE_FILE > $CACHE_FILE
> $QUEUE_FILE
fi
}
# 执行上传任务的函数
execute_tasks() {
while [ -s $CACHE_FILE ]; do
local line=$(head -n 1 $CACHE_FILE)
local task=$(echo $line | awk -F" '{print $2}')
local dest_path=$(echo $line | awk -F" '{print $4}')
log "开始上传 ${task} 到网盘 ${dest_path} 目录"
# 执行上传任务 并将运行结果记录到BAIDUPCS-GO_LOG.txt当中
# /downloads/BaiduPCS-Go 为BaiduPCS-Go的绝对路径
/downloads/BaiduPCS-Go upload "${task}" "${dest_path}" 2>&1 | while IFS= read -r line; do log_to_baidupcs_log "$line"; done
#这里只记录BaiduPCS-Go最后一次的运行结果。
#所以对于文件夹,也是记录最后一个上传信息,详细的上传日志还得去BAIDUPCS_GO_LOG看
# 检查日志文件中是否包含“文件路径含有非法字符,已跳过!”
if grep -q "文件路径含有非法字符,已跳过!" "$BAIDUPCS_GO_LOG"; then
local skip_message=$(grep "文件路径含有非法字符,已跳过!" "$BAIDUPCS_GO_LOG" | tail -n 1)
log "$skip_message"
fi
# 检查日志文件中是否包含上传成功的提示信息
if grep -q "上传文件成功, 保存到网盘路径:" "$BAIDUPCS_GO_LOG"; then
local success_message=$(grep "上传文件成功, 保存到网盘路径:" "$BAIDUPCS_GO_LOG" | tail -n 1)
log "$success_message"
fi
log "${task} 上传完成"
# 移除已完成任务
sed -i '1d' $CACHE_FILE
done
}
# 处理队列的函数
process_queue() {
load_cache
while [ -s $CACHE_FILE ]; do
execute_tasks
load_cache
done
rm -f $CACHE_FILE
}
# 主函数
main() {
if [ $# -ne 2 ]; then
echo "Usage: $0 "
exit 1
fi
local task="$1"
local dest_path="$2"
# 尝试获取锁
exec 200>$LOCK_FILE
flock -n 200
if [ $? -ne 0 ]; then
error_log "Failed to acquire lock" "$task" "Acquiring lock" "Adding task to queue"
add_to_queue "$task" "$dest_path"
exit 0
fi
# 如果获取到了锁,处理任务
if [ -f $QUEUE_FILE ]; then
add_to_queue "$task" "$dest_path"
else
echo ""${task}" "${dest_path}"" > $QUEUE_FILE
fi
process_queue
release_lock
if [ -f $QUEUE_FILE ]; then
rm -f $QUEUE_FILE
fi
}
release_lock() {
flock -u 200
rm -f $LOCK_FILE
}
main "$@"
[/ol]复制代码