From 8671f56aa8a788faa1263a98f894a0e70dd5039c Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Wed, 8 Jul 2020 12:13:51 +0200 Subject: [PATCH] Add new subtitle format - thx Holmgeir :) --- libse/SubtitleFormats/SubtitleFormat.cs | 2 +- libse/SubtitleFormats/VidIcelandic.cs | 72 +++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 libse/SubtitleFormats/VidIcelandic.cs diff --git a/libse/SubtitleFormats/SubtitleFormat.cs b/libse/SubtitleFormats/SubtitleFormat.cs index c36c501bb..89f7fc24c 100644 --- a/libse/SubtitleFormats/SubtitleFormat.cs +++ b/libse/SubtitleFormats/SubtitleFormat.cs @@ -574,7 +574,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats { new DlDd(), new Ted20(), new Captionate(), new TimeLineAscii(), new TimeLineFootageAscii(), new TimedTextImage(), new FinalCutProImage(), new SpuImage(), new Dost(), new SeImageHtmlIndex(), new BdnXml(), new Wsb(), - new JsonTypeOnlyLoad1(), new TranscriptiveJson(), new KaraokeCdgCreatorText() + new JsonTypeOnlyLoad1(), new TranscriptiveJson(), new KaraokeCdgCreatorText(), new VidIcelandic(), }; } diff --git a/libse/SubtitleFormats/VidIcelandic.cs b/libse/SubtitleFormats/VidIcelandic.cs new file mode 100644 index 000000000..23920e44d --- /dev/null +++ b/libse/SubtitleFormats/VidIcelandic.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class VidIcelandic : SubtitleFormat + { + private static readonly Regex RegexTimeCodes = new Regex(@"^#S\d{14}$", RegexOptions.Compiled); + + public override string Extension => ".vid"; + + public override string Name => "Vid Icelandic"; + + public override string ToText(Subtitle subtitle, string title) + { + return "Not implemented!"; + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + Paragraph p = null; + subtitle.Paragraphs.Clear(); + _errorCount = 0; + + if (!string.IsNullOrEmpty(fileName) && fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase) && File.Exists(fileName)) + { + lines = FileUtil.ReadAllLinesShared(fileName, Encoding.GetEncoding(861)); // icelandic dos encoding + } + + foreach (string line in lines) + { + if (line.StartsWith('#') && RegexTimeCodes.IsMatch(line)) + { + var startTime = DecodeTimeCode(line); + var endTime = DecodeDuration(startTime, line); + p = new Paragraph(startTime, endTime, string.Empty); + subtitle.Paragraphs.Add(p); + } + else if (line.Length > 11 && p != null && line.StartsWith('B')) + { + p.Text = (p.Text.TrimEnd() + Environment.NewLine + line.Remove(0, 11).Trim()).Trim(); + } + else + { + _errorCount++; + } + } + + subtitle.RemoveEmptyLines(); + subtitle.Renumber(); + } + + private TimeCode DecodeTimeCode(string line) + { + var hour = line.Substring(2, 1); + var minutes = line.Substring(3, 2); + var seconds = line.Substring(5, 2); + var frames = line.Substring(7, 2); + return new TimeCode(int.Parse(hour), int.Parse(minutes), int.Parse(seconds), FramesToMillisecondsMax999(int.Parse(frames))); + } + + private TimeCode DecodeDuration(TimeCode startTime, string line) + { + var seconds = line.Substring(10, 2); + var frames = line.Substring(12, 2); + return new TimeCode(startTime.Hours, startTime.Minutes, startTime.Seconds + int.Parse(seconds), startTime.Milliseconds + FramesToMillisecondsMax999(int.Parse(frames))); + } + } +}