SubtitleEditParser.cs 2.1 KB

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