Added two new subtitle formats + some subtitle format refactoring

git-svn-id: https://subtitleedit.googlecode.com/svn/trunk@852 99eadd0c-20b8-1223-b5c4-2a2b2df33de2
This commit is contained in:
niksedk 2011-12-20 22:45:58 +00:00
parent 7825f013ba
commit b259574bbf
20 changed files with 289 additions and 32 deletions

View File

@ -147,7 +147,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
int frames = (int)(time.TotalMilliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate)) + 1;
int frames = MillisecondsToFrames(time.TotalMilliseconds) + 1;
return frames.ToString();
}

View File

@ -58,8 +58,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
//00:03:15:22 (last is frame)
int frames = (int)(time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)

View File

@ -0,0 +1,139 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
{
class AdobeEncoreLineTabs : SubtitleFormat
{
public override string Extension
{
get { return ".txt"; }
}
public override string Name
{
get { return "Adobe Encore (line/tabs)"; }
}
public override bool HasLineNumber
{
get { return true; }
}
public override bool IsTimeBased
{
get { return true; }
}
public override bool IsMine(List<string> lines, string fileName)
{
var subtitle = new Subtitle();
var sb = new StringBuilder();
foreach (string line in lines)
sb.AppendLine(line);
LoadSubtitle(subtitle, lines, fileName);
return subtitle.Paragraphs.Count > _errorCount;
}
public override string ToText(Subtitle subtitle, string title)
{
StringBuilder sb = new StringBuilder();
int index = 0;
foreach (Paragraph p in subtitle.Paragraphs)
{
index++;
//0002 00:01:48:22 00:01:52:17 - I need those samples, fast!//- Yes, professor.
string text = p.Text;
text = text.Replace("<i>", "@Italic@");
text = text.Replace("</i>", "@Italic@");
text = text.Replace(Environment.NewLine, "//");
sb.AppendLine(string.Format("{0:0000}\t{1}\t{2}\t{3}", index, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), Utilities.RemoveHtmlTags(text)));
}
return sb.ToString();
}
private string EncodeTimeCode(TimeCode time)
{
//00:03:15:22 (last is frame)
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)
{
//0002 00:01:48:22 00:01:52:17 - I need those samples, fast!//- Yes, professor.
Paragraph p = null;
subtitle.Paragraphs.Clear();
var regexTimeCodes = new Regex(@"^\d\d\d\d\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t", RegexOptions.Compiled);
foreach (string line in lines)
{
string s = line.Replace(" ", "\t");
if (regexTimeCodes.IsMatch(s))
{
var temp = s.Split('\t');
if (temp.Length > 1)
{
string start = temp[1];
string end = temp[2];
string[] startParts = start.Split(":".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
string[] endParts = end.Split(":".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
if (startParts.Length == 4 && endParts.Length == 4)
{
string text = s.Remove(0, regexTimeCodes.Match(s).Length - 1).Trim();
if (!text.Contains(Environment.NewLine))
text = text.Replace("//", Environment.NewLine);
if (text.Contains("@Italic@"))
{
bool italicOn = false;
while (text.Contains("@Italic@"))
{
int index = text.IndexOf("@Italic@");
string italicTag = "<i>";
if (italicOn)
italicTag = "</i>";
text = text.Remove(index, "@Italic@".Length).Insert(index, italicTag);
italicOn = !italicOn;
}
text = Utilities.FixInvalidItalicTags(text);
}
p = new Paragraph(DecodeTimeCode(startParts), DecodeTimeCode(endParts), text);
subtitle.Paragraphs.Add(p);
}
}
}
else if (line.Trim().Length == 0)
{
// skip these lines
}
else if (line.Trim().Length > 0 && p != null)
{
_errorCount++;
}
}
subtitle.Renumber(1);
}
private TimeCode DecodeTimeCode(string[] parts)
{
//00:00:07:12
string hour = parts[0];
string minutes = parts[1];
string seconds = parts[2];
string frames = parts[3];
int milliseconds = (int)((1000.0 / Configuration.Settings.General.CurrentFrameRate) * int.Parse(frames));
if (milliseconds > 999)
milliseconds = 999;
TimeCode tc = new TimeCode(int.Parse(hour), int.Parse(minutes), int.Parse(seconds), milliseconds);
return tc;
}
}
}

View File

@ -55,8 +55,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
//00:03:15:22 (last is frame)
int frames = (int) (time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)

View File

@ -58,8 +58,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
//00:03:15:22 (last is frame)
int frames = (int)(time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)

View File

@ -137,8 +137,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private static string ConvertToTimeString(TimeCode time)
{
int frames = (int)(time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
}

View File

@ -87,8 +87,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
int frames = (int)(time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
private TimeCode DecodeTimeCode(string[] parts)

View File

@ -120,8 +120,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
int frames = (int)(time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
private TimeCode DecodeTimeCode(string[] parts)

View File

@ -670,7 +670,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
if (timeCode.Hours == 7 && timeCode.Minutes == 35)
highPart = "065535";
byte frames = (byte)(timeCode.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
byte frames = (byte)MillisecondsToFrames(timeCode.Milliseconds);
string lowPart = string.Format("{0:00}", timeCode.Seconds) + string.Format("{0:00}", frames);
int high = int.Parse(highPart);

View File

@ -64,8 +64,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
//[00:00:07.12]
int frames = (int)(time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("[{0:00}:{1:00}:{2:00}.{3:00}]", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("[{0:00}:{1:00}:{2:00}.{3:00}]", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)

View File

@ -55,8 +55,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
//00:03:15:22 (last is frame)
int frames = (int) (time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)

View File

@ -54,8 +54,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
//00:03:15:22 (last is frame)
int frames = (int)(time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)

View File

@ -0,0 +1,125 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
{
public class SonyDVDArchitectLineAndDuration : SubtitleFormat
{
public override string Extension
{
get { return ".txt"; }
}
public override string Name
{
get { return "Sony DVDArchitect line/duration"; }
}
public override bool HasLineNumber
{
get { return true; }
}
public override bool IsTimeBased
{
get { return true; }
}
public override bool IsMine(List<string> lines, string fileName)
{
var subtitle = new Subtitle();
LoadSubtitle(subtitle, lines, fileName);
return subtitle.Paragraphs.Count > _errorCount;
}
public override string ToText(Subtitle subtitle, string title)
{
var sb = new StringBuilder();
sb.AppendLine("Title: " + title);
sb.AppendLine("Translator: No Author");
sb.AppendLine("Date: " + DateTime.Now.ToString("dd-MM-yyyy").Replace("-",".")); // 25.08.2011
double milliseconds = 0;
if (subtitle.Paragraphs.Count > 0)
milliseconds = subtitle.Paragraphs[subtitle.Paragraphs.Count-1].EndTime.TotalMilliseconds;
var tc = new TimeCode(TimeSpan.FromMilliseconds(milliseconds));
sb.AppendLine(string.Format("Duration: {0:00}:{1:00}:{2:00}:{3:00}", tc.Hours, tc.Minutes, tc.Seconds, MillisecondsToFrames(tc.Milliseconds))); // 01:20:49:12
sb.AppendLine("Program start: 00:00:00:00");
sb.AppendLine("Title count: " + subtitle.Paragraphs.Count);
sb.AppendLine();
sb.AppendLine("#\tIn\tOut\tDuration");
sb.AppendLine();
int count = 0;
foreach (Paragraph p in subtitle.Paragraphs)
{
count++;
string text = Utilities.RemoveHtmlTags(p.Text);
sb.AppendLine(string.Format("{13}\t{0:00}:{1:00}:{2:00}:{3:00}\t{4:00}:{5:00}:{6:00}:{7:00}\t{8:00}:{9:00}:{10:00}:{11:00}\r\n{12:00}" + Environment.NewLine,
p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFrames(p.StartTime.Milliseconds),
p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFrames(p.EndTime.Milliseconds),
p.Duration.Hours, p.Duration.Minutes, p.Duration.Seconds, MillisecondsToFrames(p.Duration.Milliseconds),
text, count));
}
return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine;
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)
{ //22 00:04:19:12 00:04:21:09 00:00:01:21
var regex = new Regex(@"^\d+\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d\t\d\d:\d\d:\d\d:\d\d$", RegexOptions.Compiled);
_errorCount = 0;
Paragraph lastParagraph = null;
int count = 0;
foreach (string line in lines)
{
string s = line;
if (s.Length > 0)
{
bool success = false;
var match = regex.Match(s);
if (s.Length > 31 && match.Success)
{
if (lastParagraph != null)
subtitle.Paragraphs.Add(lastParagraph);
var arr = s.Split('\t');
TimeCode start = DecodeTimeCode(arr[1]);
TimeCode end = DecodeTimeCode(arr[2]);
lastParagraph = new Paragraph(start, end, string.Empty);
success = true;
}
else if (line.Trim().Length > 0 && lastParagraph != null && Utilities.CountTagInText(lastParagraph.Text, Environment.NewLine) < 4)
{
lastParagraph.Text = (lastParagraph.Text + Environment.NewLine + line).Trim();
success = true;
}
if (!success && count > 9)
_errorCount++;
}
count++;
}
if (lastParagraph != null)
subtitle.Paragraphs.Add(lastParagraph);
subtitle.Renumber(1);
}
private TimeCode DecodeTimeCode(string s)
{
var parts = s.Split(':');
//00:00:07:12
string hour = parts[0];
string minutes = parts[1];
string seconds = parts[2];
string frames = parts[3];
int milliseconds = (int)((1000.0 / Configuration.Settings.General.CurrentFrameRate) * int.Parse(frames));
if (milliseconds > 999)
milliseconds = 999;
TimeCode tc = new TimeCode(int.Parse(hour), int.Parse(minutes), int.Parse(seconds), milliseconds);
return tc;
}
}
}

View File

@ -86,10 +86,7 @@ $TapeOffset = FALSE
private string EncodeTimeCode(TimeCode time)
{
//00:01:54:19
int frames = (int) (time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)

View File

@ -69,8 +69,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
//00:03:15:22 (last is frame)
int frames = (int)(time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)

View File

@ -17,6 +17,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
new SubRip(),
new AbcIViewer(),
new AdobeEncore(),
new AdobeEncoreLineTabs(),
new AdobeEncoreTabs(),
new AdobeEncoreWithLineNumbers(),
new AdvancedSubStationAlpha(),
@ -50,6 +51,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
new ScenaristClosedCaptions(),
new SonyDVDArchitect(),
new SonyDVDArchitectExplicitDuration(),
new SonyDVDArchitectLineAndDuration(),
new SonyDVDArchitectTabs(),
new SonyDVDArchitectWithLineNumbers(),
new SubStationAlpha(),
@ -157,5 +159,10 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
}
}
public static int MillisecondsToFrames(double milliseconds)
{
return (int)(milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
}
}
}

View File

@ -139,8 +139,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
int frames = (int)(time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate))+1;
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
private TimeCode DecodeTimeCode(string[] parts)

View File

@ -94,8 +94,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
//0:03:02.15
int frames = (int)(time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0}:{1:00}:{2:00}.{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0}:{1:00}:{2:00}.{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
private TimeCode DecodeTimeCode(string timePart)

View File

@ -58,8 +58,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
private string EncodeTimeCode(TimeCode time)
{
//00:03:15:22 (last is frame)
int frames = (int)(time.Milliseconds / (1000.0 / Configuration.Settings.General.CurrentFrameRate));
return string.Format("{0:00}{1:00}{2:00}{3:00}", time.Hours, time.Minutes, time.Seconds, frames);
return string.Format("{0:00}{1:00}{2:00}{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFrames(time.Milliseconds));
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)

View File

@ -576,6 +576,7 @@
<Compile Include="Logic\Spellcheck\WindowsHunspell.cs" />
<Compile Include="Logic\StripableText.cs" />
<Compile Include="Logic\SubtitleFormats\AdobeEncore.cs" />
<Compile Include="Logic\SubtitleFormats\AdobeEncoreLineTabs.cs" />
<Compile Include="Logic\SubtitleFormats\AdobeEncoreTabs.cs" />
<Compile Include="Logic\SubtitleFormats\AdobeEncoreWithLineNumbers.cs" />
<Compile Include="Logic\SubtitleFormats\AdvancedSubStationAlpha.cs" />
@ -605,6 +606,7 @@
<Compile Include="Logic\SubtitleFormats\ScenaristClosedCaptions.cs" />
<Compile Include="Logic\SubtitleFormats\Son.cs" />
<Compile Include="Logic\SubtitleFormats\SonyDVDArchitectExplicitDuration.cs" />
<Compile Include="Logic\SubtitleFormats\SonyDVDArchitectLineAndDuration.cs" />
<Compile Include="Logic\SubtitleFormats\SonyDVDArchitectTabs.cs" />
<Compile Include="Logic\SubtitleFormats\SonyDVDArchitectWithLineNumbers.cs" />
<Compile Include="Logic\SubtitleFormats\Ebu.cs" />