如何优雅地管理自己的小电影
⭕未满 18 岁请勿阅读!!
废话少说直接进入正题,本文采用的是用 AV Data Capture + Plex
的方案。
?建议在 Debian 10
或Ubuntu 20.04
上进行。
?所有形如 [foobar]
的均需要你自己替换成正确的路径。
元数据
元数据 (metadata)
即影片信息:如影片封面 / 影片标题 / 发行时间 / 影片简介 / 制作公司 / 演员表 /Staff 表。
越是完善的 元数据
,导入 Plex/Emby 等本地媒体库后就越是美观便利。
就像这样:
而 Plex 自带的刮削器,或者即使使用第三方的,都功能不够完整,所以我推荐先将元数据刮削好,存入 .nfo
文件中,直接导入 Plex 中。
AV Data Capture
大多数情况下我们的小电影都存在 Google Drive 中,所以可以用 rclone
挂载,然后进行刮削。
将项目克隆到本地(自行安装 Git)
我使用的是 Python 源码版。
git clone https://github.com/yoshiko2/AV_Data_Capture
安装依赖:
cd AV_Data_Capture && pip3 install -r requirements.txt
rclone 挂载 Google Drive:
安装rclone
:
curl https://rclone.org/install.sh | sudo bash
挂载 Google Drive:
建议先申请自己的 client_id
和client_secret
,因为挂载 IO 是需要大量请求的,具体流程可以参考 该文章 ,并且完成rclone config
的配置。
然后进入 AV Data Capture 的目录并挂载。
apt install fuse -y && cd AV_Data_Capture && mkdir gd rclone mount [DriveName]:[Folder] gd \ --umask 0000 \ --default-permissions \ --allow-non-empty \ --allow-other \ --transfers 4 \ --buffer-size 32M \ --low-level-retries 200 \ --dir-cache-time 12h \ --vfs-read-chunk-size 32M \ --vfs-read-chunk-size-limit 1G &
?此处出现以及之后所有的 [DriveName]
和[Folder]
须替换为 需要刮削的的网盘名
和文件夹路径
。
刮削元数据
注意要修改 config.ini
文件:
[common] main_mode=1 failed_output_folder=gd/failed success_output_folder=gd/JAV_output soft_link=0 failed_move=1 auto_exit=1 transalte_to_sc=0 [proxy] switch=0 type=http proxy=127.0.0.1:1080 timeout=5 retry=3 cacert_file= [Name_Rule] location_rule=year+'/'+actor+'/'+number naming_rule='['+number+']'+title max_title_len= 50 [update] update_check=1 [priority] website=airav,javbus,javdb,fanza,xcity,mgstage,fc2,avsox,jav321,javlib,dlsite [escape] literals=\()/ folders=gd/failed,gd/JAV_output [debug_mode] switch=0 [transalte] switch=0 engine=google-free key= delay=1 values=title,outline [trailer] switch=0 [uncensored] uncensored_prefix=S2M,BT,LAF,SMD [media] media_type=.mp4,.avi,.rmvb,.wmv,.mov,.mkv,.flv,.ts,.webm,.iso sub_type=.smi,.srt,.idx,.sub,.sup,.psb,.ssa,.ass,.txt,.usf,.xss,.ssf,.rt,.lrc,.sbv,.vtt,.ttml [watermark] switch=1 water=2 [extrafanart] switch=0 extrafanart_folder=extrafanart
开始在后台整理:
apt install screen -y && screen -S AV python3 AV_Data_Capture.py
接下来就只用慢慢的等他刮削好,刮削成功的片就会在 JAV_output
目录下,并按照演员归类好。
CTRL+A+D
可以退出该窗口,直接关闭也可以;screen -r AV
回到该窗口。
如果刮削完想要卸载之前挂载的文件夹,可以用如下命令:
fusermount -uz gd
进阶步骤(可选)
验证刮削好的影片的完整性
这里我用到了 rclone tree
来生成文件树,建议在服务器上执行以下命令:
rclone tree [DriveName]:[Folder]/JAV_output > tmp.txt
安装 PyYAML
库:
pip3 install PyYAML
然后用以下 Python
脚本来提取出我们需要的信息:
import re import yaml with open('tmp.txt', 'r', encoding='UTF-8') as f: tmp = f.readlines() av_dict = {} for t in tmp: matched = re.match(r'.* ([0-9a-zA-Z]+(?:-[0-9a-zA-Z]+)?)\n.+\.\w{2,4}', t) if matched: t = matched.group(1) fh = str(t).upper() av_dict.setdefault(fh, []) else: matched = re.match(r'.* ((FC2-[0-9]+|[0-9a-zA-Z]+(?:-[0-9a-zA-Z]{2,4})?)(?:-fanart\.\w{2,4}|-poster\.\w{2,4}|-thumb\.\w{2,4}|\.\w{2,4}|-.+?\.\w{2,4})$)', t) if matched: t = matched.groups() fh = str(t[1]).upper() av_dict.setdefault(fh, []) av_dict[fh].append(t[0]) with open('Extra.yaml', 'w') as f: yaml.dump(av_dict, f, encoding='UTF-8')
这样就会以
Number: - file1 - file2 - file3 - file4 - file5
的形式将文件结构储存到 Extra.yaml
文件中。
然后再用以下 Python
脚本来进行文件验证:
import re import yaml def load(file): with open(file, 'r', encoding='UTF-8') as f: a = yaml.safe_load(f) a_lower = {} for k, v in a.items(): a_lower[str(k).lower()] = v return a_lower def val(ad = {}, al = {}): a_list = [] ignore = [] ignore = [ str(x).lower() for x in ignore ] for l in ad: try: if len(ad[l]) < 5 and l.lower() not in ignore: print(l, 'Lack things!') else: flag = True for a in ad[l]: if re.search(r'.*\.(mp4|avi|rmvb|wmv|mov|mkv|flv|ts|webm)', str(a).lower()): flag = False if flag: print(l, 'No video!') if l in a_list: print(l, 'Duplicate!') else: a_list.append(l) if al: if l in al: print(l, 'Existed!') except: print(l, 'Error!') def export(file, a = {}): with open(file, 'w') as f: f.writelines([ x + '\n' for x in a.keys()]) # t = load('tmp.yaml') a = load('Extra.yaml') # val(t) val(a) # val(t, a) export('existed.txt', a)
这样就能看到文件不全的番号,并将所有番号储存进 existed.txt
文件中。
在上一次刮削的基础上进行新的刮削
我们往往不希望在转存了(大佬们的)新的影片到自己的 Google Drive 中后,还要对能在自己影片库找到的影片进行二次刮削,所以我们就用到了 existed.txt
文件,这也是为什么我要用源码版。
修改源码:
在 AV_Data_Capture.py
文件中
create_data_and_move
函数添加:
def create_data_and_move(file_path: str, c: config.Config, existed: list): # Normalized number, eg: 111xxx-222.mp4 -> xxx-222.mp4 n_number = get_number(file_path) if n_number.lower() in existed: print('Existed!') return ...
并将主函数中使用该函数的位置改成:
create_data_and_move(movie_path, conf, existed_list)
- 传参函数
argparse_function
添加:
parser.add_argument("-e", "--existed", default='existed.txt', nargs='?', help="The file Path of the list of existed videos.")
这样我们就能很方便的使用 existed.txt
文件:
python3 AV_Data_Capture.py -e existed.txt
PlexDrive 挂载
首先挂载刮削好的文件夹,推荐用PlexDrive
,针对于流媒体专门进行了优化。
使用起来很简单,是一个二进制文件,先在 Release 中下载并解压,然后挂载即可:
# 首先要安装 fuse apt install fuse -y ./plexdrive mount [DstFolder] \ -c /root/.config/plexdrive -o allow_other,max_readahead=131072 -v 3 \ --cache-file=/root/.config/plexdrive/cache.bolt \ --chunk-size=10M --max-chunks=8 \ --root-node-id=ROOT_ID \ --umask=000
?此处出现以及之后所有的 [DstFolder]
须替换为 需要挂载至的本地文件夹路径
。
❗注意:
- 使用团队盘时务必加上
--drive-id=DRIVE_IDDRIVE_ID
,ROOT_ID
为需要挂载的 Google Drive 文件夹的 ID,具体可参考项目Readme。 client_id
和client_secret
可以使用上个步骤申请的。- 在后台运行可以用
nohup
等,建议使用systemd
管理,在下一个步骤进行。
等待缓存结束后先断开PlexDrive
。
Plex 导入
Plex 建议用Docker
版:
Docker
和 Docker Compose
的安装可参考 该文档。
version: "2.1" services: plex: image: linuxserver/plex container_name: plex network_mode: host environment: - PUID=1000 - PGID=1000 - VERSION=docker - UMASK_SET=000 volumes: - [config]:/config - [DstFolder]:/tv restart: always
?此处出现以及之后所有的 [config]
须替换为Plex 保存配置的文件夹
。
保存上述到文件 docker-compose.yml
并执行docker-compose up -d
。
由于 Plex 初次启动只有在同一个子网下才能发现,如果是在 VPS 上搭建的,需要先连接到该子网下:
- 在你的本地电脑下:
ssh [email protected]_IP -p SSH_PORT -L 8888:localhost:32400
- 浏览器中打开
http://localhost:8888/web
进行进一步设置。 - Plex 需要安装
XBMCnfoMoviesImporter
插件,将 项目 下载下来,解压并重命名文件夹为XBMCnfoMoviesImporter.bundle
, 然后放在config/Library/Application Support/Plex Media Server/Plug-ins
文件夹中即可,记得重启 Plex。
PlexDrive 开机自动挂载
创建文件/etc/systemd/system/plexdrive.service
,写入如下内容:
[Unit] Description=PlexDrive AssertPathIsDirectory=[DstFolder] Wants=network-online.target After=network-online.target [Service] Type=simple ExecStart=[plexdrive] mount [DstFolder] -c /root/.config/plexdrive -o allow_other,max_readahead=131072 -v 3 --cache-file=/root/.config/plexdrive/cache.bolt --chunk-size=10M --max-chunks=8 --root-node-id=ROOT_ID --umask=000 ExecStartPost=[docker] restart plex ExecStop=[fusermount] -uz [DstFolder] ExecReload=[fusermount] -uz [DstFolder] && [plexdrive] mount [DstFolder] -c /root/.config/plexdrive -o allow_other,max_readahead=131072 -v 3 --cache-file=/root/.config/plexdrive/cache.bolt --chunk-size=10M --max-chunks=8 --root-node-id=ROOT_ID --umask=000 Restart=on-abort [Install] WantedBy=default.target
?此处出现的 [plexdrive]
、[docker]
和[fusermount]
最好替换为 二进制文件所在的位置
,可以用whereis
查看;其他同上。
❗注意:如果 CPU 或内存占用过高,可以根据 该 Issue调整。
然后启用服务:
sudo systemctl daemon-reload sudo systemctl start plexdrive.service sudo systemctl enable plexdrive.service
最后在 Plex 添加资料库,并等待其扫描完文件,就能愉快的玩耍啦~
最终的效果图如下:
本文章的方案可以搭建在一台配置一般但是速度快的 VPS 上,因为 Plex 现在已经支持本地解码,不需要服务端来进行解码。
同时要注意如果你的影片过多,Plex 会产生较大的文件,建议预留 40G 以上的空间,或者根据 此文章 进行改进。