Sato Hideki
Sato Hideki
发布于 2024-10-27 / 45 阅读
0
0

搭建qBittorrent+Rclone+Alist+Emby实现一站式下载+直链观看

前段时间酷雪云发了一个剩下的 4C8G300G 的机器,一个月 4 刀,遂拿下。拿下了总得布置点啥上去,联想到前段时间买来的微软 E5 账号,于是有了这篇东拼西凑的文章。

准备:

一台性能不是太差的服务器

够大的硬盘(如果你不需要qbittorrent可以不用那么大)

一定的 Linux 基础

一、安装qBittorrent

有人说4.3.9版本有玄学加成,宁可信其有,不可信其无(

wget https://github.com/userdocs/qbittorrent-nox-static/releases/download/release-4.3.9_v1.2.15/x86_64-qbittorrent-nox
chmod a+x x86_64-qbittorrent-nox
apt-get install screen -y
screen -S qbit
./x86_64-qbittorrent-nox

这里使用screen来让qBittorrent在后台保持运行,运行之后按y同意协议,默认WEBUI地址为:http://localhost:8080/,用户名admin,密码adminadmin

二、安装和配置Rclone

sudo -v ; curl https://rclone.org/install.sh | sudo bash

一键安装,嘎嘎方便

安装完成后使用rclone config来添加配置

这里需要的client id之类可以参看这篇文章 EMBY部署并利用rclone挂载onedrive - Kuusei's Blog

rclone config
————————————————————
n) New remote:新建一个远程存储。
s) Set configuration password:设置配置文件的密码。
q) Quit config:退出配置界面。
n/s/q> This value is required and it has no default.
n/s/q> n    # 输入n新建一个配置
————————————————————
Enter name for new remote.(填写名称)
name> onedrive
.......

同时本地电脑也下rclone,文件夹内打开powershell
输入

./rclone authorize "onedrive"

会自动打开浏览器,登录你想挂载的OneDrive账号即可
回到Powershell复制token
回到SSH
rclone一路按y,等到出现(client ID之类的都可以不填,默认选择国际版OneDrive)

“config_token>”

这行时粘贴前面复制的token
一路下一步即可,此时rclone已经可以读取到OneDrive了

接下来挂载Onedrive

先创建一个文件夹当作挂载路径

mkdir /mnt/onedrive

然后进行挂载

screen -S rclone
rclone mount onedrive:/ /mnt/onedrive --cache-dir /tmp --allow-other --vfs-cache-mode writes --vfs-cache-max-age 1m --allow-non-empty

还是在screen中挂载防止掉了(

如果出现报错可能是没有安装fuse3

apt-get install fuse3

三、自动上传

新建一个qb_auto.sh脚本,按照下面的修改成自己配置

#!/bin/bash
torrent_name=$1
content_dir=$2
root_dir=$3
save_dir=$4
files_num=$5
torrent_size=$6
file_hash=$7
qb_version="4.3.9"    # 改成你的qbit版本
qb_username="admin"    # qbit用户名
qb_password="adminadmin"    # qbit密码
qb_web_url="http://localhost:8080"    # qbit webui地址
leeching_mode="false"    # 吸血模式,true下载完成后自动删除本地种子和文件
log_dir="/root/qbauto"    # 日志输出目录
rclone_dest="onedrive"    # rclone配置的储存名
rclone_parallel="32"    # qbit上传线程,默认4
auto_del_flag="rclone"    # 添加标签或者分类来标识已上传的种子 v4.0.4+版本添加标签“rclone”,低版本通过添加分类“rclone”标识
# 改上面的那些参数即可

if [ ! -d ${log_dir} ]
then
        mkdir -p ${log_dir}
fi

version=$(echo $qb_version | grep -P -o "([0-9]\.){2}[0-9]" | sed s/\\.//g)

function qb_login(){
        if [ ${version} -gt 404 ]
        then
                qb_v="1"
                cookie=$(curl -i --header "Referer: ${qb_web_url}" --data "username=${qb_username}&password=${qb_password}" "${qb_web_url}/api/v2/auth/login" | grep -P -o 'SID=\S{32}')
                if [ -n ${cookie} ]
                then
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 登录成功!cookie:${cookie}" >> ${log_dir}/autodel.log

                else
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 登录失败!" >> ${log_dir}/autodel.log
                fi
        elif [[ ${version} -le 404 && ${version} -ge 320 ]]
        then
                qb_v="2"
                cookie=$(curl -i --header "Referer: ${qb_web_url}" --data "username=${qb_username}&password=${qb_password}" "${qb_web_url}/login" | grep -P -o 'SID=\S{32}')
                if [ -n ${cookie} ]
                then
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 登录成功!cookie:${cookie}" >> ${log_dir}/autodel.log
                else
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 登录失败" >> ${log_dir}/autodel.log
                fi
        elif [[ ${version} -ge 310 && ${version} -lt 320 ]]
        then
                qb_v="3"
                echo "陈年老版本,请及时升级"
                exit
        else
                qb_v="0"
                exit
        fi
}



function qb_del(){
        if [ ${leeching_mode} == "true" ]
        then
                if [ ${qb_v} == "1" ]
                then
                        curl -X POST -d "hashes=${file_hash}&deleteFiles=true" "${qb_web_url}/api/v2/torrents/delete" --cookie ${cookie}
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 删除成功!种子名称:${torrent_name}" >> ${log_dir}/qb.log
                elif [ ${qb_v} == "2" ]
                then
                        curl -X POST -d "hashes=${file_hash}&deleteFiles=true" "${qb_web_url}/api/v2/torrents/delete" --cookie ${cookie}
                else
                        curl -X POST -d "hashes=${file_hash}&deleteFiles=true" "${qb_web_url}/api/v2/torrents/delete" --cookie ${cookie}
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 删除成功!种子文件:${torrent_name}" >> ${log_dir}/qb.log
                        echo "qb_v=${qb_v}" >> ${log_dir}/qb.log
                fi
        else
                echo "[$(date '+%Y-%m-%d %H:%M:%S')] 不自动删除已上传种子" >> ${log_dir}/qb.log
        fi
}

function rclone_copy(){
        if [ ${type} == "file" ]
        then
                rclone_copy_cmd=$(rclone -v copy --transfers ${rclone_parallel} --log-file  ${log_dir}/qbauto_copy.log "${content_dir}" ${rclone_dest}:/qbit/)
        elif [ ${type} == "dir" ]
        then
                rclone_copy_cmd=$(rclone -v copy --transfers ${rclone_parallel} --log-file ${log_dir}/qbauto_copy.log "${content_dir}"/ ${rclone_dest}:/qbit/"${torrent_name}")
        fi
}

function qb_add_auto_del_tags(){
        if [ ${qb_v} == "1" ]
        then
                curl -X POST -d "hashes=${file_hash}&tags=${auto_del_flag}" "${qb_web_url}/api/v2/torrents/addTags" --cookie "${cookie}"
        elif [ ${qb_v} == "2" ]
        then
                curl -X POST -d "hashes=${file_hash}&category=${auto_del_flag}" "${qb_web_url}/command/setCategory" --cookie ${cookie}
        else
                echo "qb_v=${qb_v}" >> ${log_dir}/qb.log
        fi
}

if [ -f "${content_dir}" ]
then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 类型:文件" >> ${log_dir}/qb.log
   type="file"
   rclone_copy
   qb_login
   qb_add_auto_del_tags
   qb_del
#   rm -rf ${content_dir}
elif [ -d "${content_dir}" ]
then 
   echo "[$(date '+%Y-%m-%d %H:%M:%S')] 类型:目录" >> ${log_dir}/qb.log
   type="dir"
   rclone_copy
   qb_login
   qb_add_auto_del_tags
   qb_del
#   rm -rf ${content_dir}
else
   echo "[$(date '+%Y-%m-%d %H:%M:%S')] 未知类型,取消上传" >> ${log_dir}/qb.log
fi

echo "种子名称:${torrent_name}" >> ${log_dir}/qb.log
echo "内容路径:${content_dir}" >> ${log_dir}/qb.log
echo "根目录:${root_dir}" >> ${log_dir}/qb.log
echo "保存路径:${save_dir}" >> ${log_dir}/qb.log
echo "文件数:${files_num}" >> ${log_dir}/qb.log
echo "文件大小:${torrent_size}Bytes" >> ${log_dir}/qb.log
echo "HASH:${file_hash}" >> ${log_dir}/qb.log
echo "Cookie:${cookie}" >> ${log_dir}/qb.log
echo -e "-------------------------------------------------------------\n" >> ${log_dir}/qb.log

随后放在你找得到的路径上,这里我放在/root里;随后进入qbittorrent-设置-下载

在最下面的“Torrent完成时运行外部链接“中填入

bash /root/qb_auto.sh  "%N" "%F" "%R" "%D" "%C" "%Z" "%I"

这样下载完成后的文件就会自动上传至Onedrive

四、安装和配置Alist

直接来点一键脚本嘎嘎方便

curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install

等他自己跑完之后记得重设一下密码免得你自己都登不上,登录地址就是http;//你的服务器ip;5244没啥好说的

至于具体的配置环节,Alist的官方文档已经描述的极为细致,在此贴一个链接直达

OneDrive / 分享 | AList文档

五、安装Emby

这一步同样没啥好说的

wget https://github.com/MediaBrowser/Emby.Releases/releases/download/4.6.4.0/emby-server-deb_4.6.4.0_amd64.deb
#下载Emby
dpkg -i emby-server-deb_4.6.4.0_amd64.deb
#安装Emby

这里的Emby版本为4.6.4.0,请根据个人需要选择版本

安装完成后就可以通过http://你的ip:8096来进入Emby了

Emby的配置在这里不做介绍,媒体库的路径使用Rclone挂载的路径即可

至此,如果你的服务器流量够多带宽够大不怕用,到这里就可以收手了

六、配置直链播放

这里使用 bpking1/embyExternalUrl: some emby/jellyfin scripts 中的emby2alist来配置直链播放

个人建议是在 Release v0.4.5 · bpking1/embyExternalUrl 中下载到本地进行编辑,因为可能会由于未知原因改无数次(

首先我建议将docker文件夹里的docker-compose.yml里你用不上的东西全删了,虽然有注释(

然后进入/nginx/conf.d文件夹,找到constant.js

需要修改的内容均有注释作为提示

Emby api key则在Emby设置-高级中可以找到并配置

挂载目录困惑了我很长时间,按照注释的提示比如你的onedrive挂载在/mnt/onedrive,则填写/mnt,但我在这里改了3天也没改出来直链播放的效果,但我将这个路径修改为在Emby中挂载的路径居然成功了,感觉很奇怪网上也没人介绍XD,初步推测是我的OneDrive内还有其他路径(?),如果你的资源都放在根目录可能不会遇到这种问题

从constant.js文件的抬头我们可以看到,还需要修改/config中的constant-mount.js文件,这里是配置你的Alist信息的。照着填就好

将改好后的文件夹整个扔到你的小鸡上,进入docker文件夹直接

docker compose up -d 要是不好使就是docker-compose up -d

配置完成,此时访问http://你的ip:8091来访问你的Emby

七、Test

可以在浏览器上安装IPvFoo插件,这个插件可以直接看到你当前正在访问的地址,随便找一部片子放一放,观察一下链接中有没有你的OneDrive

八、配个域名

本人本来就不会nginx,加了emby2alist之后更不会了,但是我的域名都是托管在Cloudflare的,这里直接用Cloudflare的Zerotrust来配置域名

这里就不再赘述了,直接贴一个别人写好的链接 Cloudflare Zero Trust:Cloudflare Tunnel使用教程 - 资源荟萃 - LINUX DO

Enjoy!


评论