aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.MediaEncoding/Subtitles/AssWriter.cs
diff options
context:
space:
mode:
authorJoshua M. Boniface <joshua@boniface.me>2022-06-20 09:57:57 -0400
committerJoshua Boniface <joshua@boniface.me>2022-06-29 01:26:15 -0400
commite61c80fed7201124809ac21a1b26facf1daddf90 (patch)
tree86b0015297935a8080abc70fcdb57db9d1289ece /MediaBrowser.MediaEncoding/Subtitles/AssWriter.cs
parentc0e4a33a0bcf471eb6bdb279ddada33e46edb372 (diff)
Merge pull request #7960 from Shadowghost/subrip-encoder-fix
(cherry picked from commit ae79bbc34cb3ecc297b0f21fcf474b6c359a3a33) Signed-off-by: Joshua Boniface <joshua@boniface.me>
Diffstat (limited to 'MediaBrowser.MediaEncoding/Subtitles/AssWriter.cs')
-rw-r--r--MediaBrowser.MediaEncoding/Subtitles/AssWriter.cs54
1 files changed, 54 insertions, 0 deletions
diff --git a/MediaBrowser.MediaEncoding/Subtitles/AssWriter.cs b/MediaBrowser.MediaEncoding/Subtitles/AssWriter.cs
new file mode 100644
index 000000000..0d1cf6e25
--- /dev/null
+++ b/MediaBrowser.MediaEncoding/Subtitles/AssWriter.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Globalization;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading;
+using MediaBrowser.Model.MediaInfo;
+
+namespace MediaBrowser.MediaEncoding.Subtitles
+{
+ /// <summary>
+ /// ASS subtitle writer.
+ /// </summary>
+ public class AssWriter : ISubtitleWriter
+ {
+ /// <inheritdoc />
+ public void Write(SubtitleTrackInfo info, Stream stream, CancellationToken cancellationToken)
+ {
+ using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true))
+ {
+ var trackEvents = info.TrackEvents;
+ var timeFormat = @"hh\:mm\:ss\.ff";
+
+ // Write ASS header
+ writer.WriteLine("[Script Info]");
+ writer.WriteLine("Title: Jellyfin transcoded ASS subtitle");
+ writer.WriteLine("ScriptType: v4.00+");
+ writer.WriteLine();
+ writer.WriteLine("[V4+ Styles]");
+ writer.WriteLine("Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding");
+ writer.WriteLine("Style: Default,Arial,20,&H00FFFFFF,&H00FFFFFF,&H19333333,&H910E0807,0,0,0,0,100,100,0,0,0,1,0,2,10,10,10,1");
+ writer.WriteLine();
+ writer.WriteLine("[Events]");
+ writer.WriteLine("Format: Layer, Start, End, Style, Text");
+
+ for (int i = 0; i < trackEvents.Count; i++)
+ {
+ cancellationToken.ThrowIfCancellationRequested();
+
+ var trackEvent = trackEvents[i];
+ var startTime = TimeSpan.FromTicks(trackEvent.StartPositionTicks).ToString(timeFormat, CultureInfo.InvariantCulture);
+ var endTime = TimeSpan.FromTicks(trackEvent.EndPositionTicks).ToString(timeFormat, CultureInfo.InvariantCulture);
+ var text = Regex.Replace(trackEvent.Text, @"\n", "\\n", RegexOptions.IgnoreCase);
+
+ writer.WriteLine(
+ "Dialogue: 0,{0},{1},Default,{2}",
+ startTime,
+ endTime,
+ text);
+ }
+ }
+ }
+ }
+}