< Summary - Jellyfin

Information
Class: Emby.Naming.Book.BookFileNameParser
Assembly: Emby.Naming
File(s): /srv/git/jellyfin/Emby.Naming/Book/BookFileNameParser.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 26
Coverable lines: 26
Total lines: 75
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 26
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 12/14/2025 - 12:12:01 AM Line coverage: 0% (0/26) Branch coverage: 0% (0/26) Total lines: 75 12/14/2025 - 12:12:01 AM Line coverage: 0% (0/26) Branch coverage: 0% (0/26) Total lines: 75

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%210%
Parse(...)0%702260%

File(s)

/srv/git/jellyfin/Emby.Naming/Book/BookFileNameParser.cs

#LineLine coverage
 1using System.Text.RegularExpressions;
 2
 3namespace Emby.Naming.Book
 4{
 5    /// <summary>
 6    /// Helper class to retrieve basic metadata from a book filename.
 7    /// </summary>
 8    public static class BookFileNameParser
 9    {
 10        private const string NameMatchGroup = "name";
 11        private const string IndexMatchGroup = "index";
 12        private const string YearMatchGroup = "year";
 13        private const string SeriesNameMatchGroup = "seriesName";
 14
 015        private static readonly Regex[] _nameMatches =
 016        [
 017            // seriesName (seriesYear) #index (of count) (year) where only seriesName and index are required
 018            new Regex(@"^(?<seriesName>.+?)((\s\((?<seriesYear>[0-9]{4})\))?)\s#(?<index>[0-9]+)((\s\(of\s(?<count>[0-9]
 019            new Regex(@"^(?<name>.+?)\s\((?<seriesName>.+?),\s#(?<index>[0-9]+)\)((\s\((?<year>[0-9]{4})\))?)$"),
 020            new Regex(@"^(?<index>[0-9]+)\s\-\s(?<name>.+?)((\s\((?<year>[0-9]{4})\))?)$"),
 021            new Regex(@"(?<name>.*)\((?<year>[0-9]{4})\)"),
 022            // last resort matches the whole string as the name
 023            new Regex(@"(?<name>.*)")
 024        ];
 25
 26        /// <summary>
 27        /// Parse a filename name to retrieve the book name, series name, index, and year.
 28        /// </summary>
 29        /// <param name="name">Book filename to parse for information.</param>
 30        /// <returns>Returns <see cref="BookFileNameParserResult"/> object.</returns>
 31        public static BookFileNameParserResult Parse(string? name)
 32        {
 033            var result = new BookFileNameParserResult();
 34
 035            if (name == null)
 36            {
 037                return result;
 38            }
 39
 040            foreach (var regex in _nameMatches)
 41            {
 042                var match = regex.Match(name);
 43
 044                if (!match.Success)
 45                {
 46                    continue;
 47                }
 48
 049                if (match.Groups.TryGetValue(NameMatchGroup, out Group? nameGroup) && nameGroup.Success)
 50                {
 051                    result.Name = nameGroup.Value.Trim();
 52                }
 53
 054                if (match.Groups.TryGetValue(IndexMatchGroup, out Group? indexGroup) && indexGroup.Success && int.TryPar
 55                {
 056                    result.Index = index;
 57                }
 58
 059                if (match.Groups.TryGetValue(YearMatchGroup, out Group? yearGroup) && yearGroup.Success && int.TryParse(
 60                {
 061                    result.Year = year;
 62                }
 63
 064                if (match.Groups.TryGetValue(SeriesNameMatchGroup, out Group? seriesGroup) && seriesGroup.Success)
 65                {
 066                    result.SeriesName = seriesGroup.Value.Trim();
 67                }
 68
 069                break;
 70            }
 71
 072            return result;
 73        }
 74    }
 75}

Methods/Properties

.cctor()
Parse(System.String)