TtmlWriter.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. public class TtmlWriter : ISubtitleWriter
  10. {
  11. public void Write(SubtitleTrackInfo info, Stream stream, CancellationToken cancellationToken)
  12. {
  13. // Example: https://github.com/zmalltalker/ttml2vtt/blob/master/data/sample.xml
  14. // Parser example: https://github.com/mozilla/popcorn-js/blob/master/parsers/parserTTML/popcorn.parserTTML.js
  15. using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true))
  16. {
  17. writer.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
  18. writer.WriteLine("<tt xmlns=\"http://www.w3.org/ns/ttml\" xmlns:tts=\"http://www.w3.org/2006/04/ttaf1#styling\" lang=\"no\">");
  19. writer.WriteLine("<head>");
  20. writer.WriteLine("<styling>");
  21. writer.WriteLine("<style id=\"italic\" tts:fontStyle=\"italic\" />");
  22. writer.WriteLine("<style id=\"left\" tts:textAlign=\"left\" />");
  23. writer.WriteLine("<style id=\"center\" tts:textAlign=\"center\" />");
  24. writer.WriteLine("<style id=\"right\" tts:textAlign=\"right\" />");
  25. writer.WriteLine("</styling>");
  26. writer.WriteLine("</head>");
  27. writer.WriteLine("<body>");
  28. writer.WriteLine("<div>");
  29. foreach (var trackEvent in info.TrackEvents)
  30. {
  31. var text = trackEvent.Text;
  32. text = Regex.Replace(text, @"\\n", "<br/>", RegexOptions.IgnoreCase);
  33. writer.WriteLine("<p begin=\"{0}\" dur=\"{1}\">{2}</p>",
  34. trackEvent.StartPositionTicks,
  35. (trackEvent.EndPositionTicks - trackEvent.StartPositionTicks),
  36. text);
  37. }
  38. writer.WriteLine("</div>");
  39. writer.WriteLine("</body>");
  40. writer.WriteLine("</tt>");
  41. }
  42. }
  43. private string FormatTime(long ticks)
  44. {
  45. var time = TimeSpan.FromTicks(ticks);
  46. return string.Format(@"{0:hh\:mm\:ss\,fff}", time);
  47. }
  48. }
  49. }