public CleanDateTimeResult Clean(string name)
        {
            var originalName = name;

            // Dummy up a file extension because the expressions will fail without one
            if (string.IsNullOrWhiteSpace(Path.GetExtension(name)))
            {
                name += ".mkv";
            }

            var result = _options.CleanDateTimes.Select(i => Clean(name, i))
                         .FirstOrDefault(i => i.HasChanged) ??
                         new CleanDateTimeResult {
                Name = originalName
            };

            if (result.HasChanged)
            {
                return(result);
            }

            // Make a second pass, running clean string first
            var cleanStringResult = new CleanStringParser(_iRegexProvider).Clean(name, _options.CleanStrings);

            if (!cleanStringResult.HasChanged)
            {
                return(result);
            }

            return(_options.CleanDateTimes.Select(i => Clean(cleanStringResult.Name, i))
                   .FirstOrDefault(i => i.HasChanged) ??
                   result);
        }
        public CleanDateTimeResult Clean(string name)
        {
            var originalName = name;

            try
            {
                var extension = Path.GetExtension(name) ?? string.Empty;
                // Check supported extensions
                if (!_options.VideoFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase) &&
                    !_options.AudioFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase))
                {
                    // Dummy up a file extension because the expressions will fail without one
                    // This is tricky because we can't just check Path.GetExtension for empty
                    // If the input is "St. Vincent (2014)", it will produce ". Vincent (2014)" as the extension
                    name += ".mkv";
                }
            }
            catch (ArgumentException)
            {
            }

            var result = _options.CleanDateTimes.Select(i => Clean(name, i))
                         .FirstOrDefault(i => i.HasChanged) ??
                         new CleanDateTimeResult {
                Name = originalName
            };

            if (result.HasChanged)
            {
                return(result);
            }

            // Make a second pass, running clean string first
            var cleanStringResult = new CleanStringParser(_iRegexProvider).Clean(name, _options.CleanStrings);

            if (!cleanStringResult.HasChanged)
            {
                return(result);
            }

            return(_options.CleanDateTimes.Select(i => Clean(cleanStringResult.Name, i))
                   .FirstOrDefault(i => i.HasChanged) ??
                   result);
        }
        public CleanDateTimeResult Clean(string name)
        {
            var originalName = name;

            try
            {
                var extension = Path.GetExtension(name) ?? string.Empty;
                // Check supported extensions
                if (!_options.VideoFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase) &&
                    !_options.AudioFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase))
                {
                    // Dummy up a file extension because the expressions will fail without one
                    // This is tricky because we can't just check Path.GetExtension for empty
                    // If the input is "St. Vincent (2014)", it will produce ". Vincent (2014)" as the extension
                    name += ".mkv";
                }
            }
            catch (ArgumentException)
            {
                
            }

            var result = _options.CleanDateTimes.Select(i => Clean(name, i))
                .FirstOrDefault(i => i.HasChanged) ??
                new CleanDateTimeResult { Name = originalName };

            if (result.HasChanged)
            {
                return result;
            }

            // Make a second pass, running clean string first
            var cleanStringResult = new CleanStringParser(_iRegexProvider).Clean(name, _options.CleanStrings);

            if (!cleanStringResult.HasChanged)
            {
                return result;
            }

            return _options.CleanDateTimes.Select(i => Clean(cleanStringResult.Name, i))
                .FirstOrDefault(i => i.HasChanged) ??
                result;
        }