Featured image of post 如何优雅的打造个人影音库

如何优雅的打造个人影音库

总结从下载+整理+观看+备份一条龙自动化看番

前言

在21年,我写过一篇《如何优雅的看番》,当时只是简单的介绍了一下下载和播放用的软件,顺便再介绍了一下补帧。但随着时间的推移,原先的那套方法早已陈旧了。正好最近有些空闲时间,把目前我使用的追/补番流程记录一下。

目前使用到的软件有以下:

通过这些软件,可以实现:

  • 自动追更+下载+整理
  • 随处播放,记录播放历史
  • 拥有精美的UI和海报墙,看着很爽
  • 自动同步播放记录

下面就依次介绍这些软件的功能与安装设置步骤,为了便于管理,我都是采用Docker进行安装。

个人媒体库——Emby

Emby是一款优秀的媒体服务器软件,致力于为用户提供丰富的多媒体体验。通过Emby,您可以方便地在家庭内的各种设备上观看您喜爱的电影、电视剧和其他视频内容。而且,Emby还具备强大的媒体管理功能,让您的影视资源井然有序,随时随地畅享观影乐趣。

首先要搭建的就是Emby,只要有NAS的用户都应该听过它的大名,用来管理本地的影音数据再合适不过了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
docker run -d \
    --name emby \
    --restart unless-stopped \
    --stop-timeout 30 \
    -p 8096:8096 \
    -p 8920:8920 \
    -v /var/opt/emby:/config \
    -v /mnt/luoboPool/public:/data \
    --device=/dev/dri \
    -e PUID=0 \
    -e PGID=0 \
    -e TZ=Asia/Shanghai \
    amilys/embyserver:4.9.0.46

这里我没有选用官方的镜像,而是使用amilys大佬做的整合版,里面内置了一些插件还是比较好用的。这里我指定了4.9.0.46版本是因为神医助手这个插件不再继续适配最新测试版了,所以就停在这个版本了。

接下来就是安装和配置相关的插件,amilys大佬使用了一个扩展脚本,所以我们就可以修改其来实现配置docker/emby/config/ext.sh

 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
#!/bin/sh

######## 说明 2023-07-30 ########
#一个sh脚本,容器每次启动时运行
#方便自定义添加功能
#################################


echo "Emby扩展启动脚本"

#去掉下行注释可以关闭次脚本
#exit 0

########下面可以自行添加功能########

## 修改容器hosts

#echo -e "13.226.210.20     api.themoviedb.org" >> /etc/hosts
#echo -e "13.225.142.99     api4.thetvdb.com" >> /etc/hosts

## Emby-crx 美化 媒体库ID为空时不启用

## 媒体库id,用逗号分隔。进入媒体库后url里的parentId
## MediaId="21466,21463"
MediaId="239"
sed -i "s/this\.parentId = \"\";/this\.parentId = \"$MediaId\";/" /system/dashboard-ui/emby-crx/config.js

## 扩展插件: 
# embyLaunchPotplayer 外部播放
# ede.user 弹幕
# actorPlus 未知演员隐藏
extmod='["embyLaunchPotplayer","actorPlus"]'

sed -i '/\ extmod/s/\[.*\]/'$extmod'/g' /system/dashboard-ui/ext.js

# 修改弹幕插件
sed -i 's#<script src="danmaku.min.js"></script>#<script src="https://cdn.jsdelivr.net/gh/chen3861229/dd-danmaku@gh-pages/ede.user.js" charset="utf-8"></script>#g' /system/dashboard-ui/index.html

exit 0

相较于原始脚本,我将弹幕脚本修改为chen3861229大佬继续维护的版本dd-danmaku

其次,我为emby-erx美化插件指定了媒体库,并修复了配置脚本没有工作的问题,最终的效果如下:

emby首页

emby首页

可以看到海报墙还是非常赏心悦目的。

关于如何创建媒体库之类的Emby设置网上已经有很多相关的教程了,我这里就不再赘述了,就只写一下和网上配置不一样的地方吧。

  • 首选图像下载语言这里设置为空,然后在神医助手里开启原语言海报,这样下载的海报就是日文原版的,看起来更舒服。
  • 媒体库可以自己用PS设计一个封面,看起来会更加醒目。

对于客户端的选择,根据我的使用体验来看,目前使用体验比较好的是:

  • PC:小雅优化的官方PC客户端
  • Android:Yampy
  • TV:amilys优化的官方TV客户端,对于部分有子集化的字幕(这个后面会介绍)使用Kodi+emby官方插件

Emby默认的元数据来源为The Movie Database (TMDB),已经满足95%的刮削需求了。但是,有些资源还是找不到,这时就可以从Bangumi 番组计划上获取了。

这里就需要使用jellyfin-plugin-bangumi插件了,虽然是为jellyfin编写的,但是作者也为Emby做了适配。

1
sudo curl -L -o /var/opt/emby/plugins/Emby.Plugin.Bangumi.dll https://github.com/kookxiang/jellyfin-plugin-bangumi/releases/download/1.7.1/Emby.Plugin.Bangumi.dll

直接将其下载到之前配置好的Emby配置目录里并重启即可使用了。

除了元数据获取,它还可以在播放完成后自动点格子,还是非常方便的。

下载三件套——Ani-rss、qBittorrent、PeerBanHelper

有了媒体库,下面需要的就是如何将网上的资源下载进来了。这里我使用的是wushuo894大佬编写的Ani-rss,可以自动检测蜜柑计划的更新并下载,同时还有重命名以及洗版功能。种子下载则是qBittorrent。PeerBanHelper则是为了避免被吸血。由于这三个工具是一起使用的,所以我直接写了个docker compose来一键启动:

 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
47
48
49
50
51
52
53
54
55
56
57
58
name: bt-download

networks:
   qb_ipv6:
      enable_ipv6: true
      ipam:
        config:
          - subnet: 2001:db8:abc1::/64
services:
  qBittorrent:
    image: linuxserver/qbittorrent
    container_name: qBittorrent
    ports:
      - 16000:16000 #网页端口
      - 18064:18064 #下载端口
      - 18064:18064/udp
    environment:
      - PUID=1000
      - PGID=994
      - TZ=Asia/Shanghai
      - WEBUI_PORT=16000
      - TORRENTING_PORT=18064
    volumes:
      - /var/opt/qbittorrent:/config
      - /mnt/luoboPool/public:/data
      - /home/luobo/qbittorrent/VueTorrent:/VueTorrent
    restart: unless-stopped
    networks:
      - qb_ipv6

  ani-rss:
    image: wushuo894/ani-rss
    container_name: ani-rss
    ports:
      - 7789:7789
    environment:
      - PORT=7789
      - CONFIG=/config
      - TZ=Asia/Shanghai
    volumes:
      - /var/opt/ani-rss:/config
      - /mnt/luoboPool/public:/data
    restart: unless-stopped
    networks:
      - qb_ipv6

  PeerBanHelper:
    image: registry.cn-hangzhou.aliyuncs.com/ghostchu/peerbanhelper
    container_name: PeerBanHelper
    ports:
      - 9898:9898
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /var/opt/PBH:/app/data
    restart: unless-stopped
    networks:
      - qb_ipv6

记得修改qBittorrent的端口和相关的挂载路径。

我这里在配置时,启用了ipv6支持,主要是下载bt时有ipv6连接性会更好一点(也就是更快)

ani-rss

对于ani-rss的设置,我这里就写一些关键的配置

  • 保存位置:/data/番剧/${year}年${quarter}月/${title}

    这样就可以按照季度进行分类的

  • 开启自动删除仅在主RSS更新后删除备用RSS备用RSS

    这样就能开启洗版功能,可以实现先下载内嵌字幕的版本,等字幕组更新后再换回内封版本

其他的参考官方的文档就好了

这里补充一下,ani-rss是基于蜜柑计划的,而蜜柑计划主站已经被干扰了,所以可以采用自建镜像站的方法。这里我使用CloudFlare的Worker,脚本为:

 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
const TELEGRAPH_URL = 'https://mikanani.me';
const MY_DOMAIN = 'https://example.com'

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const url = new URL(request.url);
  url.host = TELEGRAPH_URL.replace(/^https?:\/\//, '');

  const modifiedRequest = new Request(url.toString(), {
    headers: request.headers,
    method: request.method,
    body: request.body,
    redirect: 'manual'
  });

  const response = await fetch(modifiedRequest);
  const contentType = response.headers.get('Content-Type') || '';

  // 如果内容类型是 RSS,才进行替换操作
  if (contentType.includes('application/xml')) {
    const text = await response.text();
    const replacedText = text.replace(/https?:\/\/mikanani\.me/g, MY_DOMAIN);
    const modifiedResponse = new Response(replacedText, response);

    // 添加允许跨域访问的响应头
    modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');

    return modifiedResponse;
  } else {
    const modifiedResponse = new Response(response.body, response);

    // 添加允许跨域访问的响应头
    modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');

    return modifiedResponse;
  }
}

qBittorrent

这里也没有什么太多需要配置的,我这里就是配置了一个第三方的WebUI——VueTorrent

下载好后在使用备用 WebUI里填写对应的路径即可。

PeerBanHelper

这个主要是为了防止在公网做种时被吸血,配置好qBittorrent连接后就可以不用管了。

字体自动子集化——fontInAss

对于新番而言,字幕组在内封字幕的时候同时也会封入字体文件,这样我们就不用操心字体的问题。但是,在收集一些老番的时候,字幕往往是外挂的,这样在没有字体的环境下就会回退到默认字体,看起来就一点也不美观。

目前,已经有一种解决方案——将字体子集化并嵌入字幕1,但是这种方式还是无法避免需要手动进行处理。为此,我找到了一个可以自动化处理的软件——fontInAss,来解决这个问题。

它的安装和配置很简单,还是一样的Docker一把梭。

1
2
3
4
5
6
docker run -d --name=fontinass --restart=unless-stopped \
  -p 8012:8012 \
  -e EMBY_SERVER_URL=http://172.17.0.1:8096 \
  -v /var/opt/fontinassData:/data \
  -v "/mnt/luoboPool/public/Downloads/超级字体整合包 XZ":/fonts/XZ \
  riderlty/fontinass:latest

这里唯一要注意的就是需要预先下载好字体的整合包,可以在这里找到。(当然让它用到时再自动下载也可以)

之后访问Emby从8012端口进入就好了。

自动备份——Rclone

这款软件也是介绍过了很多次了,用它可以很方便的将数据同步到网盘上面。

1
2
#!/bin/sh
rclone copy /mnt/luoboPool/public/番剧 sp:/番剧 --exclude-from="/home/luobo/exclude-anime.txt"

这里我加上了一个排除文件,避免传上Emby刮削后的文件。

1
2
3
4
*.nfo
*.parts
*.!qB
*.json

最后就是编写定时脚本让其每天自动更新了。这里我没有使用传统的crontab,而是另一种据说更现代的方式——systemd/Timers - ArchWiki

根据文档,我们只需要编写.service.timer文件就好了。

/etc/systemd/system/sync-to-onedrive.service

1
2
3
4
5
6
7
[Unit]
Description=Copy to onedrive

[Service]
User=luobo
Group=luobo
ExecStart=/bin/bash /home/luobo/sync.sh

/etc/systemd/system/sync-to-onedrive.timer

1
2
3
4
5
6
7
8
9
[Unit]
Description=Run sync daily

[Timer]
OnCalendar=*-*-* 4:00:00
Persistent=true

[Install]
WantedBy=timers.target

小结

整理资源真的是一件很爽的事情,特别是看到最后的海报墙以后。也是很感谢这些软件的制作者,为我省下了许多的时间。