using System.Globalization; using System.IO; using System.Text.RegularExpressions; using Emby.Naming.Common; namespace Emby.Naming.AudioBook { /// /// Parser class to extract part and/or chapter number from audiobook filename. /// public class AudioBookFilePathParser { private readonly NamingOptions _options; /// /// Initializes a new instance of the class. /// /// Naming options containing AudioBookPartsExpressions. public AudioBookFilePathParser(NamingOptions options) { _options = options; } /// /// Based on regex determines if filename includes part/chapter number. /// /// Path to audiobook file. /// Returns object. public AudioBookFilePathParserResult Parse(string path) { AudioBookFilePathParserResult result = default; var fileName = Path.GetFileNameWithoutExtension(path); foreach (var expression in _options.AudioBookPartsExpressions) { var match = new Regex(expression, RegexOptions.IgnoreCase).Match(fileName); if (match.Success) { if (!result.ChapterNumber.HasValue) { var value = match.Groups["chapter"]; if (value.Success) { if (int.TryParse(value.ValueSpan, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intValue)) { result.ChapterNumber = intValue; } } } if (!result.PartNumber.HasValue) { var value = match.Groups["part"]; if (value.Success) { if (int.TryParse(value.ValueSpan, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intValue)) { result.PartNumber = intValue; } } } } } return result; } } }