SubtitleEditParser.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System;
  2. using System.Globalization;
  3. using System.IO;
  4. using System.Linq;
  5. using Jellyfin.Extensions;
  6. using MediaBrowser.Model.MediaInfo;
  7. using Microsoft.Extensions.Logging;
  8. using Nikse.SubtitleEdit.Core.Common;
  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. public class SubtitleEditParser : ISubtitleParser
  17. {
  18. private readonly ILogger _logger;
  19. /// <summary>
  20. /// Initializes a new instance of the <see cref="SubtitleEditParser"/> class.
  21. /// </summary>
  22. /// <param name="logger">The logger.</param>
  23. public SubtitleEditParser(ILogger logger)
  24. {
  25. _logger = logger;
  26. }
  27. /// <inheritdoc />
  28. public SubtitleTrackInfo Parse(Stream stream, string fileExtension)
  29. {
  30. var subtitleFormat = SubtitleFormat.AllSubtitleFormats.FirstOrDefault(asf => asf.Extension.Equals(fileExtension, StringComparison.OrdinalIgnoreCase));
  31. if (subtitleFormat == null)
  32. {
  33. throw new ArgumentException("Unsupported format: " + fileExtension);
  34. }
  35. var lines = stream.ReadAllLines().ToList();
  36. var subtitle = new Subtitle();
  37. subtitleFormat.LoadSubtitle(subtitle, lines, fileExtension);
  38. if (subtitleFormat.ErrorCount > 0)
  39. {
  40. _logger.LogError("{ErrorCount} errors encountered while parsing subtitle", subtitleFormat.ErrorCount);
  41. }
  42. var trackInfo = new SubtitleTrackInfo();
  43. int len = subtitle.Paragraphs.Count;
  44. var trackEvents = new SubtitleTrackEvent[len];
  45. for (int i = 0; i < len; i++)
  46. {
  47. var p = subtitle.Paragraphs[i];
  48. trackEvents[i] = new SubtitleTrackEvent(p.Number.ToString(CultureInfo.InvariantCulture), p.Text)
  49. {
  50. StartPositionTicks = p.StartTime.TimeSpan.Ticks,
  51. EndPositionTicks = p.EndTime.TimeSpan.Ticks
  52. };
  53. }
  54. trackInfo.TrackEvents = trackEvents;
  55. return trackInfo;
  56. }
  57. }
  58. }