Files
torrentio/src/producer/Features/ParseTorrentTitle/QualityParser.cs
iPromKnight 6600fceb1a Wip Blacklisting dmm porn
Create adult text classifier ML Model

wip - starting to write PTN in c#

More work on season, show and movie parsing

Remove ML project
2024-03-10 12:48:16 +00:00

230 lines
6.7 KiB
C#

namespace Producer.Features.ParseTorrentTitle;
public static partial class QualityParser
{
[GeneratedRegex(@"\b(?<proper>proper|repack|rerip)\b", RegexOptions.IgnoreCase, "en-GB")]
private static partial Regex ProperRegex();
[GeneratedRegex(@"\b(?<real>REAL)\b", RegexOptions.None, "en-GB")]
private static partial Regex RealRegex();
[GeneratedRegex(@"(?<version>v\d\b|\[v\d\])", RegexOptions.IgnoreCase, "en-GB")]
private static partial Regex VersionExp();
[GeneratedRegex(@"\b(?<remux>(BD|UHD)?Remux)\b", RegexOptions.IgnoreCase, "en-GB")]
private static partial Regex RemuxExp();
[GeneratedRegex(@"\b(COMPLETE|ISO|BDISO|BDMux|BD25|BD50|BR.?DISK)\b", RegexOptions.IgnoreCase, "en-GB")]
private static partial Regex BdiskExp();
[GeneratedRegex(@"\b(?<rawhd>RawHD|1080i[-_. ]HDTV|Raw[-_. ]HD|MPEG[-_. ]?2)\b", RegexOptions.IgnoreCase, "en-GB")]
private static partial Regex RawHdExp();
[GeneratedRegex(@"hr[-_. ]ws", RegexOptions.IgnoreCase, "en-GB")]
private static partial Regex HighDefPdtvRegex();
public static void Parse(string title, out QualityModel result)
{
var normalizedTitle = title.Trim().Replace("_", " ").Replace("[", " ").Replace("]", " ").Trim().ToLower();
ParseQualityModifyers(title, out var revision);
ResolutionParser.Parse(normalizedTitle, out var resolution, out _);
SourceParser.ParseSourceGroups(normalizedTitle, out var sourceGroups);
SourceParser.Parse(normalizedTitle, out var source);
VideoCodecsParser.Parse(normalizedTitle, out var codec, out _);
result = new()
{
Sources = source,
Resolution = resolution,
Revision = revision,
Modifier = null,
};
if (BdiskExp().IsMatch(normalizedTitle) && sourceGroups["bluray"])
{
result.Modifier = QualityModifier.BRDISK;
result.Sources = [Source.BLURAY];
}
if (RemuxExp().IsMatch(normalizedTitle) && !sourceGroups["webdl"] && !sourceGroups["hdtv"])
{
result.Modifier = QualityModifier.REMUX;
result.Sources = [Source.BLURAY];
}
if (RawHdExp().IsMatch(normalizedTitle) && result.Modifier != QualityModifier.BRDISK && result.Modifier != QualityModifier.REMUX)
{
result.Modifier = QualityModifier.RAWHD;
result.Sources = [Source.TV];
}
if (sourceGroups["bluray"])
{
result.Sources = [Source.BLURAY];
if (codec == VideoCodec.XVID)
{
result.Resolution = Resolution.R480P;
result.Sources = [Source.DVD];
}
if (resolution == null)
{
// assume bluray is at least 720p
result.Resolution = Resolution.R720P;
}
if (resolution == null && result.Modifier == QualityModifier.BRDISK)
{
result.Resolution = Resolution.R1080P;
}
if (resolution == null && result.Modifier == QualityModifier.REMUX)
{
result.Resolution = Resolution.R2160P;
}
return;
}
if (sourceGroups["webdl"] || sourceGroups["webrip"])
{
result.Sources = source;
if (resolution == null)
{
result.Resolution = Resolution.R480P;
}
if (resolution == null)
{
result.Resolution = Resolution.R480P;
}
if (resolution == null && title.Contains("[WEBDL]"))
{
result.Resolution = Resolution.R720P;
}
return;
}
if (sourceGroups["hdtv"])
{
result.Sources = [Source.TV];
if (resolution == null)
{
result.Resolution = Resolution.R480P;
}
if (resolution == null && title.Contains("[HDTV]"))
{
result.Resolution = Resolution.R720P;
}
return;
}
if (sourceGroups["pdtv"] || sourceGroups["sdtv"] || sourceGroups["dsr"] || sourceGroups["tvrip"])
{
result.Sources = [Source.TV];
if (HighDefPdtvRegex().IsMatch(normalizedTitle))
{
result.Resolution = Resolution.R720P;
return;
}
result.Resolution = Resolution.R480P;
return;
}
if (sourceGroups["bdrip"] || sourceGroups["brrip"])
{
if (codec == VideoCodec.XVID)
{
result.Resolution = Resolution.R480P;
result.Sources = [Source.DVD];
return;
}
if (resolution == null)
{
// bdrips are at least 480p
result.Resolution = Resolution.R480P;
}
result.Sources = [Source.BLURAY];
return;
}
if (sourceGroups["workprint"])
{
result.Sources = [Source.WORKPRINT];
return;
}
if (sourceGroups["cam"])
{
result.Sources = [Source.CAM];
return;
}
if (sourceGroups["ts"])
{
result.Sources = [Source.TELESYNC];
return;
}
if (sourceGroups["tc"])
{
result.Sources = [Source.TELECINE];
return;
}
if (result.Modifier == null && (resolution == Resolution.R2160P || resolution == Resolution.R1080P || resolution == Resolution.R720P))
{
result.Sources = [Source.WEBDL];
}
}
private static void ParseQualityModifyers(string title, out Revision revision)
{
var normalizedTitle = title.Trim().Replace("_", " ").Trim().ToLower();
revision = new()
{
Version = 1,
Real = 0,
};
if (ProperRegex().IsMatch(normalizedTitle))
{
revision.Version = 2;
}
var versionResult = VersionExp().Match(normalizedTitle);
if (versionResult.Success)
{
// get numbers from version regex
var digits = Regex.Match(versionResult.Groups["version"].Value, @"\d");
if (digits.Success)
{
var value = int.Parse(digits.Value);
revision.Version = value;
}
}
var realCount = 0;
var realGlobalExp = new Regex(RealRegex().ToString(), RegexOptions.None);
// use non normalized title to prevent insensitive REAL matching
while (realGlobalExp.IsMatch(title))
{
realCount += 1;
}
revision.Real = realCount;
}
}