public Paragraph(TimeCode startTime, TimeCode endTime, string text) { StartTime = startTime; EndTime = endTime; Text = text; ID = GenerateId(); }
public Paragraph(string text, double startTotalMilliseconds, double endTotalMilliseconds) { StartTime = new TimeCode(startTotalMilliseconds); EndTime = new TimeCode(endTotalMilliseconds); Text = text; ID = GenerateId(); }
private static string MakeTimeCode(TimeCode timeCode, Paragraph last) { double start = 0; if (last != null) start = last.EndTime.TotalSeconds; return string.Format("{0:0.0#}", (timeCode.TotalSeconds - start)); }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); lines.ForEach(line => sb.AppendLine(line)); var xml = new XmlDocument { XmlResolver = null }; xml.LoadXml(sb.ToString().Trim()); foreach (XmlNode node in xml.DocumentElement.SelectNodes("text")) { try { string start = node.Attributes["t"].InnerText; string dur = node.Attributes["d"].InnerText; TimeCode startTimeCode = GetTimeCode(start); var endTimeCode = new TimeCode(startTimeCode.TotalMilliseconds + GetTimeCode(dur).TotalMilliseconds); var p = new Paragraph(startTimeCode, endTimeCode, node.InnerText.Replace(" ", " ").Replace(" ", " ")); subtitle.Paragraphs.Add(p); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); _errorCount++; } } subtitle.Renumber(); }
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(milliseconds); sb.AppendLine(string.Format("Duration: {0:00}:{1:00}:{2:00}:{3:00}", tc.Hours, tc.Minutes, tc.Seconds, MillisecondsToFramesMaxFrameRate(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}" + Environment.NewLine, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds), p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds), p.Duration.Hours, p.Duration.Minutes, p.Duration.Seconds, MillisecondsToFramesMaxFrameRate(p.Duration.Milliseconds), text, count)); } return sb.ToString().Trim() + Environment.NewLine + Environment.NewLine + Environment.NewLine; }
/// <summary> /// Initializes a new instance of the <see cref="Paragraph"/> class. /// </summary> /// <param name="startTime"> /// The start time. /// </param> /// <param name="endTime"> /// The end time. /// </param> /// <param name="text"> /// The text. /// </param> public Paragraph(TimeCode startTime, TimeCode endTime, string text) { this.StartTime = startTime; this.EndTime = endTime; this.Text = text; this.ID = this.GenerateId(); }
internal static string ConvertToTimeString(TimeCode time) { var timeCodeFormat = Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormat.Trim().ToLowerInvariant(); if (timeCodeFormat == "source" && !string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormatSource)) { timeCodeFormat = Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormatSource.Trim().ToLowerInvariant(); } switch (timeCodeFormat) { case "source": case "seconds": return string.Format(CultureInfo.InvariantCulture, "{0:0.0##}s", time.TotalSeconds); case "milliseconds": return string.Format(CultureInfo.InvariantCulture, "{0}ms", time.TotalMilliseconds); case "ticks": return string.Format(CultureInfo.InvariantCulture, "{0}t", TimeSpan.FromMilliseconds(time.TotalMilliseconds).Ticks); case "hh:mm:ss.ms": return string.Format(CultureInfo.InvariantCulture, "{0:00}:{1:00}:{2:00}.{3:000}", time.Hours, time.Minutes, time.Seconds, time.Milliseconds); case "hh:mm:ss.ms-two-digits": return string.Format(CultureInfo.InvariantCulture, "{0:00}:{1:00}:{2:00}.{3:00}", time.Hours, time.Minutes, time.Seconds, (int)Math.Round(time.Milliseconds / 10.0)); case "hh:mm:ss,ms": return string.Format(CultureInfo.InvariantCulture, "{0:00}:{1:00}:{2:00},{3:000}", time.Hours, time.Minutes, time.Seconds, time.Milliseconds); default: return string.Format(CultureInfo.InvariantCulture, "{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFramesMaxFrameRate(time.Milliseconds)); } }
public override string ToText(Subtitle subtitle, string title) { var sb = new StringBuilder(); if (!string.IsNullOrEmpty(subtitle.Header) && (subtitle.Header.Contains("[ar:") || subtitle.Header.Contains("[ti:"))) sb.Append(subtitle.Header); for (int i = 0; i < subtitle.Paragraphs.Count; i++) { Paragraph p = subtitle.Paragraphs[i]; Paragraph next = null; if (i + 1 < subtitle.Paragraphs.Count) next = subtitle.Paragraphs[i + 1]; string text = Utilities.RemoveHtmlTags(p.Text); text = text.Replace(Environment.NewLine, " "); // text = text.Replace(Environment.NewLine, "|"); sb.AppendLine(string.Format("[{0:00}:{1:00}.{2:00}]{3}", p.StartTime.Hours * 60 + p.StartTime.Minutes, p.StartTime.Seconds, (int)Math.Round(p.StartTime.Milliseconds / 10.0), text)); if (next == null || next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds > 100) { TimeCode tc = new TimeCode(TimeSpan.FromMilliseconds(p.EndTime.TotalMilliseconds)); sb.AppendLine(string.Format("[{0:00}:{1:00}.{2:00}]{3}", tc.Hours * 60 + tc.Minutes, tc.Seconds, (int)Math.Round(tc.Milliseconds / 10.0), string.Empty)); } } return sb.ToString().Trim(); }
private void buttonReset_Click(object sender, EventArgs e) { VideoOffset = new TimeCode(); DoNotaddVideoOffsetToTimeCodes = checkBoxKeepTimeCodes.Checked; Reset = true; DialogResult = DialogResult.OK; }
private void buttonOK_Click(object sender, EventArgs e) { VideoOffset = timeUpDownVideoPosition.TimeCode; FromCurrentVideoPosition = checkBoxFromCurrentPosition.Checked; DoNotaddVideoOffsetToTimeCodes = checkBoxKeepTimeCodes.Checked; DialogResult = DialogResult.OK; }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { //00:02:09:34 00:02:13:07 - Hvad mener du så om konkurrencen?- Jo, det er helt fint. //00:02:14:02 00:02:16:41 - Var det den rigtige der vandt?- Ja, bestemt. //newline = \r (0D) _errorCount = 0; Paragraph lastParagraph = null; foreach (string line in lines) { if (string.IsNullOrWhiteSpace(line)) { continue; } bool success = false; bool isTimeCode = false; if (line.Length > 26 && line.IndexOf(':') == 2) { var match = Regex.Match(line); if (match.Success) { isTimeCode = true; string s = line.Substring(0, match.Length); s = s.Replace('\t', ':'); s = s.Replace(" ", string.Empty); s = s.Trim().TrimEnd(':').TrimEnd(); string[] parts = s.Split(':'); if (parts.Length == 8) { int hours = int.Parse(parts[0]); int minutes = int.Parse(parts[1]); int seconds = int.Parse(parts[2]); int milliseconds = int.Parse(parts[3]) * 10; var start = new TimeCode(hours, minutes, seconds, milliseconds); hours = int.Parse(parts[4]); minutes = int.Parse(parts[5]); seconds = int.Parse(parts[6]); milliseconds = int.Parse(parts[7]) * 10; var end = new TimeCode(hours, minutes, seconds, milliseconds); string text = line.Substring(match.Length).TrimStart(); text = text.Replace("|", Environment.NewLine); lastParagraph = new Paragraph(start, end, text); subtitle.Paragraphs.Add(lastParagraph); success = true; } } } if (!isTimeCode && lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) { lastParagraph.Text += Environment.NewLine + line.Trim(); success = true; } if (!success) _errorCount++; } subtitle.Renumber(); }
/// <summary> /// Get formatting object for body element /// </summary> /// <param name="regionId"></param> /// <param name="tick"></param> /// <returns></returns> public override FormattingObject GetFormattingObject(TimeCode tick) { Block block = null; if (TemporallyActive(tick)) { block = new Block(this); foreach (var child in Children) { if (child is DivElement) { var fo = (child as DivElement).GetFormattingObject(tick); if (fo != null) { fo.Parent = block; block.Children.Add(fo); } } if (child is SetElement) { var fo = ((child as SetElement).GetFormattingObject(tick)) as Animation; if (fo != null) { // fo.Parent = block; block.Animations.Add(fo); } } } } return block; }
private static void WriteTimeCode(FileStream fs, TimeCode tc) { fs.WriteByte((byte)(tc.Hours)); fs.WriteByte((byte)(tc.Minutes)); fs.WriteByte((byte)(tc.Seconds)); fs.WriteByte((byte)(MillisecondsToFramesMaxFrameRate(tc.Milliseconds))); }
private static string EncodeTimeCode(TimeCode time) { //00:50 int seconds = time.Seconds; if (time.Milliseconds >= 500) seconds++; return string.Format("{0}:{1:00}", time.Hours * 60 + time.Minutes, time.Seconds); }
private static string EncodeTimeCode(TimeCode time) { //00:03:15:22 (last is frame) int sec = time.Seconds; if (time.Milliseconds >= 500) sec++; return string.Format("{0:00}:{1:00}:{2:00}:", time.Hours, time.Minutes, sec); }
/// <summary> /// Return formatting object for br element /// </summary> /// <param name="regionId"></param> /// <param name="tick"></param> /// <returns></returns> public override FormattingObject GetFormattingObject(TimeCode tick) { if (TemporallyActive(tick)) { return new InlineContent(this); } return null; }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { // 00:04:10:92 - 00:04:13:32 Raise Yourself To Help Mankind // 00:04:27:92 - 00:04:30:92 الجهة المتولية للمسئولية الاجتماعية لشركتنا. _errorCount = 0; Paragraph lastParagraph = null; foreach (string line in lines) { if (string.IsNullOrWhiteSpace(line)) { continue; } bool success = false; Match match = null; if (line.Length > 26 && line[2] == ':') match = Regex.Match(line); if (match != null && match.Success) { string s = line.Substring(0, match.Length); s = s.Replace(" - ", ":"); s = s.Replace(" ", string.Empty); string[] parts = s.Split(':'); if (parts.Length == 8) { int hours = int.Parse(parts[0]); int minutes = int.Parse(parts[1]); int seconds = int.Parse(parts[2]); int milliseconds = int.Parse(parts[3]) * 10; var start = new TimeCode(hours, minutes, seconds, milliseconds); hours = int.Parse(parts[4]); minutes = int.Parse(parts[5]); seconds = int.Parse(parts[6]); milliseconds = int.Parse(parts[7]) * 10; var end = new TimeCode(hours, minutes, seconds, milliseconds); string text = line.Substring(match.Length).TrimStart(); text = text.Replace("|", Environment.NewLine); lastParagraph = new Paragraph(start, end, text); subtitle.Paragraphs.Add(lastParagraph); success = true; } } else if (lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) { lastParagraph.Text += Environment.NewLine + line.Trim(); success = true; } if (!success) _errorCount++; } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { var paragraph = new Paragraph(); ExpectingLine expecting = ExpectingLine.TimeStart; _errorCount = 0; subtitle.Paragraphs.Clear(); char[] splitChars = { ':', ']', '[', ' ' }; foreach (string line in lines) { if (line.StartsWith('[') && RegexTimeCode.IsMatch(line)) { string[] parts = line.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 3) { try { int startHours = int.Parse(parts[0]); int startMinutes = int.Parse(parts[1]); int startSeconds = int.Parse(parts[2]); var tc = new TimeCode(startHours, startMinutes, startSeconds, 0); if (expecting == ExpectingLine.TimeStart) { paragraph = new Paragraph(); paragraph.StartTime = tc; expecting = ExpectingLine.Text; } else if (expecting == ExpectingLine.TimeEnd) { paragraph.EndTime = tc; expecting = ExpectingLine.TimeStart; subtitle.Paragraphs.Add(paragraph); paragraph = new Paragraph(); } } catch { _errorCount++; expecting = ExpectingLine.TimeStart; } } } else { if (expecting == ExpectingLine.Text) { if (line.Length > 0) { string text = line.Replace("|", Environment.NewLine); paragraph.Text = text; expecting = ExpectingLine.TimeEnd; } } } } subtitle.Renumber(); }
private static string EncodeTime(TimeCode time) { //3:15:22 if (time.Hours > 0) return string.Format("{0:00}:{1:00}:{2:00}.{3:00}", time.Hours, time.Minutes, time.Seconds, time.Milliseconds / 10); if (time.Minutes > 9) return string.Format("{0:00}:{1:00}.{2:00}", time.Minutes, time.Seconds, time.Milliseconds / 10); return string.Format("{0}:{1:00}.{2:00}", time.Minutes, time.Seconds, time.Milliseconds / 10); }
public Paragraph(int startFrame, int endFrame, string text) { StartTime = new TimeCode(0, 0, 0, 0); EndTime = new TimeCode(0, 0, 0, 0); StartFrame = startFrame; EndFrame = endFrame; Text = text; ID = GenerateId(); }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { //00:02:10.354 00:02:13.047 00:00:02.693 Her er endnu en tekstfil fra DVD-Architect.Med 2 linier. //00:02:14.018 00:02:19.018 00:00:05.000 - Prøvetekst 2- Linie 2 //newline = \r (0D) var regex = new Regex(@"^\d\d:\d\d:\d\d\.\d\d\d[ \t]+\d\d:\d\d:\d\d\.\d\d\d[ \t]+\d\d:\d\d:\d\d\.\d\d\d[ \t]+", RegexOptions.Compiled); _errorCount = 0; Paragraph lastParagraph = null; foreach (string line in lines) { if (line.Trim().Length > 0) { string l = line; string s = l; bool success = false; var match = regex.Match(s); if (s.Length > 26 && match.Success) { s = s.Substring(0, match.Length); s = s.Replace("\t", ":"); s = s.Replace(".", ":"); s = s.Replace(" ", string.Empty); s = s.Trim().TrimEnd(':').TrimEnd(); string[] parts = s.Split(':'); if (parts.Length == 12) { int hours = int.Parse(parts[0]); int minutes = int.Parse(parts[1]); int seconds = int.Parse(parts[2]); int milliseconds = int.Parse(parts[3]); var start = new TimeCode(hours, minutes, seconds, milliseconds); hours = int.Parse(parts[4]); minutes = int.Parse(parts[5]); seconds = int.Parse(parts[6]); milliseconds = int.Parse(parts[7]); var end = new TimeCode(hours, minutes, seconds, milliseconds); string text = l.Substring(match.Length).TrimStart(); text = text.Replace("|", Environment.NewLine); lastParagraph = new Paragraph(start, end, text); subtitle.Paragraphs.Add(lastParagraph); success = true; } } else if (l.Trim().Length > 0 && lastParagraph != null && Utilities.CountTagInText(lastParagraph.Text, Environment.NewLine) < 4) { lastParagraph.Text += Environment.NewLine + l.Trim(); success = true; } if (!success && l.Trim().Length > 0) _errorCount++; } } subtitle.Renumber(1); }
/// <summary> /// Return formatting object for region element /// </summary> /// <param name="regionId"></param> /// <param name="tick"></param> /// <returns></returns> public override FormattingObject GetFormattingObject(TimeCode tick) { if (TemporallyActive(tick)) { return new BlockContainer(this); } else { return null; } }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { //00:02:09:34 00:02:13:07 - Hvad mener du så om konkurrencen?- Jo, det er helt fint. //00:02:14:02 00:02:16:41 - Var det den rigtige der vandt?- Ja, bestemt. //newline = \r (0D) var regex = new Regex(@"^\d\d:\d\d:\d\d:\d\d[ \t]+\d\d:\d\d:\d\d:\d\d[ \t]+", RegexOptions.Compiled); _errorCount = 0; Paragraph lastParagraph = null; foreach (string line in lines) { if (line.Trim().Length > 0) { bool success = false; var match = regex.Match(line); if (line.Length > 26 && match.Success) { string s = line.Substring(0, match.Length); s = s.Replace("\t", ":"); s = s.Replace(" ", string.Empty); s = s.Trim().TrimEnd(':').TrimEnd(); string[] parts = s.Split(':'); if (parts.Length == 8) { int hours = int.Parse(parts[0]); int minutes = int.Parse(parts[1]); int seconds = int.Parse(parts[2]); int milliseconds = int.Parse(parts[3]) * 10; var start = new TimeCode(hours, minutes, seconds, milliseconds); hours = int.Parse(parts[4]); minutes = int.Parse(parts[5]); seconds = int.Parse(parts[6]); milliseconds = int.Parse(parts[7]) * 10; var end = new TimeCode(hours, minutes, seconds, milliseconds); string text = line.Substring(match.Length).TrimStart(); text = text.Replace("|", Environment.NewLine); lastParagraph = new Paragraph(start, end, text); subtitle.Paragraphs.Add(lastParagraph); success = true; } } else if (line.Trim().Length > 0 && lastParagraph != null && Utilities.CountTagInText(lastParagraph.Text, Environment.NewLine) < 4) { lastParagraph.Text += Environment.NewLine + line.Trim(); success = true; } if (!success) _errorCount++; } } subtitle.Renumber(1); }
internal static string ConvertToTimeString(TimeCode time) { if (string.IsNullOrEmpty(Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormat)) return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFramesMaxFrameRate(time.Milliseconds)); else if (Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormat.Trim().ToLower() == "seconds") return string.Format(CultureInfo.InvariantCulture, "{0:0.0#}s", time.TotalSeconds); else if (Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormat.Trim().ToLower() == "milliseconds") return string.Format(CultureInfo.InvariantCulture, "{0}ms", time.TotalMilliseconds); else if (Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormat.Trim().ToLower() == "ticks") return string.Format(CultureInfo.InvariantCulture, "{0}t", TimeSpan.FromMilliseconds(time.TotalMilliseconds).Ticks); return string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFramesMaxFrameRate(time.Milliseconds)); }
public SetVideoOffset() { InitializeComponent(); _videoOffset = new TimeCode(0); Text = Configuration.Settings.Language.SetVideoOffset.Title; labelDescription.Text = Configuration.Settings.Language.SetVideoOffset.Description; checkBoxFromCurrentPosition.Text = Configuration.Settings.Language.SetVideoOffset.RelativeToCurrentVideoPosition; buttonReset.Text = Configuration.Settings.Language.SetVideoOffset.Reset; buttonOK.Text = Configuration.Settings.Language.General.Ok; buttonCancel.Text = Configuration.Settings.Language.General.Cancel; UiUtil.FixLargeFonts(this, buttonOK); }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { // 00:04:10:92 - 00:04:13:32 Raise Yourself To Help Mankind // 00:04:27:92 - 00:04:30:92 الجهة المتولية للمسئولية الاجتماعية لشركتنا. var regex = new Regex(@"^\d\d:\d\d:\d\d:\d\d[ ]+-[ ]+\d\d:\d\d:\d\d:\d\d", RegexOptions.Compiled); _errorCount = 0; Paragraph lastParagraph = null; foreach (string line in lines) { if (line.Trim().Length > 0) { bool success = false; var match = regex.Match(line); if (line.Length > 26 && match.Success) { string s = line.Substring(0, match.Length); s = s.Replace(" - ", ":"); s = s.Replace(" ", string.Empty); string[] parts = s.Split(':'); if (parts.Length == 8) { int hours = int.Parse(parts[0]); int minutes = int.Parse(parts[1]); int seconds = int.Parse(parts[2]); int milliseconds = int.Parse(parts[3]) * 10; var start = new TimeCode(hours, minutes, seconds, milliseconds); hours = int.Parse(parts[4]); minutes = int.Parse(parts[5]); seconds = int.Parse(parts[6]); milliseconds = int.Parse(parts[7]) * 10; var end = new TimeCode(hours, minutes, seconds, milliseconds); string text = line.Substring(match.Length).TrimStart(); text = text.Replace("|", Environment.NewLine); lastParagraph = new Paragraph(start, end, text); subtitle.Paragraphs.Add(lastParagraph); success = true; } } else if (line.Trim().Length > 0 && lastParagraph != null && Utilities.CountTagInText(lastParagraph.Text, Environment.NewLine) < 4) { lastParagraph.Text += Environment.NewLine + line.Trim(); success = true; } if (!success) _errorCount++; } } subtitle.Renumber(1); }
/// <summary> /// Return the formatting object for set element /// </summary> /// <param name="regionId"></param> /// <param name="tick"></param> /// <returns></returns> public override FormattingObject GetFormattingObject(TimeCode tick) { if (TemporallyActive(tick)) { var animation = new Animation(this); return animation; } else { return null; } }
private static TimeCode DecodeTimeCode(byte[] buffer, int index) { int hour = buffer[index]; int minutes = buffer[index + 1]; int seconds = buffer[index + 2]; int frames = buffer[index + 3]; int milliseconds = (int)((1000.0 / Configuration.Settings.General.CurrentFrameRate) * frames); if (milliseconds > 999) milliseconds = 999; TimeCode tc = new TimeCode(hour, minutes, seconds, milliseconds); return tc; }
private static List<string> GenerateTimes(string[] words, string text, TimeCode start, TimeCode end) { var list = new List<string>(); double total = 0.0; for (int i = 0; i < words.Length; i++) { string word = words[i]; double percent = (word.Length + 1.0) * 100 / text.Length; list.Add(Convert.ToInt64(start.TotalMilliseconds + (total * (end.TotalMilliseconds - start.TotalMilliseconds) / 100.0)).ToString()); total += percent; } return list; }
private static bool GetTimeCode(TimeCode timeCode, string timeString) { try { string[] timeParts = timeString.Split(":.".ToCharArray()); timeCode.Hours = int.Parse(timeParts[0]); timeCode.Minutes = int.Parse(timeParts[1]); timeCode.Seconds = int.Parse(timeParts[2]); timeCode.Milliseconds = int.Parse(timeParts[3]); return true; } catch { return false; } }
private static string EncodeTimeCode(TimeCode time) { //00:50:39:13 (last is frame) return(string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFramesMaxFrameRate(time.Milliseconds))); }
private void buttonOK_Click(object sender, EventArgs e) { VideoOffset = timeUpDownVideoPosition.TimeCode; FromCurrentVideoPosition = checkBoxFromCurrentPosition.Checked; DialogResult = DialogResult.OK; }
private string ConvertToTimeString(TimeCode time) { return($"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MsToFramesMaxFrameRate(time.Milliseconds, _frameRate):00}"); }
private static Paragraph MakeTextParagraph(StringBuilder text, Paragraph p, TimeCode start, TimeCode end) { p = new Paragraph(start, end, text.ToString().Trim()); if (p.Text.StartsWith(",b" + Environment.NewLine)) { p.Text = "<i>" + p.Text.Remove(0, 2).Trim() + "</i>"; } else if (p.Text.StartsWith(",1" + Environment.NewLine)) { p.Text = "{\\an8}" + p.Text.Remove(0, 2).Trim(); } else if (p.Text.StartsWith(",12" + Environment.NewLine)) { p.Text = "{\\an8}" + p.Text.Remove(0, 3).Trim(); } return(p); }
private static string EncodeTimeCode(TimeCode time) { return(time.ToHHMMSSFF()); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { // 00:04:10:92 - 00:04:13:32 Raise Yourself To Help Mankind // 00:04:27:92 - 00:04:30:92 الجهة المتولية للمسئولية الاجتماعية لشركتنا. _errorCount = 0; Paragraph lastParagraph = null; foreach (string line in lines) { if (string.IsNullOrWhiteSpace(line)) { continue; } bool success = false; Match match = null; if (line.Length > 26 && line[2] == ':') { match = Regex.Match(line); } if (match != null && match.Success) { string s = line.Substring(0, match.Length); s = s.Replace(" - ", ":"); s = s.RemoveChar(' '); string[] parts = s.Split(':'); if (parts.Length == 8) { int hours = int.Parse(parts[0]); int minutes = int.Parse(parts[1]); int seconds = int.Parse(parts[2]); int milliseconds = int.Parse(parts[3]) * 10; var start = new TimeCode(hours, minutes, seconds, milliseconds); hours = int.Parse(parts[4]); minutes = int.Parse(parts[5]); seconds = int.Parse(parts[6]); milliseconds = int.Parse(parts[7]) * 10; var end = new TimeCode(hours, minutes, seconds, milliseconds); string text = line.Substring(match.Length).TrimStart(); text = text.Replace("|", Environment.NewLine); lastParagraph = new Paragraph(start, end, text); subtitle.Paragraphs.Add(lastParagraph); success = true; } } else if (lastParagraph != null && Utilities.GetNumberOfLines(lastParagraph.Text) < 5) { lastParagraph.Text += Environment.NewLine + line.Trim(); success = true; } if (!success) { _errorCount++; } } subtitle.Renumber(); }
private static string MakeTimeCode(TimeCode tc) { return(string.Format("{0:00}:{1:00}:{2:00};{3:00}", tc.Hours, tc.Minutes, tc.Seconds, MillisecondsToFramesMaxFrameRate(tc.Milliseconds))); }
public Cavena890SaveOptions(Subtitle subtitle, string subtitleFileName) { UiUtil.PreInitialize(this); InitializeComponent(); UiUtil.FixFonts(this); buttonCancel.Text = Configuration.Settings.Language.General.Cancel; buttonOK.Text = Configuration.Settings.Language.General.Ok; timeUpDownStartTime.ForceHHMMSSFF(); timeUpDownStartTime.TimeCode = new TimeCode(TimeCode.ParseHHMMSSFFToMilliseconds(Configuration.Settings.SubtitleSettings.Cavena890StartOfMessage)); textBoxTranslatedTitle.Text = Configuration.Settings.SubtitleSettings.CurrentCavena89Title; textBoxOriginalTitle.Text = Configuration.Settings.SubtitleSettings.CurrentCavena890riginalTitle; textBoxTranslator.Text = Configuration.Settings.SubtitleSettings.CurrentCavena890Translator; textBoxComment.Text = Configuration.Settings.SubtitleSettings.CurrentCavena89Comment; if (string.IsNullOrWhiteSpace(textBoxComment.Text)) { textBoxComment.Text = "Made with Subtitle Edit"; } if (string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.CurrentCavena89Title)) { string title = Path.GetFileNameWithoutExtension(subtitleFileName) ?? string.Empty; if (title.Length > 28) { title = title.Substring(0, 28); } textBoxTranslatedTitle.Text = title; } var language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); switch (language) { case "he": Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdHebrew; comboBoxLanguage.SelectedIndex = 5; break; case "ru": Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRussian; comboBoxLanguage.SelectedIndex = 6; break; case "ro": Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRomanian; comboBoxLanguage.SelectedIndex = 7; break; case "zh": Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseSimplified; comboBoxLanguage.SelectedIndex = 2; break; case "da": Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdDanish; comboBoxLanguage.SelectedIndex = 1; break; default: Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdEnglish; comboBoxLanguage.SelectedIndex = 4; break; } }
private void buttonImport_Click(object sender, EventArgs e) { openFileDialog1.Filter = "Cavena 890 (*.890)|*.890"; openFileDialog1.FileName = string.Empty; if (openFileDialog1.ShowDialog() == DialogResult.OK) { var buffer = FileUtil.ReadAllBytesShared(openFileDialog1.FileName); if (buffer.Length > 270) { var s = System.Text.Encoding.ASCII.GetString(buffer, 40, 28); textBoxTranslatedTitle.Text = s.Replace("\0", string.Empty); s = System.Text.Encoding.ASCII.GetString(buffer, 218, 28); textBoxOriginalTitle.Text = s.Replace("\0", string.Empty); s = System.Text.Encoding.ASCII.GetString(buffer, 68, 28); textBoxTranslator.Text = s.Replace("\0", string.Empty); s = System.Text.Encoding.ASCII.GetString(buffer, 148, 24); textBoxComment.Text = s.Replace("\0", string.Empty); s = System.Text.Encoding.ASCII.GetString(buffer, 256, 11); timeUpDownStartTime.TimeCode = new TimeCode(TimeCode.ParseHHMMSSFFToMilliseconds(s)); switch (buffer[146]) { case Cavena890.LanguageIdHebrew: Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdHebrew; comboBoxLanguage.SelectedIndex = 5; break; case Cavena890.LanguageIdRussian: Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRussian; comboBoxLanguage.SelectedIndex = 6; break; case Cavena890.LanguageIdChineseSimplified: Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseSimplified; comboBoxLanguage.SelectedIndex = 2; break; case Cavena890.LanguageIdChineseTraditional: Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdChineseSimplified; comboBoxLanguage.SelectedIndex = 3; break; case Cavena890.LanguageIdDanish: Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdDanish; comboBoxLanguage.SelectedIndex = 1; break; case Cavena890.LanguageIdRomanian: Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdRomanian; comboBoxLanguage.SelectedIndex = 7; break; default: Configuration.Settings.SubtitleSettings.CurrentCavena89LanguageId = Cavena890.LanguageIdEnglish; comboBoxLanguage.SelectedIndex = 4; break; } } } }
private static string EncodeTimeCode(TimeCode time) { //[00:00:07.12] return(string.Format("[{0:00}:{1:00}:{2:00}.{3:00}]", time.Hours, time.Minutes, time.Seconds, MillisecondsToFramesMaxFrameRate(time.Milliseconds))); }
private static string EncodeTimeCode(TimeCode time) { return(string.Format(" #{0:00}:{1:00}:{2:00}-{3:0}# ", time.Hours, time.Minutes, time.Seconds, Math.Round(time.Milliseconds / 100.0, 0))); }
private string ConvertToTimeString(TimeCode time) { return(string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MsToFramesMaxFrameRate(time.Milliseconds, _frameRate))); }
public void MakeAnimation() { TypewriterParagraphs = new List <Paragraph>(); var duration = _paragraph.Duration.TotalMilliseconds - (double)numericUpDownDelay.Value * TimeCode.BaseUnit; var stepsLength = CalculateStepLength(_paragraph.Text, duration); double startMilliseconds; double endMilliseconds; TimeCode start; TimeCode end; var index = 0; var text = string.Empty; var tagOn = false; var tag = string.Empty; var i = 0; var beforeEndTag = string.Empty; var alignment = string.Empty; while (i < _paragraph.Text.Length) { if (i == 0 && _paragraph.Text.StartsWith("{\\", StringComparison.Ordinal) && _paragraph.Text.IndexOf('}') > 2) { var j = i; while (j < _paragraph.Text.Length && _paragraph.Text.Substring(j).StartsWith("{\\", StringComparison.Ordinal) && _paragraph.Text.Substring(j).IndexOf('}', j) > 2) { var idx = _paragraph.Text.IndexOf('}', j); i = idx; j = i + 1; } alignment = _paragraph.Text.Substring(0, j); } else if (_paragraph.Text.Substring(i).StartsWith("{\\", StringComparison.Ordinal) && _paragraph.Text.IndexOf('}', i) > 0) { var endIndex = _paragraph.Text.IndexOf('}', i); if (endIndex >= 0) { var assaTag = _paragraph.Text.Substring(i, endIndex - i + 1); text += assaTag; i = endIndex + 1; continue; } } else if (tagOn) { tag += _paragraph.Text[i]; if (_paragraph.Text[i] == '>') { tagOn = false; if (tag.StartsWith("<font ", StringComparison.InvariantCultureIgnoreCase)) { beforeEndTag = "</font>"; } else if (tag == "<i>") { beforeEndTag = "</i>"; } else if (tag == "<b>") { beforeEndTag = "</b>"; } else if (tag == "<u>") { beforeEndTag = "</u>"; } } } else if (_paragraph.Text[i] == '<') { tagOn = true; tag += _paragraph.Text[i]; beforeEndTag = string.Empty; } else { text += tag + _paragraph.Text[i]; tag = string.Empty; startMilliseconds = index * stepsLength; startMilliseconds += _paragraph.StartTime.TotalMilliseconds; endMilliseconds = (index + 1) * stepsLength - 1; endMilliseconds += _paragraph.StartTime.TotalMilliseconds; start = new TimeCode(startMilliseconds); end = new TimeCode(endMilliseconds); TypewriterParagraphs.Add(new Paragraph(start, end, alignment + text + beforeEndTag) { Extra = _paragraph.Extra }); index++; } i++; } if (numericUpDownDelay.Value > 0) { startMilliseconds = index * stepsLength; startMilliseconds += _paragraph.StartTime.TotalMilliseconds; endMilliseconds = _paragraph.EndTime.TotalMilliseconds; start = new TimeCode(startMilliseconds); end = new TimeCode(endMilliseconds); TypewriterParagraphs.Add(new Paragraph(start, end, _paragraph.Text) { Extra = _paragraph.Extra }); } else if (TypewriterParagraphs.Count > 0) { TypewriterParagraphs[TypewriterParagraphs.Count - 1].EndTime.TotalMilliseconds = _paragraph.EndTime.TotalMilliseconds; } }
private static string EncodeTimeCode(TimeCode time) { return(time.TotalSeconds.ToString(CultureInfo.InvariantCulture)); }
private static string EncodeTimeCode(TimeCode time) { //00:03:15:22 (last is frame) return(time.ToHHMMSSFF()); }
private static string EncodeTimeCode(TimeCode time) { var s = time.ToHHMMSSFF(); return(AddSpaces(s)); }
/// <summary> /// /// </summary> /// <param name="startTC"></param> /// <param name="endTC"></param> public EraseSegment(TimeCode startTC, TimeCode endTC) { Cmd1 = Cmd1.xxxRequest; Cmd2 = (byte)xxxRequest.EraseSegment; }
/// <summary> /// Gets the thumbnail frame of the asset at the specific position. /// </summary> /// <param name="asset">The asset to extract the thumbnail from.</param> /// <returns>The thumbnail uri string.</returns> /// <param name="timeCode">The timecode to get the frame.</param> public string GetThumbnailSource(Asset asset, TimeCode timeCode) { string getFrame = String.Format(CultureInfo.InvariantCulture, GetFrameTimeCodeTemplate, asset.ProviderUri, timeCode); return(String.Concat(this.mediaServicesUri.ToString(), getFrame)); }
public static string ConvertToTimeString(TimeCode time) { return($"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{time.Milliseconds / 4:000}"); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _errorCount = 0; subtitle.Paragraphs.Clear(); var text = new StringBuilder(); var header = new StringBuilder(); Paragraph p = null; for (int i = 0; i < lines.Count; i++) { string line = lines[i].Trim(); if (subtitle.Paragraphs.Count == 0 && line.StartsWith(";") || line.Length == 0) { header.AppendLine(line); } else if (RegexTimeCode.IsMatch(line)) { var timeParts = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (timeParts.Length == 1) { try { TimeCode start = DecodeTimeCode(timeParts[0]); if (p != null && p.EndTime.TotalMilliseconds == 0) { p.EndTime.TotalMilliseconds = start.TotalMilliseconds - Configuration.Settings.General.MininumMillisecondsBetweenLines; } TimeCode end = new TimeCode(0, 0, 0, 0); p = MakeTextParagraph(text, p, start, end); subtitle.Paragraphs.Add(p); text = new StringBuilder(); } catch { _errorCount++; } } else if (timeParts.Length == 2) { try { TimeCode start = DecodeTimeCode(timeParts[0]); if (p != null && p.EndTime.TotalMilliseconds == 0) { p.EndTime.TotalMilliseconds = start.TotalMilliseconds - Configuration.Settings.General.MininumMillisecondsBetweenLines; } TimeCode end = DecodeTimeCode(timeParts[1]); p = MakeTextParagraph(text, p, start, end); subtitle.Paragraphs.Add(p); text = new StringBuilder(); } catch { _errorCount++; } } } else if (line.Trim().Length > 0) { text.AppendLine(line.Trim().Replace("|", "♪")); if (text.Length > 5000) { return; } } else { text = new StringBuilder(); } } subtitle.Header = header.ToString(); subtitle.Renumber(1); }
private static string MakeTimeCode(TimeCode tc) { return($"{tc.Hours:00}:{tc.Minutes:00}:{tc.Seconds:00};{MillisecondsToFramesMaxFrameRate(tc.Milliseconds):00}"); }
internal static string ConvertToTimeString(TimeCode time) { return(Convert.ToInt64(Math.Round(time.TotalMilliseconds)).ToString(CultureInfo.InvariantCulture)); }
private static string EncodeTimeCode(TimeCode time) { //00:03:15:22 (last is frame) return($"{time.Hours:00}:{time.Minutes:00}:{time.Seconds:00}:{MillisecondsToFramesMaxFrameRate(time.Milliseconds):00}"); }
private string EncodeTimeCode(TimeCode time) { return(string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFramesMaxFrameRate(time.Milliseconds))); }
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))); }
private static string ConvertToTimeString(TimeCode time) { return(string.Format("{0:00}:{1:00}:{2:00}.{3:000}", time.Hours, time.Minutes, time.Seconds, time.Milliseconds)); }
private static string EncodeDuration(TimeCode timeCode) { return(string.Format("{0:00}:{1:00}", timeCode.Seconds, MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds))); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); lines.ForEach(line => sb.AppendLine(line)); var xml = new XmlDocument { XmlResolver = null }; xml.LoadXml(sb.ToString().RemoveControlCharactersButWhiteSpace().Trim()); var nsmgr = new XmlNamespaceManager(xml.NameTable); nsmgr.AddNamespace("ttaf1", xml.DocumentElement.NamespaceURI); XmlNode div = xml.DocumentElement.SelectSingleNode("//ttaf1:body", nsmgr).SelectSingleNode("ttaf1:div", nsmgr); if (div == null) { div = xml.DocumentElement.SelectSingleNode("//ttaf1:body", nsmgr).FirstChild; } var styleDic = new Dictionary <string, string>(); foreach (XmlNode node in xml.DocumentElement.SelectNodes("//ttaf1:style", nsmgr)) { if (node.Attributes["tts:fontStyle"] != null && node.Attributes["xml:id"] != null) { styleDic.Add(node.Attributes["xml:id"].Value, node.Attributes["tts:fontStyle"].Value); } } bool couldBeFrames = true; bool couldBeMillisecondsWithMissingLastDigit = true; foreach (XmlNode node in div.ChildNodes) { try { var pText = new StringBuilder(); foreach (XmlNode innerNode in node.ChildNodes) { switch (innerNode.Name.Replace("tt:", string.Empty)) { case "br": pText.AppendLine(); break; case "span": bool italic = false; if (innerNode.Attributes["style"] != null && styleDic.ContainsKey(innerNode.Attributes["style"].Value)) { if (styleDic[innerNode.Attributes["style"].Value].Contains("italic")) { italic = true; pText.Append("<i>"); } } if (!italic && innerNode.Attributes != null) { var fs = innerNode.Attributes.GetNamedItem("tts:fontStyle"); if (fs != null && fs.Value == "italic") { italic = true; pText.Append("<i>"); } } if (innerNode.HasChildNodes) { foreach (XmlNode innerInnerNode in innerNode.ChildNodes) { if (innerInnerNode.Name == "br" || innerInnerNode.Name == "tt:br") { pText.AppendLine(); } else { pText.Append(innerInnerNode.InnerText); } } } else { pText.Append(innerNode.InnerText); } if (italic) { pText.Append("</i>"); } break; case "i": pText.Append("<i>" + innerNode.InnerText + "</i>"); break; case "b": pText.Append("<b>" + innerNode.InnerText + "</b>"); break; default: pText.Append(innerNode.InnerText); break; } } string start = null; // = node.Attributes["begin"].InnerText; string end = null; // = node.Attributes["begin"].InnerText; string dur = null; // = node.Attributes["begin"].InnerText; foreach (XmlAttribute attr in node.Attributes) { if (attr.Name.EndsWith("begin", StringComparison.Ordinal)) { start = attr.InnerText; } else if (attr.Name.EndsWith("end", StringComparison.Ordinal)) { end = attr.InnerText; } else if (attr.Name.EndsWith("duration", StringComparison.Ordinal)) { dur = attr.InnerText; } } //string start = node.Attributes["begin"].InnerText; string text = pText.ToString(); text = text.Replace(Environment.NewLine + "</i>", "</i>" + Environment.NewLine); text = text.Replace("<i></i>", string.Empty).Trim(); if (end != null) { if (end.Length != 11 || end.Substring(8, 1) != ":" || start == null || start.Length != 11 || start.Substring(8, 1) != ":") { couldBeFrames = false; } if (couldBeMillisecondsWithMissingLastDigit && (end.Length != 11 || start == null || start.Length != 11 || end.Substring(8, 1) != "." | start.Substring(8, 1) != ".")) { couldBeMillisecondsWithMissingLastDigit = false; } //string end = node.Attributes["end"].InnerText; double dBegin, dEnd; if (!start.Contains(':') && Utilities.CountTagInText(start, '.') == 1 && !end.Contains(':') && Utilities.CountTagInText(end, '.') == 1 && double.TryParse(start, NumberStyles.Float, CultureInfo.InvariantCulture, out dBegin) && double.TryParse(end, NumberStyles.Float, CultureInfo.InvariantCulture, out dEnd)) { subtitle.Paragraphs.Add(new Paragraph(text, dBegin * TimeCode.BaseUnit, dEnd * TimeCode.BaseUnit)); } else { if (start.Length == 8 && start[2] == ':' && start[5] == ':' && end.Length == 8 && end[2] == ':' && end[5] == ':') { var p = new Paragraph(); var parts = start.Split(new[] { ':' }); p.StartTime = new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0); parts = end.Split(new[] { ':' }); p.EndTime = new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0); p.Text = text; subtitle.Paragraphs.Add(p); } else { subtitle.Paragraphs.Add(new Paragraph(TimedText10.GetTimeCode(start, false), TimedText10.GetTimeCode(end, false), text)); } } } else if (dur != null) { if (dur.Length != 11 || dur.Substring(8, 1) != ":" || start == null || start.Length != 11 || start.Substring(8, 1) != ":") { couldBeFrames = false; } if (couldBeMillisecondsWithMissingLastDigit && (dur.Length != 11 || start == null || start.Length != 11 || dur.Substring(8, 1) != "." | start.Substring(8, 1) != ".")) { couldBeMillisecondsWithMissingLastDigit = false; } TimeCode duration = TimedText10.GetTimeCode(dur, false); TimeCode startTime = TimedText10.GetTimeCode(start, false); var endTime = new TimeCode(startTime.TotalMilliseconds + duration.TotalMilliseconds); subtitle.Paragraphs.Add(new Paragraph(startTime, endTime, text)); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); _errorCount++; } } subtitle.RemoveEmptyLines(); if (couldBeFrames) { bool all30OrBelow = true; foreach (Paragraph p in subtitle.Paragraphs) { if (p.StartTime.Milliseconds > 30 || p.EndTime.Milliseconds > 30) { all30OrBelow = false; } } if (all30OrBelow) { foreach (Paragraph p in subtitle.Paragraphs) { p.StartTime.Milliseconds = SubtitleFormat.FramesToMillisecondsMax999(p.StartTime.Milliseconds); p.EndTime.Milliseconds = SubtitleFormat.FramesToMillisecondsMax999(p.EndTime.Milliseconds); } } } else if (couldBeMillisecondsWithMissingLastDigit) { foreach (Paragraph p in subtitle.Paragraphs) { p.StartTime.Milliseconds *= 10; p.EndTime.Milliseconds *= 10; } } subtitle.Renumber(); }
private static string EncodeTimeCode(TimeCode timeCode) { return($"{timeCode.Hours}:{timeCode.Minutes:00}:{timeCode.Seconds:00}:{MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"); }
private static string EncodeTime(TimeCode time) { return(string.Format("{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, time.Milliseconds / 10.0)); }