| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | using System;using System.Globalization;using System.IO;using System.Text.RegularExpressions;using Emby.Naming.Common;using Jellyfin.Extensions;namespace Emby.Naming.Audio{    /// <summary>    /// Helper class to determine if Album is multipart.    /// </summary>    public partial class AlbumParser    {        private readonly NamingOptions _options;        /// <summary>        /// Initializes a new instance of the <see cref="AlbumParser"/> class.        /// </summary>        /// <param name="options">Naming options containing AlbumStackingPrefixes.</param>        public AlbumParser(NamingOptions options)        {            _options = options;        }        [GeneratedRegex(@"[-\.\(\)\s]+")]        private static partial Regex CleanRegex();        /// <summary>        /// Function that determines if album is multipart.        /// </summary>        /// <param name="path">Path to file.</param>        /// <returns>True if album is multipart.</returns>        public bool IsMultiPart(string path)        {            var filename = Path.GetFileName(path);            if (filename.Length == 0)            {                return false;            }            // TODO: Move this logic into options object            // Even better, remove the prefixes and come up with regexes            // But Kodi documentation seems to be weak for audio            // Normalize            // Remove whitespace            filename = CleanRegex().Replace(filename, " ");            ReadOnlySpan<char> trimmedFilename = filename.AsSpan().TrimStart();            foreach (var prefix in _options.AlbumStackingPrefixes)            {                if (!trimmedFilename.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))                {                    continue;                }                var tmp = trimmedFilename.Slice(prefix.Length).Trim();                if (int.TryParse(tmp.LeftPart(' '), CultureInfo.InvariantCulture, out _))                {                    return true;                }            }            return false;        }    }}
 |