Working on formats

git-svn-id: https://subtitleedit.googlecode.com/svn/trunk@1185 99eadd0c-20b8-1223-b5c4-2a2b2df33de2
This commit is contained in:
niksedk 2012-05-16 20:37:15 +00:00
parent 77d929cf12
commit 8d136715d1
13 changed files with 1009 additions and 493 deletions

View File

@ -90,11 +90,14 @@
this.toolStripMenuItemExportPngXml = new System.Windows.Forms.ToolStripMenuItem();
this.bluraySupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItemExportCapMakerPlus = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItemExportCaptionInc = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItemCavena890 = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItemExportCheetahCap = new System.Windows.Forms.ToolStripMenuItem();
this.eBUSTLToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItemImagePerFrame = new System.Windows.Forms.ToolStripMenuItem();
this.pACScreenElectronicsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.plainTextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItemExportUltech130 = new System.Windows.Forms.ToolStripMenuItem();
this.plainTextWithoutLineBreaksToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.vobSubsubidxToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();
@ -951,11 +954,14 @@
this.toolStripMenuItemExportPngXml,
this.bluraySupToolStripMenuItem,
this.toolStripMenuItemExportCapMakerPlus,
this.toolStripMenuItemExportCaptionInc,
this.toolStripMenuItemCavena890,
this.toolStripMenuItemExportCheetahCap,
this.eBUSTLToolStripMenuItem,
this.toolStripMenuItemImagePerFrame,
this.pACScreenElectronicsToolStripMenuItem,
this.plainTextToolStripMenuItem,
this.toolStripMenuItemExportUltech130,
this.plainTextWithoutLineBreaksToolStripMenuItem,
this.vobSubsubidxToolStripMenuItem});
this.toolStripMenuItemExport.Name = "toolStripMenuItemExport";
@ -990,6 +996,13 @@
this.toolStripMenuItemExportCapMakerPlus.Text = "CapMaker Plus...";
this.toolStripMenuItemExportCapMakerPlus.Click += new System.EventHandler(this.toolStripMenuItemExportCapMakerPlus_Click);
//
// toolStripMenuItemExportCaptionInc
//
this.toolStripMenuItemExportCaptionInc.Name = "toolStripMenuItemExportCaptionInc";
this.toolStripMenuItemExportCaptionInc.Size = new System.Drawing.Size(258, 22);
this.toolStripMenuItemExportCaptionInc.Text = "Captions Inc...";
this.toolStripMenuItemExportCaptionInc.Click += new System.EventHandler(this.toolStripMenuItemExportCaptionInc_Click);
//
// toolStripMenuItemCavena890
//
this.toolStripMenuItemCavena890.Name = "toolStripMenuItemCavena890";
@ -997,6 +1010,13 @@
this.toolStripMenuItemCavena890.Text = "Cavena 890...";
this.toolStripMenuItemCavena890.Click += new System.EventHandler(this.ToolStripMenuItemCavena890Click);
//
// toolStripMenuItemExportCheetahCap
//
this.toolStripMenuItemExportCheetahCap.Name = "toolStripMenuItemExportCheetahCap";
this.toolStripMenuItemExportCheetahCap.Size = new System.Drawing.Size(258, 22);
this.toolStripMenuItemExportCheetahCap.Text = "Cheetah CAP...";
this.toolStripMenuItemExportCheetahCap.Click += new System.EventHandler(this.toolStripMenuItemExportCheetahCap_Click);
//
// eBUSTLToolStripMenuItem
//
this.eBUSTLToolStripMenuItem.Name = "eBUSTLToolStripMenuItem";
@ -1026,6 +1046,13 @@
this.plainTextToolStripMenuItem.Text = "Plain text...";
this.plainTextToolStripMenuItem.Click += new System.EventHandler(this.PlainTextToolStripMenuItemClick);
//
// toolStripMenuItemExportUltech130
//
this.toolStripMenuItemExportUltech130.Name = "toolStripMenuItemExportUltech130";
this.toolStripMenuItemExportUltech130.Size = new System.Drawing.Size(258, 22);
this.toolStripMenuItemExportUltech130.Text = "Ultech caption...";
this.toolStripMenuItemExportUltech130.Click += new System.EventHandler(this.toolStripMenuItemExportUltech130_Click);
//
// plainTextWithoutLineBreaksToolStripMenuItem
//
this.plainTextWithoutLineBreaksToolStripMenuItem.Name = "plainTextWithoutLineBreaksToolStripMenuItem";
@ -1755,7 +1782,7 @@
this.fixCommonErrorsInSelectedLinesToolStripMenuItem,
this.changeCasingForSelectedLinesToolStripMenuItem});
this.contextMenuStripListview.Name = "contextMenuStripListview";
this.contextMenuStripListview.Size = new System.Drawing.Size(285, 782);
this.contextMenuStripListview.Size = new System.Drawing.Size(285, 760);
this.contextMenuStripListview.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripListviewOpening);
//
// setStylesForSelectedLinesToolStripMenuItem
@ -3014,7 +3041,7 @@
this.showOnlyWaveformToolStripMenuItem,
this.showOnlySpectrogramToolStripMenuItem});
this.contextMenuStripWaveForm.Name = "contextMenuStripWaveForm";
this.contextMenuStripWaveForm.Size = new System.Drawing.Size(253, 236);
this.contextMenuStripWaveForm.Size = new System.Drawing.Size(253, 214);
this.contextMenuStripWaveForm.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripWaveFormOpening);
//
// addParagraphHereToolStripMenuItem
@ -4162,6 +4189,9 @@
private System.Windows.Forms.ToolStripMenuItem joinSubtitlesToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemReverseRightToLeftStartEnd;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportCapMakerPlus;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportCheetahCap;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportCaptionInc;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemExportUltech130;
}
}

View File

@ -1843,6 +1843,35 @@ namespace Nikse.SubtitleEdit.Forms
}
}
if (format == null)
{
var captionsInc = new CaptionsInc();
if (captionsInc.IsMine(null, fileName))
{
captionsInc.LoadSubtitle(_subtitle, null, fileName);
_oldSubtitleFormat = captionsInc;
SetFormatToSubRip();
SetEncoding(Configuration.Settings.General.DefaultEncoding);
encoding = GetCurrentEncoding();
justConverted = true;
format = GetCurrentSubtitleFormat();
}
}
if (format == null)
{
var ultech130 = new Ultech130();
if (ultech130.IsMine(null, fileName))
{
ultech130.LoadSubtitle(_subtitle, null, fileName);
_oldSubtitleFormat = ultech130;
SetFormatToSubRip();
SetEncoding(Configuration.Settings.General.DefaultEncoding);
encoding = GetCurrentEncoding();
justConverted = true;
format = GetCurrentSubtitleFormat();
}
}
if (format == null)
{
@ -12247,7 +12276,16 @@ namespace Nikse.SubtitleEdit.Forms
private void InsertLineToolStripMenuItemClick(object sender, EventArgs e)
{
InsertBefore();
if (_subtitle == null || _subtitle.Paragraphs.Count == 0)
{
InsertBefore();
}
else
{
SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.Count - 1);
InsertAfter();
SubtitleListview1.SelectIndexAndEnsureVisible(_subtitle.Paragraphs.Count - 1);
}
}
private void CloseVideoToolStripMenuItemClick(object sender, EventArgs e)
@ -13842,5 +13880,104 @@ namespace Nikse.SubtitleEdit.Forms
}
}
private void toolStripMenuItemExportCheetahCap_Click(object sender, EventArgs e)
{
var cheetahCaption = new CheetahCaption();
saveFileDialog1.Filter = cheetahCaption.Name + "|*" + cheetahCaption.Extension;
saveFileDialog1.Title = _language.SaveSubtitleAs;
saveFileDialog1.DefaultExt = "*" + cheetahCaption.Extension;
saveFileDialog1.AddExtension = true;
if (!string.IsNullOrEmpty(_videoFileName))
saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_videoFileName);
else
saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_fileName);
if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory))
saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory;
DialogResult result = saveFileDialog1.ShowDialog(this);
if (result == DialogResult.OK)
{
openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory;
string fileName = saveFileDialog1.FileName;
string ext = Path.GetExtension(fileName).ToLower();
bool extOk = ext == cheetahCaption.Extension.ToLower();
if (!extOk)
{
if (fileName.EndsWith("."))
fileName = fileName.Substring(0, fileName.Length - 1);
fileName += cheetahCaption.Extension;
}
cheetahCaption.Save(fileName, _subtitle);
}
}
private void toolStripMenuItemExportCaptionInc_Click(object sender, EventArgs e)
{
var captionInc = new CaptionsInc();
saveFileDialog1.Filter = captionInc.Name + "|*" + captionInc.Extension;
saveFileDialog1.Title = _language.SaveSubtitleAs;
saveFileDialog1.DefaultExt = "*" + captionInc.Extension;
saveFileDialog1.AddExtension = true;
if (!string.IsNullOrEmpty(_videoFileName))
saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_videoFileName);
else
saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_fileName);
if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory))
saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory;
DialogResult result = saveFileDialog1.ShowDialog(this);
if (result == DialogResult.OK)
{
openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory;
string fileName = saveFileDialog1.FileName;
string ext = Path.GetExtension(fileName).ToLower();
bool extOk = ext == captionInc.Extension.ToLower();
if (!extOk)
{
if (fileName.EndsWith("."))
fileName = fileName.Substring(0, fileName.Length - 1);
fileName += captionInc.Extension;
}
captionInc.Save(fileName, _subtitle);
}
}
private void toolStripMenuItemExportUltech130_Click(object sender, EventArgs e)
{
var ultech130 = new Ultech130();
saveFileDialog1.Filter = ultech130.Name + "|*" + ultech130.Extension;
saveFileDialog1.Title = _language.SaveSubtitleAs;
saveFileDialog1.DefaultExt = "*" + ultech130.Extension;
saveFileDialog1.AddExtension = true;
if (!string.IsNullOrEmpty(_videoFileName))
saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_videoFileName);
else
saveFileDialog1.FileName = Path.GetFileNameWithoutExtension(_fileName);
if (!string.IsNullOrEmpty(openFileDialog1.InitialDirectory))
saveFileDialog1.InitialDirectory = openFileDialog1.InitialDirectory;
DialogResult result = saveFileDialog1.ShowDialog(this);
if (result == DialogResult.OK)
{
openFileDialog1.InitialDirectory = saveFileDialog1.InitialDirectory;
string fileName = saveFileDialog1.FileName;
string ext = Path.GetExtension(fileName).ToLower();
bool extOk = ext == ultech130.Extension.ToLower();
if (!extOk)
{
if (fileName.EndsWith("."))
fileName = fileName.Substring(0, fileName.Length - 1);
fileName += ultech130.Extension;
}
ultech130.Save(fileName, _subtitle);
}
}
}
}

View File

@ -574,6 +574,9 @@
<metadata name="toolStripWaveControls.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>208, 56</value>
</metadata>
<metadata name="toolStripWaveControls.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>208, 56</value>
</metadata>
<data name="toolStripButtonWaveFormZoomOut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@ -681,7 +684,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD2
CAAAAk1TRnQBSQFMAgEBAgEAAZgBEgGYARIBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
CAAAAk1TRnQBSQFMAgEBAgEAAcgBEgHIARIBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA

View File

@ -2293,7 +2293,7 @@
"Down",
"End",
"Escape",
"Ins",
"Insert",
"Left",
"Pause",
"Return",

View File

@ -589,8 +589,8 @@ namespace Nikse.SubtitleEdit.Logic
MainAdjustSetEnd = string.Empty;
MainAdjustSelected100MsForward = string.Empty;
MainAdjustSelected100MsBack = string.Empty;
MainInsertAfter = "Alt+Ins";
MainInsertBefore = "Control+Shift+Ins";
MainInsertAfter = "Alt+Insert";
MainInsertBefore = "Control+Shift+Insert";
MainMergeDialogue = string.Empty;
WaveformVerticalZoom = string.Empty;
WaveformPlaySelection = string.Empty;

View File

@ -61,27 +61,55 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
buffer = new byte[] { // styles 00 00 80 BF 00 00 00 C0 02 00 01 00
0,
0,
0x80,
0x80, //horizontal align, 0x80BF= center, 0x0000=left, 0x00c0=right
0xBF,
0,
0,
0,
0xC0, // horizontal pos: C0=bottom, 0=top
2,
0xC0, // vertical pos: C0=bottom, 0=top
2, //justification, 1=left, 2=center
0,
1, //1=normal font, 3=italic
0 };
if (p.Text.StartsWith("{\\a6}"))
string text = p.Text;
if (text.StartsWith("{\\a6}"))
{
p.Text = p.Text.Remove(0, 5);
text = p.Text.Remove(0, 5);
buffer[7] = 0; // align top
}
if (p.Text.StartsWith("<i>") && p.Text.EndsWith("</i>"))
else if (text.StartsWith("{\\a1}"))
{
text = p.Text.Remove(0, 5);
buffer[2] = 0; // align left
buffer[3] = 0; // align left
}
else if (text.StartsWith("{\\a3}"))
{
text = p.Text.Remove(0, 5);
buffer[2] = 0; // align right
buffer[3] = 0xc0; // align right
}
else if (text.StartsWith("{\\a5}"))
{
text = p.Text.Remove(0, 5);
buffer[7] = 0; // align top
buffer[2] = 0; // align left
buffer[3] = 0; // align left
}
else if (text.StartsWith("{\\a7}"))
{
text = p.Text.Remove(0, 5);
buffer[7] = 0; // align top
buffer[2] = 0; // align right
buffer[3] = 0xc0; // align right
}
if (text.StartsWith("<i>") && text.EndsWith("</i>"))
buffer[10] = 3;
fs.Write(buffer, 0, buffer.Length);
string text = Utilities.RemoveHtmlTags(p.Text);
text = Utilities.RemoveHtmlTags(text);
if (text.Length > 118)
text = text.Substring(0, 118);
fs.WriteByte((byte)(text.Length));

View File

@ -139,10 +139,11 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
bool textEnd = false;
while (!startFound && !textEnd && i < buffer.Length - 20)
{
bool skip = false;
if (buffer[i] == 0x0d)
i++;
else if (buffer[i] == 0x0a)
;
skip = true;
else if (buffer[i] == 0x14 && buffer[i + 1] == 0x2c) // text end
textEnd = true;
else if (buffer[i] <= 0x20) // text start
@ -150,7 +151,8 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
else
startFound = true;
i++;
if (!skip)
i++;
}
i++;

View File

@ -35,7 +35,12 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
byte[] buffer = new byte[] { 0xEA, 0x22, 1, 0 }; // header
fs.Write(buffer, 0, buffer.Length);
buffer = new byte[] { 5, 0, 9, 0xA8, 0xAF, 0x4F }; // sizes
int numberOfLines = subtitle.Paragraphs.Count;
fs.WriteByte((byte)(numberOfLines % 256)); // paragraphs - low byte
fs.WriteByte((byte)(numberOfLines / 256)); // paragraphs - high byte
buffer = new byte[] { 9, 0xA8, 0xAF, 0x4F }; // ?
fs.Write(buffer, 0, buffer.Length);
for (int i = 0; i < 118; i++)
@ -45,19 +50,71 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
foreach (Paragraph p in subtitle.Paragraphs)
{
string text = p.Text.Replace(Environment.NewLine, "\0\0\0\0");
int length = text.Length + 16;
//styles + ?
buffer = new byte[] {
0x12,
1,
0,
0,
0,
0,
3, // justification, 1=left, 2=right, 3=center
0xF, //horizontal position, 1=top, F=bottom
0x10 //horizontal position, 3=left, 0x10=center, 0x19=right
};
//Normal : 12 01 00 00 00 00 03 0F 10
//Right-top : 12 01 00 00 00 00 03 01 1C
//Top : 12 01 00 00 00 00 03 01 10
//Left-top : 12 01 00 00 00 00 03 01 05
//Left : 12 01 00 00 00 00 03 0F 0A
//Right : 12 01 00 00 00 00 03 0F 1E
//Left : 12 03 00 00 00 00 03 0F 07
if (text.StartsWith("{\\a6}"))
{
text = p.Text.Remove(0, 5);
buffer[7] = 1; // align top
}
else if (text.StartsWith("{\\a1}"))
{
text = p.Text.Remove(0, 5);
buffer[8] = 0x0A; // align left
}
else if (text.StartsWith("{\\a3}"))
{
text = p.Text.Remove(0, 5);
buffer[8] = 0x1E; // align right
}
else if (text.StartsWith("{\\a5}"))
{
text = p.Text.Remove(0, 5);
buffer[7] = 1; // align top
buffer[8] = 05; // align left
}
else if (text.StartsWith("{\\a7}"))
{
text = p.Text.Remove(0, 5);
buffer[7] = 1; // align top
buffer[8] = 0xc; // align right
}
int length = text.Length + 20;
long end = fs.Position + length;
fs.WriteByte((byte)(length));
fs.WriteByte(0x42); // ?
fs.WriteByte(0x62); // ?
WriteTime(fs, p.StartTime);
WriteTime(fs, p.EndTime);
WriteTime(fs, p.StartTime);
buffer = new byte[] { 0x12, 1,0,0,0,0,1,0x0F,1 }; // sizes ?
fs.Write(buffer, 0, buffer.Length);
buffer = Encoding.ASCII.GetBytes(text);
fs.Write(buffer, 0, buffer.Length); // Text starter på index 19 (0 baseret)
fs.WriteByte(0);
while (end > fs.Position)
fs.WriteByte(0);

View File

@ -4,12 +4,11 @@ using System.IO;
using System.Text;
using System.Xml;
// - Mom, when you were my age&#13;what did you want to do?
namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
{
class FinalCutProTestXml : SubtitleFormat
{
public double FrameRate { get; set; }
public override string Extension
{
get { return ".xml"; }
@ -37,486 +36,463 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
return subtitle.Paragraphs.Count > 0;
}
private string IsNtsc()
public string GetFrameRateAsString()
{
if (FrameRate >= 29.976 && FrameRate <= 30.0)
return "TRUE";
if (Configuration.Settings.General.CurrentFrameRate < 24)
return "24"; // ntsc 23.976
if (Configuration.Settings.General.CurrentFrameRate < 25)
return "24";
if (Configuration.Settings.General.CurrentFrameRate < 29)
return "25";
if (Configuration.Settings.General.CurrentFrameRate < 29)
return "25";
if (Configuration.Settings.General.CurrentFrameRate < 30)
return "30"; // ntsc 29.97
if (Configuration.Settings.General.CurrentFrameRate < 40)
return "30";
if (Configuration.Settings.General.CurrentFrameRate < 40)
return "30";
if (Configuration.Settings.General.CurrentFrameRate < 60)
return "60"; // ntsc 59.94
return "60";
}
public string GetNtsc()
{
if (Configuration.Settings.General.CurrentFrameRate < 24)
return "TRUE"; // ntsc 23.976
if (Configuration.Settings.General.CurrentFrameRate < 25)
return "FALSE";
if (Configuration.Settings.General.CurrentFrameRate < 29)
return "FALSE";
if (Configuration.Settings.General.CurrentFrameRate < 29)
return "FALSE";
if (Configuration.Settings.General.CurrentFrameRate < 30)
return "TRUE"; // ntsc 29.97
if (Configuration.Settings.General.CurrentFrameRate < 40)
return "FALSE";
if (Configuration.Settings.General.CurrentFrameRate < 40)
return "FALSE";
if (Configuration.Settings.General.CurrentFrameRate < 60)
return "TRUE"; // ntsc 59.94
return "FALSE";
}
public override string ToText(Subtitle subtitle, string title)
{
if (Configuration.Settings.General.CurrentFrameRate > 26)
FrameRate = 30;
else
FrameRate = 25;
string xmlStructure =
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + Environment.NewLine +
"<!DOCTYPE xmeml>" + Environment.NewLine +
"<xmeml version=\"3\">" + Environment.NewLine +
" <sequence id=\"Subtitles\">" + Environment.NewLine +
" <name>Subtitles</name>" + Environment.NewLine +
" <media>" + Environment.NewLine +
" <video />" + Environment.NewLine +
" </media>" + Environment.NewLine +
" </sequence>" + Environment.NewLine +
"</xmeml>";
"<xmeml version=\"5\">" + Environment.NewLine +
"<sequence id=\"LOF_master til dialogliste\">" + Environment.NewLine +
@" <uuid>5B3B0C07-9A9D-42AA-872C-C953923F97D8</uuid>
<updatebehavior>add</updatebehavior>
<name>LOF_master til dialogliste</name>
<duration>73574</duration>
<rate>
<ntsc>" + GetNtsc() + @"</ntsc>
<timebase>" + GetFrameRateAsString() + @"</timebase>
</rate>
<timecode>
<rate>
<ntsc>" + GetNtsc() + @"</ntsc>
<timebase>" + GetFrameRateAsString() + @"</timebase>
</rate>
<string>00:00:00:00</string>
<frame>0</frame>
<source>source</source>
<displayformat>NDF</displayformat>
</timecode>
<in>0</in>
<out>73575</out>
<media>
<video>
<format>
<samplecharacteristics>
<width>1920</width>
<height>1080</height>
<anamorphic>FALSE</anamorphic>
<pixelaspectratio>Square</pixelaspectratio>
<fielddominance>none</fielddominance>
<rate>
<ntsc>" + GetNtsc() + @"</ntsc>
<timebase>" + GetFrameRateAsString() + @"</timebase>
</rate>
<colordepth>24</colordepth>
<codec>
<name>Apple ProRes 422</name>
<appspecificdata>
<appname>Final Cut Pro</appname>
<appmanufacturer>Apple Inc.</appmanufacturer>
<appversion>7.0</appversion>
<data>
<qtcodec>
<codecname>Apple ProRes 422</codecname>
<codectypename>Apple ProRes 422 (HQ)</codectypename>
<codectypecode>apch</codectypecode>
<codecvendorcode>appl</codecvendorcode>
<spatialquality>1024</spatialquality>
<temporalquality>0</temporalquality>
<keyframerate>0</keyframerate>
<datarate>0</datarate>
</qtcodec>
</data>
</appspecificdata>
</codec>
</samplecharacteristics>
<appspecificdata>
<appname>Final Cut Pro</appname>
<appmanufacturer>Apple Inc.</appmanufacturer>
<appversion>7.0</appversion>
<data>
<fcpimageprocessing>
<useyuv>TRUE</useyuv>
<usesuperwhite>FALSE</usesuperwhite>
<rendermode>Float10BPP</rendermode>
</fcpimageprocessing>
</data>
</appspecificdata>
</format>
<track>
</track>
</video>
</media>
</sequence>
</xmeml>";
string xmlTrackStructure =
"<generatoritem>" + Environment.NewLine +
" <name>Text</name>" + Environment.NewLine +
" <rate>" + Environment.NewLine +
" <ntsc>" + IsNtsc() + "</ntsc>" + Environment.NewLine +
" <timebase>" + string.Format("{0:0.##}", FrameRate) + "</timebase>" + Environment.NewLine +
" </rate>" + Environment.NewLine +
" <start></start>" + Environment.NewLine + // start frame?
" <end></end>" + Environment.NewLine + // end frame?
" <enabled>TRUE</enabled>" + Environment.NewLine +
" <anamorphic>FALSE</anamorphic>" + Environment.NewLine +
" <alphatype>black</alphatype>" + Environment.NewLine +
" <effect id=\"subtitle\">" + Environment.NewLine +
" <name>Text</name>" + Environment.NewLine +
// " <effectid>Text</effectid>" + Environment.NewLine +
" <effectcategory>Text</effectcategory>" + Environment.NewLine +
" <effecttype>generator</effecttype>" + Environment.NewLine +
" <mediatype>video</mediatype>" + Environment.NewLine +
" <parameter>" + Environment.NewLine +
" <parameterid>str</parameterid>" + Environment.NewLine +
" <name>Text</name>" + Environment.NewLine +
" <value />" + Environment.NewLine + // TEXT GOES HERE
" </parameter>" + Environment.NewLine +
" </effect>" + Environment.NewLine +
"</generatoritem>";
// string xmlTrackStructure2 =
// @"<generatoritem id='Subtitle Edit'>
// <name>edit 'B subtitle</name>
// <duration>3000</duration>
// <rate>
// <ntsc>FALSE</ntsc>
// <timebase>25</timebase>
// </rate>
// <in>1375</in>
// <out>1383</out>
// <start>0</start>
// <end>8</end>
// <enabled>TRUE</enabled>
// <anamorphic>TRUE</anamorphic>
// <alphatype>black</alphatype>
// <logginginfo>
// <scene>
// </scene>
// <shottake>
// </shottake>
// <lognote>
// </lognote>
// <good>FALSE</good>
// </logginginfo>
// <labels>
// <label2>
// </label2>
// </labels>
// <comments>
// <mastercomment1>
// </mastercomment1>
// <mastercomment2>
// </mastercomment2>
// <mastercomment3>
// </mastercomment3>
// <mastercomment4>
// </mastercomment4>
// </comments>
// <effect>
// <name>edit 'B subtitle</name>
// <effectid>edit 'B subtitle</effectid>
// <effectcategory>Text</effectcategory>
// <effecttype>generator</effecttype>
// <mediatype>video</mediatype>
// <parameter>
// <parameterid>part1</parameterid>
// <name>Text Settings</name>
// <value>0</value>
// </parameter>
// <parameter>
// <parameterid>str</parameterid>
// <name>Text</name>
// <value></value>
// </parameter>
// <parameter>
// <parameterid>fontname</parameterid>
// <name>Font</name>
// <value>Arial Narrow</value>
// </parameter>
// <parameter>
// <parameterid>fontstyle</parameterid>
// <name>Style</name>
// <valuemin>1</valuemin>
// <valuemax>4</valuemax>
// <valuelist>
// <valueentry>
// <name>Plain</name>
// <value>1</value>
// </valueentry>
// <valueentry>
// <name>Bold</name>
// <value>2</value>
// </valueentry>
// <valueentry>
// <name>Italic</name>
// <value>3</value>
// </valueentry>
// <valueentry>
// <name>Bold/Italic</name>
// <value>4</value>
// </valueentry>
// </valuelist>
// <value>1</value>
// </parameter>
// <parameter>
// <parameterid>fontalign</parameterid>
// <name>Alignment</name>
// <valuemin>1</valuemin>
// <valuemax>3</valuemax>
// <valuelist>
// <valueentry>
// <name>Left</name>
// <value>1</value>
// </valueentry>
// <valueentry>
// <name>Center</name>
// <value>2</value>
// </valueentry>
// <valueentry>
// <name>Right</name>
// <value>3</value>
// </valueentry>
// </valuelist>
// <value>2</value>
// </parameter>
// <parameter>
// <parameterid>fontsize</parameterid>
// <name>Size</name>
// <valuemin>20</valuemin>
// <valuemax>80</valuemax>
// <value>28</value>
// </parameter>
// <parameter>
// <parameterid>origin</parameterid>
// <name>Origin</name>
// <value>
// <horiz>0</horiz>
// <vert>0.3056</vert>
// </value>
// </parameter>
// <parameter>
// <parameterid>aspect</parameterid>
// <name>Aspect</name>
// <valuemin>0</valuemin>
// <valuemax>2</valuemax>
// <value>1</value>
// </parameter>
// <parameter>
// <parameterid>textopacity</parameterid>
// <name>Text Opacity</name>
// <valuemin>0</valuemin>
// <valuemax>100</valuemax>
// <value>100</value>
// </parameter>
// <parameter>
// <parameterid>textcolor</parameterid>
// <name>Text Color</name>
// <value>
// <alpha>255</alpha>
// <red>255</red>
// <green>255</green>
// <blue>255</blue>
// </value>
// </parameter>
// <parameter>
// <parameterid>fonttrack</parameterid>
// <name>Tracking</name>
// <valuemin>0</valuemin>
// <valuemax>10</valuemax>
// <value>1</value>
// </parameter>
// <parameter>
// <parameterid>leading</parameterid>
// <name>Leading</name>
// <valuemin>-40</valuemin>
// <valuemax>40</valuemax>
// <value>-13</value>
// </parameter>
// <parameter>
// <parameterid>autokern</parameterid>
// <name>Auto Kerning</name>
// <value>TRUE</value>
// </parameter>
// <parameter>
// <parameterid>part2</parameterid>
// <name>Outline Settings</name>
// <value>0</value>
// </parameter>
// <parameter>
// <parameterid>linewidth</parameterid>
// <name>Width</name>
// <valuemin>0</valuemin>
// <valuemax>50</valuemax>
// <value>8</value>
// </parameter>
// <parameter>
// <parameterid>linesoft</parameterid>
// <name>Soft</name>
// <valuemin>0</valuemin>
// <valuemax>100</valuemax>
// <value>38</value>
// </parameter>
// <parameter>
// <parameterid>linecolor</parameterid>
// <name>Color</name>
// <value>
// <alpha>255</alpha>
// <red>0</red>
// <green>0</green>
// <blue>0</blue>
// </value>
// </parameter>
// <parameter>
// <parameterid>part3</parameterid>
// <name>Shadow Settings</name>
// <value>0</value>
// </parameter>
// <parameter>
// <parameterid>shadowoffsetx</parameterid>
// <name>Offset X</name>
// <valuemin>-20</valuemin>
// <valuemax>20</valuemax>
// <value>3</value>
// </parameter>
// <parameter>
// <parameterid>shadowoffsety</parameterid>
// <name>Offset y</name>
// <valuemin>-20</valuemin>
// <valuemax>20</valuemax>
// <value>3</value>
// </parameter>
// <parameter>
// <parameterid>shadowopacity</parameterid>
// <name>Opacity</name>
// <valuemin>0</valuemin>
// <valuemax>100</valuemax>
// <value>75</value>
// </parameter>
// <parameter>
// <parameterid>shadowsoft</parameterid>
// <name>Softness</name>
// <valuemin>0</valuemin>
// <valuemax>100</valuemax>
// <value>2</value>
// </parameter>
// <parameter>
// <parameterid>shadowcolor</parameterid>
// <name>Color</name>
// <value>
// <alpha>255</alpha>
// <red>0</red>
// <green>0</green>
// <blue>0</blue>
// </value>
// </parameter>
// </effect>
// <sourcetrack>
// <mediatype>video</mediatype>
// </sourcetrack>
// </generatoritem>";
string xmlTrackStructure3a =
@"<generatoritem>
<name>Text</name>
<duration>3600</duration>
<rate>
<ntsc>TRUE</ntsc>
<timebase>" + string.Format("{0:0.##}", FrameRate) + @"</timebase>
</rate>
<in>1650</in>
<out>1784</out>
<start>0</start>
<end>134</end>
<enabled>TRUE</enabled>
<anamorphic>FALSE</anamorphic>
<alphatype>black</alphatype>
<effect id = 'subtitle'>
<name>Text</name>
<effectid>Text</effectid>
<effectcategory>Text</effectcategory>
<effecttype>generator</effecttype>
<mediatype>video</mediatype>
<parameter>
<parameterid>str</parameterid>
<name>Text</name>
<value>If you look at the Lindy Hop&#13;you'll see a couple just moving</value>
</parameter>
<parameter>
<parameterid>fontname</parameterid>
<name>Font</name>
<value>Futura</value>
</parameter>
<parameter>
<parameterid>fontsize</parameterid>
<name>Size</name>
<valuemin>0</valuemin>
<valuemax>1000</valuemax>
<value>36</value></parameter>
<parameter>
<parameterid>fontstyle</parameterid>
<name>Style</name>
<valuemin>1</valuemin>
<valuemax>4</valuemax>
<valuelist>
<valueentry>
@" <generatoritem id='Outline Text[NUMBER]'>
<name>Outline Text</name>
<duration>3000</duration>
<rate>
<ntsc>" + GetNtsc() + @"</ntsc>
<timebase>" + GetFrameRateAsString() + @"</timebase>
</rate>
<in>1380</in>
<out>1474</out>
<start>8228</start>
<end>8322</end>
<enabled>TRUE</enabled>
<anamorphic>FALSE</anamorphic>
<alphatype>black</alphatype>
<masterclipid>Outline Text1</masterclipid>
<logginginfo>
<scene/>
<shottake/>
<lognote/>
<good>FALSE</good>
</logginginfo>
<labels>
<label2/>
</labels>
<comments>
<mastercomment1/>
<mastercomment2/>
<mastercomment3/>
<mastercomment4/>
</comments>
<effect>
<name>Outline Text</name>
<effectid>Outline Text</effectid>
<effectcategory>Text</effectcategory>
<effecttype>generator</effecttype>
<mediatype>video</mediatype>
<parameter>
<parameterid>part1</parameterid>
<name>Text Settings</name>
<value/>
</parameter>
<parameter>
<parameterid>str</parameterid>
<name>Text</name>
<value>[TEXT]</value>
</parameter>
<parameter>
<parameterid>font</parameterid>
<name>Font</name>
<value>Lucida Grande</value>
</parameter>
<parameter>
<parameterid>style</parameterid>
<name>Style</name>
<valuemin>1</valuemin>
<valuemax>4</valuemax>
<valuelist>
<valueentry>
<name>Plain</name>
<value>1</value>
</valueentry>
<valueentry>
</valueentry>
<valueentry>
<name>Bold</name>
<value>2</value>
</valueentry>
<valueentry>
</valueentry>
<valueentry>
<name>Italic</name>
<value>3</value>
</valueentry>
<valueentry>
</valueentry>
<valueentry>
<name>Bold/Italic</name>
<value>4</value>
</valueentry>
</valuelist>
<value>3</value>
</parameter>
<parameter>
<parameterid>fontalign</parameterid>
<name>Alignment</name>
<valuemin>1</valuemin>
<valuemax>3</valuemax>
<valuelist>
<valueentry>
</valueentry>
</valuelist>
<value>[FONTSTYLE]</value>
</parameter>
<parameter>
<parameterid>align</parameterid>
<name>Alignment</name>
<valuemin>1</valuemin>
<valuemax>3</valuemax>
<valuelist>
<valueentry>
<name>Left</name>
<value>1</value>
</valueentry>
<valueentry>
</valueentry>
<valueentry>
<name>Center</name>
<value>2</value>
</valueentry>
<valueentry>
</valueentry>
<valueentry>
<name>Right</name>
<value>3</value>
</valueentry>
</valuelist>
<value>2</value>
</parameter>
<parameter>
<parameterid>fontcolor</parameterid>
<name>Font Color</name>
<value>
<alpha>255</alpha>
<red>255</red>
<green>255</green>
<blue>255</blue>
</value>
</parameter>
<parameter>
<parameterid>origin</parameterid>
<name>Origin</name>
<value>
<horiz>0</horiz>
<vert>0.34375</vert>
</value>
</parameter>
</effect>
<sourcetrack>
<mediatype>video</mediatype>
</sourcetrack>
</generatoritem>";
</valueentry>
</valuelist>
<value>2</value>
</parameter>
<parameter>
<parameterid>size</parameterid>
<name>Size</name>
<valuemin>0</valuemin>
<valuemax>200</valuemax>
<value>18</value>
</parameter>
<parameter>
<parameterid>track</parameterid>
<name>Tracking</name>
<valuemin>0</valuemin>
<valuemax>100</valuemax>
<value>1</value>
</parameter>
<parameter>
<parameterid>lead</parameterid>
<name>Leading</name>
<valuemin>-100</valuemin>
<valuemax>100</valuemax>
<value>0</value>
</parameter>
<parameter>
<parameterid>aspect</parameterid>
<name>Aspect</name>
<valuemin>0</valuemin>
<valuemax>4</valuemax>
<value>1</value>
</parameter>
<parameter>
<parameterid>linewidth</parameterid>
<name>Line Width</name>
<valuemin>0</valuemin>
<valuemax>200</valuemax>
<value>20</value>
</parameter>
<parameter>
<parameterid>linesoft</parameterid>
<name>Line Softness</name>
<valuemin>0</valuemin>
<valuemax>100</valuemax>
<value>5</value>
</parameter>
<parameter>
<parameterid>textopacity</parameterid>
<name>Text Opacity</name>
<valuemin>0</valuemin>
<valuemax>100</valuemax>
<value>100</value>
</parameter>
<parameter>
<parameterid>center</parameterid>
<name>Center</name>
<value>
<horiz>0.00833333</horiz>
<vert>0.390741</vert>
</value>
</parameter>
<parameter>
<parameterid>textcolor</parameterid>
<name>Text Color</name>
<value>
<alpha>255</alpha>
<red>255</red>
<green>255</green>
<blue>255</blue>
</value>
</parameter>
<parameter>
<parameterid>supertext</parameterid>
<name>Text Graphic</name>
</parameter>
<parameter>
<parameterid>linecolor</parameterid>
<name>Line Color</name>
<value>
<alpha>255</alpha>
<red>0</red>
<green>0</green>
<blue>0</blue>
</value>
</parameter>
<parameter>
<parameterid>superline</parameterid>
<name>Line Graphic</name>
</parameter>
<parameter>
<parameterid>part2</parameterid>
<name>Background Settings</name>
<value/>
</parameter>
<parameter>
<parameterid>xscale</parameterid>
<name>Horizontal Size</name>
<valuemin>0</valuemin>
<valuemax>200</valuemax>
<value>0</value>
</parameter>
<parameter>
<parameterid>yscale</parameterid>
<name>Vertical Size</name>
<valuemin>0</valuemin>
<valuemax>200</valuemax>
<value>0</value>
</parameter>
<parameter>
<parameterid>xoffset</parameterid>
<name>Horizontal Offset</name>
<valuemin>-100</valuemin>
<valuemax>100</valuemax>
<value>0</value>
</parameter>
<parameter>
<parameterid>yoffset</parameterid>
<name>Vertical Offset</name>
<valuemin>-100</valuemin>
<valuemax>100</valuemax>
<value>0</value>
</parameter>
<parameter>
<parameterid>backsoft</parameterid>
<name>Back Soft</name>
<valuemin>0</valuemin>
<valuemax>100</valuemax>
<value>0</value>
</parameter>
<parameter>
<parameterid>backopacity</parameterid>
<name>Back Opacity</name>
<valuemin>0</valuemin>
<valuemax>100</valuemax>
<value>50</value>
</parameter>
<parameter>
<parameterid>backcolor</parameterid>
<name>Back Color</name>
<value>
<alpha>255</alpha>
<red>255</red>
<green>255</green>
<blue>255</blue>
</value>
</parameter>
<parameter>
<parameterid>superback</parameterid>
<name>Back Graphic</name>
</parameter>
<parameter>
<parameterid>crop</parameterid>
<name>Crop</name>
<value>FALSE</value>
</parameter>
<parameter>
<parameterid>autokern</parameterid>
<name>Auto Kerning</name>
<value>TRUE</value>
</parameter>
</effect>
<sourcetrack>
<mediatype>video</mediatype>
</sourcetrack>
<itemhistory>
<uuid>8F00E937-5C83-4A2F-9827-AE0612006D05</uuid>
</itemhistory>
</generatoritem>";
string xmlTrackStructure3b =
@"<generatoritem>
<start>135</start>
<end>219</end>
<effect id='subtitle'>
<name>Text</name>
<effectid>Text</effectid>
<effectcategory>Text</effectcategory>
<effecttype>generator</effecttype>
<mediatype>video</mediatype>
<parameter>
<parameterid>str</parameterid>
<name>Text</name>
<value></value>
</parameter>
</effect>
</generatoritem>";
XmlDocument xml = new XmlDocument();
var xml = new XmlDocument();
xml.LoadXml(xmlStructure);
xml.DocumentElement.SelectSingleNode("sequence/name").InnerText = title;
if (subtitle.Header != null && subtitle.Header.StartsWith("<uuid>") && subtitle.Header.EndsWith("</uuid>"))
xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = subtitle.Header.Replace("<uuid>", string.Empty).Replace("</uuid>", string.Empty).Trim();
else
xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText = Guid.NewGuid().ToString().ToUpper();
XmlNode videoNode = xml.DocumentElement.SelectSingleNode("sequence/media/video");
XmlNode trackNode = xml.DocumentElement.SelectSingleNode("sequence/media/video/track");
string newLine = "_____@___";
int number = 1;
foreach (Paragraph p in subtitle.Paragraphs)
{
XmlNode track = xml.CreateElement("track");
if (number == 1)
track.InnerXml = xmlTrackStructure3a;
else
track.InnerXml = xmlTrackStructure3b;
XmlNode generatorItem = xml.CreateElement("generatoritem");
string fontStyle = "1"; //1==plain
string s = Utilities.RemoveHtmlFontTag(p.Text).Trim();
if (s.StartsWith("<i>") && s.EndsWith("</i>"))
fontStyle = "3"; //3==italic
generatorItem.InnerXml = xmlTrackStructure.Replace("[NUMBER]", number.ToString()).Replace("[FONTSTYLE]", fontStyle);
double frameRate = Configuration.Settings.General.CurrentFrameRate;
XmlNode start = track.SelectSingleNode("generatoritem/start");
start.InnerText = ((int)Math.Round(p.StartTime.TotalSeconds*frameRate)).ToString();
XmlNode start = generatorItem.SelectSingleNode("generatoritem/start");
start.InnerText = ((int)Math.Round(p.StartTime.TotalSeconds * frameRate)).ToString();
XmlNode end = track.SelectSingleNode("generatoritem/end");
XmlNode end = generatorItem.SelectSingleNode("generatoritem/end");
end.InnerText = ((int)Math.Round(p.EndTime.TotalSeconds * frameRate)).ToString();
XmlNode text = track.SelectSingleNode("generatoritem/effect/parameter[parameterid='str']/value");
XmlNode text = generatorItem.SelectSingleNode("generatoritem/effect/parameter[parameterid='str']/value");
text.InnerText = Utilities.RemoveHtmlTags(p.Text);
text.InnerXml = text.InnerXml.Replace(Environment.NewLine, newLine);
XmlNode effect = track.SelectSingleNode("generatoritem/effect");
if (effect != null && effect.Attributes["id"] != null)
effect.Attributes["id"].InnerText = "Subtitle" + number.ToString();
videoNode.AppendChild(track);
trackNode.AppendChild(generatorItem.SelectSingleNode("generatoritem"));
number++;
}
MemoryStream ms = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(ms, Encoding.UTF8);
writer.Formatting = Formatting.Indented;
var ms = new MemoryStream();
var writer = new XmlTextWriter(ms, Encoding.UTF8) { Formatting = Formatting.Indented };
xml.Save(writer);
string xmlAsText = Encoding.UTF8.GetString(ms.ToArray()).Trim();
xmlAsText = xmlAsText.Replace("xmeml[]", "xmeml");
xmlAsText = xmlAsText.Replace(newLine, "&#13;");
return xmlAsText;
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)
{
_errorCount = 0;
FrameRate = Configuration.Settings.General.CurrentFrameRate;
var frameRate = Configuration.Settings.General.CurrentFrameRate;
StringBuilder sb = new StringBuilder();
var sb = new StringBuilder();
lines.ForEach(line => sb.AppendLine(line));
XmlDocument xml = new XmlDocument();
var xml = new XmlDocument();
try
{
xml.LoadXml(sb.ToString());
if (xml.DocumentElement.SelectSingleNode("sequence/uuid") != null)
subtitle.Header = "<uuid>" + xml.DocumentElement.SelectSingleNode("sequence/uuid").InnerText + "</uuid>";
if (xml.DocumentElement.SelectSingleNode("sequence/rate") != null && xml.DocumentElement.SelectSingleNode("sequence/rate/timebase") != null)
{
try
{
FrameRate = double.Parse(xml.DocumentElement.SelectSingleNode("sequence/rate/timebase").InnerText);
frameRate = double.Parse(xml.DocumentElement.SelectSingleNode("sequence/rate/timebase").InnerText);
}
catch
{
FrameRate = Configuration.Settings.General.CurrentFrameRate;
frameRate = Configuration.Settings.General.CurrentFrameRate;
}
}
@ -531,7 +507,7 @@ string xmlTrackStructure3b =
{
XmlNode timebase = rate.SelectSingleNode("timebase");
if (timebase != null)
FrameRate = double.Parse(timebase.InnerText);
frameRate = double.Parse(timebase.InnerText);
}
double startFrame = 0;
@ -551,9 +527,38 @@ string xmlTrackStructure3b =
if (valueNode != null)
text += valueNode.InnerText;
}
bool italic = false;
foreach (XmlNode parameterNode in generatorItemNode.SelectNodes("effect/parameter[parameterid='style']"))
{
XmlNode valueNode = parameterNode.SelectSingleNode("value");
var valueEntries = parameterNode.SelectNodes("valuelist/valueentry");
if (valueNode != null)
{
int no;
if (int.TryParse(valueNode.InnerText, out no))
{
no--;
if (no < valueEntries.Count)
{
var styleNameNode = valueEntries[no].SelectSingleNode("name");
if (styleNameNode != null)
{
string styleName = styleNameNode.InnerText;
italic = styleName.ToLower().Trim() == "italic";
}
}
}
}
}
if (text.Length > 0)
{
subtitle.Paragraphs.Add(new Paragraph(text, Convert.ToDouble((startFrame / FrameRate) *1000), Convert.ToDouble((endFrame / FrameRate) * 1000)));
if (!text.Contains(Environment.NewLine))
text = text.Replace("\r", Environment.NewLine);
if (italic)
text = "<i>" + text + "</i>";
subtitle.Paragraphs.Add(new Paragraph(text, Convert.ToDouble((startFrame / frameRate) * 1000), Convert.ToDouble((endFrame / frameRate) * 1000)));
}
}
}
@ -569,7 +574,7 @@ string xmlTrackStructure3b =
_errorCount = 1;
return;
}
Configuration.Settings.General.CurrentFrameRate = frameRate;
}
}

View File

@ -177,21 +177,6 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
<anamorphic>FALSE</anamorphic>
<alphatype>black</alphatype>
<masterclipid>Outline Text1</masterclipid>
<logginginfo>
<scene/>
<shottake/>
<lognote/>
<good>FALSE</good>
</logginginfo>
<labels>
<label2/>
</labels>
<comments>
<mastercomment1/>
<mastercomment2/>
<mastercomment3/>
<mastercomment4/>
</comments>
<effect>
<name>Outline Text</name>
<effectid>Outline Text</effectid>
@ -340,10 +325,6 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
<blue>0</blue>
</value>
</parameter>
<parameter>
<parameterid>superline</parameterid>
<name>Line Graphic</name>
</parameter>
<parameter>
<parameterid>part2</parameterid>
<name>Background Settings</name>
@ -377,20 +358,6 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
<valuemax>100</valuemax>
<value>0</value>
</parameter>
<parameter>
<parameterid>backsoft</parameterid>
<name>Back Soft</name>
<valuemin>0</valuemin>
<valuemax>100</valuemax>
<value>0</value>
</parameter>
<parameter>
<parameterid>backopacity</parameterid>
<name>Back Opacity</name>
<valuemin>0</valuemin>
<valuemax>100</valuemax>
<value>50</value>
</parameter>
<parameter>
<parameterid>backcolor</parameterid>
<name>Back Color</name>
@ -419,9 +386,6 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
<sourcetrack>
<mediatype>video</mediatype>
</sourcetrack>
<itemhistory>
<uuid>8F00E937-5C83-4A2F-9827-AE0612006D05</uuid>
</itemhistory>
</generatoritem>";
var xml = new XmlDocument();

View File

@ -0,0 +1,285 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
{
class Ultech130 : SubtitleFormat
{
private const string UltechId = "ULTECH\01.30";
public override string Extension
{
get { return ".ult"; }
}
public override string Name
{
get { return "Ultech 1.30 Caption"; }
}
public override bool HasLineNumber
{
get { return false; }
}
public override bool IsTimeBased
{
get { return true; }
}
public void Save(string fileName, Subtitle subtitle)
{
var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
byte[] buffer = buffer = Encoding.ASCII.GetBytes(UltechId);
fs.Write(buffer, 0, buffer.Length);
buffer = new byte[] { 0, 0, 2, 0x1D, 0 }; // ?
fs.Write(buffer, 0, buffer.Length);
int numberOfLines = subtitle.Paragraphs.Count;
fs.WriteByte((byte)(numberOfLines % 256)); // paragraphs - low byte
fs.WriteByte((byte)(numberOfLines / 256)); // paragraphs - high byte
buffer = new byte[] { 0, 0, 0, 0, 0x1, 0, 0xF, 0x15, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0xE, 0x15, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0xD, 0x15, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0xC, 0x15, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // ?
fs.Write(buffer, 0, buffer.Length);
buffer = buffer = Encoding.ASCII.GetBytes("Subtitle Edit");
fs.Write(buffer, 0, buffer.Length);
while (fs.Length < 512)
fs.WriteByte(0);
// paragraphs
foreach (Paragraph p in subtitle.Paragraphs)
{
// convert line breaks
var sb = new StringBuilder();
var line = new StringBuilder();
int skipCount = 0;
int numberOfNewLines = Utilities.CountTagInText(p.Text, Environment.NewLine);
bool italic = p.Text.StartsWith("<i>") && p.Text.EndsWith("</i>");
string text = Utilities.RemoveHtmlTags(p.Text);
if (italic)
{
sb.Append(Convert.ToChar(0x11).ToString());
sb.Append(Convert.ToChar(0x2E).ToString());
}
int y = 0x74 - (numberOfNewLines * 0x20);
for (int j=0; j<text.Length; j++)
{
if (text.Substring(j).StartsWith(Environment.NewLine))
{
y += 0x20;
if (line.Length > 0)
sb.Append(line);
line = new StringBuilder();
skipCount = Environment.NewLine.Length - 1;
sb.Append(Convert.ToChar(0x14).ToString());
sb.Append(Convert.ToChar((byte)(y)).ToString());
if (italic)
{
sb.Append(Convert.ToChar(0x11).ToString());
sb.Append(Convert.ToChar(0x2E).ToString());
}
}
else if (skipCount == 0)
{
line.Append(text.Substring(j, 1));
}
else
{
skipCount--;
}
}
if (line.Length > 0)
sb.Append(line);
text = sb.ToString();
// codes?
buffer = new byte[] {
0x14,
0x20,
0x14,
0x2E,
0x14,
(byte)(0x74 - (numberOfNewLines * 0x20)),
0x17,
0x21,
};
//if (text.StartsWith("{\\a6}"))
//{
// text = p.Text.Remove(0, 5);
// buffer[7] = 1; // align top
//}
//else if (text.StartsWith("{\\a1}"))
//{
// text = p.Text.Remove(0, 5);
// buffer[8] = 0x0A; // align left
//}
//else if (text.StartsWith("{\\a3}"))
//{
// text = p.Text.Remove(0, 5);
// buffer[8] = 0x1E; // align right
//}
//else if (text.StartsWith("{\\a5}"))
//{
// text = p.Text.Remove(0, 5);
// buffer[7] = 1; // align top
// buffer[8] = 05; // align left
//}
//else if (text.StartsWith("{\\a7}"))
//{
// text = p.Text.Remove(0, 5);
// buffer[7] = 1; // align top
// buffer[8] = 0xc; // align right
//}
fs.WriteByte(0xF1); //ID of start record
// length
int length = text.Length + 15;
fs.WriteByte((byte)(length));
fs.WriteByte(0);
// start time
WriteTime(fs, p.StartTime);
fs.Write(buffer, 0, buffer.Length);
// text
buffer = Encoding.ASCII.GetBytes(text);
fs.Write(buffer, 0, buffer.Length); // Text starter på index 19 (0 baseret)
fs.WriteByte(0x14);
fs.WriteByte(0x2F);
fs.WriteByte(0);
// end time
fs.WriteByte(0xF1); // id of start record
fs.WriteByte(7); // length of end time
fs.WriteByte(0);
WriteTime(fs, p.EndTime);
fs.WriteByte(0x14);
fs.WriteByte(0x2c);
fs.WriteByte(0);
}
buffer = new byte[] { 0xF1, 0x0B, 0x00, 0x00, 0x00, 0x1B, 0x18, 0x14, 0x20, 0x14, 0x2E, 0x14, 0x2F, 0x00 }; // footer
fs.Write(buffer, 0, buffer.Length);
fs.Close();
}
private void WriteTime(FileStream fs, TimeCode timeCode)
{
fs.WriteByte((byte)timeCode.Hours);
fs.WriteByte((byte)timeCode.Minutes);
fs.WriteByte((byte)timeCode.Seconds);
fs.WriteByte((byte)MillisecondsToFrames(timeCode.Milliseconds));
}
public override bool IsMine(List<string> lines, string fileName)
{
if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName))
{
var fi = new FileInfo(fileName);
if (fi.Length >= 200 && fi.Length < 1024000) // not too small or too big
{
if (fileName.ToLower().EndsWith(".ult") || fileName.ToLower().EndsWith(".uld")) // drop frame is often named uld, and ult for non-drop
{
byte[] buffer = File.ReadAllBytes(fileName);
string id = Encoding.ASCII.GetString(buffer, 0, UltechId.Length);
return id == UltechId;
}
}
}
return false;
}
public override string ToText(Subtitle subtitle, string title)
{
return "Not supported!";
}
private TimeCode DecodeTimeStamp(byte[] buffer, int index)
{
return new TimeCode(buffer[index], buffer[index + 1], buffer[index + 2], FramesToMilliseconds(buffer[index + 3]));
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)
{
subtitle.Paragraphs.Clear();
subtitle.Header = null;
byte[] buffer = File.ReadAllBytes(fileName);
int i = 512;
Paragraph last = null;
while (i < buffer.Length - 25)
{
var p = new Paragraph();
int length = buffer[i+1];
p.StartTime = DecodeTimeStamp(buffer, i + 3);
if (last != null && last.EndTime.TotalMilliseconds == 0)
last.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds-1;
if (length > 22)
{
int start = i + 7;
var sb = new StringBuilder();
int skipCount = 0;
for (int k = start; k < length + i; k++)
{
byte b = buffer[k];
if (skipCount > 0)
{
skipCount--;
}
else if (b < 0x1F)
{
skipCount = 1;
if (sb.Length > 0)
sb.AppendLine();
}
else if (b == 0x80)
{
break;
}
else
{
sb.Append(Convert.ToChar(b).ToString());
}
}
p.Text = sb.ToString();
p.Text = p.Text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine);
p.Text = p.Text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine);
p.Text = p.Text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine);
subtitle.Paragraphs.Add(p);
}
else if (last != null)
{
last.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds;
}
last = p;
i += length + 3;
}
if (last != null)
{
if (last.EndTime.TotalMilliseconds == 0)
last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + 2500;
if (last != null && last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds)
last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + Utilities.GetDisplayMillisecondsFromText(last.Text);
}
subtitle.Renumber(1);
}
}
}

View File

@ -1318,29 +1318,33 @@ namespace Nikse.SubtitleEdit.Logic
}
}
private static void AddExtension(StringBuilder sb, string extension)
{
if (!sb.ToString().Contains("*" + extension + ";"))
sb.Append("*" + extension + ";");
}
public static string GetOpenDialogFilter()
{
StringBuilder sb = new StringBuilder();
sb.Append(Configuration.Settings.Language.General.SubtitleFiles + "|");
foreach (SubtitleFormat s in SubtitleFormat.AllSubtitleFormats)
{
if (!sb.ToString().Contains("*" + s.Extension + ";"))
sb.Append("*" + s.Extension + ";");
AddExtension(sb, s.Extension);
foreach (string ext in s.AlternateExtensions)
{
if (!sb.ToString().Contains("*" + ext + ";"))
sb.Append("*" + ext + ";");
}
AddExtension(sb, ext);
}
sb.Append("*" + new Pac().Extension + ";");
sb.Append("*" + new Cavena890().Extension + ";");
sb.Append("*" + new Spt().Extension + ";");
sb.Append("*" + new Wsb().Extension + ";");
sb.Append("*" + new CheetahCaption().Extension + ";");
sb.Append("*" + new CaptionsInc().Extension + ";");
sb.Append("*" + new SonicScenaristBitmaps().Extension + ";");
sb.Append("*.mks;"); // matroska subtitlefiles (normally contain subtitles)
sb.Append("*.sup;"); // blu-ray sup
AddExtension(sb, new Pac().Extension);
AddExtension(sb, new Cavena890().Extension);
AddExtension(sb, new Spt().Extension);
AddExtension(sb, new Wsb().Extension);
AddExtension(sb, new CheetahCaption().Extension);
AddExtension(sb, new CaptionsInc().Extension);
AddExtension(sb, new Ultech130().Extension);
AddExtension(sb, ".uld"); // Ultech drop frame
AddExtension(sb, new SonicScenaristBitmaps().Extension);
AddExtension(sb, ".mks");
AddExtension(sb, ".sup");
if (!string.IsNullOrEmpty(Configuration.Settings.General.OpenSubtitleExtraExtensions))
{

View File

@ -660,6 +660,7 @@
<Compile Include="Logic\SubtitleFormats\TranscriberXml.cs" />
<Compile Include="Logic\SubtitleFormats\TurboTitler.cs" />
<Compile Include="Logic\SubtitleFormats\UleadSubtitleFormat.cs" />
<Compile Include="Logic\SubtitleFormats\Ultech130.cs" />
<Compile Include="Logic\SubtitleFormats\UnknownSubtitle10.cs" />
<Compile Include="Logic\SubtitleFormats\UnknownSubtitle11.cs" />
<Compile Include="Logic\SubtitleFormats\UnknownSubtitle12.cs" />