| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 | 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>    /// SSA subtitle writer.    /// </summary>    public partial class SsaWriter : ISubtitleWriter    {        [GeneratedRegex(@"\n", RegexOptions.IgnoreCase)]        private static partial Regex NewLineRegex();        /// <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 SSA header                writer.WriteLine("[Script Info]");                writer.WriteLine("Title: Jellyfin transcoded SSA subtitle");                writer.WriteLine("ScriptType: v4.00");                writer.WriteLine();                writer.WriteLine("[V4 Styles]");                writer.WriteLine("Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding");                writer.WriteLine("Style: Default,Arial,20,&H00FFFFFF,&H00FFFFFF,&H19333333,&H19333333,0,0,0,1,0,2,10,10,10,0,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 = NewLineRegex().Replace(trackEvent.Text, "\\n");                    writer.WriteLine(                        "Dialogue: 0,{0},{1},Default,{2}",                        startTime,                        endTime,                        text);                }            }        }    }}
 |