SsaWriter.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System;
  2. using System.Globalization;
  3. using System.IO;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Threading;
  7. using MediaBrowser.Model.MediaInfo;
  8. namespace MediaBrowser.MediaEncoding.Subtitles
  9. {
  10. /// <summary>
  11. /// SSA subtitle writer.
  12. /// </summary>
  13. public class SsaWriter : ISubtitleWriter
  14. {
  15. /// <inheritdoc />
  16. public void Write(SubtitleTrackInfo info, Stream stream, CancellationToken cancellationToken)
  17. {
  18. using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true))
  19. {
  20. var trackEvents = info.TrackEvents;
  21. var timeFormat = @"hh\:mm\:ss\.ff";
  22. // Write SSA header
  23. writer.WriteLine("[Script Info]");
  24. writer.WriteLine("Title: Jellyfin transcoded SSA subtitle");
  25. writer.WriteLine("ScriptType: v4.00");
  26. writer.WriteLine();
  27. writer.WriteLine("[V4 Styles]");
  28. writer.WriteLine("Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding");
  29. writer.WriteLine("Style: Default,Arial,20,&H00FFFFFF,&H00FFFFFF,&H19333333,&H19333333,0,0,0,1,0,2,10,10,10,0,1");
  30. writer.WriteLine();
  31. writer.WriteLine("[Events]");
  32. writer.WriteLine("Format: Layer, Start, End, Style, Text");
  33. for (int i = 0; i < trackEvents.Count; i++)
  34. {
  35. cancellationToken.ThrowIfCancellationRequested();
  36. var trackEvent = trackEvents[i];
  37. var startTime = TimeSpan.FromTicks(trackEvent.StartPositionTicks).ToString(timeFormat, CultureInfo.InvariantCulture);
  38. var endTime = TimeSpan.FromTicks(trackEvent.EndPositionTicks).ToString(timeFormat, CultureInfo.InvariantCulture);
  39. var text = Regex.Replace(trackEvent.Text, @"\n", "\\n", RegexOptions.IgnoreCase);
  40. writer.WriteLine(
  41. "Dialogue: 0,{0},{1},Default,{2}",
  42. startTime,
  43. endTime,
  44. text);
  45. }
  46. }
  47. }
  48. }
  49. }