Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }