/// <summary> /// Parse name and year from previously determined name of audiobook. /// </summary> /// <param name="name">Name of the audiobook.</param> /// <returns>Returns <see cref="AudioBookNameParserResult"/> object.</returns> public AudioBookNameParserResult Parse(string name) { AudioBookNameParserResult result = default; foreach (var expression in _options.AudioBookNamesExpressions) { var match = new Regex(expression, RegexOptions.IgnoreCase).Match(name); if (match.Success) { if (result.Name == null) { var value = match.Groups["name"]; if (value.Success) { result.Name = value.Value; } } if (!result.Year.HasValue) { var value = match.Groups["year"]; if (value.Success) { if (int.TryParse(value.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intValue)) { result.Year = intValue; } } } } } if (string.IsNullOrEmpty(result.Name)) { result.Name = name; } return(result); }
private void FindExtraAndAlternativeFiles(ref List <AudioBookFileInfo> stackFiles, out List <AudioBookFileInfo> extras, out List <AudioBookFileInfo> alternativeVersions, AudioBookNameParserResult nameParserResult) { extras = new List <AudioBookFileInfo>(); alternativeVersions = new List <AudioBookFileInfo>(); var haveChaptersOrPages = stackFiles.Any(x => x.ChapterNumber != null || x.PartNumber != null); var groupedBy = stackFiles.GroupBy(file => new { file.ChapterNumber, file.PartNumber }); var nameWithReplacedDots = nameParserResult.Name.Replace(' ', '.'); foreach (var group in groupedBy) { if (group.Key.ChapterNumber == null && group.Key.PartNumber == null) { if (group.Count() > 1 || haveChaptersOrPages) { var ex = new List <AudioBookFileInfo>(); var alt = new List <AudioBookFileInfo>(); foreach (var audioFile in group) { var name = Path.GetFileNameWithoutExtension(audioFile.Path); if (name.Equals("audiobook") || name.Contains(nameParserResult.Name, StringComparison.OrdinalIgnoreCase) || name.Contains(nameWithReplacedDots, StringComparison.OrdinalIgnoreCase)) { alt.Add(audioFile); } else { ex.Add(audioFile); } } if (ex.Count > 0) { var extra = ex .OrderBy(x => x.Container) .ThenBy(x => x.Path) .ToList(); stackFiles = stackFiles.Except(extra).ToList(); extras.AddRange(extra); } if (alt.Count > 0) { var alternatives = alt .OrderBy(x => x.Container) .ThenBy(x => x.Path) .ToList(); var main = FindMainAudioBookFile(alternatives, nameParserResult.Name); alternatives.Remove(main); stackFiles = stackFiles.Except(alternatives).ToList(); alternativeVersions.AddRange(alternatives); } } } else if (group.Count() > 1) { var alternatives = group .OrderBy(x => x.Container) .ThenBy(x => x.Path) .Skip(1) .ToList(); stackFiles = stackFiles.Except(alternatives).ToList(); alternativeVersions.AddRange(alternatives); } } }