Nfo Scraper:一款免改名的半自动媒体刮削器(更新 strm 模式)
本帖最后由 askjhas 于 2024-10-25 23:46 编辑Nfo Scraper
Github 项目:https://github.com/spr-equinox/nfo_scraper一款免改名的半自动媒体刮削器由于动漫的命名比较特殊,一般的刮削器要通过大批量的改名才能识别,于是就有了写这个软件的想法这还是我首次发帖,有什么问题请多多包涵注意:本软件仍然处于非常前期的测试阶段,建议先使用硬链接副本进行测试特点
[*]没有严格的文件名/文件夹名的限制
[*]允许电影和剧集混合,统一生成剧集格式的元数据
[*]使用可自定义的正则表达式进行标题提取
[*]可自定义需要忽略的路径,并生成 .ignore 文件
使用方法
[*]建议将媒体库按照如下格式排列(便于其他软件识别)大体上就是套两层文件夹(剧集-季度-视频文件),以下 .nfo 和 .ignore 由软件生成
媒体库
├─某个系列
││tvshow.nfo
│├─[某个制作组] Mou Ge Fan Ju
│││season.nfo
│││[某个制作组] Mou Ge Fan Ju .mkv
│││[某个制作组] Mou Ge Fan Ju .nfo
│││[某个制作组] Mou Ge Fan Ju .sc.ass
│││[某个制作组] Mou Ge Fan Ju .mkv
│││[某个制作组] Mou Ge Fan Ju .nfo
│││[某个制作组] Mou Ge Fan Ju .sc.ass
││├─CDs
││││.ignore
│││└─ 某个CD (flac)
│││ 01. 某首歌.flac
││└─SPs
││ .ignore
││ [某个制作组] Mou Ge Fan Ju .mkv
││ [某个制作组] Mou Ge Fan Ju .mkv
│├─[某个制作组]
│││season.nfo
│││[某个制作组].chs.ass
│││[某个制作组].mkv
││└─某个无关文件夹
││ .ignore
││ 某些无关文件.png
│└─Mou Ge Fan Ju S2
│ season.nfo
│ Mou Ge Fan Ju S2.mkv
│ Mou Ge Fan Ju S2.nfo
│ Mou Ge Fan Ju S2.sc.ass
└─某部电影
A Movie-.chs_jpn.ass
A Movie-.mkv
A Movie-.nfo
season.nfo
[*]打开软件目录下的 config.json (没有的在仓库下),填好 tmdb_api_key,有需要的可以自定义其他内容
[*]打开软件,把媒体文件夹拖入窗口,注意不要有重复文件夹
[*]选择“下一步”,检测搜索到的文件夹是否正确。在这步可以为需要忽略的文件夹创建 .ignore 文件,全选( Ctrl + A)列表“被忽略的路径”,选择“创建 .ignore 文件”
[*]选择“下一步”,本窗口用于创建剧集元数据。全选,再选择“搜索所选项”。软件会按照“搜索名称”向服务器搜索,如果有错误,可以双击“搜索名称”进行更改,再选择“搜索所选项”再次搜索;也可以双击错误的条目,或者选中错误的条目,选择“手动搜索所选项”,手动指定搜索结果;除此之外,还可以手动输入 ID 和类别,再选择“更新所选项”,手动指定条目
[*]全选,选择写入所选项,这一步会创建 tvshow.nfo
[*]选择“下一步”,本窗口用于创建季度元数据,季度的 ID 将会从父文件夹处继承。继承的 ID 需要手动更新季度数据,即全选并选择“更新所选项”。手动为每一个剧集指定季度。如果 ID 有误,可以用和上一步一样的方法修正
[*]全选,选择写入所选项,这一步会创建 season.nfo
[*]选择“下一步”,本窗口用于创建单集元数据。软件会先自动获取每一季度的单集信息,尝试与本地的视频进行一一对应,如果数量一致,状态会被标记为“√”,否则就是“×”。此时需要我们手动调整,双击待处理的项目,将本地视频从列表中移除、添加或者把获取到的数据移除、添加,让两边的数量和顺序对应。本地视频数量与元数据数量不匹配的话将无法写入此季度
[*]全选,选择写入所选项,这一步会创建 <文件名>.nfo
[*]选择“下一步”,本窗口用于为季度文件夹中无关的子文件夹创建 .ignore 文件。全选列表,选择“创建 .ignore 文件”即可完成操作
[*]选择“完成”结束刮削
STRM 文件模式
strm 文件是一个文本文件,里面写着媒体文件的路径 (https://emby.media/support/articles/Strm-Files.html)。媒体服务器可以通过这个文件链接到资源,而根据 strm 文件名和目录结构进行刮削,不会影响到仓库
效果:
目标文件夹
├─剧集
│├─86-不存在的战区- (2021)
││└─Season 01
││ 86-不存在的战区- S01E01.strm
││ ………
││ 86-不存在的战区- S01E23.strm
││
│├─中二病也要谈恋爱! (2012)
││├─Season 00
│││ 中二病也要谈恋爱! S00E35.strm
│││
││├─Season 01
│││ 中二病也要谈恋爱! S01E01.strm
│││ ………
│││ 中二病也要谈恋爱! S01E12.strm
│││
││└─Season 02
││ 中二病也要谈恋爱! S02E01.strm
││ ………
││ 中二病也要谈恋爱! S02E12.strm
││
│└─冰菓 (2012)
│ ├─Season 00
│ │ 冰菓 S00E01.strm
│ │
│ └─Season 01
│ 冰菓 S01E01.strm
│ ………
│ 冰菓 S01E22.strm
│
└─电影
├─中二病也要谈恋爱!剧场版 -Take On Me- (2018)
│ 中二病也要谈恋爱!剧场版 -Take On Me-.strm
│
├─中二病也要谈恋爱!剧场版 小鸟游六花?改 (2013)
│ 中二病也要谈恋爱!剧场版 小鸟游六花・改.strm
│
└─你的名字。 (2016)
你的名字。.strm
具体操作方式和 nfo 文件模式区别不大。写入文件会被替换成生成文件夹或者创建 strm 文件。方便一点的是在 strm 文件模式下,不会因为上一步没有创建文件夹而无法继续进行,只要最后一步的视频文件对应上而且选择写入了,没有创建的文件夹会自动创建
注意:如果同个视频文件存在多个版本,只会保留最早创建的 strm 文件
导入jellyfin方法:
选择“混合电影和电视剧”,然后把所有刮削器包括图片刮削器都关掉
导入媒体库并且扫描结束之后再选择“刷新媒体库”
刷新模式选覆盖所有元数据、替换现有图片
下载地址:
https://github.com/spr-equinox/nfo_scraper/releases 本帖最后由 Alicelotus 于 2024-4-24 22:51 编辑
之前就是因为下的基本都是vcb又喜欢bt保种所以都懒得改名。这次看见稍微试着玩了一下。
说说自己踩得坑{:10_1045:}
①遇到的第一个坑。config.json这里试了几次api密钥都不行,最后发现原来是用TMDB下面那个“API 读访问令牌”才对
"tmdb_api_key": ""
// tmdb api 密钥,必填,否则无法使用
②遇到的第二个问题。我的存储方式是这样的。因为Anime文件夹下已经存了不知道多少部动画了,所以直接拖拽Anime主文件夹进去几百行直接头都晕了。所以不太可能直接拖Anime文件夹。
Anime(主文件夹)
—— EIGHTY SIX (二级文件夹) ——SPs(三级文件夹)
—— EIGHTY SIX .mkv
——零之使魔全四季(二级文件夹)
——零之使魔第一季(三级文件夹)
——SPs(四级文件夹)
—— Zero no Tsukaima .mkv
——零之使魔第二季(三级文件夹)
选择直接拖86 不存在的战区(二级文件夹)这种就只有一季度的动画时,就会变成无法读取下面的mkv文件。只能读取SPs这些三级文件夹以及里面的内容
https://img.azusa.wiki/images/2024/04/24/2024-04-24-120331.png
但拖拽如零之使魔全四季(二级文件夹)这些不只有一季而是多季度的时候就会好起来
https://img.azusa.wiki/images/2024/04/24/2024-04-24-120652.png
③遇到的第三个坑,没有认真看github的使用方法。点进去以后搜索完TMDB对应信息,原来不是直接点击下一步,而是需要先点左边的写入 之后才点下一步。我一开始还以为下一步是就直接帮你写入好文件然后进行下一步。。。
同时注意到VCB零之使魔的这四季,第一季和第四季的这个命名是可以直接搜索到对应TMDB信息的,但第二季和第三季是不可以直接搜的,需要手动重新打剧集名称来搜索写入。
而这一步能否自动搜索则关系到下面的第四个问题
https://img.azusa.wiki/images/2024/04/24/2024-04-24-121440.pnghttps://img.azusa.wiki/images/2024/04/24/2024-04-24-121657.png
④遇到的第四个坑。已经写入好tvshow.nfoseason.nfo<文件名>.nfo.ignore 这四样东西后。去EMBY创建媒体库。
思考着,既然nfo文件里都已经把视频简介,剧集信息,预览图url都写进去了。那么只需要读取NFO文件,其他什么都不要不就行了?
创建EMBY媒体库
类型一:啥都没选
内容类型:电视节目
✅元数据读取器NFO
❌电视节目 元数据下载器
❌季 元数据下载器
❌集 元数据下载器
❌]电视节目 的图像获取器
❌季 的图像获取器
❌]集 的图像获取器
全部刮削失败
SPs与正片内容 分为两个文件夹
每集的预览图 ×
每集的简介 √
https://img.azusa.wiki/images/2024/04/24/2024-04-24-215135.pnghttps://img.azusa.wiki/images/2024/04/24/2024-04-24-215204.png
由于上面类型一的设置失败,那么就试着全部都只选TMDB这一个源来刮削
创建EMBY媒体库
类型二:全选TMDB刮削
内容类型:电视节目
名称:电视节目
✅元数据读取器NFO
✅电视节目 元数据下载器 TheMoiveDb
❌季 元数据下载器
✅集 元数据下载器 TheMoiveDb
✅电视节目 的图像获取器 TheMoiveDb
✅季 的图像获取器 TheMoiveDb
✅集 的图像获取器 TheMoiveDb
遇到和③类似的问题,86 零使第一季和第四季刮削成功,零使1和4季度自动合并。但第二和第三季无法正常识别。
刮削成功的86和零使1 4,点进内部
SPs与正片内容 分为两个文件夹
每集的预览图 √
每集的简介 √
https://img.azusa.wiki/images/2024/04/24/2024-04-24-194948.png
创建EMBY媒体库类型三:创建混合内容
内容类型:混合内容
名称:混合内容
✅元数据读取器NFO
✅电视节目 元数据下载器 TheMoiveDb
❌季 元数据下载器 TheMoiveDb
✅集 元数据下载器 TheMoiveDb
✅电影 元数据下载器 TheMoiveDb
✅电视节目 的图像获取器 TheMoiveDb
✅季 的图像获取器 TheMoiveDb
✅集 的图像获取器 TheMoiveDb
✅电影 的图像获取器 TheMoiveDb
86和零使 4季 全部刮削成功
但是点进内部
仅有一季的86 SPs与正片内容分为两个文件夹
有多季度的零使SPs与正片内容 合并为了一个文件夹
每集的预览图 √
每集的简介 √
https://img.azusa.wiki/images/2024/04/24/2024-04-24-200054.pnghttps://img.azusa.wiki/images/2024/04/24/2024-04-24-200111.pnghttps://img.azusa.wiki/images/2024/04/24/2024-04-24-200455.png
这一次基本算是成功了,但只算成功了90%,因为SP和正片内容混在一起了。
类型四:终于解决了
内容类型:电视节目
创建EMBY媒体库
✅元数据读取器NFO
✅电视节目 元数据下载器 TheMoiveDb-TheTVDB(比类型二多选了一个TheTVDB)
❌季 元数据下载器 TheMoiveDb
✅集 元数据下载器 TheMoiveDb
✅电视节目 的图像获取器 TheMoiveDb
✅季 的图像获取器 TheMoiveDb
✅集 的图像获取器 TheMoiveDb
全部刮削成功
SPs与正片内容 分为两个文件夹
每集的预览图 √
每集的简介 √
https://img.azusa.wiki/images/2024/04/24/2024-04-24-205409.pnghttps://img.azusa.wiki/images/2024/04/24/2024-04-24-221629.pnghttps://img.azusa.wiki/images/2024/04/24/2024-04-24-221704.png
然后得出结论,其实就是直接选创建电视节目的媒体库,选好偏好语言之后直接按默认的保存就完事了,或者在默认的基础上再勾上TMDB的源获取。
但还有最后一种就是类似魔禁系列这种。多季度+剧场版的没试过在电视节目媒体库下的表现会是怎么样的。
综上所述就是这几个坑,其实①③④都解决了。唯独②,关于单季度番剧的剧集信息nfo写入的这个问题。我除了特意创建多一个文件夹把86拖进去让它多添加一层之后,写好了nfo再把他们又重新拖回出来没别的办法。
所以楼主可以改一改软件让类似单季度这样的番剧没必要额外再在上面多添加一层文件夹后才能读取吗?
本帖最后由 askjhas 于 2024-4-24 23:19 编辑
Alicelotus 发表于 2024-4-24 22:33
之前就是因为下的基本都是vcb又喜欢bt保种所以都懒得改名。这次看见稍微试着玩了一下。
说说自己踩得坑{:10 ...
我估计你的情况是直接把视频文件夹直接拖入软件了,我的搜索逻辑是不识别直接裸露在媒体库文件夹下的视频文件,因为这个文件夹可能没有父路径,会让程序崩溃。我也许可以搞个选项让单季的文件夹识别,跳过刮取剧集的操作
我的设想是直接放大的anime文件夹进去的,我自己刮削整个大的文件夹(5TB)大概用了15min
由于我没有去试 EMBY不知道具体情况。只试了 jellyfin,jellyfin我是选择“混合电影和电视剧”,然后把所有刮削器包括图片刮削器都关掉,就能正常读取。软件写入的nfo文件中的图片用的是超链接的方式,所以要通过某些方法连上 image.tmdb.org,一开始是没有图片的,但可以看到有网络连接。jellyfin显示读取完媒体库之后,网络也不活动了,仍然没有图片,但是把jellyfin开着放一段时间,估计软件刷新了,图片就出来了,不知道EMBY是不是类似的问题。
SP的话实在太乱了,有菜单啊,访谈之类的,tmdb还不一定有收录,是没有打算让软件刮的。但sp没有元数据就会搞乱页面,所以我在最后一步给了写入.ignore文件的选项(记得全选,再点写入),用来让jellyfin和EMBY不读取sp或者cd这些非正片的文件夹
askjhas 发表于 2024-4-24 23:11
我估计你的情况是直接把视频文件夹直接拖入软件了,我的搜索逻辑是不识别直接裸露在媒体库文件夹下的视频 ...
昨晚看见你说的就去试了试Jellyfin。
在emby和jellyfin两边都是创建的混合内容。都是只读取元nfo文件,其他下载器获取器全关的情况下。
首先是单季度的,由于没有上一集文件夹,第一步的tvshow.nfo写入跳过,只写入的season和单集nfo的情况。
emby和jellyfin都是可以不可以直接识别出剧集信息的。emby是直接啥都没有,jellyfin是点进去只有单集的标题和简介,但顺序都是乱的。
https://img.azusa.wiki/images/2024/04/25/QQ20240425182352.pnghttps://img.azusa.wiki/images/2024/04/25/QQ20240425185944.png
接着是把tvshow.nfo放回去单季度的文件里,和season他们在同一个文件夹下,就都可以成功显示剧集了。
然后就是和多季度剧集一样,跟我楼上提到过的问题④的类型一那样了。只有单集的标题和简介,然后剧集和单集的图像都是没有的。
https://img.azusa.wiki/images/2024/04/25/QQ20240425181033.png
然后发现emby和jellyfin两边都是只有演员的图片
https://img.azusa.wiki/images/2024/04/25/QQ20240425190938.pnghttps://img.azusa.wiki/images/2024/04/25/QQ20240425191000.png
然后想着楼主说过开着放一段时间就有,但昨晚到现在依旧还是保持原样,楼主能截一下看看你的媒体库设置是怎么样的吗。
我现在jellyfin什么都不选是这样的。SPs不选igonre是想着里面有NCOP之类的,但这估计是没啥方法解决了。实在不行还是只能改名或者忽略了
本帖最后由 askjhas 于 2024-4-27 18:11 编辑
Alicelotus 发表于 2024-4-25 19:23
昨晚看见你说的就去试了试Jellyfin。
在emby和jellyfin两边都是创建的混合内容。都是只读取元nfo文件,其 ...
我的设置和你一摸一样,是有这样的效果的,找了个有剧场版和多季的
https://img.azusa.wiki/images/2024/04/25/2024-04-25-19-58-54.jpg
可以去这里看看Jellyfin的日志,有没有网络连接错误
C:\ProgramData\Jellyfin\Server\log
像这样的
MediaBrowser.Providers.Manager.ProviderManager: "TmdbEpisodeImageProvider" failed in GetImageInfos for type "Episode" at ""
System.Net.Http.HttpRequestException: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 (api.themoviedb.org:443)
---> System.Net.Sockets.SocketException (10060): 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
at System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|277_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(HttpRequestMessage request)
at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.GetHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net.Http.DiagnosticsHandler.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
at TMDbLib.Rest.RestRequest.SendInternal(HttpMethod method, CancellationToken cancellationToken)
at TMDbLib.Rest.RestRequest.Get(CancellationToken cancellationToken)
at TMDbLib.Rest.RestRequestExtensions.GetOfT(RestRequest request, CancellationToken cancellationToken)
at TMDbLib.Client.TMDbClient.GetConfigAsync()
at MediaBrowser.Providers.Plugins.Tmdb.TmdbClientManager.EnsureClientConfigAsync()
at MediaBrowser.Providers.Plugins.Tmdb.TmdbClientManager.GetEpisodeAsync(Int32 tvShowId, Int32 seasonNumber, Int32 episodeNumber, String displayOrder, String language, String imageLanguages, CancellationToken cancellationToken)
at MediaBrowser.Providers.Plugins.Tmdb.TV.TmdbEpisodeImageProvider.GetImages(BaseItem item, CancellationToken cancellationToken)
at MediaBrowser.Providers.Manager.ProviderManager.GetImages(BaseItem item, IRemoteImageProvider provider, String preferredLanguage, Boolean includeAllLanguages, CancellationToken cancellationToken, Nullable`1 type)
Emby.Server.Implementations.Library.LibraryManager: Cannot compute blurhash for "C:\ProgramData\Jellyfin\Server\metadata\library\6a\6ab0abd3f58697a7659fa0d749550bc1\poster.jpg"
image.tmdb.org 的连接性貌似不稳定
还是没有的话刷新一下元数据,选覆盖所有,在代理日志里面看看有没有image.tmdb.org的网络连接
目录结构放附件了
--2024.4.27--
已经基本确定了怎么导入jellyfin
导入媒体库之后选择“刷新媒体库”
刷新模式选覆盖所有元数据、替换现有图片
更新STRM 文件模式
strm 文件是一个文本文件,里面写着媒体文件的路径 (https://emby.media/support/articles/Strm-Files.html)。媒体服务器可以通过这个文件链接到资源,而根据 strm 文件名和目录结构进行刮削,不会影响到仓库
效果:
目标文件夹
├─剧集
│├─86-不存在的战区- (2021)
││└─Season 01
││ 86-不存在的战区- S01E01.strm
││ ………
││ 86-不存在的战区- S01E23.strm
││
│├─中二病也要谈恋爱! (2012)
││├─Season 00
│││ 中二病也要谈恋爱! S00E35.strm
│││
││├─Season 01
│││ 中二病也要谈恋爱! S01E01.strm
│││ ………
│││ 中二病也要谈恋爱! S01E12.strm
│││
││└─Season 02
││ 中二病也要谈恋爱! S02E01.strm
││ ………
││ 中二病也要谈恋爱! S02E12.strm
││
│└─冰菓 (2012)
│ ├─Season 00
│ │ 冰菓 S00E01.strm
│ │
│ └─Season 01
│ 冰菓 S01E01.strm
│ ………
│ 冰菓 S01E22.strm
│
└─电影
├─中二病也要谈恋爱!剧场版 -Take On Me- (2018)
│ 中二病也要谈恋爱!剧场版 -Take On Me-.strm
│
├─中二病也要谈恋爱!剧场版 小鸟游六花?改 (2013)
│ 中二病也要谈恋爱!剧场版 小鸟游六花・改.strm
│
└─你的名字。 (2016)
你的名字。.strm
具体操作方式和 nfo 文件模式区别不大。写入文件会被替换成生成文件夹或者创建 strm 文件。方便一点的是在 strm 文件模式下,不会因为上一步没有创建文件夹而无法继续进行,只要最后一步的视频文件对应上而且选择写入了,没有创建的文件夹会自动创建
注意:如果同个视频文件存在多个版本,只会保留最早创建的 strm 文件
页:
[1]