Emby N+1(自动入库新番、直链、AList、单点认证......) 最终解决方案

最近给某个群内搭建了 Emby 媒体服务器作为群服务提供,中间因为各种原因踩了大大小小的坑,最后才有了这篇文章。

注意:此文章随时可能更新,文中用到的软件可能随时更新,因此配置文件可能过时。

为什么是 Emby

原因很简单:相较于 Jellyfin 和其竞品、Emby 的界面和体验都处于第一梯队的水平,且也有相当多的相关插件 / 第三方客户端。

但是其也不可避免的存在以下缺陷:

  • 价格偏贵:尽管存在开心版,但也只能解锁一部分功能,一些插件相关的功能(如 PodCast、TVLive 等)仍然无法使用。月付 4.99 USD,年付 54 USD,永久 119(黑五期间 99)USD。
  • 闭源问题:Emby 和 Jellyfin 早期有说不清道不明的关系,但是在后来分道扬镳,转为了闭源软件。
  • 功能偏少:Emby 的插件丰富度不如 Jellyfin。

但即便如此,由于 Emby 在多用户管理等多个方面仍然好于其他软件,因此最终敲定了 Emby 作为媒体库的系统。

搭建目标

由于目标较多,因此文章会分为以下几个部分

  • AList + 网盘挂载
  • ANI-RSS 实现自动入库新番
  • AutoFilm 自动生成 strm 文件供 Emby 刮削
  • 部署 Emby 服务端
  • MediaWarp + Emby 向客户端返回网盘直链作为播放链接
  • Bangumi 插件刮削番剧和多季番剧的元数据设置
  • Authentik + LDAP 插件实现统一身份认证

大致流程

AList + 网盘挂载

实现流程图

部署 AList

参考 AList 官方文档自行部署。

Docker Compose 文件参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3.3'
services:
alist:
image: 'xhofe/alist:beta'
container_name: alist
volumes:
- '/etc/alist:/opt/alist/data'
ports:
- '5244:5244'
environment:
- PUID=0
- PGID=0
- UMASK=022
restart: unless-stopped

挂载网盘

假设我已经分别挂载了天翼云盘和 OneDrive,且他们都有 bangumi 这个文件夹。

那么我们可以使用别名功能,选择添加存储 - 别名,设置挂载路径为 /bangumi开启启用签名、关闭保护重名

在路径中填写:

1
2
/天翼云盘/bangumi
/OneDrive/bangumi

随后,这两个文件夹中的内容都会显示在 /bangumi 目录下。

为什么要用别名
假设我在不同网盘都存放了视频,但是一个个分别挂载太过麻烦,这时候别名功能就能让你把多个网盘的文件汇总在同一个文件夹下。

ANI-RSS 实现自动入库新番

实现流程图

部署 ANI-RSS 和 qBittorrent

参考 ANI-RSS 官方文档ANI-RSS:自动追番新姿势! - 初之音 部署。

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
version: "3"
services:
ani-rss:
image: wushuo894/ani-rss
container_name: ani-rss
environment:
- PORT=7789 # ani-rss 端口
- CONFIG=/config
- TZ=Asia/Shanghai
volumes:
- /volume1/docker/ani-rss/config:/config
- /volume2/wushuo/Media:/Media # 番剧挂载路径两侧须一致
restart: always
network_mode: host
qBittorrent:
image: linuxserver/qbittorrent
container_name: qBittorrent
environment:
- PUID=0
- PGID=0
- WEBUI_PORT=8080 # qBittorrent 端口
- TZ=Asia/Shanghai
volumes:
- /volume1/docker/qBittorrent/config:/config
- /volume2/wushuo/downloads:/downloads
- /volume2/wushuo/Media:/Media # 番剧挂载路径两侧须一致
restart: always
network_mode: host

ASS 的默认账户密码均为 admin,初次启动时 qBittorrent 会为 admin 用户生成一个随机密码,请查看日志获取初始密码。

配置自动上传至 AList

打开 ANI-RSS,选择设置 - 下载设置 - Alist,分别填入 AlistHostAlistTokenAlistPath,并且将开关打开。

AlistHost:AList 的访问链接(建议内网,HTTPS 端口请填写 alist.example:443)。
AlistToken:打开 AList 管理界面,选择设置 - 其他,填入令牌。
AlistPath:你的上传目录(不能是别名!只能填写真实目录!)。

随后,订阅的番剧都会自动上传一份至网盘,你只需要定期清理 ANI-RSS 下载到硬盘的番剧即可(删除订阅不会删除已经上传的文件)

AutoFilm 自动生成 strm 文件供 Emby 刮削

实现流程图

部署 AutoFilm

参考 AutoFilm说明文档 | 秋澪的博客 部署。

Docker Compose 文件参考如下:

1
2
3
4
5
6
7
8
9
10
version: '3.1'
services:
autofilm:
restart: always
volumes:
- ./autofilm_config:/config # AutoFilm 配置文件存放位置
- ./media:/media # .strm 文件存放位置
- ./autofilm_logs:/logs # AutoFilm 日志存放位置
container_name: autofilm
image: akimio/autofilm:latest

./autofilm_config/config.yaml 写入以下配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Settings:
DEV: False # 开发者模式(可选,默认 False)

Alist2StrmList:
- id: 动漫 # 标识 ID
cron: 0 * * * * # 后台定时任务 Crontable 表达式
url: http://alist:5244 # Alist 服务器地址
username: alist # Alist 用户名
password: alist # Alist 密码
# token: alist-d22d23ddf42fvv2 # Alist Token 永久令牌(可选,使用永久令牌则无需设置账号密码)
source_dir: /bangumi/ # Alist 服务器上文件夹路径
target_dir: /media/bangumi/ # 输出路径
flatten_mode: False # 平铺模式,开启后 subtitle、image、nfo 强制关闭(可选,默认 False)
subtitle: True # 是否下载字幕文件(可选,默认 False)
image: False # 是否下载图片文件(可选,默认 False)
nfo: False # 是否下载 .nfo 文件(可选,默认 False)
raw_url: False # 是否使用原始地址替换 Alist 服务器下载地址(可选,默认 False)
overwrite: False # 覆盖模式,本地路径存在同名文件时是否重新生成/下载该文件(可选,默认 False)
sync_server: True # 是否同步服务器(可选,默认为 True)
sync_ignore: \.(nfo|jpg)$ # 同步时忽略的文件正则表达式(可选,默认为空,仅对文件名及拓展名有效,对路径无效)
max_workers: 2 # 下载文件最大并发数(可选,默认 5)
max_downloaders: 2 # 下载文件最大并发数(可选,默认 5)
mode: AlistPath # 下载模式(可选项:AlistPath、AlistFile、AlistList,默认 AlistPath)

需要注意的点:

  • mode 请填写 AlistPath,因为可以配合下面的 MediaWarp 使用
  • cron 不能填写 * * * * *,所以你不能一分钟刷新一次。

随后,定时任务执行后,./media 文件夹下应当已经生成了 .strm 文件。

部署 Emby 服务端

没什么好废话的,Docker Compose 一把梭:

1
2
3
4
5
6
7
8
9
10
version: '3.1'
emby:
image: emby/embyserver:beta
container_name: emby
volumes:
- ./data:/config # 持久化配置文件
- ./media:/media # 持久化媒体文件
restart: unless-stopped # 当容器停止时除非手动停止,自动重启
ports:
- 8096:8096 # Emby 默认端口

需要注意,这里镜像需要选择 beta,因为下面的 Bangumi 插件和最新稳定版不兼容。

MediaWarp 向客户端返回网盘直链作为播放链接

MediaWarp 是前置于 EmbyServer 的 反向代理服务器,修改了原版 EmbyServer 的 API 返回内容以实现特殊功能。

实现流程图

部署 MediaWarp

参考 MediaWarp说明文档 | 秋澪的博客 部署。

Docker Compose 文件参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
version: '3.1'
services:
mediawarp:
image: akimio/mediawarp:latest
container_name: mediawarp
restart: unless-stopped
volumes:
- ./mediawarp_config:/config
- ./mediawarp_logs:/logs
- ./static:/static
ports:
- 9000:9000

./autofilm_config/config.yaml 写入以下配置文件:

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
59
60
61
62
63
64
65
66
67
68
69
70
71
Port: 9000                                  # MideWarp监听端口

MediaServer: # 媒体服务器相关设置
Type: Emby # 媒体服务器类型(可选选项:Emby)
ADDR: http://emby:8096 # 媒体服务器地址
AUTH: authkey # 媒体服务器认证方式

Cache: # 缓存设置
Type: Memory # 缓存类型(可选项:Memory内存缓存)
WebCache: False # 是否启用Web缓存中间件(若MdiaWarp离上游服务距离较近则不建议启用)

Logger: # 日志设定
AccessLogger: # 访问日志设定
Console: True # 是否将访问日志文件输出到终端中
File: False # 是否将访问日志文件记录到文件中
ServiceLogger: # 服务日志设定
Console: True # 是否将服务日志文件输出到终端中
File: True # 是否将服务日志文件记录到文件中

Web: # Web页面修改相关设置
Enable: True # 总开关
Custom: True # 是否加载自定义静态资源
Index: false # 是否从static目录读取index.html文件
Head: | # 是否添加自定义字段到index.html的HEAD中
<script src="/MediaWarp/static/custom/emby-front-end-mod/actor-plus.js"></script>
<script src="/MediaWarp/static/custom/emby-front-end-mod/emby-swiper.js"></script>
<script src="/MediaWarp/static/custom/emby-front-end-mod/emby-tab.js"></script>
<script src="/MediaWarp/static/custom/emby-front-end-mod/fanart-show.js"></script>
<script src="/MediaWarp/static/custom/emby-front-end-mod/playbackRate.js"></script>

ExternalPlayerUrl: True # 是否开启外置播放器
ActorPlus: false # 过滤没有头像的演员和制作人员
FanartShow: True # 显示同人图(fanart图)
Danmaku: True # Web显示弹幕
VideoTogether: False # 共同观影,详情见 https://videotogether.github.io/
BeautifyCSS: True # Emby美化CSS样式

ClientFilter: # 客户端过滤器
Enable: False # 是否启用客户端过滤器
Mode: BlackList # WhileList / BlackList # 黑白名单模式
ClientList: # 名单列表
- Fileball
- Infuse

# 302重定向相关配置

HTTPStrm:
Enable: False # 是否开启HttpStrm重定向
TransCode: True # False:强制关闭转码 True:保持原有转码设置
PrefixList: # EmbyServer中Strm文件的前缀(符合该前缀的Strm文件且被正确识别为http协议都会路由到该规则下)
- /media/strm/http
- /media/strm/https

AlistStrm: # AlistStrm相关配置(Strm文件内容是Alist上文件的路径,目前仅支持适配Alist V3)
Enable: True # 是否启用AlistStrm重定向
TransCode: False # False:强制关闭转码 True:保持原有转码设置
RawURL: True # Fasle:直接响应 Alist 上游的真实链接 True:响应 Alist 服务器的直链(要求客户端可以访问到 Alist)
List: # Alist服务关配置列表
- ADDR: http://1Panel-alist-fvbK:5244 # Alist服务器地址
Token: AlistToken # Alist Token
PrefixList: # EmbyServer中Strm文件的前缀(符合该前缀的Strm文件都会路由到该规则下)
- /media/bangumi # 同一个Alist可以有多个前缀规则
- /media/movies
- /media/dramas

Subtitle: # 字体相关设置
Enable: True # 启用
SRT2ASS: False # SRT 字幕转 ASS 字幕
ASSStyle: # SRT 字幕转 ASS 字幕使用的样式
- "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding"
- "Style: Default,楷体,20,&H03FFFFFF,&H00FFFFFF,&H00000000,&H02000000,-1,0,0,0,100,100,0,0,1,1,0,2,10,10,10,1"

其中,MediaServerauthkey 可以在 Emby 管理后台 - 高级 - API 密钥 获取。

Bangumi 插件刮削番剧和多季番剧的元数据设置

添加 Bangumi 插件

Releases 界面下载 Emby.Plugin.Bangumi.dll,随后将其复制到 ./data/plugins/ 下,重启 Emby 服务器。

Bangumi 插件的设置

打开 Emby 管理后台 - Bangumi Lite,登录自己的 Bangumi 账号。

你可以参考我的 Bangumi 插件设置:

Bangumi 插件设置

多季番剧元数据设置

参考官方 WIKI:

多季动漫
使用 Season X 的文件夹存放每季的视频,jellyfin 会自动显示为 第 n 季
注意此时无法自动关联在 bangumi 上的 id,需要手动编辑该季的元数据,在 Bangumi 季 ID 中填写手动关联
关联后重新刷新元数据即可

分割放送的动漫
对于分割放松的剧集,用 Season x Part y 的方式命名文件夹
此时 jellyfin 会在两个 Season x 的文件夹下分开存储元数据,但由于季号相同,界面上只会显示成一季
关联时需要点击单集动画,通过名称下方的 第 x 季 按钮返回,此时编辑元数据可以修改单个文件夹下的 ID
填写后通过同样的方式修改其他文件夹的 id,最后分别刷新元数据(或者直接在系列中刷新元数据)

因此,打开元数据管理器,找到多季放送的番剧,展开后分别填写每一季的 Bangumi ID,随后点击保存 - 右侧三个点 - 刷新元数据 - 替换所有元数据,即可显示正确的元数据。

Authentik + LDAP 插件实现统一身份认证

LDAP 插件需要 Emby Premiere 订阅才能工作,开心版无法绕过此限制。

实现流程图

配置 Authentik

按照正常流程配置 LDAP 和和前哨即可才不是我懒得写了(

配置 LDAP 插件

打开 Emby 管理后台 - 高级 - 插件 - LDAP,随后填写以下参数:

LDAP server address:LDAP 服务器地址,只需要填写 IP 或者是域名即可,不需要带协议头
LDAP server Port number:LDAP 服务器端口,启用 SSL 根据实际情况填写。

Bind DN:填写 Authentik 提示的 Bind DN 内容。
Bind credentials:填写 Authentik 提示的 Bind 密码 内容。

User search base:填写为 OU=users,DC=ldap,DC=goauthentik,DC=io
User search filter:填写为:(cn={0})

如果一切顺利的话,这个时候 Emby 已经可以通过 LDAP 认证了。

已知问题

AutoFilm

  • 长时间运行任务时导致崩溃(#89
  • 不支持音乐文件

MediaWarp

  • 影响到 Emby 播放电视直播(#26
  • 不支持音乐文件

Bangumi 插件

  • SP 内容无法正常刮削(#198
  • 标题含有 - 无法正常刮削(#186

后记

说实话尽管发展了这么久,实际上整套系统还是不怎么成熟的。

如果有条件的话,我还是建议本地大硬盘会更好,也没必要这么折腾。


Emby N+1(自动入库新番、直链、AList、单点认证......) 最终解决方案
https://blog.byteloid.one/2025/03/23/emby-all-in-one-solution/
作者
bingxin666
发布于
2025年3月23日
许可协议