Skip to content

Commit 1dc2dd1

Browse files
committed
added multi-episode parsing for standard mode.
1 parent 2ac05eb commit 1dc2dd1

File tree

6 files changed

+48
-4
lines changed

6 files changed

+48
-4
lines changed

CustomMetadataDB.Tests/UtilsTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,23 @@ public void Test_toStandard_Naming(string filename)
115115
Assert.Equal($"{item.IndexNumber}", item.ProviderIds[Constants.PLUGIN_EXTERNAL_ID]);
116116
}
117117

118+
[Theory]
119+
[InlineData("Show Title - S01E66-E67 - episode title [foo].mkv", 67)]
120+
[InlineData("episode title ep066-ep100 [DVD].mkv", 100)]
121+
public void Test_toStandard_Naming_Multi(string filename, int indexEnd)
122+
{
123+
var path = $"/home/media/Show Title/Season 01/{filename}";
124+
var result = Utils.ToEpisode(Utils.FileToInfo(path));
125+
126+
Assert.True(result.HasMetadata);
127+
128+
var item = result.Item;
129+
130+
Assert.Equal(66, item.IndexNumber);
131+
Assert.Equal(1, item.ParentIndexNumber);
132+
Assert.Equal(indexEnd, item.IndexNumberEnd);
133+
}
134+
118135
private static ILogger<UtilsTest> SetLogger()
119136
{
120137
using ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());

CustomMetadataDB/CustomMetadataDB.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<TargetFramework>net8.0</TargetFramework>
44
<RootNamespace>CustomMetadataDB</RootNamespace>
5-
<Version>1.1.0.5</Version>
5+
<Version>1.1.0.7</Version>
66
<FileVersion>$(Version)</FileVersion>
77
<AssemblyVersion>$(Version)</AssemblyVersion>
88
<IsPackable>true</IsPackable>

CustomMetadataDB/Helpers/Constants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ public class Constants
2323
// Title ep0000
2424
new(@"^(?<title>.+?)\s?[Ee][Pp](?<episode>[0-9]{1,4})", RegexOptions.Compiled | RegexOptions.IgnoreCase),
2525
};
26+
public static readonly Regex MULTI_EPISODE_MATCHER = new(@"(EP?)(?<start>\d{1,4})-(EP?)?(?<end>\d{1,4})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
2627
}
2728
}

CustomMetadataDB/Helpers/Utils.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,26 @@ public static EpisodeInfo FileToInfo(string file, DateTime? file_date = null)
186186
return new EpisodeInfo();
187187
}
188188

189-
Logger?.LogInformation($"Parsed '{System.IO.Path.GetFileName(file)}' as 'S{item.ParentIndexNumber}E{item.IndexNumber}' - {item.Name}'.");
189+
// -- Multiple episode handling.
190+
if (!item.PremiereDate.HasValue)
191+
{
192+
var match = Constants.MULTI_EPISODE_MATCHER.Match(filename);
193+
if (match.Success)
194+
{
195+
var matchIndexEnd = int.Parse(match.Groups["end"].Value);
196+
if (matchIndexEnd < item.IndexNumber)
197+
{
198+
Logger?.LogError($"Invalid multi-episode range in '{filename}'.");
199+
}
200+
else
201+
{
202+
item.IndexNumberEnd = matchIndexEnd;
203+
}
204+
}
205+
}
206+
207+
var indexEnd = item.IndexNumberEnd.HasValue ? $"-E{item.IndexNumberEnd}" : "";
208+
Logger?.LogInformation($"Parsed '{System.IO.Path.GetFileName(file)}' as 'S{item.ParentIndexNumber}E{item.IndexNumber}{indexEnd}' - {item.Name}'.");
190209

191210
return item;
192211
}
@@ -206,6 +225,7 @@ public static MetadataResult<Episode> ToEpisode(EpisodeInfo data)
206225
{
207226
Name = data.Name,
208227
IndexNumber = data.IndexNumber,
228+
IndexNumberEnd = data.IndexNumberEnd,
209229
ParentIndexNumber = data.ParentIndexNumber,
210230
Path = data.Path,
211231
};

CustomMetadataDB/Provider/EpisodeProvider.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public EpisodeProvider(ILogger<EpisodeProvider> logger)
2727

2828
public bool HasChanged(BaseItem item, IDirectoryService directoryService)
2929
{
30+
try{
3031
FileSystemMetadata fileInfo = directoryService.GetFile(item.Path);
3132

3233
if (false == fileInfo.Exists)
@@ -35,11 +36,16 @@ public bool HasChanged(BaseItem item, IDirectoryService directoryService)
3536
return true;
3637
}
3738

38-
if (fileInfo.LastWriteTimeUtc.ToUniversalTime() > item.DateLastSaved.ToUniversalTime())
39+
if (fileInfo.CreationTimeUtc.ToUniversalTime() > item.DateLastSaved.ToUniversalTime())
3940
{
4041
_logger.LogInformation($"CMD HasChanged: '{item.Path}' has changed");
4142
return true;
4243
}
44+
}
45+
catch (Exception ex)
46+
{
47+
_logger.LogError(ex, $"CMD HasChanged: For path '{item.Path}' failed. '{ex.Message}'.");
48+
}
4349

4450
return false;
4551
}

build.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
name: "Custom metadata agent db"
33
guid: "83b77e24-9fce-4ee0-a794-73fdfa972e66"
4-
version: "1.0.0.5"
4+
version: "1.0.0.7"
55
targetAbi: "10.7.0.0"
66
owner: "arabcoders"
77
overview: "A Custom metadata agent."

0 commit comments

Comments
 (0)