aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.MediaEncoding/Subtitles/TtmlWriter.cs
diff options
context:
space:
mode:
authorAndrew Rabert <6550543+nvllsvm@users.noreply.github.com>2018-12-14 18:06:12 -0500
committerGitHub <noreply@github.com>2018-12-14 18:06:12 -0500
commit81ba5acf7c9e0bfe30941476847571e09f022898 (patch)
treea92f44659da2175a54b7afde688bf14b2d7f3b09 /MediaBrowser.MediaEncoding/Subtitles/TtmlWriter.cs
parent28a2774883ac522159c845cb16e60c53b1389f15 (diff)
parent1d7d52ff9e42c3efb4bb2c65e82a4a82faf9decb (diff)
Merge pull request #154 from MatMaul/mediaencoding
Port MediaEncoding and Api.Playback
Diffstat (limited to 'MediaBrowser.MediaEncoding/Subtitles/TtmlWriter.cs')
-rw-r--r--MediaBrowser.MediaEncoding/Subtitles/TtmlWriter.cs60
1 files changed, 60 insertions, 0 deletions
diff --git a/MediaBrowser.MediaEncoding/Subtitles/TtmlWriter.cs b/MediaBrowser.MediaEncoding/Subtitles/TtmlWriter.cs
new file mode 100644
index 0000000000..c32005f897
--- /dev/null
+++ b/MediaBrowser.MediaEncoding/Subtitles/TtmlWriter.cs
@@ -0,0 +1,60 @@
+using System;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading;
+using MediaBrowser.Model.MediaInfo;
+
+namespace MediaBrowser.MediaEncoding.Subtitles
+{
+ public class TtmlWriter : ISubtitleWriter
+ {
+ public void Write(SubtitleTrackInfo info, Stream stream, CancellationToken cancellationToken)
+ {
+ // Example: https://github.com/zmalltalker/ttml2vtt/blob/master/data/sample.xml
+ // Parser example: https://github.com/mozilla/popcorn-js/blob/master/parsers/parserTTML/popcorn.parserTTML.js
+
+ using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true))
+ {
+ writer.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+ writer.WriteLine("<tt xmlns=\"http://www.w3.org/ns/ttml\" xmlns:tts=\"http://www.w3.org/2006/04/ttaf1#styling\" lang=\"no\">");
+
+ writer.WriteLine("<head>");
+ writer.WriteLine("<styling>");
+ writer.WriteLine("<style id=\"italic\" tts:fontStyle=\"italic\" />");
+ writer.WriteLine("<style id=\"left\" tts:textAlign=\"left\" />");
+ writer.WriteLine("<style id=\"center\" tts:textAlign=\"center\" />");
+ writer.WriteLine("<style id=\"right\" tts:textAlign=\"right\" />");
+ writer.WriteLine("</styling>");
+ writer.WriteLine("</head>");
+
+ writer.WriteLine("<body>");
+ writer.WriteLine("<div>");
+
+ foreach (var trackEvent in info.TrackEvents)
+ {
+ var text = trackEvent.Text;
+
+ text = Regex.Replace(text, @"\\n", "<br/>", RegexOptions.IgnoreCase);
+
+ writer.WriteLine("<p begin=\"{0}\" dur=\"{1}\">{2}</p>",
+ trackEvent.StartPositionTicks,
+ (trackEvent.EndPositionTicks - trackEvent.StartPositionTicks),
+ text);
+ }
+
+ writer.WriteLine("</div>");
+ writer.WriteLine("</body>");
+
+ writer.WriteLine("</tt>");
+ }
+ }
+
+ private string FormatTime(long ticks)
+ {
+ var time = TimeSpan.FromTicks(ticks);
+
+ return string.Format(@"{0:hh\:mm\:ss\,fff}", time);
+ }
+ }
+}