| | 1 | | using System.IO; |
| | 2 | | using System.Text; |
| | 3 | | using System.Text.RegularExpressions; |
| | 4 | | using System.Threading; |
| | 5 | | using MediaBrowser.Model.MediaInfo; |
| | 6 | |
|
| | 7 | | namespace MediaBrowser.MediaEncoding.Subtitles |
| | 8 | | { |
| | 9 | | /// <summary> |
| | 10 | | /// TTML subtitle writer. |
| | 11 | | /// </summary> |
| | 12 | | public partial class TtmlWriter : ISubtitleWriter |
| | 13 | | { |
| | 14 | | [GeneratedRegex(@"\\n", RegexOptions.IgnoreCase)] |
| | 15 | | private static partial Regex NewLineEscapeRegex(); |
| | 16 | |
|
| | 17 | | /// <inheritdoc /> |
| | 18 | | public void Write(SubtitleTrackInfo info, Stream stream, CancellationToken cancellationToken) |
| | 19 | | { |
| | 20 | | // Example: https://github.com/zmalltalker/ttml2vtt/blob/master/data/sample.xml |
| | 21 | | // Parser example: https://github.com/mozilla/popcorn-js/blob/master/parsers/parserTTML/popcorn.parserTTML.j |
| | 22 | |
|
| 0 | 23 | | using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true)) |
| | 24 | | { |
| 0 | 25 | | writer.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); |
| 0 | 26 | | writer.WriteLine("<tt xmlns=\"http://www.w3.org/ns/ttml\" xmlns:tts=\"http://www.w3.org/2006/04/ttaf1#st |
| | 27 | |
|
| 0 | 28 | | writer.WriteLine("<head>"); |
| 0 | 29 | | writer.WriteLine("<styling>"); |
| 0 | 30 | | writer.WriteLine("<style id=\"italic\" tts:fontStyle=\"italic\" />"); |
| 0 | 31 | | writer.WriteLine("<style id=\"left\" tts:textAlign=\"left\" />"); |
| 0 | 32 | | writer.WriteLine("<style id=\"center\" tts:textAlign=\"center\" />"); |
| 0 | 33 | | writer.WriteLine("<style id=\"right\" tts:textAlign=\"right\" />"); |
| 0 | 34 | | writer.WriteLine("</styling>"); |
| 0 | 35 | | writer.WriteLine("</head>"); |
| | 36 | |
|
| 0 | 37 | | writer.WriteLine("<body>"); |
| 0 | 38 | | writer.WriteLine("<div>"); |
| | 39 | |
|
| 0 | 40 | | foreach (var trackEvent in info.TrackEvents) |
| | 41 | | { |
| 0 | 42 | | var text = trackEvent.Text; |
| | 43 | |
|
| 0 | 44 | | text = NewLineEscapeRegex().Replace(text, "<br/>"); |
| | 45 | |
|
| 0 | 46 | | writer.WriteLine( |
| 0 | 47 | | "<p begin=\"{0}\" dur=\"{1}\">{2}</p>", |
| 0 | 48 | | trackEvent.StartPositionTicks, |
| 0 | 49 | | trackEvent.EndPositionTicks - trackEvent.StartPositionTicks, |
| 0 | 50 | | text); |
| | 51 | | } |
| | 52 | |
|
| 0 | 53 | | writer.WriteLine("</div>"); |
| 0 | 54 | | writer.WriteLine("</body>"); |
| | 55 | |
|
| 0 | 56 | | writer.WriteLine("</tt>"); |
| 0 | 57 | | } |
| 0 | 58 | | } |
| | 59 | | } |
| | 60 | | } |