mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-10-28 06:52:35 +01:00
Add new sub format - thx Edward :)
This commit is contained in:
parent
ef6c555d2e
commit
c3606f0148
137
src/libse/SubtitleFormats/NkhCuePoints.cs
Normal file
137
src/libse/SubtitleFormats/NkhCuePoints.cs
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
using Nikse.SubtitleEdit.Core.Common;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Text;
|
||||||
|
using System.Xml;
|
||||||
|
|
||||||
|
namespace Nikse.SubtitleEdit.Core.SubtitleFormats
|
||||||
|
{
|
||||||
|
public class NkhCuePoints : SubtitleFormat
|
||||||
|
{
|
||||||
|
public override string Extension => ".xml";
|
||||||
|
|
||||||
|
public override string Name => "NkhCuePoints";
|
||||||
|
|
||||||
|
public override string ToText(Subtitle subtitle, string title)
|
||||||
|
{
|
||||||
|
string xmlStructure =
|
||||||
|
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + Environment.NewLine +
|
||||||
|
"<FLVCoreCuePoints Version=\"1\" />";
|
||||||
|
|
||||||
|
var xml = new XmlDocument();
|
||||||
|
xml.LoadXml(xmlStructure);
|
||||||
|
|
||||||
|
foreach (var p in subtitle.Paragraphs)
|
||||||
|
{
|
||||||
|
XmlNode paragraph = xml.CreateElement("CuePoint");
|
||||||
|
|
||||||
|
XmlNode startTime = xml.CreateElement("Time");
|
||||||
|
startTime.InnerText = p.StartTime.TotalMilliseconds.ToString();
|
||||||
|
paragraph.AppendChild(startTime);
|
||||||
|
|
||||||
|
XmlNode paragraphType = xml.CreateElement("Type");
|
||||||
|
paragraphType.InnerText = "event";
|
||||||
|
paragraph.AppendChild(paragraphType);
|
||||||
|
|
||||||
|
XmlNode name = xml.CreateElement("Name");
|
||||||
|
name.InnerText = p.Text;
|
||||||
|
paragraph.AppendChild(name);
|
||||||
|
|
||||||
|
XmlNode parameters = xml.CreateElement("Parameters");
|
||||||
|
|
||||||
|
XmlNode parameter = xml.CreateElement("Parameter");
|
||||||
|
name = xml.CreateElement("Name");
|
||||||
|
name.InnerText = "source";
|
||||||
|
XmlNode value = xml.CreateElement("Value");
|
||||||
|
value.InnerText = "transcription";
|
||||||
|
parameter.AppendChild(name);
|
||||||
|
parameter.AppendChild(value);
|
||||||
|
parameters.AppendChild(parameter);
|
||||||
|
|
||||||
|
parameter = xml.CreateElement("Parameter");
|
||||||
|
name = xml.CreateElement("Name");
|
||||||
|
name.InnerText = "duration";
|
||||||
|
value = xml.CreateElement("Value");
|
||||||
|
value.InnerText = p.Duration.TotalMilliseconds.ToString();
|
||||||
|
parameter.AppendChild(name);
|
||||||
|
parameter.AppendChild(value);
|
||||||
|
parameters.AppendChild(parameter);
|
||||||
|
|
||||||
|
parameter = xml.CreateElement("Parameter");
|
||||||
|
name = xml.CreateElement("Name");
|
||||||
|
name.InnerText = "confidence";
|
||||||
|
value = xml.CreateElement("Value");
|
||||||
|
value.InnerText = "50";
|
||||||
|
parameter.AppendChild(name);
|
||||||
|
parameter.AppendChild(value);
|
||||||
|
parameters.AppendChild(parameter);
|
||||||
|
|
||||||
|
paragraph.AppendChild(parameters);
|
||||||
|
|
||||||
|
xml.DocumentElement.AppendChild(paragraph);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ToUtf8XmlString(xml);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)
|
||||||
|
{
|
||||||
|
_errorCount = 0;
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
lines.ForEach(line => sb.AppendLine(line));
|
||||||
|
var allText = sb.ToString().Trim();
|
||||||
|
|
||||||
|
var startRemove = 5;
|
||||||
|
while (allText.Length > 0 && allText[0] != '<' && startRemove > 0)
|
||||||
|
{
|
||||||
|
allText = allText.Remove(0, 1);
|
||||||
|
startRemove--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!allText.Contains("<cuepoints") && allText.Contains("<subtitle"))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var xml = new XmlDocument { XmlResolver = null };
|
||||||
|
try
|
||||||
|
{
|
||||||
|
xml.LoadXml(allText);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine(exception.Message);
|
||||||
|
_errorCount = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var lastWasSubtitle = false;
|
||||||
|
foreach (XmlNode node in xml.DocumentElement.SelectNodes("//cuepoints/cuepoint"))
|
||||||
|
{
|
||||||
|
var timeAttribute = node.Attributes["time"];
|
||||||
|
if (timeAttribute != null && double.TryParse(timeAttribute.InnerText, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var seconds))
|
||||||
|
{
|
||||||
|
var subtitleNode = node.SelectSingleNode("subtitle");
|
||||||
|
if (subtitleNode != null)
|
||||||
|
{
|
||||||
|
var text = node.InnerText;
|
||||||
|
subtitle.Paragraphs.Add(new Paragraph(text, seconds * 1000.0, seconds * 1000.0 + Configuration.Settings.General.NewEmptyDefaultMs));
|
||||||
|
lastWasSubtitle = true;
|
||||||
|
}
|
||||||
|
else if (lastWasSubtitle)
|
||||||
|
{
|
||||||
|
subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].EndTime.TotalMilliseconds = seconds * 1000.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_errorCount++;
|
||||||
|
lastWasSubtitle = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subtitle.Renumber();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -641,6 +641,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
|
|||||||
{
|
{
|
||||||
return new SubtitleFormat[]
|
return new SubtitleFormat[]
|
||||||
{
|
{
|
||||||
|
new NkhCuePoints(),
|
||||||
new DlDd(),
|
new DlDd(),
|
||||||
new Ted20(),
|
new Ted20(),
|
||||||
new Captionate(),
|
new Captionate(),
|
||||||
|
Loading…
Reference in New Issue
Block a user