mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-10-28 06:52:35 +01:00
Working on formats
git-svn-id: https://subtitleedit.googlecode.com/svn/trunk@1185 99eadd0c-20b8-1223-b5c4-2a2b2df33de2
This commit is contained in:
parent
77d929cf12
commit
8d136715d1
34
src/Forms/Main.Designer.cs
generated
34
src/Forms/Main.Designer.cs
generated
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -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
|
||||
|
2
src/Forms/Settings.Designer.cs
generated
2
src/Forms/Settings.Designer.cs
generated
@ -2293,7 +2293,7 @@
|
||||
"Down",
|
||||
"End",
|
||||
"Escape",
|
||||
"Ins",
|
||||
"Insert",
|
||||
"Left",
|
||||
"Pause",
|
||||
"Return",
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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++;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -4,12 +4,11 @@ using System.IO;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
|
||||
// - Mom, when you were my age 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 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, " ");
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
|
285
src/Logic/SubtitleFormats/Ultech130.cs
Normal file
285
src/Logic/SubtitleFormats/Ultech130.cs
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -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))
|
||||
{
|
||||
|
@ -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" />
|
||||
|
Loading…
Reference in New Issue
Block a user