AssWriter.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. /// ASS subtitle writer.
  12. /// </summary>
  13. public partial class AssWriter : ISubtitleWriter
  14. {
  15. [GeneratedRegex(@"\n", RegexOptions.IgnoreCase)]
  16. private static partial Regex NewLineRegex();
  17. /// <inheritdoc />
  18. public void Write(SubtitleTrackInfo info, Stream stream, CancellationToken cancellationToken)
  19. {
  20. using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true))
  21. {
  22. var trackEvents = info.TrackEvents;
  23. var timeFormat = @"hh\:mm\:ss\.ff";
  24. // Write ASS header
  25. writer.WriteLine("[Script Info]");
  26. writer.WriteLine("Title: Jellyfin transcoded ASS subtitle");
  27. writer.WriteLine("ScriptType: v4.00+");
  28. writer.WriteLine();
  29. writer.WriteLine("[V4+ Styles]");
  30. 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");
  31. 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");
  32. writer.WriteLine();
  33. writer.WriteLine("[Events]");
  34. writer.WriteLine("Format: Layer, Start, End, Style, Text");
  35. for (int i = 0; i < trackEvents.Count; i++)
  36. {
  37. cancellationToken.ThrowIfCancellationRequested();
  38. var trackEvent = trackEvents[i];
  39. var startTime = TimeSpan.FromTicks(trackEvent.StartPositionTicks).ToString(timeFormat, CultureInfo.InvariantCulture);
  40. var endTime = TimeSpan.FromTicks(trackEvent.EndPositionTicks).ToString(timeFormat, CultureInfo.InvariantCulture);
  41. var text = NewLineRegex().Replace(trackEvent.Text, "\\n");
  42. writer.WriteLine(
  43. "Dialogue: 0,{0},{1},Default,{2}",
  44. startTime,
  45. endTime,
  46. text);
  47. }
  48. }
  49. }
  50. }
  51. }