SubtitleEditParser.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #nullable enable
  2. using System.Globalization;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading;
  6. using MediaBrowser.Common.Extensions;
  7. using MediaBrowser.Model.MediaInfo;
  8. using Microsoft.Extensions.Logging;
  9. using Nikse.SubtitleEdit.Core;
  10. using ILogger = Microsoft.Extensions.Logging.ILogger;
  11. using SubtitleFormat = Nikse.SubtitleEdit.Core.SubtitleFormats.SubtitleFormat;
  12. namespace MediaBrowser.MediaEncoding.Subtitles
  13. {
  14. /// <summary>
  15. /// SubStation Alpha subtitle parser.
  16. /// </summary>
  17. /// <typeparam name="T">The <see cref="SubtitleFormat" />.</typeparam>
  18. public abstract class SubtitleEditParser<T> : ISubtitleParser
  19. where T : SubtitleFormat, new()
  20. {
  21. private readonly ILogger _logger;
  22. /// <summary>
  23. /// Initializes a new instance of the <see cref="SubtitleEditParser{T}"/> class.
  24. /// </summary>
  25. /// <param name="logger">The logger.</param>
  26. protected SubtitleEditParser(ILogger logger)
  27. {
  28. _logger = logger;
  29. }
  30. /// <inheritdoc />
  31. public SubtitleTrackInfo Parse(Stream stream, CancellationToken cancellationToken)
  32. {
  33. var subtitle = new Subtitle();
  34. var subRip = new T();
  35. var lines = stream.ReadAllLines().ToList();
  36. subRip.LoadSubtitle(subtitle, lines, "untitled");
  37. if (subRip.ErrorCount > 0)
  38. {
  39. _logger.LogError("{ErrorCount} errors encountered while parsing subtitle.");
  40. }
  41. var trackInfo = new SubtitleTrackInfo();
  42. int len = subtitle.Paragraphs.Count;
  43. var trackEvents = new SubtitleTrackEvent[len];
  44. for (int i = 0; i < len; i++)
  45. {
  46. var p = subtitle.Paragraphs[i];
  47. trackEvents[i] = new SubtitleTrackEvent(p.Number.ToString(CultureInfo.InvariantCulture), p.Text)
  48. {
  49. StartPositionTicks = p.StartTime.TimeSpan.Ticks,
  50. EndPositionTicks = p.EndTime.TimeSpan.Ticks
  51. };
  52. }
  53. trackInfo.TrackEvents = trackEvents;
  54. return trackInfo;
  55. }
  56. }
  57. }