媒体库与扫描 - MiCat-S/Mi302 GitHub Wiki
这一页说明媒体库的文件夹怎么放、Mi302 怎么扫描,以及中文片名的排序搜索、演职人员中文名、类型中文化和媒体库封面。
媒体库在管理页面的“媒体库”标签页创建。标签页上每个媒体库一格,显示封面、名称、类型、项目数和文件夹。点最后一格的“新增媒体库”,在对话框里起个名字,类型选“电影”或“剧集”,点“加入资料夹”选服务器上的文件夹,最后点“储存并扫描”。一个媒体库可以有多个文件夹。
要改名称、类型、文件夹或封面,点那一格的封面、名称或“编辑”,打开同一个对话框。对话框左下角的“删除媒体库”删掉整个媒体库,文件夹里的文件不会被删;但这个媒体库的观看记录(看过、续播点、收藏)会一起删除,之后再加回同一个文件夹也找不回来,确认框会写出有几条。一次建好几个媒体库见批量新增媒体库。
Mi302 不自己刮削,只读取文件夹里已有的文件:
- 视频:
.strm和普通视频文件(.mkv.mp4.m4v.avi.ts.m2ts.mov.wmv.flv.webm.rmvb.mpg.mpeg.iso.3gp)。 - 元数据:nfo 和图片(
.jpg.jpeg.png.webp)。这些可以在 115 同步时一起下载,或交给 MoviePilot 刮削,见 MoviePilot 集成。
典型的结构:
movies/
Inception (2010)/
Inception (2010).strm
Inception (2010).nfo # 或 movie.nfo
poster.jpg fanart.jpg
tv/
Dark (2017)/
tvshow.nfo poster.jpg fanart.jpg
Season 1/
Dark.S01E01.strm
Dark.S01E01.nfo
Dark.S01E01-thumb.jpg
查找电影和剧集文件夹时,名称以 .、@、# 开头的文件夹会被跳过(例如 NAS 的 @eaDir、#recycle)。
- 每个视频文件是一部电影。
- 文件夹里只有这一部视频(而且不是直接放在媒体库文件夹下)时,如果文件夹名称带年份、或文件名没有年份,就用文件夹名称作为片名,例如
Inception (2010)。这种文件夹也会读取movie.nfo。 - 其他情况用文件名:识别
片名 (年份),或去掉1080p、BluRay、x265这类字样后取片名和年份。 - nfo 里有
<title>时以 nfo 为准。
每个剧集文件夹是一部剧。剧集文件夹里任何一层的视频都算这部剧的集,可以放在季文件夹里,也可以直接放在剧集文件夹里。
季文件夹的名称:
| 写法 | 例子 | 季 |
|---|---|---|
Season N、Series N(中间可以有空格、点、下划线、减号) |
Season 1、Season.02、Series 3
|
N |
SN |
S01、s2
|
N |
第N季、第N部(阿拉伯数字或中文数字) |
第1季、第一季、第十二季
|
N |
Specials、Special、SP、特別篇、特别篇
|
0(特别篇) |
集号从文件名里找,按下面的顺序,第一个匹配上的为准:
| 写法 | 例子 |
|---|---|
SxxEyy(也识别 SxxEPyy,中间可以有空格、点、下划线、减号) |
Dark.S01E02.mkv、S01 EP02
|
NxNN |
1x02 |
第N集、第N话、第N話(阿拉伯数字或中文数字) |
第2集、第十二集
|
Eyy、EPyy(前面是开头、空格、点、下划线、减号或 [) |
EP02、[E05]
|
文件名开头就是集号,后面接点、减号、下划线或 、;只用空格隔开时要补零 |
10.潘玮柏战队…、03-比赛…、01 嘻哈首战、07
|
最后一种只在没有其他写法时才用。只用空格隔开又没补零的(21 Jump Street)不算集号。
有多个来源时的优先顺序:
- 季:集的 nfo 里的
<season>→ 所在的季文件夹 → 文件名里的SxxEyy→ 都没有就算第 1 季。 - 集号:集的 nfo 里的
<episode>→ 文件名。
nfo 里的 <season>、<episode> 是负数(例如刮削时没认出集号写的 -1)时当成没写,改用后面的来源。
- 集名:集的 nfo 里的
<title>→ “第 N 集”→ 文件名。
季的名称是“第 N 季”,第 0 季是“特別篇”。季文件夹里的 season.nfo 可以修改季的名称和简介。
剧集媒体库里可以有分类文件夹,例如 MoviePilot 二级分类的 电视剧/国产剧/庆余年 (2019)/。媒体库路径直接选 电视剧 就行,不用每个分类各加一次。
满足下面任意一项的文件夹是一部剧:
- 里面有
tvshow.nfo。 - 名称是
剧名 (年份),括号也可以是全角()或[]。 - 里面有季文件夹。
- 里面直接放着视频或 strm。
其他文件夹当作分类,再往下一层找。媒体库文件夹下最多找三层分类文件夹。
注意两种会认错的情况:
- 分类文件夹里直接放了视频,这个分类会被当成一部剧。
- 剧集文件夹没有年份、没有
tvshow.nfo,视频又都放在不是季文件夹的子文件夹里(例如Disc1),这部剧会被当成分类。给剧集文件夹加上年份最稳妥。
想让每个分类在播放器首页各占一行,就每个分类各建一个媒体库,用下一节的“从资料夹批量新增”可以一次建好。
一个文件夹下面已经分好“电影”“国产剧”“日番”这类子文件夹,想让每个子文件夹各自成为一个媒体库时,点“媒体库”标签页最后一格的“从资料夹批量新增”:
- 选上层文件夹。对话框会先读第一个媒体库第一个文件夹的上一层,还没有媒体库时直接打开选文件夹的窗口。要换文件夹就点“选择…”,或输入路径后点“读取”。
- 每个子文件夹一行,附上视频数和建议的类型。
- 勾选要新增的,名称和类型都可以改。空文件夹和已经在某个媒体库里的文件夹默认不勾,后者会写出在哪个媒体库。
- 点“新增并扫描”。
建议的类型是看文件夹里的文件猜的:
- 抽样的视频里有三成以上文件名带集数(
S01E01、1x01、第1集、EP01这类)、放在季文件夹里,或在有tvshow.nfo的文件夹里,就建议“剧集”,否则建议“电影”。 - 视频少于 3 个时改看文件夹名称:带“电影”“剧场版”“movie”“film”的是电影,带“剧”“番”“动漫”“动画”“综艺”“电视”“tv”“series”“show”“anime”“drama”的是剧集,繁体字也认得。都看不出来就先当电影。
名称改成一样的几行会合成一个媒体库,类型要相同。名称和现有的媒体库相同,这个文件夹就加进那个媒体库,类型跟着那个媒体库。每一行下面会写出它会怎么处理,有问题的行(名称空白、同名但类型不同)要先改好才能提交。
文件夹可能在网络磁盘上,所以每个子文件夹最多往下看 5 层、1.5 秒,整次最多 12 秒。没看完的视频数显示“至少 N 部”,来不及看的显示“影片数不明”、类型改看名称,也不会默认勾选,对话框上方会提醒检查。
表格里的 X 是视频文件名去掉扩展名。图片可以是 .jpg、.jpeg、.png、.webp。
| 项目 | nfo | 海报 | 背景图 | 横幅 | Logo |
|---|---|---|---|---|---|
| 电影 | X.nfo |
X-poster、X
|
X-fanart、X-backdrop
|
X-thumb、X-landscape
|
X-logo、X-clearlogo
|
| 电影(文件夹里只有这一部时另外识别) | movie.nfo |
poster、folder、cover
|
fanart、backdrop、background
|
thumb、landscape
|
logo、clearlogo
|
| 剧集(放在剧集文件夹) | tvshow.nfo |
poster、folder、cover
|
fanart、backdrop、background
|
thumb、landscape
|
logo、clearlogo
|
| 季 | 季文件夹里的 season.nfo
|
剧集文件夹里的 season01-poster、season01(特别篇是 seasonspecials-poster、seasonspecials);没有就用季文件夹里的 poster、folder、cover
|
|||
| 集 | X.nfo |
X-thumb、X
|
- 集没有自己的图时,用剧的横幅(
thumb/landscape),没有横幅就用剧的背景图。 - 季和集没有自己的背景图、横幅、Logo 时用剧的。
- nfo 读取的字段:
title、originaltitle、sorttitle、plot(或outline)、year、premiered(或aired、releasedate)、rating、mpaa、genre、runtime(分钟)、uniqueid和tmdbid/imdbid/tvdbid、season、episode,以及演职人员(见下文)。
扫描就是把文件夹里的视频、nfo 和图片读进数据库,播放器看到的就是数据库里的内容。不一定要整个重新扫描。
“媒体库”标签页可以:
- 点某个媒体库那一格的“扫描”,只扫这个媒体库。
- 打开媒体库的“编辑”对话框,点某个文件夹那一行的“扫描”,只扫这个文件夹。文件夹不存在时会标出“资料夹不存在”,这一行没有“扫描”按钮,媒体库那一格也会写出几个文件夹不存在。刚加进去、还没保存的文件夹也没有“扫描”按钮。
- 点上方的“扫描资料夹…”,选任意一个媒体库里的文件夹,例如一个分类
电视剧/国产剧或一部剧电视剧/国产剧/庆余年 (2019)。选到媒体库以外的位置会提示“这个位置不在任何媒体库的资料夹里”。 - 点“全部重新扫描”,扫描全部媒体库。
扫描时页面上方会显示“扫描中”、百分比和正在处理的片名。第一次扫描还不知道总数,显示来回滑动的忙碌条。同一时间只运行一个扫描,其他的排队。
扫描中可以点“停止”:在两个项目之间停下,没扫到的不会从媒体库删除,下次扫描再补。排在后面等着的整库扫描(例如开机、改了设置之后的)也一起取消,停止之后再点的照常扫描;同步后、删除后只扫描变动地方的照常做(那些地方之后不会再有人扫描)。没在扫描时,进度条的位置显示上次扫了什么、处理了几个项目、是不是点了停止。
自动扫描也只扫有变动的地方:
| 时机 | 扫描范围 |
|---|---|
| 每次启动 Mi302 | 全部媒体库 |
| 115 同步完成(“同步完自动重新扫描媒体库”开着时,默认开) | 新增、改名、移动或删除的文件所在的剧或电影 |
| MoviePilot 刮削完成 | 刮削过的那些 |
MoviePilot 或其他工具调用 POST /Library/Media/Updated
|
通知里的路径(先按 MoviePilot 的路径映射换回 Mi302 的路径);通知里没有路径时扫描全部 |
播放器对单个项目“刷新”(POST /Items/{id}/Refresh,需要管理员账号) |
那部电影或那部剧;对媒体库操作就是整个媒体库 |
POST /Library/Refresh |
全部媒体库 |
| 在“媒体库”标签页保存(“储存并扫描”“新增并扫描”“删除媒体库”) | 新增或改过的媒体库;删掉的媒体库连同里面的项目一起移除 |
部分扫描以一部剧或一部电影为单位:
- 剧集媒体库:给一集或一季的路径,会重扫整部剧;给分类文件夹,会扫描里面所有剧;不在任何剧集文件夹里的文件跳过。
- 电影媒体库:重扫变动所在的整个文件夹,因为同一个文件夹里有几部视频会影响片名怎么取;直接放在媒体库文件夹下的视频只处理那一部。
- 已经删掉的路径:把数据库里那下面的项目移除。
- 重复或互相包含的路径只扫一次。
- 一次超过 300 个单位时(例如第一次全量同步),改为把这些单位所在的媒体库整个扫一次。
项目按文件路径对应。重新扫描(不论部分还是全部)不会改变项目的 id,观看记录、收藏、片头片尾记录都会保留。文件改名或移动后是新的项目,旧项目和它的观看记录在下次扫描时移除。
NAS 的 NFS/SMB、Parallels 的 /media/psf/... 这类文件夹,开机时可能比 Mi302 晚挂载。媒体库文件夹不存在、读不到或完全是空的,Mi302 会当作还没挂载:
- 整个媒体库的扫描(包括启动时那一次)保留这个文件夹原有的项目和观看记录,不会当成视频全被删了,日志记一条警告“媒体库路径不存在或是空的”。
- 部分扫描跳过这个文件夹。
挂载好之后在“媒体库”标签页点“全部重新扫描”即可。
反过来说,真的把一个文件夹清空时,旧项目会一直留着。这时在媒体库的“编辑”对话框把这个文件夹移除,再点“储存并扫描”;或点“删除媒体库”删掉整个媒体库。
排序:
- 电影和剧集的排序名用 nfo 的
<sorttitle>,没有就用片名。 - 中文先转成简体再转拼音,一个字一个音节、用空格隔开:
流浪地球2→liu lang di qiu 2。其他文字转小写。所以播放器按字母跳转也有效。 - 集的顺序按季、集号,不受影响。
搜索:
- 片名、原名(nfo 的
<originaltitle>)都能搜到。 - 中文片名还可以用全拼(
qingyunian)、首字母(qyn)、简体、繁体(慶餘年)找到“庆余年”。拼音只从片名生成,不从原名生成。 - 繁体转简体有时用字不同(
慶餘年会转成庆馀年),所以两个字以上的中文搜索词会再用拼音比对一次。
排序名和搜索用的字段在扫描时生成。每次启动都会整个扫描一次,所以从旧版更新后,旧数据会自动补齐。
Mi302 从 nfo 读取演职人员,给播放器显示:
-
<director>:导演。 -
<credits>、<writer>:编剧。 -
<actor>:演员,读取name、role、thumb、tmdbid;type是GuestStar时算客串。
显示顺序是导演、编剧、演员。点人物可以看他在 Mi302 里参与的作品,搜索也能找到人。集和季没有自己的演职人员时用剧的。
人物照片是 nfo 里 <thumb> 的地址(通常在 TMDB)。播放器请求照片时,Mi302 用 302 把它重定向到那个地址,所以播放器要能连上那台图片服务器。
TMDB 的人名常是拼音或英文(Chen He)。“设定”标签页的“中文化”卡片里,“演职人员显示中文名”(server.chinese_people,默认开)开着时,Mi302 在后台查询中文名:
- 只查 nfo 里带数字 TMDB 人物 id 的人:每部作品的导演、编剧、客串,以及排在前面的演员(程序设定是前 20 位演员,另外留 10 个位置给排在前面的导演和编剧)。
- 先问 MoviePilot 的人物接口(
/api/v1/tmdb/person/{id}),从 TMDB 的别名里挑中文的(陈赫):去掉带日文假名的,优先本来就是简体的,都没有就把繁体转成简体。每秒最多问 2 次。 - MoviePilot 没有的、或还没设置 MoviePilot、或连不上时,改问 Wikidata(按 TMDB 人物 id,每批 100 位),中文标签一律转成简体。
- 查过没有的,30 天后再查。设置了 MoviePilot 但这次连不上时,只问了 Wikidata 的人不算查过,下次再问。
- 每 30 分钟检查一次有没有新的人要查(启动 1 分钟后第一次),每次最多 500 位。也可以点“现在查中文名”立即查询。
查到之后播放器显示中文名,人物数据另外带上原名(OriginalTitle)。用原名、中文名都能搜到人。
“中文化”卡片显示演职人员、有中文名、还没查、查过没有的人数,两个来源各查到几位、上次查询时间和错误信息。还没设置 MoviePilot 时会提示只能问 Wikidata。
关掉“演职人员显示中文名”并点“储存设定”后,播放器马上改回显示原名,后台也不再查询;已经查到的中文名保留在数据库里。
“中文化”卡片里的“类型显示中文”(server.chinese_genres,默认开)开着时,扫描时会替换 nfo 的类型:
- 英文的 TMDB、IMDb 类型按下表换成中文(不区分大小写),用的是 TMDB 简体中文的叫法。
- 中文类型的繁体换成简体,所以类型一律显示简体。
- 表里没有的英文类型保持原样。替换后重复的只留一个。
这是扫描时做的,改了开关要重新扫描才生效。关掉后重新扫描,就还原成 nfo 里原本的类型。
| 英文 | 中文 | 英文 | 中文 | 英文 | 中文 |
|---|---|---|---|---|---|
| Action | 动作 | Adventure | 冒险 | Animation | 动画 |
| Comedy | 喜剧 | Crime | 犯罪 | Documentary | 纪录 |
| Drama | 剧情 | Family | 家庭 | Fantasy | 奇幻 |
| History | 历史 | Horror | 恐怖 | Music | 音乐 |
| Mystery | 悬疑 | Romance | 爱情 | Science Fiction | 科幻 |
| Sci-Fi | 科幻 | TV Movie | 电视电影 | Thriller | 惊悚 |
| War | 战争 | Western | 西部 | Action & Adventure | 动作冒险 |
| Kids | 儿童 | News | 新闻 | Reality | 真人秀 |
| Sci-Fi & Fantasy | 科幻奇幻 | Soap | 肥皂剧 | Talk | 脱口秀 |
| War & Politics | 战争政治 | Biography | 传记 | Sport | 运动 |
| Sports | 运动 | Musical | 歌舞 | Film-Noir | 黑色电影 |
| Short | 短片 | Game-Show | 游戏节目 | Reality-TV | 真人秀 |
| Talk-Show | 脱口秀 | Anime | 动画 |
播放器首页每个媒体库的封面,依次使用:
- 上传的封面。
- 媒体库文件夹里的
poster、folder或cover图(媒体库有多个文件夹时,用第一个找得到的)。
“媒体库”标签页每一格都显示封面。打开那一格的“编辑”对话框,能看到封面的来源:
- 点“上传封面”选一张图,可以是 jpg、png、gif 或 webp,最大 30 MB。
- 有上传的封面时多一个“改回预设”,点了会删掉上传的封面,改回文件夹里的图。
MoviePilot 的媒体库封面插件用 Emby 的 POST /Items/{id}/Images/Primary 上传,效果和在网页上上传一样,设置方法见 MoviePilot 集成。
上传的图片:
- 保存在数据文件夹的
images/(默认data/images/,一键安装的在config/data/images/)。封面的文件名是{项目 id}-primary_image.{扩展名}。 - 重新扫描不会被覆盖,也比文件夹里的图优先。
- 同一个接口也能给电影、剧集等其他项目上传海报、背景图、横幅、Logo,规则相同。项目从媒体库移除时,它上传的图片也跟着删除。