using System.Text.RegularExpressions; namespace Emby.Naming.Book { /// /// Helper class to retrieve basic metadata from a book filename. /// public static class BookFileNameParser { private const string NameMatchGroup = "name"; private const string IndexMatchGroup = "index"; private const string YearMatchGroup = "year"; private const string SeriesNameMatchGroup = "seriesName"; private static readonly Regex[] _nameMatches = [ // seriesName (seriesYear) #index (of count) (year) where only seriesName and index are required new Regex(@"^(?.+?)((\s\((?[0-9]{4})\))?)\s#(?[0-9]+)((\s\(of\s(?[0-9]+)\))?)((\s\((?[0-9]{4})\))?)$"), new Regex(@"^(?.+?)\s\((?.+?),\s#(?[0-9]+)\)((\s\((?[0-9]{4})\))?)$"), new Regex(@"^(?[0-9]+)\s\-\s(?.+?)((\s\((?[0-9]{4})\))?)$"), new Regex(@"(?.*)\((?[0-9]{4})\)"), // last resort matches the whole string as the name new Regex(@"(?.*)") ]; /// /// Parse a filename name to retrieve the book name, series name, index, and year. /// /// Book filename to parse for information. /// Returns object. public static BookFileNameParserResult Parse(string? name) { var result = new BookFileNameParserResult(); if (name == null) { return result; } foreach (var regex in _nameMatches) { var match = regex.Match(name); if (!match.Success) { continue; } if (match.Groups.TryGetValue(NameMatchGroup, out Group? nameGroup) && nameGroup.Success) { result.Name = nameGroup.Value.Trim(); } if (match.Groups.TryGetValue(IndexMatchGroup, out Group? indexGroup) && indexGroup.Success && int.TryParse(indexGroup.Value, out var index)) { result.Index = index; } if (match.Groups.TryGetValue(YearMatchGroup, out Group? yearGroup) && yearGroup.Success && int.TryParse(yearGroup.Value, out var year)) { result.Year = year; } if (match.Groups.TryGetValue(SeriesNameMatchGroup, out Group? seriesGroup) && seriesGroup.Success) { result.SeriesName = seriesGroup.Value.Trim(); } break; } return result; } } }