From 8f56b74d63eb624cf26d3b1392c45beab3fb42b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Miguel=20Alm=C3=A1nzar?= Date: Sun, 11 May 2014 02:29:44 -0400 Subject: [PATCH] add VTT writer implementation --- .../Subtitles/VttWriter.cs | 14 ++- MediaBrowser.Tests/MediaBrowser.Tests.csproj | 4 + .../Subtitles/TestSubtitles/expected.vtt | 32 ++++++ .../MediaEncoding/Subtitles/VttWriterTest.cs | 103 ++++++++++++++++++ 4 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 MediaBrowser.Tests/MediaEncoding/Subtitles/TestSubtitles/expected.vtt create mode 100644 MediaBrowser.Tests/MediaEncoding/Subtitles/VttWriterTest.cs diff --git a/MediaBrowser.MediaEncoding/Subtitles/VttWriter.cs b/MediaBrowser.MediaEncoding/Subtitles/VttWriter.cs index a52043bf1..dc750fb6b 100644 --- a/MediaBrowser.MediaEncoding/Subtitles/VttWriter.cs +++ b/MediaBrowser.MediaEncoding/Subtitles/VttWriter.cs @@ -9,8 +9,18 @@ namespace MediaBrowser.MediaEncoding.Subtitles { public class VttWriter : ISubtitleWriter { - public void Write(SubtitleTrackInfo info, Stream stream) - { + public void Write(SubtitleTrackInfo info, Stream stream) { + using (var writer = new StreamWriter(stream)) + { + writer.WriteLine("WEBVTT"); + writer.WriteLine(string.Empty); + foreach (var trackEvent in info.TrackEvents) + { + writer.WriteLine(@"{0:hh\:mm\:ss\.fff} --> {1:hh\:mm\:ss\.fff}", TimeSpan.FromTicks(trackEvent.StartPositionTicks), TimeSpan.FromTicks(trackEvent.EndPositionTicks)); + writer.WriteLine(trackEvent.Text); + writer.WriteLine(string.Empty); + } + } } } } diff --git a/MediaBrowser.Tests/MediaBrowser.Tests.csproj b/MediaBrowser.Tests/MediaBrowser.Tests.csproj index dad3677f2..d31615952 100644 --- a/MediaBrowser.Tests/MediaBrowser.Tests.csproj +++ b/MediaBrowser.Tests/MediaBrowser.Tests.csproj @@ -52,6 +52,7 @@ + @@ -84,6 +85,9 @@ + + Always + Always diff --git a/MediaBrowser.Tests/MediaEncoding/Subtitles/TestSubtitles/expected.vtt b/MediaBrowser.Tests/MediaEncoding/Subtitles/TestSubtitles/expected.vtt new file mode 100644 index 000000000..b6352e7b5 --- /dev/null +++ b/MediaBrowser.Tests/MediaEncoding/Subtitles/TestSubtitles/expected.vtt @@ -0,0 +1,32 @@ +WEBVTT + +00:00:02.400 --> 00:00:05.200 +[Background Music Playing] + +00:00:15.712 --> 00:00:17.399 +Oh my god, Watch out!
It's coming!! + +00:00:25.712 --> 00:00:30.399 +[Bird noises] + +00:00:31.000 --> 00:00:31.999 +This text is RED and has not been positioned. + +00:00:32.000 --> 00:00:32.999 +This is a
new line, as is
this + +00:00:33.000 --> 00:00:33.999 +This contains nested bold, italic, underline and strike-through HTML tags + +00:00:34.000 --> 00:00:34.999 +Unclosed but supported HTML tags are left in, SSA italics aren't + +00:00:35.000 --> 00:00:35.999 +<ggg>Unsupported</ggg> HTML tags are escaped and left in, even if <hhh>not closed. + +00:00:36.000 --> 00:00:36.999 +Multiple SSA tags are stripped + +00:00:37.000 --> 00:00:37.999 +Greater than (<) and less than (>) are shown + diff --git a/MediaBrowser.Tests/MediaEncoding/Subtitles/VttWriterTest.cs b/MediaBrowser.Tests/MediaEncoding/Subtitles/VttWriterTest.cs new file mode 100644 index 000000000..5292ad3d2 --- /dev/null +++ b/MediaBrowser.Tests/MediaEncoding/Subtitles/VttWriterTest.cs @@ -0,0 +1,103 @@ +using System.Collections.Generic; +using System.IO; +using MediaBrowser.MediaEncoding.Subtitles; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace MediaBrowser.Tests.MediaEncoding.Subtitles { + + [TestClass] + public class VttWriterTest { + [TestMethod] + public void TestWrite() { + var infoSubs = + new SubtitleTrackInfo + { + TrackEvents = new List { + new SubtitleTrackEvent { + Id = "1", + StartPositionTicks = 24000000, + EndPositionTicks = 52000000, + Text = + "[Background Music Playing]" + }, + new SubtitleTrackEvent { + Id = "2", + StartPositionTicks = 157120000, + EndPositionTicks = 173990000, + Text = + "Oh my god, Watch out!
It's coming!!" + }, + new SubtitleTrackEvent { + Id = "3", + StartPositionTicks = 257120000, + EndPositionTicks = 303990000, + Text = "[Bird noises]" + }, + new SubtitleTrackEvent { + Id = "4", + StartPositionTicks = 310000000, + EndPositionTicks = 319990000, + Text = + "This text is RED and has not been positioned." + }, + new SubtitleTrackEvent { + Id = "5", + StartPositionTicks = 320000000, + EndPositionTicks = 329990000, + Text = + "This is a
new line, as is
this" + }, + new SubtitleTrackEvent { + Id = "6", + StartPositionTicks = 330000000, + EndPositionTicks = 339990000, + Text = + "This contains nested bold, italic, underline and strike-through HTML tags" + }, + new SubtitleTrackEvent { + Id = "7", + StartPositionTicks = 340000000, + EndPositionTicks = 349990000, + Text = + "Unclosed but supported HTML tags are left in, SSA italics aren't" + }, + new SubtitleTrackEvent { + Id = "8", + StartPositionTicks = 350000000, + EndPositionTicks = 359990000, + Text = + "<ggg>Unsupported</ggg> HTML tags are escaped and left in, even if <hhh>not closed." + }, + new SubtitleTrackEvent { + Id = "9", + StartPositionTicks = 360000000, + EndPositionTicks = 369990000, + Text = + "Multiple SSA tags are stripped" + }, + new SubtitleTrackEvent { + Id = "10", + StartPositionTicks = 370000000, + EndPositionTicks = 379990000, + Text = + "Greater than (<) and less than (>) are shown" + } + } + }; + + var sut = new VttWriter(); + + if(File.Exists("testVTT.vtt")) + File.Delete("testVTT.vtt"); + using (var file = File.OpenWrite("testVTT.vtt")) + { + sut.Write(infoSubs,file); + } + + var result = File.ReadAllText("testVTT.vtt"); + var expectedText = File.ReadAllText(@"MediaEncoding\Subtitles\TestSubtitles\expected.vtt"); + + Assert.AreEqual(expectedText, result); + } + } +} \ No newline at end of file