SubtitleParser.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using Emby.Naming.Common;
  5. namespace Emby.Naming.Subtitles
  6. {
  7. public class SubtitleParser
  8. {
  9. private readonly NamingOptions _options;
  10. public SubtitleParser(NamingOptions options)
  11. {
  12. _options = options;
  13. }
  14. public SubtitleInfo ParseFile(string path)
  15. {
  16. if (string.IsNullOrEmpty(path))
  17. {
  18. throw new ArgumentNullException(nameof(path));
  19. }
  20. var extension = Path.GetExtension(path);
  21. if (!_options.SubtitleFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase))
  22. {
  23. return null;
  24. }
  25. var flags = GetFlags(path);
  26. var info = new SubtitleInfo
  27. {
  28. Path = path,
  29. IsDefault = _options.SubtitleDefaultFlags.Any(i => flags.Contains(i, StringComparer.OrdinalIgnoreCase)),
  30. IsForced = _options.SubtitleForcedFlags.Any(i => flags.Contains(i, StringComparer.OrdinalIgnoreCase))
  31. };
  32. var parts = flags.Where(i => !_options.SubtitleDefaultFlags.Contains(i, StringComparer.OrdinalIgnoreCase) && !_options.SubtitleForcedFlags.Contains(i, StringComparer.OrdinalIgnoreCase))
  33. .ToList();
  34. // Should have a name, language and file extension
  35. if (parts.Count >= 3)
  36. {
  37. info.Language = parts[parts.Count - 2];
  38. }
  39. return info;
  40. }
  41. private string[] GetFlags(string path)
  42. {
  43. if (string.IsNullOrEmpty(path))
  44. {
  45. throw new ArgumentNullException(nameof(path));
  46. }
  47. // Note: the tags need be be surrounded be either a space ( ), hyphen -, dot . or underscore _.
  48. var file = Path.GetFileName(path);
  49. return file.Split(_options.SubtitleFlagDelimiters, StringSplitOptions.RemoveEmptyEntries);
  50. }
  51. }
  52. }