using System; using System.Collections.Generic; using System.Text; using System.Xml; namespace Nikse.SubtitleEdit.Core.SubtitleFormats { internal class MediaTransData : SubtitleFormat { public override string Extension => ".imtpro"; public override string Name => "MediaTransData"; public override string ToText(Subtitle subtitle, string title) { const string xmpTemplate = @" 2 For editing SDTV video Standard PAL video (4:3interlaced) SDTV 25.00 fps True 720 400 720/400 D1/DV PAL (1.067) | Default Default 24Bit PNG 0001 False 0 1 False Default FOX-HD-Malaysia Default False 2500 FALSE 00:00:00:00 1 09:59:35:00 1 C:\Project\uknown.mpg 29.97DF 1 Track 1 True False 7 No 40 False False In 64 False False Out 66 False False Style 15 False False StyleEx 96 False False Comment 77 False False Language 01 349 False False 4096 [COUNT] 0 "; const string paragraphTemplate = @" 10:21:15:06 10:21:16:18 Text Line1|Line2 "; var xml = new XmlDocument(); xml.LoadXml(xmpTemplate.Replace("[COUNT]", subtitle.Paragraphs.Count.ToString())); var paragraphInsertNode = xml.DocumentElement.SelectSingleNode("Tracks/Track1/Data"); int count = 1; foreach (Paragraph p in subtitle.Paragraphs) { string nodeName = "Data" + count++; XmlNode paragraph = xml.CreateElement(nodeName); paragraph.InnerXml = paragraphTemplate; paragraph.SelectSingleNode("In").InnerText = p.StartTime.ToHHMMSSFF(); paragraph.SelectSingleNode("Out").InnerText = p.EndTime.ToHHMMSSFF(); paragraph.SelectSingleNode("Fields/Field1/Data").InnerText = string.Join("|", p.Text.SplitToLines()); 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("Text") || !xmlAsText.Contains("")) { return; } try { var xml = new XmlDocument { XmlResolver = null }; xml.LoadXml(xmlAsText); foreach (XmlNode node in xml.DocumentElement.SelectNodes("//Fields/Field1")) { try { var nodeType = node.SelectSingleNode("Type"); if (nodeType?.InnerText == "Text") { var timeCodeIn = DecodeTimeCodeFrames(node.ParentNode.ParentNode.SelectSingleNode("In").InnerText, SplitCharColon); var timeCodeOut = DecodeTimeCodeFrames(node.ParentNode.ParentNode.SelectSingleNode("Out").InnerText, SplitCharColon); var text = node.SelectSingleNode("Data").InnerText.Replace("|", Environment.NewLine); var p = new Paragraph(timeCodeIn, timeCodeOut, text); subtitle.Paragraphs.Add(p); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); _errorCount++; } } subtitle.Renumber(); } catch (Exception) { _errorCount++; } } } }