using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace Nikse.SubtitleEdit.Core.SubtitleFormats
{
internal class UnknownSubtitle78 : SubtitleFormat
{
public override string Extension => ".xml";
public override string Name => "Unknown 78";
public override string ToText(Subtitle subtitle, string title)
{
const string xmpTemplate = @"
CCTV Subtitle Sequence File
1.0
1
CG1
Jetsen
CCTV Subtitle Sequence Generate by Jetsen
[YYYY-MM-DD]
[YYYY-MM-DD]
1
0
0
HD_1080_25i
1
1008
2
2
[TIME_CODE_FIRST]
[TIME_CODE_LAST]
0
66373
IsContinuousClip=FALSE
0
0
0
0
52
0
52
53
0
";
const string paragraphTemplate = @"
00:00:15:09
00:00:16:14
0
0
0
0
29
0
29
30
0
";
var xml = new XmlDocument();
var firstTimeCode = new TimeCode();
var lastTimeCode = new TimeCode();
if (subtitle.Paragraphs.Count > 0)
{
firstTimeCode = subtitle.Paragraphs[0].StartTime;
lastTimeCode = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].StartTime;
}
string today = DateTime.Now.ToString("YYYY-mm-DD");
xml.LoadXml(xmpTemplate.Replace('\'', '"').Replace("[YYYY-MM-DD]", today).Replace("[TIME_CODE_FIRST]", firstTimeCode.ToHHMMSSFF()).Replace("[TIME_CODE_LAST]", lastTimeCode.ToHHMMSSFF()));
var paragraphInsertNode = xml.DocumentElement.SelectSingleNode("TextSection");
foreach (Paragraph p in subtitle.Paragraphs)
{
XmlNode paragraph = xml.CreateElement("TextScreen");
paragraph.InnerXml = paragraphTemplate;
paragraph.SelectSingleNode("TimeCodeIn").InnerText = p.StartTime.ToHHMMSSFF();
paragraph.SelectSingleNode("TimeCodeOut").InnerText = p.EndTime.ToHHMMSSFF();
var textBlockNodes = paragraph.SelectNodes("TextBlock");
textBlockNodes[0].SelectSingleNode("String").InnerText = p.Text;
paragraphInsertNode.AppendChild(paragraph);
}
return ToUtf8XmlString(xml).Replace(" xmlns=\"\"", string.Empty);
}
public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName)
{
_errorCount = 0;
var sb = new StringBuilder();
lines.ForEach(line => sb.AppendLine(line));
var xmlAsText = sb.ToString().Trim();
if (!xmlAsText.Contains("") || !xmlAsText.Contains(""))
{
return;
}
try
{
var xml = new XmlDocument { XmlResolver = null };
xml.LoadXml(xmlAsText);
foreach (XmlNode node in xml.DocumentElement.SelectNodes("TextSection/TextScreen"))
{
try
{
var timeCodeIn = DecodeTimeCodeFrames(node.SelectSingleNode("TimeCodeIn").InnerText, SplitCharColon);
var timeCodeOut = DecodeTimeCodeFrames(node.SelectSingleNode("TimeCodeOut").InnerText, SplitCharColon);
sb.Clear();
foreach (XmlNode textBlockNode in node.SelectNodes("TextBlock"))
{
sb.AppendLine(textBlockNode.InnerText);
}
var p = new Paragraph(timeCodeIn, timeCodeOut, sb.ToString().Trim());
subtitle.Paragraphs.Add(p);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
_errorCount++;
}
}
subtitle.Renumber();
}
catch (Exception)
{
_errorCount++;
}
}
}
}