Skip to content

Commit a9acabc

Browse files
committed
fix: support SxxEPxx format. close #60
1 parent 169ce81 commit a9acabc

File tree

3 files changed

+35
-16
lines changed

3 files changed

+35
-16
lines changed

Jellyfin.Plugin.MetaShark.Test/ParseNameTest.cs

+7-6
Original file line numberDiff line numberDiff line change
@@ -174,19 +174,20 @@ public void TestEposideParse()
174174
Assert.AreEqual(parseResult.Name, "New World");
175175
Assert.AreEqual(parseResult.Year, 2013);
176176

177-
// 只英文S01E01
177+
// 只英文 S01E01
178178
fileName = "She-Hulk.Attorney.At.Law.S01E01.1080p.WEBRip.x265-RARBG";
179179
parseResult = NameParser.Parse(fileName);
180180
Assert.AreEqual(parseResult.Name, "She-Hulk Attorney At Law");
181181
Assert.AreEqual(parseResult.ParentIndexNumber, 1);
182182
Assert.AreEqual(parseResult.IndexNumber, 1);
183183

184-
// 只英文S01EP01
185-
fileName = "Detective.Dee.S01EP18.2004.1080p.WEB-DL.x264.AAC-HQCS";
184+
// 测试 SXXEPXX 格式
185+
fileName = "神探狄仁杰2 Detective.Dee.Ⅱ.S02EP02.2006.2160p.WEB-DL.x264.AAC-HQC";
186186
parseResult = NameParser.Parse(fileName);
187-
Assert.AreEqual(parseResult.Name, "Detective Dee");
188-
Assert.AreEqual(parseResult.ParentIndexNumber, 1);
189-
Assert.AreEqual(parseResult.IndexNumber, 18);
187+
Assert.AreEqual(parseResult.ChineseName, "神探狄仁杰2");
188+
Assert.AreEqual(parseResult.Name, "Detective Dee Ⅱ");
189+
Assert.AreEqual(parseResult.ParentIndexNumber, 2);
190+
Assert.AreEqual(parseResult.IndexNumber, 2);
190191

191192

192193
// 日文

Jellyfin.Plugin.MetaShark/Core/NameParser.cs

+16-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Text;
66
using System.Text.RegularExpressions;
77
using System.Threading.Tasks;
8+
using Emby.Naming.TV;
89
using Jellyfin.Plugin.MetaShark.Model;
910

1011
namespace Jellyfin.Plugin.MetaShark.Core
@@ -110,7 +111,7 @@ public static ParseNameResult Parse(string fileName, bool isEpisode = false)
110111
// 假如Anitomy解析不到year,尝试使用jellyfin默认parser,看能不能解析成功
111112
if (parseResult.Year == null && !isAnime)
112113
{
113-
var nativeParseResult = ParseMovie(fileName);
114+
var nativeParseResult = ParseMovieByDefault(fileName);
114115
if (nativeParseResult.Year != null)
115116
{
116117
parseResult = nativeParseResult;
@@ -143,8 +144,10 @@ private static string CleanName(string name)
143144
return name.Replace(".", " ").Trim();
144145
}
145146

146-
// emby原始电影解析
147-
public static ParseNameResult ParseMovie(string fileName)
147+
/// <summary>
148+
/// emby原始电影解析
149+
/// </summary>
150+
public static ParseNameResult ParseMovieByDefault(string fileName)
148151
{
149152
// 默认解析器会错误把分辨率当年份,先删除
150153
fileName = resolutionReg.Replace(fileName, "");
@@ -165,6 +168,16 @@ public static ParseNameResult ParseMovie(string fileName)
165168
return parseResult;
166169
}
167170

171+
/// <summary>
172+
/// emby原始剧集解析
173+
/// </summary>
174+
public static EpisodePathParserResult ParseEpisodeByDefault(string fileName)
175+
{
176+
var nameOptions = new Emby.Naming.Common.NamingOptions();
177+
return new EpisodePathParser(nameOptions)
178+
.Parse(fileName, false);
179+
}
180+
168181

169182
private static int ParseYear(string val)
170183
{

Jellyfin.Plugin.MetaShark/Providers/EpisodeProvider.cs

+12-7
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ public async Task<MetadataResult<Episode>> GetMetadata(EpisodeInfo info, Cancell
4444
// 刷新元数据四种模式差别:
4545
// 自动扫描匹配:info的Name、IndexNumber和ParentIndexNumber是从文件名解析出来的,假如命名不规范,就会导致解析出错误值
4646
// 识别:info的Name、IndexNumber和ParentIndexNumber是从文件名解析出来的,provinceIds有指定选择项的ProvinceId
47+
// 覆盖所有元数据:info的Name、IndexNumber和ParentIndexNumber是从文件名解析出来的,provinceIds保留所有旧值
4748
// 搜索缺少的元数据:info的Name、IndexNumber和ParentIndexNumber是从当前的元数据获取,provinceIds保留所有旧值
48-
// 覆盖所有元数据:info的Name、IndexNumber和ParentIndexNumber是从当前的元数据获取,provinceIds保留所有旧值
4949
this.Log($"GetEpisodeMetadata of [name]: {info.Name} number: {info.IndexNumber} ParentIndexNumber: {info.ParentIndexNumber} IsAutomated: {info.IsAutomated}");
5050
var result = new MetadataResult<Episode>();
5151

@@ -139,6 +139,14 @@ public EpisodeInfo FixParseInfo(EpisodeInfo info)
139139
info.Year = parseResult.Year;
140140
info.Name = parseResult.ChineseName ?? parseResult.Name;
141141

142+
// 修正文件名有特殊命名SXXEPXX时,默认解析到错误季数的问题,如神探狄仁杰 Detective.Dee.S01EP01.2006.2160p.WEB-DL.x264.AAC-HQC
143+
// TODO: 会导致覆盖用户手动修改元数据的季数
144+
if (info.ParentIndexNumber.HasValue && parseResult.ParentIndexNumber.HasValue && parseResult.ParentIndexNumber > 0 && info.ParentIndexNumber != parseResult.ParentIndexNumber)
145+
{
146+
this.Log("FixSeasonNumber by anitomy. old: {0} new: {1}", info.ParentIndexNumber, parseResult.ParentIndexNumber);
147+
info.ParentIndexNumber = parseResult.ParentIndexNumber;
148+
}
149+
142150
// 没有season级目录(即虚拟季)ParentIndexNumber默认是1,季文件夹命名不规范时,ParentIndexNumber默认是null
143151
if (info.ParentIndexNumber is null)
144152
{
@@ -152,11 +160,10 @@ public EpisodeInfo FixParseInfo(EpisodeInfo info)
152160
var season = episodeItem != null ? ((Episode)episodeItem).Season : null;
153161
if (season != null && season.IndexNumber.HasValue && info.ParentIndexNumber != season.IndexNumber)
154162
{
155-
this.Log("FixSeasonNumber: old: {0} new: {1}", info.ParentIndexNumber, season.IndexNumber);
163+
this.Log("FixSeasonNumber by season. old: {0} new: {1}", info.ParentIndexNumber, season.IndexNumber);
156164
info.ParentIndexNumber = season.IndexNumber;
157165
}
158166

159-
160167
// // 当没有season级目录时,默认为1,即当成只有一季(不需要处理,虚拟季jellyfin默认传的ParentIndexNumber=1)
161168
// if (info.ParentIndexNumber is null && season != null && season.LocationType == LocationType.Virtual)
162169
// {
@@ -172,7 +179,6 @@ public EpisodeInfo FixParseInfo(EpisodeInfo info)
172179
info.ParentIndexNumber = this.GuessSeasonNumberByDirectoryName(seasonFolderPath);
173180
}
174181

175-
176182
// 识别特典
177183
if (info.ParentIndexNumber is null && NameParser.IsAnime(fileName) && (parseResult.IsSpecial || NameParser.IsSpecialDirectory(info.Path)))
178184
{
@@ -186,17 +192,16 @@ public EpisodeInfo FixParseInfo(EpisodeInfo info)
186192
// info.ParentIndexNumber = 1;
187193
// }
188194

189-
190195
// 特典优先使用文件名(特典除了前面特别设置,还有SXX/Season XX等默认的)
191196
if (info.ParentIndexNumber.HasValue && info.ParentIndexNumber == 0)
192197
{
193198
info.Name = parseResult.SpecialName == info.Name ? fileName : parseResult.SpecialName;
194199
}
195200

196-
197201
// 大于1000,可能错误解析了分辨率
198-
if (parseResult.IndexNumber.HasValue && parseResult.IndexNumber < 1000)
202+
if (parseResult.IndexNumber.HasValue && parseResult.IndexNumber < 1000 && info.IndexNumber != parseResult.IndexNumber)
199203
{
204+
this.Log("FixEpisodeNumber by anitomy. old: {0} new: {1}", info.IndexNumber, parseResult.IndexNumber);
200205
info.IndexNumber = parseResult.IndexNumber;
201206
}
202207

0 commit comments

Comments
 (0)