Featured image of post 我的动漫媒体库搭建指北

我的动漫媒体库搭建指北

本文讲述了动漫媒体库从准备到整理搭建最后到观看的全过程

自从 2021 年买了 NAS,就一直想着可以收藏超级多的动漫,搭建成自己的动漫库,即便不能每一部都看完,但也能满足自己的收集癖好,算是实现童年的一个小小梦想。

经过这么多年的摸索、完善,以及各路开源大佬制作的工具,直到 25 年初的时候算是拼凑出一个自己比较满意的方案了。并且,使用了大半年后也没什么特别想加的,趋于稳定,因此记录下来以免以后忘记。

我的动漫媒体库的基本遵循以下目标:

  • 不必收集所有动漫,但自己感兴趣的都有
  • 动漫资源无删减、无圣光,保证原汁原味(官方版本原本就有码的除外)
  • 非新番只收集 BD 资源(至今没有 BD 资源的除外)
  • 尽量使用高质量的压制资源
  • 尽量使用中日字幕,翻译质量优先,其次字幕特效
  • 桌面端、移动端、电视均能有较好的观看体验
  • 可以看弹幕(没弹幕太孤单了 TAT)
  • 半自动化,减少繁琐操作(不全自动是因为番剧特典资源比较混乱,很难做到统一)

以下按正常观看流程顺序来记录。

准备

在整个流程中我用到的一些工具,类似功能都可以任意替换。

储存: 群晖 DS220+,双 16T 机械硬盘
服务: 运行于Docker,使用 Docker-compose 方式安装。
下载: qbittorrent115 浏览器
媒体库: EMBY(Jellyfin 与其类似,可以通用)
播放器: MPV config
插件: uosc_danmakuTampermonkeyembyToLocalPlayer

下载

主要分为新番旧番,其他还有番剧对应的剧场版,单独的动画电影等。

以收集有 BD 的旧番为主,新番通常需要等待很长一段时间才会有 BD 资源流出,如果想要追番,只能退而求其次选择稍差一点的资源观看(其实只有与 BD 比较会有较大区别),之后再替换成 BD 版。

对于我来说,新番一个季度一般只会追 1-2 部非常喜欢的,还不一定能追完。经常想起来要看都已经完结了。

下载的资源不做任何改动,统一存放在下载目录,满足 BT 做种的需求。 毕竟能得到这些资源也是其他爱好者做种分享,自己也要有分享精神。

我的媒体库目录结构如下,下载目录要和 NAS 中媒体库文件在同一个分区

- NAS
    - Media  # 媒体库分区
	    - anime
		- animemovie
		- movie
		- tv
		- hlinks
	    - downloads # 下载的未经过整理的原始文件
			- anime # 番剧
			- animemovie # 动画电影、剧场版
			- movie # 普通电影
			- tv # 电视剧
			- bangumi # 追番专用,出BD资源后直接删除对应的
			- book # 图书、电子书、有声书
			- other # 其他不好归类的
			- sort # 待整理的资源
			- incomplete # qBittorrent的下载缓存

压制组

BD 资源我会优先选择VCB-Studio的作品,每集大小在 700Mb-1.2Gb 左右,并且特典、CD、封面一应俱全,画质上乘,一次性满足了我的大部分需求。

在 VCB 的《作品项目列表》中搜索想要的番剧,通过公网 BT 或者磁力链接下载。

比较久远的番可能时间太长没人做种,下载会比较慢。我的解决方法是使用 115 离线下载,只要有人在 115 中上传过,就可以确保满速下载。

115 必须要开会员才能使用,介意可以等 BT 慢慢下或者去找 PT 站的资源。

其次我会选择Moozzi2压制的作品,除了没有 CD,其他资源也都齐全,大小和品质都满足我的需求。虽然很多人不喜欢他作品压制后饱和度过高的色彩,但我实际观看下来个人是能接受,感觉还不错,因此作为备用方案。

新番资源,追求最快我会先选择Ani的作品,等Lolihouse资源出了自动替换,具体如何操作可以看大佬《ANI-RSS:自动追番新姿势!》这篇文章。我自己也会在文章末尾简略写一下,方便回忆。

目前还在活跃的压制组国内外其实质量都不错,比如 AI-Raws 也是我经常的选择。因为个人喜好不同,纠结的话还是先根据自己的硬盘大小筛选,再都下载一集对比观看,选定一个后再下载就不用纠结了。

字幕

由于下载的压制组的作品,很多都是不带字幕的,这时候就需要自己去寻找了。

新番的话比较简单,直接下载喜欢的字幕组的资源观看就行,或者去各个字幕组的资源发布页面下载单独的字幕文件,简介中一般都有写。

BD 因为会修复 TV 新番中的一些错误,直接使用 TV 版的字幕,可能导致时间轴对不上,这时候就要去Anime 字幕论坛中搜索同好们对好轴的版本,感谢分享的同好们!

实在找不到,也可以使用Aegisub自己对字幕进行对轴、更改字体等操作。

因为我最喜欢百合日常类型的番剧,对千夏字幕组情有独钟,如果有的话我会最优先选择。新番其实没有太多字幕可以选择,各个字幕组很少会做同一部动漫,各自有各自的主要制作的类型偏好,在有限的选择里选自己喜欢的就行。

比较老的番剧的话,诸神字幕组拥有中日双语,质量上乘,用作收藏字幕非常合适,是我的第一选择。

整理

因为对资源有做种需求(不能修改做种资源的文件名),并且为了适配 EMBY 的媒体库识别和刮削,有特定的命名规则。

而且动漫资源不像普通影视资源,通常原始文件名称更加复杂,不利于媒体库的识别。因此,非常有必要对资源进行整理,规范名称。这也是我选择手动+半自动整理的原因。

为什么不用 Moviepliot 等工具管理?

诸如 Nastool、Moviepliot 等工具,全自动下对于普通影视效果非常好。但是,对动漫的识别经常容易错集漏集(例如动漫第 2 季第 1 集有时候是 01 话,又有时候会被命名为 14 话等等情况),还是得手动编辑匹配名称和偏移量,全自动整理完后文件反而更混乱,还要找出错误的删除,重新手动整理,非常闹心,那不如一开始就手动慢慢整理好。

硬链接

为了同时满足做种和重命名需求,这时候就需要硬链接了。

简单来说,每个文件在硬盘中都是固定的一块数据,硬链接就是给这块数据再起了一个名字,两个不同的文件名,指向硬盘上完全相同的一块数据

注意: 你无论修改哪个“名字”下的文件,另一个“名字”下的内容也会同步改变,因为它们本来就是同一个文件。删除其中一个“名字”,文件数据并不会消失,只有把所有“名字”都删了,文件才会被真正删除。且必须在同一个盘符中!!!

好处就是节省了硬盘空间,因为不需要复制,就能让文件出现在多个地方,同时同盘符内可以任意移动。

先将资源存入预先分类好的下载文件夹中,再硬链接至中转文件夹内。

- NAS
    - Media  # 媒体库分区
	    - anime
		- hlinks # 中转文件夹,整理完后移入↑anime
	    - downloads # 下载的未经过整理的原始文件
	        - anime
			- sort # 待整理的资源,整理完后移入↑anime

以下我使用过的部分硬链接工具。

TorrentHardLinkHelper

很多年以前,U2 大佬千反田える发布的工具,发布地址,依然好用。具体使用方法可以可以参考贴吧教程

简单来说,可以对已有文件和种子文件内的内容比对,再硬链接到指定位置。

TorrentHardLinkHelper

使用的是 Docker 的 Web 端硬链接工具,[官网地址](https://hlink.likun.me/)。

如何使用 Docker 搭建可以参考我之前这篇文章 《Docker-Compose 的日常使用》

创建如下配置文件,设置需要包括和排除的文件类型和文件夹:

// 重要说明路径地址都请填写 绝对路径!!!!

export default {

  /**

   * 源路径与目标路径的映射关系

   * 例子:

   *  pathsMapping: {

   *     '/path/to/exampleSource': '/path/to/exampleDest',

   *     '/path/to/exampleSource2': '/path/to/exampleDest2'

   *  }

   */

  pathsMapping: {

    '/Media/downloads/sort': '/Media/hlinks/',

  },

  /**

   * 需要包含的后缀,如果与exclude同时配置,则取两者的交集

   * include 留空表示包含所有文件

   *

   * 后缀不够用? 高阶用法: https://hlink.likun.me/other/v2.html#%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD

   */

  include: [

    'mp4',

    'mkv',

    'mka',

  ],

  /**

   * 需要排除的后缀,如果与include同时配置,则取两者的交集

   *

   * 后缀不够用? 高阶用法: https://hlink.likun.me/other/v2.html#%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD

   */

  exclude: [

    '**/CDs/**',

    '**/Scans/**',

    'ass',

  ],

  /**

   * @scope 该配置项 hlink 专用

   * 是否保持原有目录结构,为false时则只保存一级目录结构

   * 可选值: true/false

   * 例子:

   *  - 源地址目录为:/a

   *  - 目标地址目录为: /d

   *  - 链接的文件地址为 /a/b/c/z/y/mv.mkv

   *  如果设置为true  生成的硬链地址为: /d/b/c/z/y/mv.mkv

   *  如果设置为false 生成的硬链地址为:/d/y/mv.mkv

   */

  keepDirStruct: true,

  /**

   * @scope 该配置项 hlink 专用

   * 是否打开缓存,为true表示打开

   * 可选值: true/false

   * 打开后,每次硬链后会把对应文件存入缓存,就算下次删除硬链,也不会进行硬链

   */

  openCache: false,

  /**

   * @scope 该配置项 hlink 专用

   * 是否为独立文件创建同名文件夹,为true表示创建

   * 可选值: true/false

   */

  mkdirIfSingle: true,

  /**

   * @scope 该配置项为 hlink prune 命令专用

   * 是否删除文件及所在目录,为false只会删除文件

   * 可选值: true/false

   */

  deleteDir: false,

}

再在任务列表中创建任务,有需要可以设置定时循环。

脚本

由于总是要打开 web 端运行,感觉还是比较麻烦,所以用 AI 制作了一个脚本方便我自己日常使用。目前自用很舒适,Bug 不清楚,有需要可以去我的 Github参考修改。

重命名

对文件经过硬链接之后,只要不修改文件内的内容,就可以任意操作而不影响原始文件了。因此可以随意重命名,以适配 emby。(jellyfin 可以按相同规律。plex 仅可参考,具体还得看官方文档。)

对于番剧,将命名改成以下格式:

- 番剧名 (年代) [tmdbid=编号]  # 加上编号更利于准确识别,名称和TMDB一致也可以不需要。

	- 特典  # 番剧目录下,任意被命名为extras、specials、shorts、scenes、featurettes、behind the scenes、deleted scenes、interviews、trailers、Season 0的文件夹,都会被识别到媒体库的特典文件夹内,对于番剧来说并不友好,因此推荐把真正的特典内容放在Season 0中。

	- 季度  # 按Season 1,Season 02等命名文件夹

		- 任意名称+季度集数+加后缀.视频格式  # 识别排在文件名最前的季度与集数

另外还有多种命名方式和文件摆放方式,具体可以看emby-tv 命名规则

对于动画电影,就相对来说比较简单:

- 电影名 (年代) [tmdbid=编号]  # 加上编号更利于准确识别,名称和TMDB一致也可以不需要。

	 - 特典  # 统一使用extras文件夹就行
		  - 电影名 (年代) - 分辨率标识  # 加上分辨率可以应对同一部电影不同分辨率的情况。

其他命名规则,具体可以看emby-movie 命名规则

按照上面的原理,以略微复杂的 摇曳百合(究级难整理的得属物语系列了)为案例示范。

以下是硬链接一次筛选过后的原文件名称(选取代表性的部分):

- [VCB-Studio] Yuru Yuri [Ma10p_1080p]
	- SPs
		- [VCB-Studio] Yuru Yuri [SP][Ma10p_1080p][x265_flac].mkv
		- [VCB-Studio] Yuru Yuri [CM01][Ma10p_1080p][x265_flac].mkv
	- [VCB-Studio] Yuru Yuri [01][Ma10p_1080p][x265_flac].mkv

- [VCB-Studio] Yuru Yuri 2 [Ma10p_1080p]
  	- SPs
		- [VCB-Studio] Yuru Yuri 2 [Art Design01 Akari][Ma10p_1080p][x265_flac].mkv
		- [VCB-Studio] Yuru Yuri 2 [NCOP01][Ma10p_1080p][x265_flac].mkv
	- [VCB-Studio] Yuru Yuri 2 [01][Ma10p_1080p][x265_2flac].mkv

- [VCB-Studio] Yuru Yuri 3 [Ma10p_1080p]
	- SPs
		- [VCB-Studio] Yuru Yuri 3 [PV01][Ma10p_1080p][x265_flac].mkv
	- [VCB-Studio] Yuru Yuri 3 [01][Ma10p_1080p][x265_2flac].mkv

- [VCB-Studio] Yuru Yuri Nachuyachumi! [Ma10p_1080p]
  	- SPs
	  	- [VCB-Studio] Yuru Yuri Nachuyachumi!+ [Preview01][Ma10p_1080p][x265_flac].mkv
	  	- [VCB-Studio] Yuru Yuri Nachuyachumi! [NCED][Ma10p_1080p][x265_flac].mkv
	- [VCB-Studio] Yuru Yuri Nachuyachumi! [Ma10p_1080p][x265_flac].mkv
	- [VCB-Studio] Yuru Yuri Nachuyachumi! [Ma10p_1080p][x265_flac].mka
	- [VCB-Studio] Yuru Yuri Nachuyachumi!+ [02][Ma10p_1080p][x265_flac].mkv

按照我的习惯,重命名并且分类后为:

- 摇曳百合 (2011)
	- CM
		- season.nfo
		- 摇曳百合 CM01 - 1080p.mkv
	- OPED
		- season.nfo
	    - 摇曳百合♪♪ NCOP01 - 1080p.mkv
	- PV
	    - season.nfo
	    - 摇曳百合 3☆Hi! PV01 - 1080p-trailer.mkv
	- Yokoku
	    - season.nfo
	    - 摇曳百合 夏日时光!+ Preview01 - 1080p.mkv
	- Season 0 [Airota@VCB-Studio]
	    - 摇曳百合 - S01E01 - 1080p.mkv
	    - 摇曳百合 夏日时光!+ + - S00E03 - 1080p.mkv
	    - 摇曳百合♪♪  - S00E09 -  Art Design01 Akari - 1080p.mkv
	- Season 1 (2011) [Airota@VCB-Studio]
	    - 摇曳百合 - S00E01 - 1080p.mkv
	- Season 2 (2012) [Airota@VCB-Studio]
	    - 摇曳百合 - S02E01 - 1080p.mkv
	- Season 3 (2015) [Airota@VCB-Studio]
	    - 摇曳百合 - S03E01 - 1080p.mkv

- 摇曳百合 夏日时光! (2014)  [VCB-Studio]
	- extras
	    - 摇曳百合 夏日时光! NCED - 1080p.mkv
	-  摇曳百合 夏日时光! (2014) - 1080p.mkv
	-  摇曳百合 夏日时光! (2014) - 1080p.mka

再把它们分别移动至媒体库:

- NAS
    - Media  # 媒体库分区
	    - anime
	        - 摇曳百合 (2011)
		- animemovie
			- 摇曳百合 夏日时光! (2014)  [VCB-Studio]

注意: CMOPEDPVYokoku这些带season.nfo的文件夹,其实可以是根据自己需求,任意建立的文件夹。season.nfo是自己建立的文件,通过修改其中的元数据信息,让其在媒体库中以分类文件夹形式显示。

例如,CM中的 season.nfo 文件为:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

<season>

  <plot><![CDATA[电视放送广告]]></plot>

  <outline><![CDATA[电视放送广告]]></outline>

  <lockdata>true</lockdata>

  <dateadded>2025-09-22 16:40:44</dateadded>

  <title>广告</title>

  <sorttitle>广告</sorttitle>

  <seasonnumber>103</seasonnumber>

</season>

大量的重命名和分类操作也可以用脚本来减轻重复劳动的压力,有需要的话同样可以参考我的 Github

媒体库

我使用的是emby(因为很久以前就购买了永久会员),jellyfin 的设置与 emby 几乎相同,plex 没有用过。

安装

同样是使用 Docker-compose,安装方法参考 《Docker-Compose 的日常使用》

我的 yaml 文件配置如下:

---
services:
  emby:
    image: lscr.io/linuxserver/emby:beta
    container_name: emby
    environment:
      # 用户和组ID设置
      - PUID=填自己的
      - PGID=填自己的
      # 时区设置
      - TZ=Asia/Shanghai
    volumes:
      # 配置目录
      - /volume1/docker/emby-beta/library:/config:rw
      # 媒体库目录
      - /volume1/music:/music
      - /volume2/Media/anime:/anime
      - /volume2/Media/downloads/Bangumi:/bangumi:rw
      - /volume2/Media/animemovie:/animemovie:rw
    ports:
      # 主要端口(修改为8888)
      - 8888:8096
      # HTTPS端口(可选)
      - 8920:8920
    devices:
      # Intel硬解设备映射(关键)
      - /dev/dri:/dev/dri
    restart: unless-stopped

插件:

  1. TheMovieDb:官方自带的刮削插件,使用这个足够满足绝大多数需求。
  2. Bangumi Lite:Bangumi 自动点格子,放在/config/plugins中就行。

设置

大部分默认设置即可,我一般只更改以下几项。

用户

  1. 将默认用户更改为管理员用户,设置密码,给最高权限。
  2. 新增一个专门看动漫的用户,无密码,有限权限,设置仅可观看动漫相关的媒体库,不允许删除文件等操作。日常观看都用这个用户,防止误操作。

媒体库

建立追番、动漫、剧场版、音乐四个媒体库。

动漫媒体库为例进行设置,其他设置大同小异。


文件夹: 直接填在 docker-compose 中映射好的分类目录/anime,或者其他你自定义的。
共享网络文件夹: 填 Nas 上文件夹的实际地址,如nfs://ip地址/volume2/Media/anime,需要开启 smb 或者 nfs 功能,我习惯用 nfs 读取。填写这一项可以获取到文件的实际地址,方便用 mpv 等播放器观看时直接打开本地文件,而不是使用流媒体播放。


实时监视: 手动整理的媒体库,一般不开启,仅在追番媒体库开启。添加新动漫的时候,直接手动扫描一下媒体库就行。开启的话容易在整理还没完成的时候就自动刮削了元数据,生成很多命名不对的文件,导致文件混乱。


nfo: 开启后会读取文件同目录下的元数据文件信息,之前整理阶段自己制作的season.nfo就是靠这个生效。


元数据下载器: 勾选后会按顺序获取元数据信息,所谓的刮削就是指这个。由于之前的整理阶段已经针对 TheMovieDb 做好了非常细致的命名,通常只需要选择 TheMovieDb 就行。我勾选 Bangumi 是为了同时获取 Bangumi 番剧的编号,用来自动点格子。
合集: 这个功能个人认为非常没用,又关不掉,还会如第一张截图所示生成一个普通情况下无法删除的媒体文件夹,逼死强迫症。因此设置成最大。关于如何删除后面再说。


元数据储存方式: Nfo 勾选,勾选后才会用 nfo 文件的形式储存元数据。
图像获取器: 我喜欢优先选择 FanArt,FanArt 的海报图片质量通常更加高清,并且更纯粹,没有多余的广告演员等信息在海报上。其次再选择 TheMovieDb。
保存媒体图片到媒体文件夹中: 勾选。这样今后移动整理删除都更加方便整洁。


字幕: 相关功能都不开启,对动漫类影视几乎没有任何作用。只对不在意这些,也不想折腾的人有用。自己收藏的影视还是自己找心仪的字幕比较好。
播放: 默认就行。仅影响 Bangumi 何时判断自动点格子。

效果

Tips

我遇到的一些问题,以及解决方案。

主页不好看怎么办?

使用emby-crx项目,目前适用于 4.8 的正式版 emby,4.9 的测试版自己修改了好几天也无法适配,只能暂时放弃,在找懂代码的朋友修改中。

以下是我自己用的笨方法:

  1. /docker/emby-beta/下创建emby-crx目录。
  2. SSH 管理员模式进入 Nas,进入目录。
cd /volume1/docker/emby-beta/emby-crx
  1. 拉取主要使用的这几个文件到目录下,main.js使用的是issues#17
wget https://raw.githubusercontent.com/Nolovenodie/emby-crx/master/static/css/style.css
wget https://raw.githubusercontent.com/Nolovenodie/emby-crx/master/static/js/common-utils.js
wget https://raw.githubusercontent.com/Nolovenodie/emby-crx/master/static/js/jquery-3.6.0.min.js
wget https://raw.githubusercontent.com/Nolovenodie/emby-crx/master/static/js/md5.min.js
wget https://raw.githubusercontent.com/mobclix/emby-crx/master/content/main.js
  1. 文件夹内新建对应的config.js
class Config{
	constructor() {
		//媒体库id,用逗号分隔。进入媒体库后url里的parentId
		//this.parentId = "5,21463";
                this.parentId = "";
		//滚屏间隔 ms
		this.interval = 8000;
		//是否开启随机
		this.random = true;
		this.itemQuery={
			//返回横幅的最大数量,注意每10个为一轮,一轮不足10个的会被舍弃。例如27则只显示两轮20
			Limit : 20,//(integer) Optional. The maximum number of records to return

			//一般只需要关注上面几个配置,下面不了解的不需要修改
			/*-------------------------------------------------------------------------------------------------------------------------------*/
			Recursive : true,//(boolean) When searching within folders, this determines whether or not the search will be recursive. true/false
			SortOrder : "Descending",//(string) Sort Order - Ascending,Descending
			Fields : "ProductionYear",//(string) Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines
			EnableUserData : false,//(boolean) Optional, include user data
			ImageTypeLimit : 1,//(integer) Optional, the max number of images to return, per image type
			Fields : "ProductionYear",//(string) Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines
			IncludeItemTypes : "Movie,Series",//(string) Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.
			ImageTypes : "Backdrop",//(string) Optional. If specified, results will be filtered based on those containing image types. This allows multiple, comma delimited.
			EnableImageTypes : "Logo,Backdrop",//(string) Optional. The image types to include in the output.
			SortBy : "ProductionYear, PremiereDate, SortName",//(string) Optional. Specify one or more sort orders, comma delimeted. Options: Album, AlbumArtist, Artist, Budget, CommunityRating, CriticRating, DateCreated, DatePlayed, PlayCount, PremiereDate, ProductionYear, SortName, Random, Revenue, Runtime
			ArtistType : "",//(string) Artist or AlbumArtist
			MaxOfficialRating : "",//(string) Optional filter by maximum official rating (PG, PG-13, TV-MA, etc).
			HasThemeSong : "",//(boolean) Optional filter by items with theme songs.
			HasThemeVideo : "",//(boolean) Optional filter by items with theme videos.
			HasSubtitles : "",//(boolean) Optional filter by items with subtitles.
			HasSpecialFeature : "",//(boolean) Optional filter by items with special features.
			HasTrailer : "",//(boolean) Optional filter by items with trailers.
			AdjacentTo : "",//(string) Optional. Return items that are siblings of a supplied item.
			MinIndexNumber : "",//(integer) Optional filter by minimum index number.
			MaxPlayers : "",//(integer) Optional filter by minimum number of game players.
			ParentIndexNumber : "",//(integer) Optional filter by parent index number.
			HasParentalRating : "",//(integer) Optional filter by items that have or do not have a parental rating
			IsHD : "",//(boolean) Optional filter by items that are HD or not.
			LocationTypes : "",//(string) Optional. If specified, results will be filtered based on LocationType. This allows multiple, comma delimeted.
			ExcludeLocationTypes : "",//(string) Optional. If specified, results will be filtered based on LocationType. This allows multiple, comma delimeted.
			IsMissing : "",//(boolean) Optional filter by items that are missing episodes or not.
			IsUnaired : "",//(boolean) Optional filter by items that are unaired episodes or not.
			MinCommunityRating : "",//(number) Optional filter by minimum community rating.
			MinCriticRating : "",//(number) Optional filter by minimum critic rating.
			AiredDuringSeason : "",//(integer) Gets all episodes that aired during a season, including specials.
			MinPremiereDate : "",//(string) Optional. The minimum premiere date. Format = ISO
			MinDateLastSaved : "",//(string) Optional. The minimum premiere date. Format = ISO
			MinDateLastSavedForUser : "",//(string) Optional. The minimum premiere date. Format = ISO
			MaxPremiereDate : "",//(string) Optional. The maximum premiere date. Format = ISO
			HasOverview : "",//(boolean) Optional filter by items that have an overview or not.
			HasImdbId : "",//(boolean) Optional filter by items that have an imdb id or not.
			HasTmdbId : "",//(boolean) Optional filter by items that have a tmdb id or not.
			HasTvdbId : "",//(boolean) Optional filter by items that have a tvdb id or not.
			ExcludeItemIds : "",//(string) Optional. If specified, results will be filtered by exxcluding item ids. This allows multiple, comma delimeted.
			StartIndex : "",//(integer) Optional. The record index to start at. All items with a lower index will be dropped from the results.
			ExcludeItemTypes : "",//(string) Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.
			AnyProviderIdEquals : "",//(string) Optional. If specified, result will be filtered to contain only items which match at least one of the specified IDs. Each provider ID must be in the form 'prov.id', e.g. 'imdb.tt123456'. This allows multiple, comma delimeted value pairs.
			Filters : "",//(string) Optional. Specify additional filters to apply. This allows multiple, comma delimeted. Options: IsFolder, IsNotFolder, IsUnplayed, IsPlayed, IsFavorite, IsResumable, Likes, Dislikes
			IsFavorite : "",//(boolean) Optional filter by items that are marked as favorite, or not.
			IsMovie : "",//(boolean) Optional filter for movies.
			IsSeries : "",//(boolean) Optional filter for movies.
			IsNews : "",//(boolean) Optional filter for news.
			IsKids : "",//(boolean) Optional filter for kids.
			IsSports : "",//(boolean) Optional filter for sports.
			MediaTypes : "",//(string) Optional filter by MediaType. Allows multiple, comma delimited.
			IsPlayed : "",//(string) Optional filter by items that are played, or not.
			Genres : "",//(string) Optional. If specified, results will be filtered based on genre. This allows multiple, pipe delimeted.
			OfficialRatings : "",//(string) Optional. If specified, results will be filtered based on OfficialRating. This allows multiple, pipe delimeted.
			Tags : "",//(string) Optional. If specified, results will be filtered based on tag. This allows multiple, pipe delimeted.
			Years : "",//(string) Optional. If specified, results will be filtered based on production year. This allows multiple, comma delimeted.
			EnableImages : "",//(boolean) Optional, include image information in output
			Person : "",//(string) Optional. If specified, results will be filtered to include only those containing the specified person.
			PersonIds : "",//(string) Optional. If specified, results will be filtered to include only those containing the specified person.
			PersonTypes : "",//(string) Optional. If specified, along with Person, results will be filtered to include only those containing the specified person and PersonType. Allows multiple, comma-delimited
			Studios : "",//(string) Optional. If specified, results will be filtered based on studio. This allows multiple, pipe delimeted.
			StudioIds : "",//(string) Optional. If specified, results will be filtered based on studio. This allows multiple, pipe delimeted.
			Artists : "",//(string) Optional. If specified, results will be filtered based on artist. This allows multiple, pipe delimeted.
			ArtistIds : "",//(string) Optional. If specified, results will be filtered based on artist. This allows multiple, pipe delimeted.
			Albums : "",//(string) Optional. If specified, results will be filtered based on album. This allows multiple, pipe delimeted.
			Ids : "",//(string) Optional. If specific items are needed, specify a list of item id's to retrieve. This allows multiple, comma delimited.
			VideoTypes : "",//(string) Optional filter by VideoType (videofile, dvd, bluray, iso). Allows multiple, comma delimeted.
			Containers : "",//(string) Optional filter by Container. Allows multiple, comma delimeted.
			AudioCodecs : "",//(string) Optional filter by AudioCodec. Allows multiple, comma delimeted.
			VideoCodecs : "",//(string) Optional filter by VideoCodec. Allows multiple, comma delimeted.
			SubtitleCodecs : "",//(string) Optional filter by SubtitleCodec. Allows multiple, comma delimeted.
			Path : "",//(string) Optional filter by Path.
			UserId  : "",//(string) User Id
			MinOfficialRating : "",//(string) Optional filter by minimum official rating (PG, PG-13, TV-MA, etc).
			IsLocked : "",//(string) Optional filter by items that are locked.
			IsPlaceHolder : "",//(boolean) Optional filter by items that are placeholders
			HasOfficialRating : "",//(boolean) Optional filter by items that have official ratings
			GroupItemsIntoCollections : "",//(boolean) Whether or not to hide items behind their boxsets.
			Is3D : "",//(boolean) Whether or not to hide items behind their boxsets.
			SeriesStatus : "",//(string) Optional filter by Series Status. Allows multiple, comma delimeted.
			NameStartsWithOrGreater : "",//(string) Optional filter by items whose name is sorted equally or greater than a given input string.
			NameStartsWith : "",//(string) Optional filter by items whose name is sorted equally than a given input string.
			NameLessThan : ""//(string) Optional filter by items whose name is equally or lesser than a given input string.
		}

		Object.getOwnPropertyNames(this.itemQuery).forEach(key => {
			if(this.itemQuery[key]==""){
				delete this.itemQuery[key];
			}
		})

		this.parentIds = this.parentId.split(',');
	}
}
  1. 回到上级目录,将容器内index.html文件拷贝出来并且备份:
cd ../
# 注意写自己设置的容器名
docker-compose cp emby:/app/emby/system/dashboard-ui/ index.html # emby4.9测试版目录
docker-compose cp emby:/system/dashboard-ui/ index.html # emby4.9测试版目录
  1. index.html文件的</head>前插入代码,用于调用jscss,保存:
	<link rel='stylesheet' id='theme-css' href='emby-crx/style.css' type='text/css' media='all'/>
	<script src="emby-crx/common-utils.js"></script>
	<script src="emby-crx/jquery-3.6.0.min.js"></script>
	<script src="emby-crx/md5.min.js"></script>
	<script src="emby-crx/config.js"></script>
	<script src="emby-crx/main.js"></script>
  1. 将文件夹和文件拷贝回容器内:
docker-compose cp index.html emby:/app/emby/system/dashboard-ui/
docker-compose cp emby-crx emby:/app/emby/system/dashboard-ui/
  1. 刷新 emby 首页观察效果。

如何使用动态封面图?

将 Gif 图片保存为 Png 格式上传使用。

突然冒出的合集无法删除怎么办?

  1. 在首页中,将合集内的剧集选中设置,移出合集。或者在设置-主屏幕中,选择不显示合集。这两种方法可以隐藏主页的合集显示,但媒体库中依然存在。
  2. config/root/default中找到合集或者collection,删除。重启 emby,有概率可以删除媒体库的合集。
  3. 安装StrmAssistant插件,设置中可以选择隐藏合集,同时媒体库中合集点开详细设置会出现移除按钮。

演员栏都是英文名、问号怎么办?

使用这两个工具都可解决。media_server_toolsStrmAssistant

播放

绝大部分情况下都是使用 PC 桌面端播放,目前只有在 PC 上才能流畅使用弹幕功能,而这个功能对我来说太重要了,大家一起看真的不会那么孤单。

桌面端

折腾版: 使用的是 MPV 播放器,基于大佬的整合包自己再修改一些设置日常使用。Potplayer、VLC、MPC-BE 等等播放器我都使用过,最终因为可高度自定义,还是喜欢 MPV。

不想折腾: 也可以使用弹弹 play,捐赠会员可以直接调用 mpv 播放且显示弹幕。

超级懒: 也可以直接使用魔改版的 emby 桌面端,请自己搜索下载。

配置

快捷键配置,修改input.conf文件,位于/mpv/portable_config/中。整合包已经设置的非常齐全,几乎不需要做任何的修改。最多添加一个一键开关滤镜指定着色器的功能,例如:

CTRL+0           change-list glsl-shaders add "~~/shaders/Anime4K/glsl/Restore/Anime4K_Restore_GAN_UL.glsl;~~/shaders/Anime4K/glsl/Upscale/Anime4K_Upscale_GAN_x4_UL.glsl;~~/shaders/Anime4K/glsl/Restore/Anime4K_Clamp_Highlights.glsl"        #menu: 着色器 >自用4k优化
# 在原有着色器的基础上再添加这些着色器。

功能配置,修改mpv.conf文件,位于/mpv/portable_config/中。

slang=assfonts,chs,sc,zh-Hans,zh-CN,cht,tc,zh-Hant,zh-HK,zh-TW,chi,zho,zh
# 将assfonts的子集化字幕设置为第一优先级

screenshot-format=webp
# 截图使用webp格式

screenshot-webp-quality=95
# 截图压缩质量

screenshot-template="C:/Users/用户名/Pictures/mpv/%{media-title}-%P-%n"
# 截图路径

[Anime]

 profile-desc=自用动画配置

 profile-cond=path:find("Anime")~=nil or path:find("anime")~=nil or path:find("ANIME")~=nil or path:find("Bangumi")~=nil

 profile-restore=copy

 vf-toggle=fps=fps=60/1.001

 script-opts-append="uosc_danmaku-auto_load=yes"
 
 # 在条件配置栏添加,在指定关键词路径下播放的文件,锁定所有帧率为60fps,并且自动打开弹幕开关。

弹幕相关设置可以看uosc_danmaku

Emby 调用 MPV

  1. 使用embyToLocalPlayer安装脚本,开启服务器和本地硬盘模式。
  2. 下载embyToLocalPlayer.zip,解压到纯英文路径下,打开embyToLocalPlayer.ini
  3. 设置 mpv.exe 的路径,并选择 mpv 播放器。
  4. 开启回传进度。
  5. 填写 emby 端的目录前缀,例如我的是nfs://ip地址/volume2/Media/,这就是之前媒体库要设置网络共享文件夹的原因。
  6. 填写本地目录前缀,我是直接将Media文件夹映射成了M:盘,填写a= M:
  7. 其他根据自己需求设置。

效果

Android 端

目前都无法使用弹幕功能,只能通过将 xml 格式的本地弹幕转换成字幕实现。

Emby for Android:手机使用,可以自行搜索魔改版,更好用。
Emby for Android TV:电视使用,可以自行搜索魔改版,更好用。

iOS 端

目前都无法使用弹幕功能,只能通过将 xml 格式的本地弹幕转换成字幕实现。

Infuse:苹果设备使用,ios 最好用的播放器。缺点是太贵,买断只能使用一个大版本,无法享受后续的更新。

Emby for iOS:日常使用足够。

结语

至此,在满足我收集癖和绝大部分需求的情况下,还能更舒服、轻松的观看动漫。

折腾过后也是满满的成就感!

主题 StackJimmy 设计 Blog Run Time
Love U: