VttWriter.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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 class VttWriter : ISubtitleWriter
  13. {
  14. /// <inheritdoc />
  15. public void Write(SubtitleTrackInfo info, Stream stream, CancellationToken cancellationToken)
  16. {
  17. using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true))
  18. {
  19. writer.WriteLine("WEBVTT");
  20. writer.WriteLine();
  21. writer.WriteLine("Region: id:subtitle width:80% lines:3 regionanchor:50%,100% viewportanchor:50%,90%");
  22. writer.WriteLine();
  23. foreach (var trackEvent in info.TrackEvents)
  24. {
  25. cancellationToken.ThrowIfCancellationRequested();
  26. var startTime = TimeSpan.FromTicks(trackEvent.StartPositionTicks);
  27. var endTime = TimeSpan.FromTicks(trackEvent.EndPositionTicks);
  28. // make sure the start and end times are different and sequential
  29. if (endTime.TotalMilliseconds <= startTime.TotalMilliseconds)
  30. {
  31. endTime = startTime.Add(TimeSpan.FromMilliseconds(1));
  32. }
  33. writer.WriteLine(@"{0:hh\:mm\:ss\.fff} --> {1:hh\:mm\:ss\.fff} region:subtitle line:90%", startTime, endTime);
  34. var text = trackEvent.Text;
  35. // TODO: Not sure how to handle these
  36. text = Regex.Replace(text, @"\\n", " ", RegexOptions.IgnoreCase);
  37. writer.WriteLine(text);
  38. writer.WriteLine();
  39. }
  40. }
  41. }
  42. }
  43. }