VttWriter.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System;
  2. using System.IO;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. using System.Threading;
  6. using MediaBrowser.Model.MediaInfo;
  7. namespace MediaBrowser.MediaEncoding.Subtitles
  8. {
  9. /// <summary>
  10. /// Subtitle writer for the WebVTT format.
  11. /// </summary>
  12. public partial class VttWriter : ISubtitleWriter
  13. {
  14. [GeneratedRegex(@"\\n", RegexOptions.IgnoreCase)]
  15. private static partial Regex NewlineEscapeRegex();
  16. /// <inheritdoc />
  17. public void Write(SubtitleTrackInfo info, Stream stream, CancellationToken cancellationToken)
  18. {
  19. using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true))
  20. {
  21. writer.WriteLine("WEBVTT");
  22. writer.WriteLine();
  23. writer.WriteLine("Region: id:subtitle width:80% lines:3 regionanchor:50%,100% viewportanchor:50%,90%");
  24. writer.WriteLine();
  25. foreach (var trackEvent in info.TrackEvents)
  26. {
  27. cancellationToken.ThrowIfCancellationRequested();
  28. var startTime = TimeSpan.FromTicks(trackEvent.StartPositionTicks);
  29. var endTime = TimeSpan.FromTicks(trackEvent.EndPositionTicks);
  30. // make sure the start and end times are different and sequential
  31. if (endTime.TotalMilliseconds <= startTime.TotalMilliseconds)
  32. {
  33. endTime = startTime.Add(TimeSpan.FromMilliseconds(1));
  34. }
  35. writer.WriteLine(@"{0:hh\:mm\:ss\.fff} --> {1:hh\:mm\:ss\.fff} region:subtitle line:90%", startTime, endTime);
  36. var text = trackEvent.Text;
  37. // TODO: Not sure how to handle these
  38. text = NewlineEscapeRegex().Replace(text, " ");
  39. writer.WriteLine(text);
  40. writer.WriteLine();
  41. }
  42. }
  43. }
  44. }
  45. }