Add new sub format

This commit is contained in:
Nikolaj Olsson 2020-05-09 10:20:32 +02:00
parent bde737082e
commit 32bece4678
3 changed files with 105 additions and 1 deletions

View File

@ -6,7 +6,7 @@ namespace Nikse.SubtitleEdit.Core
public class SeJsonParser
{
public enum SeJsonState
{
{
Object,
Array,
Value,

View File

@ -0,0 +1,103 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
namespace Nikse.SubtitleEdit.Core.SubtitleFormats
{
public class JsonType17 : SubtitleFormat
{
public override string Extension => ".json";
public override string Name => "JSON Type 17";
public override string ToText(Subtitle subtitle, string title)
{
var sb = new StringBuilder();
sb.AppendLine("{" + Environment.NewLine + "\t\"subtitles\": [");
for (int i = 0; i < subtitle.Paragraphs.Count; i++)
{
if (i > 0)
{
sb.AppendLine("\t,");
}
sb.AppendLine("\t{");
sb.AppendLine("\t\t\"text\": [");
Paragraph p = subtitle.Paragraphs[i];
var lines = p.Text.SplitToLines();
for (int j = 0; j < lines.Count; j++)
{
sb.Append("\t\t");
sb.Append('"');
sb.Append(Json.EncodeJsonText(lines[j]));
sb.Append('"');
if (j < lines.Count - 1)
{
sb.Append(',');
}
sb.AppendLine();
}
sb.AppendLine("\t\t],");
sb.AppendLine($"\t\t\"timestamp_begin\": {p.StartTime.TotalSeconds.ToString(CultureInfo.InvariantCulture)}, ");
sb.AppendLine($"\t\t\"timestamp_end\": {p.EndTime.TotalMilliseconds.ToString(CultureInfo.InvariantCulture)}");
sb.AppendLine("\t}");
}
sb.Append("}");
return sb.ToString().Trim();
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)
{
_errorCount = 0;
var sb = new StringBuilder();
foreach (string s in lines)
{
sb.Append(s);
}
string allText = sb.ToString();
var indexOfMainTag = allText.IndexOf("\"timestamp_begin\"", StringComparison.Ordinal);
if (indexOfMainTag < 0)
{
return;
}
var startIndex = allText.IndexOf('{');
if (startIndex < 0)
{
return;
}
var json = allText.Substring(startIndex);
var parser = new SeJsonParser();
var items = parser.GetArrayElementsByName(json, "subtitles");
foreach (var item in items)
{
var textLines = parser.GetArrayElementsByName(item, "text");
var beginTime = parser.GetAllTagsByNameAsStrings(item, "timestamp_begin");
var endTime = parser.GetAllTagsByNameAsStrings(item, "timestamp_end");
if (textLines.Count > 0 && beginTime.Count == 1 && endTime.Count == 1 &&
double.TryParse(beginTime[0], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var startSeconds) &&
double.TryParse(endTime[0], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var endSeconds))
{
var text = new StringBuilder();
foreach (var line in textLines)
{
text.AppendLine(Json.DecodeJsonText(line));
}
var p = new Paragraph(text.ToString().Trim(), startSeconds * 1000.0, endSeconds * 1000.0);
subtitle.Paragraphs.Add(p);
}
}
subtitle.RemoveEmptyLines();
subtitle.Renumber();
}
}
}

View File

@ -115,6 +115,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
new JsonType14(),
new JsonType15(),
new JsonType16(),
new JsonType17(),
new KanopyHtml(),
new LambdaCap(),
new Lrc(),