抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

ControlNet

个人博客 << 分享一些有用的东西

之前的文章中讨论了如何在Windows上配置最佳的视频播放器用于看番,然而这个方法具有很大的局限性。这篇文章将介绍如何搭建一个更加完善的系统,为了获得真正的快乐终极看番体验。

背景

之前的文章中介绍了如何在 Windows 系统中搭建一个拥有超分辨率和插帧的视频播放器,这个能保证很强的画面效果,但是这套看番的方法依然有很多局限性。

  • 基于本地: 由于这个系统是打开本地的文件进行播放,所以当需要远程访问的时候就会有很大的问题。而且由于本地磁盘容量的限制,也只能存储有限的番剧。
  • 缺少自动化: 由于这个系统是基于 MPC-HC 的,所以没有自动化的功能,比如自动下载番剧,自动更新番剧等等。
  • 缺少番剧管理: 整个播放体验是基于 Windows 的文件系统,并没有使用一些软件来提升观看的体验,也没有类似于海报墙的东西。
  • 落后的技术: 之前基于SVP的插帧已经比较落后,和现在SoTA的RIFE[1]插帧相比,画质和效果都有很大的差距。

解决方案

为了解决以上问题,我们需要一个更加完善的系统,这个系统将会搭载在一个上24小时开机的家庭服务器上,这个服务器可以是NAS,也可是软路由,或者是存算分离的Linux服务器。

考虑到不折腾,本人选择了自己DIY一个基于低功耗x86平台的NAS。考虑到折腾软路由可能会让网络没那么稳定,就没有打算在这套系统里使用软路由。家里现在是一台ASUS的硬路由,一台NAS,一台高性能的Linux服务器用于游戏服务器和爬虫脚本等等,然后是一台台式机用于日常游戏和学习。这样的设计是为了让每个设备都有自己的用途,不会因为一台设备的问题导致其他设备无法使用。这篇文章主要会讨论NAS上的部署。

硬件准备

这次是购买了一台蜗牛星际B型,带一个ITX主板+赛扬J6412。到手之后,换了一个靠谱的海韵Flex电源,又插了2根8G DDR4内存,确保之后的docker和vm不会有性能瓶颈。并且把机箱风扇换成了猫扇,确保散热效果。

硬盘方面,用了一个512G的老固态做缓存池,然后是4块8TB的机械硬盘做主存储。

hardware
Fig. 1. 硬件配置, 照片拍摄于刚刚买到基础的蜗牛星际机器时,很多硬件改装还没有开始

系统选择

NAS系统现在主要是四个,黑群晖,OMV[2]TrueNAS[3]Unraid[4]

  • 黑群晖: 有很多自带软件,图形化界面对新手友好,但是感觉有点太花里胡哨了,系统的兼容性不是很好,也不方便升级,而且对存储系统的管理也很麻烦。
  • OMV: 一个基于debian的开源系统,相当于是一个debian系统+web管理界面。优势是可以很方便的进terminal进行操作,但是缺点是对文件系统用起来麻烦,而且对docker,vm的支持也不是很好。但是如果愿意折腾,OMV应该是比较强大的。还有一个是OMV的维护者感觉不是很靠谱,对这个系统的未来前景很担忧。
  • TrueNAS scale: 也是基于debian的开源系统,专门为NAS设计,有非常强大的存储系统管理,非常的专业,性能也很强。但是缺点是对docker的支持很糟糕,这个k3s用起来非常反人类。尽管这个系统可能在2024年下半年支持普通的docker,但是现在还没到时候。
  • Unraid: 一个商业系统,有很好的docker和vm支持,存储系统比较灵活,社区也很活跃。但是缺点是存储系统的性能比较差,而且还要收费。

综合考虑,自己不拿这个NAS作为热访问的存储,所以对性能需求没有那么高,只要能拖得动4K视频就行,所以最后选择了方便部署服务的Unraid。

Unraid

Unraid系统安装非常简单,买了一个U盘,然后下载Unraid的安装器,把系统安装在U盘上,然后就能用U盘引导启动了,不需要把系统安装在硬盘上。

Unraid的存储系统是基于JBOD(阵列)和Unraid(池)的。阵列是允许一系列不同大小的硬盘组合成一个大存储空间,并且用1~2块最大的硬盘用于校验,如果阵列中有少于校验盘数量的硬盘挂了,那么数据还能恢复。但是由于阵列的写入就是一块盘,而且还需要实时计算校验,所以性能比较差。而池是允许组成ZFS raid的,可以保证性能,也可以不用raid就单个盘。

Unraid本身是支持多级存储的,比如说可以用一个池来作为缓存池,然后把阵列当成主存储。这样的话,写入的时候会先写入缓存池,然后再定时把缓存池的数据写入主存储。通过这样的设计,IO性能就会提升很多。并且不用保持主存储的硬盘长时间开启,也可以节省电费。

所以,我就把512G的固态硬盘作为缓存池,然后把4块8TB的机械硬盘作为主存储(1块校验盘+3块数据盘=24TB)。这样的设计可以保证不会有IO瓶颈,也可以保证数据的安全。

除此之外,通过插件,unraid也可以在webui里把SMB/NFS之类的远程磁盘挂载到本地。比如说现在在这个Unraid NAS上挂载了一个老家的威廉通NAS。

unraid-disk
Fig. 2. Unraid的硬盘配置

这里推荐一些必装插件:

  • Dynamix Cache Directories: 可以把文件夹的metadata缓存到内存里
  • Mover Tuning: 可以调整mover从缓存池移动文件到主存储阵列的行为,比如说只移动3天前的文件,更加合理
  • Swapfile for unRAID 6.9: swap文件,不然内存容易爆。标题说是6.9,但是最新版本也可以用
  • Unassigned Devices: 用于挂载远程存储,比如说SMB/NFS,还能挂载USB设备等等
  • unbalanced: 用于在阵列中移动文件,从阵列中的一个磁盘里移动文件到另一个磁盘等等
  • User Scripts: 用于设定一些定时脚本, 比如说用rsync备份文件,或者用rclone同步文件等等

基础服务

虚拟网络

尽管有公网ipv4,但是为了避免把端口暴露在公网上,现在主要用虚拟网络来进行内网穿透。现在同时在NAS上部署里ZeroTier[5]Tailscale[6],通过route,可以让这两个虚拟网络的设备互通。

稍微画了一个不专业的网络拓扑图。

network
Fig. 3. 网络拓扑图(建议使用亮色模式观看)

文件服务

首先是aria2[7]qBittorrent[8]用于NAS上的文件下载。Aria2建议使用这个docker[9],这个docker里面包含了一些开箱即用的设置,比较方便。至于webui,可以使用AriaNg[10]。qBittorrent可以使用官方docker,然后用peerbanhelper服务[11]来ban掉吸血雷等客户端。

如果使用qb卡死,最好降低同时做种和下载的数量。

其次是文件同步,建议使用Syncthing[12],这个软件可以在不同设备之间同步文件,而且是p2p的,不需要服务器。可以用这个来同步一些文件和文件夹。

顺便提一下,用Syncthing去同步git仓库,可能会导致git仓库损坏,所以不建议这样做。

用于文件分享的话,主要用Alist[13],这个软件可以把本地的文件夹 (和网盘里的文件) 分享出去,然后可以通过webui下载文件。

用于NAS的文件管理,建议使用FileBrowser[14],这个软件可以在webui里管理文件,比如说上传文件,删除文件等等。

filebrowser
Fig. 4. FileBrowser的webui

服务访问

为了能访问NAS上数不清的服务,可以使用Homepage[15],这个软件可以把所有的服务整合到一个页面上,然后可以通过这个页面看到服务运行的情况,也可以访问所有的服务。

现在已经部署了一个Homepage,欢迎参观。https://portal.controlnet.space

另外也可以部署一个glances[16],用于监控系统的运行情况。

homepage
Fig. 5. Homepage的webui

追番自动化

没有人喜欢需要手动去找动画资源,然后手动下载手动整理的,所以需要部署一些工具让它尽可能的自动化。

首先是考虑了以下的一个工具链:

  • 蜜柑计划[17]: 一个动画资源的聚合网站,可以通过RSS订阅动画资源
  • AutoBangumi[18]: 一个追番自动化的开源工具,通过RSS订阅动画资源,然后自动调用qb下载,并且自动按照规则整理文件
  • Jellyfin[19]: 一个开源的媒体服务器,可以把本地的动画资源刮削好,并且通过web或者别的客户端访问

蜜柑计划和 AutoBangumi 都是基于bangumi的元数据,其中蜜柑计划会完全采用和bangumi一样的动画标题来整理BT种子,另外蜜柑计划也会根据字幕组/压制组进行分类。这些种子都会作为RSS进行广播。在蜜柑计划中,可以注册账号,然后订阅自己感兴趣的番剧,然后这些番剧将会被聚合到一个RSS订阅中。

AutoBangumi 有两种使用方式: 订阅和收集。订阅是通过观测蜜柑计划的聚合RSS订阅,然后根据规则自动下载新出现的种子,这样可以保证一直保持新番更新,而不用手动去找。收集是通过输入RSS订阅,根据规则下载全部种子,用于下载已经完结的老番。

AutoBangumi 在下载种子之后,会自动的把文件重命名为{番剧名}/Season {季}/{番剧名} S{季}E{集}.{后缀名},这样方便Jellyfin刮削。

例如,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
├── 怪人的沙拉碗
│ ├── Season 1
│ │ ├── 怪人的沙拉碗 S01E01.mp4
│ │ ├── 怪人的沙拉碗 S01E02.mp4
│ │ ├── 怪人的沙拉碗 S01E03.mp4
│ │ ├── 怪人的沙拉碗 S01E04.mp4
│ │ ├── 怪人的沙拉碗 S01E05.mp4
│ │ ├── 怪人的沙拉碗 S01E06.mp4
│ │ ├── 怪人的沙拉碗 S01E07.mp4
│ │ ├── 怪人的沙拉碗 S01E08.mp4
│ │ ├── 怪人的沙拉碗 S01E09.mp4
│ │ ├── 怪人的沙拉碗 S01E10.mp4
│ │ ├── 怪人的沙拉碗 S01E11.mp4
│ │ ├── 怪人的沙拉碗 S01E12.mp4

媒体服务器考虑了plex[20], emby[21]Jellyfin。plex和emby的收费内容很多,体验很差。只有Jellyfin是免费开源的,而且生态也很强大,所以选择了Jellyfin。Jellyfin可以通过webui来管理媒体库,也可以通过客户端来观看。

Jellyfin有一个bangumi插件[22],可以通过bangumi的API来刮削动画的元数据,因为下载的时候是根据bangumi的元数据下载的,所以通过这个方式可以保证绝大多数动画被刮削到Jellyfin里。但是bangumi的元数据相比于TMDB[23]TVDB[24]来说还是有很多问题,比如说对不同季之间的合并做的很差。而且bangumi没有除了封面之外的图片,比如说背景图,logo等等。

所以最后用tinyMediaManager[25]手动进行元数据匹配来兜底。一般情况下,刮削好元数据之后,视频文件夹就会像以下这样,以后如果用别的播放器或者媒体服务器打开,也能确保一样的元数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
├── 怪人的沙拉碗
│ ├── Season 1
│ │ ├── folder.jpg
│ │ ├── metadata
│ │ │ ├── 怪人的沙拉碗 S01E01.jpg
│ │ │ ├── 怪人的沙拉碗 S01E02.jpg
│ │ │ ├── 怪人的沙拉碗 S01E03.jpg
│ │ │ ├── 怪人的沙拉碗 S01E04.jpg
│ │ │ ├── 怪人的沙拉碗 S01E05.jpg
│ │ │ ├── 怪人的沙拉碗 S01E06.jpg
│ │ │ ├── 怪人的沙拉碗 S01E07.jpg
│ │ │ ├── 怪人的沙拉碗 S01E08.jpg
│ │ │ ├── 怪人的沙拉碗 S01E09.jpg
│ │ │ └── 怪人的沙拉碗 S01E10.jpg
│ │ │ └── 怪人的沙拉碗 S01E11.jpg
│ │ │ └── 怪人的沙拉碗 S01E12.jpg
│ │ ├── season.nfo
│ │ ├── 怪人的沙拉碗 S01E01.mp4
│ │ ├── 怪人的沙拉碗 S01E01.nfo
│ │ ├── 怪人的沙拉碗 S01E02.mp4
│ │ ├── 怪人的沙拉碗 S01E02.nfo
│ │ ├── 怪人的沙拉碗 S01E03.mp4
│ │ ├── 怪人的沙拉碗 S01E03.nfo
│ │ ├── 怪人的沙拉碗 S01E04.mp4
│ │ ├── 怪人的沙拉碗 S01E04.nfo
│ │ ├── 怪人的沙拉碗 S01E05.mp4
│ │ ├── 怪人的沙拉碗 S01E05.nfo
│ │ ├── 怪人的沙拉碗 S01E06.mp4
│ │ ├── 怪人的沙拉碗 S01E06.nfo
│ │ ├── 怪人的沙拉碗 S01E07.mp4
│ │ ├── 怪人的沙拉碗 S01E07.nfo
│ │ ├── 怪人的沙拉碗 S01E08.mp4
│ │ ├── 怪人的沙拉碗 S01E08.nfo
│ │ ├── 怪人的沙拉碗 S01E09.mp4
│ │ ├── 怪人的沙拉碗 S01E09.nfo
│ │ ├── 怪人的沙拉碗 S01E10.mp4
│ │ ├── 怪人的沙拉碗 S01E10.nfo
│ │ ├── 怪人的沙拉碗 S01E11.mp4
│ │ ├── 怪人的沙拉碗 S01E11.nfo
│ │ ├── 怪人的沙拉碗 S01E12.mp4
│ │ └── 怪人的沙拉碗 S01E12.nfo
│ ├── backdrop.jpg
│ ├── clearlogo.png
│ ├── fanart.jpg
│ ├── folder.jpg
│ └── tvshow.nfo

jellyfin
Fig. 6. Jellyfin的番剧元数据界面

除了动画之外的影视剧

有些时候除了动画番剧之外,也想看下电影和美剧。这时候用 Servarr[26] 全套来做自动化就很方便了,反而日本动画因为格式不统一且高度以来字幕组,导致用这套系统效果很差,但是对西方的电影和美剧就很好。

这套系统包括了

  • 请求电影和美剧下载的前端 Jellyseerr[27]
  • 自动搜索并下载电影的自动化后端 Radarr[28], 用于美剧的 Sonarr[29]
  • 用于给自动化后端提供 indexer 的 Prowlarr[30]
  • 用于给自动化后端作为下载工具的 Aria2 和 qBittorrent。

在 Jellyseerr 中,需要设置好 Radarr 和 Sonarr 的 API key,然后就可以通过 Jellyseerr 来搜索电影和美剧,然后自动下载。

jellyseerr-ui
Fig. 7. 在Jelyyseerr中可以订阅几乎任何的电影或电视剧

但是想要做到自动化,需要在 Jellyseerr, Radarr, Sonarr 和 Prowlarr 中设置好 indexer 和下载工具,这样才能保证自动化的流程。

用这套系统去自动化动画下载是很困难的,因为动画的资源很杂,而且不同字幕组之间的格式也很不同,元数据很混乱。动画自动化只建议使用AutoBangumi。

jellyseerr
Fig. 8. Jellyseerr中设置Radarr和Sonarr服务器

prowlarr1
prowlarr2
Fig. 9. Prowlarr中订阅indexer,并设定Radarr和Sonarr服务器

radarr1
radarr2
Fig. 10. Radarr中设置媒体库和下载工具 (Sonarr略)

这样,在 Jellyseerr 请求电影和美剧之后,就可以在 Radarr 和 Sonarr 中看到请求的电影和美剧,然后就可以自动下载了。然后在 Jellyfin 中就可以看到这些电影和美剧。

本地播放器

尽管可以在服务器上自动下载和整理番剧,但是依然需要通过本地的播放器软件来观看。为了使用先进的插帧和超分辨率技术,现在建议使用mpv[31]。mpv是一个开源的播放器,支持很多的插件,比如说插帧,超分辨率等等。

为了方便使用,可以使用MPV_lazy[32],这是一个mpv的整合包,里面包括了很多的插件,基本上不需要自己再另外准备什么了。这个整合包里提供了一些vs脚本,可以用于调整插帧和超分的参数,也可以自己在上面改。比如说,

1
2
3
4
5
6
7
8
9
10
# MAIN.vpy
import k7sfunc as k7f

clip = video_in
if container_fps < 60:
clip = k7f.RIFE_NV(clip, lt_d2k=True, model=46, ext_proc=False, t_tta=False, fps_in=container_fps, fps_num=2, fps_den=1, sc_mode=1, gpu=0, gpu_t=2, st_eng=False, ws_size=8)

if clip.height < 1200:
clip: Any = k7f.FMT_CTRL(clip, h_max=720, fmt_pix=0)
clip: Any = k7f.ESRGAN_NV(clip, lt_hd=True, model=5005, gpu=0, gpu_t=2, st_eng=False, ws_size=0)

这样就可以在播放的时候同时用RIFE插帧和ESRGAN超分辨率了。

其次是需要在客户端上装一个后台服务来接管jellyfin播放,这样可以在jellyfin网页上点击播放之后,自动打开mpv。这里推荐油猴插件embyToLocalPlayer[33]

总结

本文介绍了如何建立一个自动化的家庭服务器系统,用于自动化下载,管理,观看番剧和其他媒体内容。在这里分享了一些自己的经验,希望对大家有所帮助。

参考文献

  • [1] Z. Huang, T. Zhang, W. Heng, B. Shi, and S. Zhou, “Real-Time Intermediate Flow Estimation for Video Frame Interpolation,” in Proceedings of the European Conference on Computer Vision (ECCV), S. Avidan, G. Brostow, M. Cissé, G. M. Farinella, and T. Hassner, Eds., Cham: Springer Nature Switzerland, 2022, pp. 624–642. doi: 10.1007/978-3-031-19781-9_36.
  • [2] "openmediavault - The open network attached storage solution", Openmediavault, 2024. https://www.openmediavault.org/
  • [3] "TrueNAS - Welcome to the Open Source Storage Era", TrueNAS, 2024. https://www.truenas.com/
  • [4] "Unraid | Unleash Your Hardware", Unraid, 2024. https://unraid.net/
  • [5] "ZeroTier | Global Networking Solution for IoT, SD-WAN, and VPN", Zerotier, 2024. https://zerotier.com/
  • [6] "Tailscale · Best VPN Service for Secure Networks", Tailscale, 2024. https://tailscale.com/
  • [7] "aria2", Aria2, 2024. https://aria2.github.io/
  • [8] "qBittorrent Official Website", Qbittorrent, 2024. https://www.qbittorrent.org/
  • [9] "P3TERX/Aria2-Pro-Docker", GitHub, 2024. https://github.com/P3TERX/Aria2-Pro-Docker
  • [10] "mayswind/AriaNg", GitHub, 2024. https://github.com/mayswind/AriaNg
  • [11] "PBH-BTN/PeerBanHelper", GitHub, 2024. https://github.com/PBH-BTN/PeerBanHelper
  • [12] "Syncthing", Syncthing, 2024. https://syncthing.net/
  • [13] "Home | AList Docs", Alist, 2024. https://alist.nn.ci/
  • [14] "Welcome | File Browser", File Browser, 2024. https://filebrowser.org/
  • [15] "Home - homepage", Homepage, 2024. https://gethomepage.dev/latest/
  • [16] "nicolargo/glances", GitHub, 2024. https://github.com/nicolargo/glances
  • [17] "蜜柑计划 - Mikan Project", Mikan Project, 2024. https://mikanani.me/
  • [18] "AutoBangumi | 自动追番,解放双手!", Autobangumi, 2024. https://www.autobangumi.org/
  • [19] "The Free Software Media System | Jellyfin", Jellyfin, 2024. https://jellyfin.org/
  • [20] "Stream Movies & TV Shows | Plex", Plex, 2024. https://www.plex.tv/
  • [21] "Emby - The open media solution", Emby, 2024. https://emby.media/
  • [22] "kookxiang/jellyfin-plugin-bangumi", GitHub, 2024. https://github.com/kookxiang/jellyfin-plugin-bangumi
  • [23] "The Movie Database (TMDB)", Themoviedb, 2024. https://www.themoviedb.org/
  • [24] "Welcome - TheTVDB.com", Thetvdb, 2024. https://www.thetvdb.com/
  • [25] "tinyMediaManager", tinyMediaManager, 2024. https://www.tinymediamanager.org/
  • [26] "Servarr | Servarr Wiki", Servarr, 2024. https://wiki.servarr.com/
  • [27] "Fallenbagel/jellyseerr", GitHub, 2024. https://github.com/Fallenbagel/jellyseerr
  • [28] "Radarr", Radarr, 2024. https://radarr.video/
  • [29] "Sonarr - Dive in", Sonarr, 2024. https://sonarr.tv/
  • [30] "Prowlarr", Prowlarr, 2024. https://prowlarr.com/
  • [31] "mpv.io", mpv, 2024. https://mpv.io/
  • [32] "hooke007/MPV_lazy", GitHub, 2024. https://github.com/hooke007/MPV_lazy
  • [33] "embyToLocalPlayer", GreasyFork, 2024. https://greasyfork.org/zh-CN/scripts/448648-embytolocalplayer

评论