From f3dbdf46cd795cbe07f58c20444e1336fd245f7b Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Thu, 11 Jun 2026 01:11:02 +0100 Subject: [PATCH 1/3] Refactor TimeCode frame-based formatting into ITimeFormatter strategy Replace ToHHMMSSFF, ToShortStringHHMMSSFF, ToHHMMSS, ToHHMMSSFFDropFrame, ToSSFF and ToHHMMSSPeriodFF with formatter classes implementing ITimeFormatter, passed to TimeCode.ToString(ITimeFormatter). Shared frame-rounding/second-carry logic lives in FrameBasedTimeFormatter. Co-Authored-By: Claude Fable 5 --- src/libse/Common/TimeCode.cs | 120 +----------------- .../TimeFormatters/FrameBasedTimeFormatter.cs | 31 +++++ .../HhMmSsFfDropFrameTimeFormatter.cs | 15 +++ .../TimeFormatters/HhMmSsFfTimeFormatter.cs | 15 +++ .../HhMmSsPeriodFfTimeFormatter.cs | 15 +++ .../TimeFormatters/HhMmSsTimeFormatter.cs | 15 +++ .../Common/TimeFormatters/ITimeFormatter.cs | 10 ++ .../ShortHhMmSsFfTimeFormatter.cs | 30 +++++ .../TimeFormatters/SsFfTimeFormatter.cs | 23 ++++ .../Common/TimeFormatters/TimeFormatter.cs | 15 +++ src/libse/SubtitleFormats/AdobeEncore.cs | 5 +- .../AdobeEncoreLineTabNewLine.cs | 5 +- .../SubtitleFormats/AdobeEncoreLineTabs.cs | 5 +- src/libse/SubtitleFormats/AdobeEncoreTabs.cs | 5 +- .../AdobeEncoreWithLineNumbers.cs | 5 +- src/libse/SubtitleFormats/AvidCaption.cs | 7 +- .../SubtitleFormats/AvidCaptionDropFrame.cs | 7 +- src/libse/SubtitleFormats/AvidDvd.cs | 5 +- .../SubtitleFormats/AvidLocationMarkers.cs | 5 +- src/libse/SubtitleFormats/CapMakerPlus.cs | 5 +- src/libse/SubtitleFormats/Cappella.cs | 5 +- src/libse/SubtitleFormats/CaptionAssistant.cs | 5 +- src/libse/SubtitleFormats/CaptionsInc.cs | 5 +- src/libse/SubtitleFormats/CsvDaVinci.cs | 7 +- src/libse/SubtitleFormats/CsvNuendo.cs | 5 +- src/libse/SubtitleFormats/DCinemaSmpte2010.cs | 7 +- src/libse/SubtitleFormats/DCinemaSmpte2014.cs | 7 +- src/libse/SubtitleFormats/ESubXf.cs | 7 +- .../SubtitleFormats/EZTSubtitlesProject.cs | 7 +- src/libse/SubtitleFormats/Edius4Frames.cs | 5 +- .../SubtitleFormats/EdiusMarkerList2Frames.cs | 5 +- .../SubtitleFormats/EdiusMarkerList3Frames.cs | 5 +- src/libse/SubtitleFormats/ElrPrint.cs | 5 +- src/libse/SubtitleFormats/InqScribe.cs | 5 +- src/libse/SubtitleFormats/IssXml.cs | 5 +- src/libse/SubtitleFormats/LambdaCap.cs | 5 +- src/libse/SubtitleFormats/MediaTransData.cs | 7 +- .../SubtitleFormats/MidwayInscriberCGX.cs | 5 +- src/libse/SubtitleFormats/MsOfficeWorkbook.cs | 7 +- .../SubtitleFormats/NciTimedRollUpCaptions.cs | 7 +- src/libse/SubtitleFormats/Oresme.cs | 5 +- .../SubtitleFormats/OresmeDocXDocument.cs | 5 +- src/libse/SubtitleFormats/PE2.cs | 5 +- src/libse/SubtitleFormats/QubeMasterImport.cs | 5 +- src/libse/SubtitleFormats/RhozetHarmonic.cs | 5 +- .../SubtitleFormats/RhozetHarmonicImage.cs | 5 +- src/libse/SubtitleFormats/SoftNiColonSub.cs | 7 +- src/libse/SubtitleFormats/SoftNiSub.cs | 7 +- src/libse/SubtitleFormats/Son.cs | 5 +- .../SubtitleFormats/SonicScenaristBitmaps.cs | 5 +- src/libse/SubtitleFormats/Titra.cs | 5 +- .../SubtitleFormats/UnknownSubtitle104.cs | 5 +- .../SubtitleFormats/UnknownSubtitle107.cs | 5 +- .../SubtitleFormats/UnknownSubtitle20.cs | 7 +- .../SubtitleFormats/UnknownSubtitle23.cs | 5 +- .../SubtitleFormats/UnknownSubtitle69.cs | 7 +- src/libse/SubtitleFormats/UnknownSubtitle7.cs | 5 +- .../SubtitleFormats/UnknownSubtitle71.cs | 5 +- .../SubtitleFormats/UnknownSubtitle77.cs | 5 +- .../SubtitleFormats/UnknownSubtitle78.cs | 9 +- .../SubtitleFormats/UnknownSubtitle79.cs | 5 +- .../SubtitleFormats/UnknownSubtitle80.cs | 5 +- .../SubtitleFormats/UnknownSubtitle81.cs | 5 +- .../SubtitleFormats/UnknownSubtitle83.cs | 5 +- .../SubtitleFormats/UnknownSubtitle84.cs | 5 +- .../SubtitleFormats/UnknownSubtitle95.cs | 5 +- src/libse/SubtitleFormats/Xif.cs | 9 +- .../ExportHandlerDCinemaSmpte2014Png.cs | 3 +- .../AudioVisualizerControl/AudioVisualizer.cs | 5 +- src/ui/Controls/TimeCodeUpDown.cs | 5 +- .../ExportEbuStl/ExportEbuStlViewModel.cs | 3 +- .../ExportPlainTextViewModel.cs | 3 +- .../DCinemaSmptePropertiesViewModel.cs | 3 +- .../Video/ShotChanges/ShotChangesViewModel.cs | 7 +- .../NetflixQualityCheck/NetflixCheckGlyph.cs | 5 +- .../NetflixCheckMaxLineLength.cs | 7 +- .../NetflixCheckMinDuration.cs | 5 +- .../NetflixCheckWhiteSpace.cs | 5 +- .../DoubleToDisplayShortConverter.cs | 3 +- .../TimeSpanToDisplayFullConverter.cs | 5 +- .../TimeSpanToDisplayShortConverter.cs | 5 +- 81 files changed, 404 insertions(+), 270 deletions(-) create mode 100644 src/libse/Common/TimeFormatters/FrameBasedTimeFormatter.cs create mode 100644 src/libse/Common/TimeFormatters/HhMmSsFfDropFrameTimeFormatter.cs create mode 100644 src/libse/Common/TimeFormatters/HhMmSsFfTimeFormatter.cs create mode 100644 src/libse/Common/TimeFormatters/HhMmSsPeriodFfTimeFormatter.cs create mode 100644 src/libse/Common/TimeFormatters/HhMmSsTimeFormatter.cs create mode 100644 src/libse/Common/TimeFormatters/ITimeFormatter.cs create mode 100644 src/libse/Common/TimeFormatters/ShortHhMmSsFfTimeFormatter.cs create mode 100644 src/libse/Common/TimeFormatters/SsFfTimeFormatter.cs create mode 100644 src/libse/Common/TimeFormatters/TimeFormatter.cs diff --git a/src/libse/Common/TimeCode.cs b/src/libse/Common/TimeCode.cs index ddfa84a825..5218d70f1b 100644 --- a/src/libse/Common/TimeCode.cs +++ b/src/libse/Common/TimeCode.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.SubtitleFormats; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.SubtitleFormats; using System; using System.Globalization; @@ -205,118 +206,11 @@ public string ToShortString(bool localize = false) return PrefixSign(s); } - public string ToShortStringHHMMSSFF() - { - var s = ToHHMMSSFF(); - var pre = string.Empty; - if (s.StartsWith('-')) - { - pre = "-"; - s = s.TrimStart('-'); - } - - var j = 0; - var len = s.Length; - while (j + 6 < len && s[j] == '0' && s[j + 1] == '0' && s[j + 2] == ':') - { - j += 3; - } - s = j > 0 ? s.Substring(j) : s; - return pre + s; - } - - public string ToHHMMSSFF() - { - string s; - var ts = TimeSpan; - var frames = Math.Round(ts.Milliseconds / (BaseUnit / Configuration.Settings.General.CurrentFrameRate)); - if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001) - { - var newTs = new TimeSpan(ts.Ticks); - newTs = newTs.Add(new TimeSpan(0, 0, 1)); - s = $"{newTs.Days * 24 + newTs.Hours:00}:{newTs.Minutes:00}:{newTs.Seconds:00}:{0:00}"; - } - else - { - s = $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}"; - } + public string ToString(ITimeFormatter formatter) => formatter.Format(this); - return PrefixSign(s); - } - - public string ToHHMMSS() - { - string s; - var ts = TimeSpan; - var frames = Math.Round(ts.Milliseconds / (BaseUnit / Configuration.Settings.General.CurrentFrameRate)); - if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001) - { - var newTs = new TimeSpan(ts.Ticks); - newTs = newTs.Add(new TimeSpan(0, 0, 1)); - s = $"{newTs.Days * 24 + newTs.Hours:00}:{newTs.Minutes:00}:{newTs.Seconds:00}"; - } - else - { - s = $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}"; - } - return PrefixSign(s); - } - - public string ToHHMMSSFFDropFrame() - { - string s; - var ts = TimeSpan; - var frames = Math.Round(ts.Milliseconds / (BaseUnit / Configuration.Settings.General.CurrentFrameRate)); - if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001) - { - var newTs = new TimeSpan(ts.Ticks); - newTs = newTs.Add(new TimeSpan(0, 0, 1)); - s = $"{newTs.Days * 24 + newTs.Hours:00}:{newTs.Minutes:00}:{newTs.Seconds:00};{0:00}"; - } - else - { - s = $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00};{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}"; - } - return PrefixSign(s); - } - - public string ToSSFF() - { - string s; - var ts = TimeSpan; - var frames = Math.Round(ts.Milliseconds / (BaseUnit / Configuration.Settings.General.CurrentFrameRate)); - if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001) - { - s = $"{ts.Seconds + 1:00}:{0:00}"; - } - else - { - s = $"{ts.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}"; - } - - return PrefixSign(s); - } - - public string ToHHMMSSPeriodFF() - { - string s; - var ts = TimeSpan; - var frames = Math.Round(ts.Milliseconds / (BaseUnit / Configuration.Settings.General.CurrentFrameRate)); - if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001) - { - var newTs = new TimeSpan(ts.Ticks); - newTs = newTs.Add(new TimeSpan(0, 0, 1)); - s = $"{newTs.Days * 24 + newTs.Hours:00}:{newTs.Minutes:00}:{newTs.Seconds:00}.{0:00}"; - } - else - { - s = $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}.{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}"; - } - - return PrefixSign(s); - } + internal static string PrefixSign(string time, double totalMilliseconds) => totalMilliseconds >= 0 ? time : $"-{time.RemoveChar('-')}"; - private string PrefixSign(string time) => TotalMilliseconds >= 0 ? time : $"-{time.RemoveChar('-')}"; + private string PrefixSign(string time) => PrefixSign(time, TotalMilliseconds); public string ToDisplayString() { @@ -327,7 +221,7 @@ public string ToDisplayString() if (Configuration.Settings?.General.UseTimeFormatHHMMSSFF == true) { - return ToHHMMSSFF(); + return ToString(TimeFormatter.HhMmSsFf); } return ToString(true); @@ -342,7 +236,7 @@ public string ToShortDisplayString() if (Configuration.Settings?.General.UseTimeFormatHHMMSSFF == true) { - return ToShortStringHHMMSSFF(); + return ToString(TimeFormatter.ShortHhMmSsFf); } return ToShortString(true); diff --git a/src/libse/Common/TimeFormatters/FrameBasedTimeFormatter.cs b/src/libse/Common/TimeFormatters/FrameBasedTimeFormatter.cs new file mode 100644 index 0000000000..c327805172 --- /dev/null +++ b/src/libse/Common/TimeFormatters/FrameBasedTimeFormatter.cs @@ -0,0 +1,31 @@ +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using System; + +namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters +{ + /// + /// Base for formatters that convert milliseconds to frames using the current frame rate, + /// carrying over to the next second when the frame count rounds up to the frame rate. + /// + public abstract class FrameBasedTimeFormatter : ITimeFormatter + { + public string Format(TimeCode timeCode) + { + var ts = timeCode.TimeSpan; + var frames = Math.Round(ts.Milliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate)); + string s; + if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001) + { + s = FormatTime(ts.Add(new TimeSpan(0, 0, 1)), 0); + } + else + { + s = FormatTime(ts, SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds)); + } + + return TimeCode.PrefixSign(s, timeCode.TotalMilliseconds); + } + + protected abstract string FormatTime(TimeSpan ts, int frames); + } +} diff --git a/src/libse/Common/TimeFormatters/HhMmSsFfDropFrameTimeFormatter.cs b/src/libse/Common/TimeFormatters/HhMmSsFfDropFrameTimeFormatter.cs new file mode 100644 index 0000000000..0e0d449b58 --- /dev/null +++ b/src/libse/Common/TimeFormatters/HhMmSsFfDropFrameTimeFormatter.cs @@ -0,0 +1,15 @@ +using System; + +namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters +{ + /// + /// Formats as "HH:MM:SS;FF" (drop frame, semicolon before frames). + /// + public class HhMmSsFfDropFrameTimeFormatter : FrameBasedTimeFormatter + { + protected override string FormatTime(TimeSpan ts, int frames) + { + return $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00};{frames:00}"; + } + } +} diff --git a/src/libse/Common/TimeFormatters/HhMmSsFfTimeFormatter.cs b/src/libse/Common/TimeFormatters/HhMmSsFfTimeFormatter.cs new file mode 100644 index 0000000000..0f3a35ea00 --- /dev/null +++ b/src/libse/Common/TimeFormatters/HhMmSsFfTimeFormatter.cs @@ -0,0 +1,15 @@ +using System; + +namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters +{ + /// + /// Formats as "HH:MM:SS:FF". + /// + public class HhMmSsFfTimeFormatter : FrameBasedTimeFormatter + { + protected override string FormatTime(TimeSpan ts, int frames) + { + return $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}:{frames:00}"; + } + } +} diff --git a/src/libse/Common/TimeFormatters/HhMmSsPeriodFfTimeFormatter.cs b/src/libse/Common/TimeFormatters/HhMmSsPeriodFfTimeFormatter.cs new file mode 100644 index 0000000000..5172c1bf27 --- /dev/null +++ b/src/libse/Common/TimeFormatters/HhMmSsPeriodFfTimeFormatter.cs @@ -0,0 +1,15 @@ +using System; + +namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters +{ + /// + /// Formats as "HH:MM:SS.FF" (period before frames). + /// + public class HhMmSsPeriodFfTimeFormatter : FrameBasedTimeFormatter + { + protected override string FormatTime(TimeSpan ts, int frames) + { + return $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}.{frames:00}"; + } + } +} diff --git a/src/libse/Common/TimeFormatters/HhMmSsTimeFormatter.cs b/src/libse/Common/TimeFormatters/HhMmSsTimeFormatter.cs new file mode 100644 index 0000000000..dbae2e35e4 --- /dev/null +++ b/src/libse/Common/TimeFormatters/HhMmSsTimeFormatter.cs @@ -0,0 +1,15 @@ +using System; + +namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters +{ + /// + /// Formats as "HH:MM:SS", rounding seconds up when the frame count carries over. + /// + public class HhMmSsTimeFormatter : FrameBasedTimeFormatter + { + protected override string FormatTime(TimeSpan ts, int frames) + { + return $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}"; + } + } +} diff --git a/src/libse/Common/TimeFormatters/ITimeFormatter.cs b/src/libse/Common/TimeFormatters/ITimeFormatter.cs new file mode 100644 index 0000000000..a9c0fde264 --- /dev/null +++ b/src/libse/Common/TimeFormatters/ITimeFormatter.cs @@ -0,0 +1,10 @@ +namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters +{ + /// + /// Formats a as a string. Pass to . + /// + public interface ITimeFormatter + { + string Format(TimeCode timeCode); + } +} diff --git a/src/libse/Common/TimeFormatters/ShortHhMmSsFfTimeFormatter.cs b/src/libse/Common/TimeFormatters/ShortHhMmSsFfTimeFormatter.cs new file mode 100644 index 0000000000..89e9082b19 --- /dev/null +++ b/src/libse/Common/TimeFormatters/ShortHhMmSsFfTimeFormatter.cs @@ -0,0 +1,30 @@ +namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters +{ + /// + /// Formats as "HH:MM:SS:FF" with leading zero groups ("00:") trimmed. + /// + public class ShortHhMmSsFfTimeFormatter : ITimeFormatter + { + private static readonly HhMmSsFfTimeFormatter LongFormatter = new HhMmSsFfTimeFormatter(); + + public string Format(TimeCode timeCode) + { + var s = LongFormatter.Format(timeCode); + var pre = string.Empty; + if (s.StartsWith('-')) + { + pre = "-"; + s = s.TrimStart('-'); + } + + var j = 0; + var len = s.Length; + while (j + 6 < len && s[j] == '0' && s[j + 1] == '0' && s[j + 2] == ':') + { + j += 3; + } + s = j > 0 ? s.Substring(j) : s; + return pre + s; + } + } +} diff --git a/src/libse/Common/TimeFormatters/SsFfTimeFormatter.cs b/src/libse/Common/TimeFormatters/SsFfTimeFormatter.cs new file mode 100644 index 0000000000..e9810f417e --- /dev/null +++ b/src/libse/Common/TimeFormatters/SsFfTimeFormatter.cs @@ -0,0 +1,23 @@ +using Nikse.SubtitleEdit.Core.SubtitleFormats; +using System; + +namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters +{ + /// + /// Formats as "SS:FF". On frame carry-over the seconds value is incremented + /// without rolling over into minutes (59 becomes 60). + /// + public class SsFfTimeFormatter : ITimeFormatter + { + public string Format(TimeCode timeCode) + { + var ts = timeCode.TimeSpan; + var frames = Math.Round(ts.Milliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate)); + var s = frames >= Configuration.Settings.General.CurrentFrameRate - 0.001 + ? $"{ts.Seconds + 1:00}:{0:00}" + : $"{ts.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}"; + + return TimeCode.PrefixSign(s, timeCode.TotalMilliseconds); + } + } +} diff --git a/src/libse/Common/TimeFormatters/TimeFormatter.cs b/src/libse/Common/TimeFormatters/TimeFormatter.cs new file mode 100644 index 0000000000..2edc0b7abb --- /dev/null +++ b/src/libse/Common/TimeFormatters/TimeFormatter.cs @@ -0,0 +1,15 @@ +namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters +{ + /// + /// Shared formatter instances for use with . + /// + public static class TimeFormatter + { + public static readonly ITimeFormatter HhMmSsFf = new HhMmSsFfTimeFormatter(); + public static readonly ITimeFormatter ShortHhMmSsFf = new ShortHhMmSsFfTimeFormatter(); + public static readonly ITimeFormatter HhMmSs = new HhMmSsTimeFormatter(); + public static readonly ITimeFormatter HhMmSsFfDropFrame = new HhMmSsFfDropFrameTimeFormatter(); + public static readonly ITimeFormatter SsFf = new SsFfTimeFormatter(); + public static readonly ITimeFormatter HhMmSsPeriodFf = new HhMmSsPeriodFfTimeFormatter(); + } +} diff --git a/src/libse/SubtitleFormats/AdobeEncore.cs b/src/libse/SubtitleFormats/AdobeEncore.cs index 2e15f4cf8a..7c4f09adef 100644 --- a/src/libse/SubtitleFormats/AdobeEncore.cs +++ b/src/libse/SubtitleFormats/AdobeEncore.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -68,7 +69,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { //00:03:15:22 (last is frame) - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/AdobeEncoreLineTabNewLine.cs b/src/libse/SubtitleFormats/AdobeEncoreLineTabNewLine.cs index 1a24a92c27..cfe8f725bc 100644 --- a/src/libse/SubtitleFormats/AdobeEncoreLineTabNewLine.cs +++ b/src/libse/SubtitleFormats/AdobeEncoreLineTabNewLine.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -63,7 +64,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { //00:03:15:22 (last is frame) - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/AdobeEncoreLineTabs.cs b/src/libse/SubtitleFormats/AdobeEncoreLineTabs.cs index 6b2912fd0a..c76e827a30 100644 --- a/src/libse/SubtitleFormats/AdobeEncoreLineTabs.cs +++ b/src/libse/SubtitleFormats/AdobeEncoreLineTabs.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -55,7 +56,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { //00:03:15:22 (last is frame) - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/AdobeEncoreTabs.cs b/src/libse/SubtitleFormats/AdobeEncoreTabs.cs index b25282be99..a9b7695cbc 100644 --- a/src/libse/SubtitleFormats/AdobeEncoreTabs.cs +++ b/src/libse/SubtitleFormats/AdobeEncoreTabs.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -28,7 +29,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { //00:03:15:22 (last is frame) - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/AdobeEncoreWithLineNumbers.cs b/src/libse/SubtitleFormats/AdobeEncoreWithLineNumbers.cs index 06c72a2976..8a4dcc3c7e 100644 --- a/src/libse/SubtitleFormats/AdobeEncoreWithLineNumbers.cs +++ b/src/libse/SubtitleFormats/AdobeEncoreWithLineNumbers.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -57,7 +58,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { //00:03:15:22 (last is frame) - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/AvidCaption.cs b/src/libse/SubtitleFormats/AvidCaption.cs index ecd4a36857..be9dee2d68 100644 --- a/src/libse/SubtitleFormats/AvidCaption.cs +++ b/src/libse/SubtitleFormats/AvidCaption.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -23,7 +24,7 @@ public override string ToText(Subtitle subtitle, string title) const string writeFormat = "{0} {1}{2}{3}{2}"; foreach (Paragraph p in subtitle.Paragraphs) { - sb.AppendLine(string.Format(writeFormat, p.StartTime.ToHHMMSSFF(), EncodeEndTimeCode(p.EndTime), Environment.NewLine, HtmlUtil.RemoveHtmlTags(p.Text, true))); + sb.AppendLine(string.Format(writeFormat, p.StartTime.ToString(TimeFormatter.HhMmSsFf), EncodeEndTimeCode(p.EndTime), Environment.NewLine, HtmlUtil.RemoveHtmlTags(p.Text, true))); //00:50:34:22 00:50:39:13 //Ich muss dafür sorgen, //dass die Epsteins weiterleben @@ -50,7 +51,7 @@ private static string EncodeEndTimeCode(TimeCode time) } else { - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } } diff --git a/src/libse/SubtitleFormats/AvidCaptionDropFrame.cs b/src/libse/SubtitleFormats/AvidCaptionDropFrame.cs index 549cdadc62..12221647c0 100644 --- a/src/libse/SubtitleFormats/AvidCaptionDropFrame.cs +++ b/src/libse/SubtitleFormats/AvidCaptionDropFrame.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -23,7 +24,7 @@ public override string ToText(Subtitle subtitle, string title) const string writeFormat = "{0} {1}{2}{3}{2}"; foreach (var p in subtitle.Paragraphs) { - sb.AppendLine(string.Format(writeFormat, p.StartTime.ToHHMMSSFFDropFrame(), EncodeEndTimeCode(p.EndTime), Environment.NewLine, HtmlUtil.RemoveHtmlTags(p.Text, true))); + sb.AppendLine(string.Format(writeFormat, p.StartTime.ToString(TimeFormatter.HhMmSsFfDropFrame), EncodeEndTimeCode(p.EndTime), Environment.NewLine, HtmlUtil.RemoveHtmlTags(p.Text, true))); //00:50:34:22 00:50:39:13 //Ich muss dafür sorgen, //dass die Epsteins weiterleben @@ -50,7 +51,7 @@ private static string EncodeEndTimeCode(TimeCode time) } else { - return time.ToHHMMSSFFDropFrame(); + return time.ToString(TimeFormatter.HhMmSsFfDropFrame); } } diff --git a/src/libse/SubtitleFormats/AvidDvd.cs b/src/libse/SubtitleFormats/AvidDvd.cs index 8b83a642c7..66b7843b64 100644 --- a/src/libse/SubtitleFormats/AvidDvd.cs +++ b/src/libse/SubtitleFormats/AvidDvd.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -41,7 +42,7 @@ public override bool IsMine(List lines, string fileName) private static string MakeTimeCode(TimeCode tc) { - return tc.ToHHMMSSFF(); + return tc.ToString(TimeFormatter.HhMmSsFf); } public override string ToText(Subtitle subtitle, string title) diff --git a/src/libse/SubtitleFormats/AvidLocationMarkers.cs b/src/libse/SubtitleFormats/AvidLocationMarkers.cs index 6e75eb3fa8..8d2f580193 100644 --- a/src/libse/SubtitleFormats/AvidLocationMarkers.cs +++ b/src/libse/SubtitleFormats/AvidLocationMarkers.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using Nikse.SubtitleEdit.Core.Forms.FixCommonErrors; using System.Collections.Generic; using System.Text; @@ -16,7 +17,7 @@ public class AvidLocationMarkers : SubtitleFormat private static string MakeTimeCode(TimeCode tc) { - return tc.ToHHMMSSFF(); + return tc.ToString(TimeFormatter.HhMmSsFf); } public override string ToText(Subtitle subtitle, string title) diff --git a/src/libse/SubtitleFormats/CapMakerPlus.cs b/src/libse/SubtitleFormats/CapMakerPlus.cs index 9ef8de035e..ce96fa5b2a 100644 --- a/src/libse/SubtitleFormats/CapMakerPlus.cs +++ b/src/libse/SubtitleFormats/CapMakerPlus.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.IO; @@ -29,7 +30,7 @@ public static void Save(string fileName, Subtitle subtitle) private static void WriteTime(Stream stream, TimeCode timeCode) { stream.WriteByte(0xb); - var buffer = Encoding.ASCII.GetBytes(timeCode.ToHHMMSSFF()); + var buffer = Encoding.ASCII.GetBytes(timeCode.ToString(TimeFormatter.HhMmSsFf)); stream.Write(buffer, 0, buffer.Length); } diff --git a/src/libse/SubtitleFormats/Cappella.cs b/src/libse/SubtitleFormats/Cappella.cs index 50d096d917..b72f461f74 100644 --- a/src/libse/SubtitleFormats/Cappella.cs +++ b/src/libse/SubtitleFormats/Cappella.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -72,7 +73,7 @@ public override string ToText(Subtitle subtitle, string title) private static string ToTimeCode(TimeCode tc) { - return tc.ToHHMMSSFF(); + return tc.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/CaptionAssistant.cs b/src/libse/SubtitleFormats/CaptionAssistant.cs index dace621991..4d143bebe3 100644 --- a/src/libse/SubtitleFormats/CaptionAssistant.cs +++ b/src/libse/SubtitleFormats/CaptionAssistant.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -14,7 +15,7 @@ public class CaptionAssistant : SubtitleFormat private static string ToTimeCode(TimeCode time) { - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } private static TimeCode DecodeTimeCode(string s) diff --git a/src/libse/SubtitleFormats/CaptionsInc.cs b/src/libse/SubtitleFormats/CaptionsInc.cs index b7d4d49de8..b1eb184f1b 100644 --- a/src/libse/SubtitleFormats/CaptionsInc.cs +++ b/src/libse/SubtitleFormats/CaptionsInc.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.IO; @@ -77,7 +78,7 @@ public static void Save(string fileName, Subtitle subtitle) private static void WriteTime(FileStream fs, TimeCode timeCode, bool addEndBytes) { - var time = timeCode.ToHHMMSSFF(); + var time = timeCode.ToString(TimeFormatter.HhMmSsFf); var buffer = Encoding.ASCII.GetBytes(time); fs.Write(buffer, 0, buffer.Length); if (addEndBytes) diff --git a/src/libse/SubtitleFormats/CsvDaVinci.cs b/src/libse/SubtitleFormats/CsvDaVinci.cs index cb5210e89a..b4261c96e0 100644 --- a/src/libse/SubtitleFormats/CsvDaVinci.cs +++ b/src/libse/SubtitleFormats/CsvDaVinci.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Globalization; @@ -27,8 +28,8 @@ public override string ToText(Subtitle subtitle, string title) string.Format( LineFormat, (index + 1).ToString(CultureInfo.InvariantCulture), - p.StartTime.ToHHMMSSFF(), - p.EndTime.ToHHMMSSFF(), + p.StartTime.ToString(TimeFormatter.HhMmSsFf), + p.EndTime.ToString(TimeFormatter.HhMmSsFf), actor, text, bool.TryParse(p.Effect, out var s) ? s.ToString().ToUpperInvariant() : "False")); diff --git a/src/libse/SubtitleFormats/CsvNuendo.cs b/src/libse/SubtitleFormats/CsvNuendo.cs index 637751bbe5..ad5babf089 100644 --- a/src/libse/SubtitleFormats/CsvNuendo.cs +++ b/src/libse/SubtitleFormats/CsvNuendo.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -80,7 +81,7 @@ public override string ToText(Subtitle subtitle, string title) { var text = string.IsNullOrEmpty(p.Text) ? string.Empty : "\"" + p.Text.Replace("\"", "\"\"").Replace(Environment.NewLine, "\n") + "\""; var actor = string.IsNullOrEmpty(p.Actor) ? string.Empty : "\"" + p.Actor.Replace(",", " ").Replace("\"", string.Empty) + "\""; - sb.AppendLine(string.Format(LineFormat, ",", actor, p.StartTime.ToHHMMSSFF(), p.EndTime.ToHHMMSSFF(), text)); + sb.AppendLine(string.Format(LineFormat, ",", actor, p.StartTime.ToString(TimeFormatter.HhMmSsFf), p.EndTime.ToString(TimeFormatter.HhMmSsFf), text)); } return sb.ToString().Trim(); } diff --git a/src/libse/SubtitleFormats/DCinemaSmpte2010.cs b/src/libse/SubtitleFormats/DCinemaSmpte2010.cs index c79564f7e6..ba91731008 100644 --- a/src/libse/SubtitleFormats/DCinemaSmpte2010.cs +++ b/src/libse/SubtitleFormats/DCinemaSmpte2010.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.IO; @@ -207,11 +208,11 @@ public override string ToText(Subtitle subtitle, string title) subNode.Attributes.Append(id); var fadeUpTime = xml.CreateAttribute("FadeUpTime"); - fadeUpTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeUpTime)).ToHHMMSSFF(); + fadeUpTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeUpTime)).ToString(TimeFormatter.HhMmSsFf); subNode.Attributes.Append(fadeUpTime); var fadeDownTime = xml.CreateAttribute("FadeDownTime"); - fadeDownTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeDownTime)).ToHHMMSSFF(); + fadeDownTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeDownTime)).ToString(TimeFormatter.HhMmSsFf); subNode.Attributes.Append(fadeDownTime); var start = xml.CreateAttribute("TimeIn"); diff --git a/src/libse/SubtitleFormats/DCinemaSmpte2014.cs b/src/libse/SubtitleFormats/DCinemaSmpte2014.cs index 19fa71a78d..6f73a08c4a 100644 --- a/src/libse/SubtitleFormats/DCinemaSmpte2014.cs +++ b/src/libse/SubtitleFormats/DCinemaSmpte2014.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.IO; @@ -214,11 +215,11 @@ public override string ToText(Subtitle subtitle, string title) subNode.Attributes.Append(id); XmlAttribute fadeUpTime = xml.CreateAttribute("FadeUpTime"); - fadeUpTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeUpTime)).ToHHMMSSFF(); + fadeUpTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeUpTime)).ToString(TimeFormatter.HhMmSsFf); subNode.Attributes.Append(fadeUpTime); XmlAttribute fadeDownTime = xml.CreateAttribute("FadeDownTime"); - fadeDownTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeDownTime)).ToHHMMSSFF(); + fadeDownTime.InnerText = new TimeCode(FramesToMilliseconds(Configuration.Settings.SubtitleSettings.DCinemaFadeDownTime)).ToString(TimeFormatter.HhMmSsFf); subNode.Attributes.Append(fadeDownTime); XmlAttribute start = xml.CreateAttribute("TimeIn"); diff --git a/src/libse/SubtitleFormats/ESubXf.cs b/src/libse/SubtitleFormats/ESubXf.cs index d143203e54..d6bfafaf98 100644 --- a/src/libse/SubtitleFormats/ESubXf.cs +++ b/src/libse/SubtitleFormats/ESubXf.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Globalization; @@ -64,11 +65,11 @@ public override string ToText(Subtitle subtitle, string title) var paragraph = xml.CreateElement("subtitle", NameSpaceUri); var start = xml.CreateAttribute("display"); - start.InnerText = p.StartTime.ToHHMMSSFF(); + start.InnerText = p.StartTime.ToString(TimeFormatter.HhMmSsFf); paragraph.Attributes.Append(start); var end = xml.CreateAttribute("clear"); - end.InnerText = p.EndTime.ToHHMMSSFF(); + end.InnerText = p.EndTime.ToString(TimeFormatter.HhMmSsFf); paragraph.Attributes.Append(end); var hRegion = xml.CreateElement("hregion", NameSpaceUri); diff --git a/src/libse/SubtitleFormats/EZTSubtitlesProject.cs b/src/libse/SubtitleFormats/EZTSubtitlesProject.cs index 4f359cbecc..5c01763011 100644 --- a/src/libse/SubtitleFormats/EZTSubtitlesProject.cs +++ b/src/libse/SubtitleFormats/EZTSubtitlesProject.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Globalization; @@ -84,11 +85,11 @@ private static XmlNode MakeSubNode(XmlDocument xml, Paragraph p, int index) subtitle.Attributes.Append(attrNumber); var attrInCue = xml.CreateAttribute("incue"); - attrInCue.Value = p.StartTime.ToHHMMSSFF(); + attrInCue.Value = p.StartTime.ToString(TimeFormatter.HhMmSsFf); subtitle.Attributes.Append(attrInCue); var attrOutCue = xml.CreateAttribute("outcue"); - attrOutCue.Value = p.EndTime.ToHHMMSSFF(); + attrOutCue.Value = p.EndTime.ToString(TimeFormatter.HhMmSsFf); subtitle.Attributes.Append(attrOutCue); XmlNode rows = xml.CreateElement("Rows"); diff --git a/src/libse/SubtitleFormats/Edius4Frames.cs b/src/libse/SubtitleFormats/Edius4Frames.cs index 4b1c3c2a1a..0c8d070c86 100644 --- a/src/libse/SubtitleFormats/Edius4Frames.cs +++ b/src/libse/SubtitleFormats/Edius4Frames.cs @@ -1,4 +1,5 @@ -using System; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using System; using Nikse.SubtitleEdit.Core.Common; using System.Collections.Generic; using System.Globalization; @@ -67,7 +68,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode timeCode) { - return timeCode.ToHHMMSSFF(); + return timeCode.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/EdiusMarkerList2Frames.cs b/src/libse/SubtitleFormats/EdiusMarkerList2Frames.cs index d14c537ea0..1e3b05ea10 100644 --- a/src/libse/SubtitleFormats/EdiusMarkerList2Frames.cs +++ b/src/libse/SubtitleFormats/EdiusMarkerList2Frames.cs @@ -1,4 +1,5 @@ -using System; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using System; using Nikse.SubtitleEdit.Core.Common; using System.Collections.Generic; using System.Globalization; @@ -40,7 +41,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode timeCode) { - return timeCode.ToHHMMSSFF(); + return timeCode.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/EdiusMarkerList3Frames.cs b/src/libse/SubtitleFormats/EdiusMarkerList3Frames.cs index 239f236149..90e2502040 100644 --- a/src/libse/SubtitleFormats/EdiusMarkerList3Frames.cs +++ b/src/libse/SubtitleFormats/EdiusMarkerList3Frames.cs @@ -1,4 +1,5 @@ -using System; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using System; using Nikse.SubtitleEdit.Core.Common; using System.Collections.Generic; using System.Globalization; @@ -40,7 +41,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode timeCode) { - return timeCode.ToHHMMSSFF(); + return timeCode.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/ElrPrint.cs b/src/libse/SubtitleFormats/ElrPrint.cs index 3d678ccc1d..162f6ffeda 100644 --- a/src/libse/SubtitleFormats/ElrPrint.cs +++ b/src/libse/SubtitleFormats/ElrPrint.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -38,7 +39,7 @@ public override string ToText(Subtitle subtitle, string title) for (var index = 0; index < subtitle.Paragraphs.Count; index++) { Paragraph p = subtitle.Paragraphs[index]; - sb.AppendLine(string.Format(writeFormat, index + 1, p.StartTime.ToHHMMSSFF(), p.EndTime.ToHHMMSSFF(), GetDuration(p), Environment.NewLine, p.Text)); + sb.AppendLine(string.Format(writeFormat, index + 1, p.StartTime.ToString(TimeFormatter.HhMmSsFf), p.EndTime.ToString(TimeFormatter.HhMmSsFf), GetDuration(p), Environment.NewLine, p.Text)); } return sb.ToString().Trim(); diff --git a/src/libse/SubtitleFormats/InqScribe.cs b/src/libse/SubtitleFormats/InqScribe.cs index d17871f8b8..21bf280f5f 100644 --- a/src/libse/SubtitleFormats/InqScribe.cs +++ b/src/libse/SubtitleFormats/InqScribe.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Globalization; @@ -73,7 +74,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode timeCode) { - return timeCode.ToHHMMSSPeriodFF(); + return timeCode.ToString(TimeFormatter.HhMmSsPeriodFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/IssXml.cs b/src/libse/SubtitleFormats/IssXml.cs index 69717ab9c8..84e1b5fe4b 100644 --- a/src/libse/SubtitleFormats/IssXml.cs +++ b/src/libse/SubtitleFormats/IssXml.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -82,7 +83,7 @@ public override string ToText(Subtitle subtitle, string title) XmlNodeList list = stItem.SelectNodes("StTextList/StText"); list[0].InnerText = p.Text; - list[2].InnerText = p.StartTime.ToHHMMSSFF(); + list[2].InnerText = p.StartTime.ToString(TimeFormatter.HhMmSsFf); trackNode.AppendChild(stItem); number++; diff --git a/src/libse/SubtitleFormats/LambdaCap.cs b/src/libse/SubtitleFormats/LambdaCap.cs index 368e567c66..d102b887fe 100644 --- a/src/libse/SubtitleFormats/LambdaCap.cs +++ b/src/libse/SubtitleFormats/LambdaCap.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -72,7 +73,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { - return time.ToHHMMSSFF().RemoveChar(':'); // HHMMSSFF without separators, like 00031522 + return time.ToString(TimeFormatter.HhMmSsFf).RemoveChar(':'); // HHMMSSFF without separators, like 00031522 } private static string EncodeStyle(string text) diff --git a/src/libse/SubtitleFormats/MediaTransData.cs b/src/libse/SubtitleFormats/MediaTransData.cs index 9ac16cc839..9344b462f3 100644 --- a/src/libse/SubtitleFormats/MediaTransData.cs +++ b/src/libse/SubtitleFormats/MediaTransData.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -159,8 +160,8 @@ public override string ToText(Subtitle subtitle, string title) string nodeName = "Data" + count++; XmlNode paragraph = xml.CreateElement(nodeName); paragraph.InnerXml = paragraphTemplate; - paragraph.SelectSingleNode("In").InnerText = p.StartTime.ToHHMMSSFF(); - paragraph.SelectSingleNode("Out").InnerText = p.EndTime.ToHHMMSSFF(); + paragraph.SelectSingleNode("In").InnerText = p.StartTime.ToString(TimeFormatter.HhMmSsFf); + paragraph.SelectSingleNode("Out").InnerText = p.EndTime.ToString(TimeFormatter.HhMmSsFf); paragraph.SelectSingleNode("Fields/Field1/Data").InnerText = string.Join("|", p.Text.SplitToLines()); paragraphInsertNode.AppendChild(paragraph); } diff --git a/src/libse/SubtitleFormats/MidwayInscriberCGX.cs b/src/libse/SubtitleFormats/MidwayInscriberCGX.cs index f5117f0444..3dfad43ab4 100644 --- a/src/libse/SubtitleFormats/MidwayInscriberCGX.cs +++ b/src/libse/SubtitleFormats/MidwayInscriberCGX.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -30,7 +31,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { //00:50:39:13 (last is frame) - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/MsOfficeWorkbook.cs b/src/libse/SubtitleFormats/MsOfficeWorkbook.cs index 82770cfced..92524a6fb9 100644 --- a/src/libse/SubtitleFormats/MsOfficeWorkbook.cs +++ b/src/libse/SubtitleFormats/MsOfficeWorkbook.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -119,8 +120,8 @@ private static XmlNode MakeParagraph(XmlDocument xml, Paragraph p) var height = xml.CreateAttribute("ss:Height", NamespaceSpreadsheet); height.InnerText = "30"; row.Attributes.Append(height); - MakeCell(xml, row, p.StartTime.ToHHMMSSFF()); - MakeCell(xml, row, p.EndTime.ToHHMMSSFF()); + MakeCell(xml, row, p.StartTime.ToString(TimeFormatter.HhMmSsFf)); + MakeCell(xml, row, p.EndTime.ToString(TimeFormatter.HhMmSsFf)); MakeCell(xml, row, HtmlUtil.RemoveHtmlTags(p.Text.Replace(Environment.NewLine, "\n"), true)); MakeCell(xml, row, string.Empty); MakeCell(xml, row, string.Empty); diff --git a/src/libse/SubtitleFormats/NciTimedRollUpCaptions.cs b/src/libse/SubtitleFormats/NciTimedRollUpCaptions.cs index f20a2b8d71..0ec0967448 100644 --- a/src/libse/SubtitleFormats/NciTimedRollUpCaptions.cs +++ b/src/libse/SubtitleFormats/NciTimedRollUpCaptions.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -49,12 +50,12 @@ public override string ToText(Subtitle subtitle, string title) text = text.Replace("'", "'\u0012\u0029"); text = "\u0014" + "\u0025" + "\u0014" + "\u002d" + text; } - sb.AppendLine(p.StartTime.ToHHMMSSFF() + "\r\n" + text); + sb.AppendLine(p.StartTime.ToString(TimeFormatter.HhMmSsFf) + "\r\n" + text); Paragraph next = subtitle.GetParagraphOrDefault(index + 1); if (next == null || next.StartTime.TotalMilliseconds > p.StartTime.TotalMilliseconds + MaxDurationMs) { - sb.AppendLine(p.EndTime.ToHHMMSSFF() + "\r\n\u0014\u002C"); + sb.AppendLine(p.EndTime.ToString(TimeFormatter.HhMmSsFf) + "\r\n\u0014\u002C"); } } return sb.ToString().Trim(); diff --git a/src/libse/SubtitleFormats/Oresme.cs b/src/libse/SubtitleFormats/Oresme.cs index 399a743c99..0fd6963392 100644 --- a/src/libse/SubtitleFormats/Oresme.cs +++ b/src/libse/SubtitleFormats/Oresme.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -35,7 +36,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/OresmeDocXDocument.cs b/src/libse/SubtitleFormats/OresmeDocXDocument.cs index cedae60656..d3b5e02904 100644 --- a/src/libse/SubtitleFormats/OresmeDocXDocument.cs +++ b/src/libse/SubtitleFormats/OresmeDocXDocument.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -204,7 +205,7 @@ private static XmlNode CreateXmlParagraph(XmlDocument xml, Paragraph p) private static string ToTimeCode(TimeCode timeCode) { - return timeCode.ToHHMMSSFF(); //10:00:07:27 + return timeCode.ToString(TimeFormatter.HhMmSsFf); //10:00:07:27 } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/PE2.cs b/src/libse/SubtitleFormats/PE2.cs index 76feee326d..46ebd4dfdf 100644 --- a/src/libse/SubtitleFormats/PE2.cs +++ b/src/libse/SubtitleFormats/PE2.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -150,7 +151,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string private static string EncodeTimeCode(TimeCode time) { - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } } diff --git a/src/libse/SubtitleFormats/QubeMasterImport.cs b/src/libse/SubtitleFormats/QubeMasterImport.cs index fbb075fa65..dca6255d73 100644 --- a/src/libse/SubtitleFormats/QubeMasterImport.cs +++ b/src/libse/SubtitleFormats/QubeMasterImport.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -43,7 +44,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/RhozetHarmonic.cs b/src/libse/SubtitleFormats/RhozetHarmonic.cs index f5d79b8178..3f84472374 100644 --- a/src/libse/SubtitleFormats/RhozetHarmonic.cs +++ b/src/libse/SubtitleFormats/RhozetHarmonic.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -14,7 +15,7 @@ public class RhozetHarmonic : SubtitleFormat private static string ToTimeCode(TimeCode time) { - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override string ToText(Subtitle subtitle, string title) diff --git a/src/libse/SubtitleFormats/RhozetHarmonicImage.cs b/src/libse/SubtitleFormats/RhozetHarmonicImage.cs index 83cb1c0208..6d00b6e072 100644 --- a/src/libse/SubtitleFormats/RhozetHarmonicImage.cs +++ b/src/libse/SubtitleFormats/RhozetHarmonicImage.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -14,7 +15,7 @@ public class RhozetHarmonicImage : SubtitleFormat private static string ToTimeCode(TimeCode time) { - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override string ToText(Subtitle subtitle, string title) diff --git a/src/libse/SubtitleFormats/SoftNiColonSub.cs b/src/libse/SubtitleFormats/SoftNiColonSub.cs index 44c7f9fcf5..08a792d103 100644 --- a/src/libse/SubtitleFormats/SoftNiColonSub.cs +++ b/src/libse/SubtitleFormats/SoftNiColonSub.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Linq; @@ -92,7 +93,7 @@ public override string ToText(Subtitle subtitle, string title) text = "}" + text; } - sb.AppendLine($"{text}{Environment.NewLine}{p.StartTime.ToHHMMSSPeriodFF().Replace(".", ":")}\\{p.EndTime.ToHHMMSSPeriodFF().Replace(".", ":")}"); + sb.AppendLine($"{text}{Environment.NewLine}{p.StartTime.ToString(TimeFormatter.HhMmSsPeriodFf).Replace(".", ":")}\\{p.EndTime.ToString(TimeFormatter.HhMmSsPeriodFf).Replace(".", ":")}"); } var last = subtitle.Paragraphs.Last(); @@ -105,7 +106,7 @@ public override string ToText(Subtitle subtitle, string title) { var endTime = new TimeCode(last.EndTime.TotalMilliseconds + 1000.0) { Milliseconds = 0 }; sb.AppendLine("*END*"); - sb.AppendLine($"{endTime.ToHHMMSSPeriodFF()}\\{endTime.ToHHMMSSPeriodFF()}"); + sb.AppendLine($"{endTime.ToString(TimeFormatter.HhMmSsPeriodFf)}\\{endTime.ToString(TimeFormatter.HhMmSsPeriodFf)}"); } sb.AppendLine(@"*CODE*"); diff --git a/src/libse/SubtitleFormats/SoftNiSub.cs b/src/libse/SubtitleFormats/SoftNiSub.cs index 26d0cd556a..ce94ad38b9 100644 --- a/src/libse/SubtitleFormats/SoftNiSub.cs +++ b/src/libse/SubtitleFormats/SoftNiSub.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Linq; @@ -93,7 +94,7 @@ public override string ToText(Subtitle subtitle, string title) text = "}" + text; } - sb.AppendLine(string.Format(writeFormat, text, Environment.NewLine, p.StartTime.ToHHMMSSPeriodFF(), p.EndTime.ToHHMMSSPeriodFF())); + sb.AppendLine(string.Format(writeFormat, text, Environment.NewLine, p.StartTime.ToString(TimeFormatter.HhMmSsPeriodFf), p.EndTime.ToString(TimeFormatter.HhMmSsPeriodFf))); } var last = subtitle.Paragraphs.Last(); @@ -106,7 +107,7 @@ public override string ToText(Subtitle subtitle, string title) { var endTime = new TimeCode(last.EndTime.TotalMilliseconds + 1000.0) { Milliseconds = 0 }; sb.AppendLine("*END*"); - sb.AppendLine($"{endTime.ToHHMMSSPeriodFF()}\\{endTime.ToHHMMSSPeriodFF()}"); + sb.AppendLine($"{endTime.ToString(TimeFormatter.HhMmSsPeriodFf)}\\{endTime.ToString(TimeFormatter.HhMmSsPeriodFf)}"); } sb.AppendLine(@"*CODE*"); diff --git a/src/libse/SubtitleFormats/Son.cs b/src/libse/SubtitleFormats/Son.cs index b5c191f9e3..a84aa769ac 100644 --- a/src/libse/SubtitleFormats/Son.cs +++ b/src/libse/SubtitleFormats/Son.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -28,7 +29,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { //00:03:15:22 (last is frame) - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/SonicScenaristBitmaps.cs b/src/libse/SubtitleFormats/SonicScenaristBitmaps.cs index 0f4eccf54a..42804f6d12 100644 --- a/src/libse/SubtitleFormats/SonicScenaristBitmaps.cs +++ b/src/libse/SubtitleFormats/SonicScenaristBitmaps.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -42,7 +43,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { //00:03:15:22 (last is frame) - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/Titra.cs b/src/libse/SubtitleFormats/Titra.cs index 3b057985da..687a0faae1 100644 --- a/src/libse/SubtitleFormats/Titra.cs +++ b/src/libse/SubtitleFormats/Titra.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -56,7 +57,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { //00:03:15:22 (last is frame) - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/UnknownSubtitle104.cs b/src/libse/SubtitleFormats/UnknownSubtitle104.cs index dd432bc02b..4e4dc32d46 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle104.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle104.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -25,7 +26,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTime(TimeCode timeCode) { - return "[" + timeCode.ToHHMMSS() + "]"; + return "[" + timeCode.ToString(TimeFormatter.HhMmSs) + "]"; } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/UnknownSubtitle107.cs b/src/libse/SubtitleFormats/UnknownSubtitle107.cs index 812c970224..e46743a109 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle107.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle107.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -31,7 +32,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { - return time.ToHHMMSSFF().Replace(":", ";"); + return time.ToString(TimeFormatter.HhMmSsFf).Replace(":", ";"); } private static string EncodeEndTimeCode(TimeCode time) diff --git a/src/libse/SubtitleFormats/UnknownSubtitle20.cs b/src/libse/SubtitleFormats/UnknownSubtitle20.cs index c3ae228b4d..c1778d7066 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle20.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle20.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -43,7 +44,7 @@ public override string ToText(Subtitle subtitle, string title) // line 1 sb.Append(string.Empty.PadLeft(5, ' ')); - sb.Append(p.StartTime.ToHHMMSSFF()); + sb.Append(p.StartTime.ToString(TimeFormatter.HhMmSsFf)); sb.Append(string.Empty.PadLeft(5, ' ')); sb.Append(number.ToString("D4")); sb.Append(string.Empty.PadLeft(12, ' ')); @@ -51,7 +52,7 @@ public override string ToText(Subtitle subtitle, string title) //line 2 sb.Append(string.Empty.PadLeft(5, ' ')); - sb.Append(p.EndTime.ToHHMMSSFF()); + sb.Append(p.EndTime.ToString(TimeFormatter.HhMmSsFf)); sb.Append(string.Empty.PadLeft(5, ' ')); sb.Append((number2 / 7 + 1).ToString("D3")); sb.Append('-'); diff --git a/src/libse/SubtitleFormats/UnknownSubtitle23.cs b/src/libse/SubtitleFormats/UnknownSubtitle23.cs index 2c154b1df3..9e6e4784b8 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle23.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle23.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Globalization; @@ -48,7 +49,7 @@ public override string ToText(Subtitle subtitle, string title) private static string MakeTimeCode(TimeCode timeCode) { - return timeCode.ToHHMMSSPeriodFF(); + return timeCode.ToString(TimeFormatter.HhMmSsPeriodFf); } private static TimeCode DecodeTimeCode(string timeCode) diff --git a/src/libse/SubtitleFormats/UnknownSubtitle69.cs b/src/libse/SubtitleFormats/UnknownSubtitle69.cs index 8b753fb6c3..16d21f2be2 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle69.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle69.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -28,8 +29,8 @@ public override string ToText(Subtitle subtitle, string title) foreach (Paragraph p in subtitle.Paragraphs) { string text = HtmlUtil.RemoveHtmlTags(p.Text, true); - string start = p.StartTime.ToHHMMSSFF(); - string end = p.EndTime.ToHHMMSSFF(); + string start = p.StartTime.ToString(TimeFormatter.HhMmSsFf); + string end = p.EndTime.ToString(TimeFormatter.HhMmSsFf); string duration = $"{p.Duration.Seconds:00}:{MillisecondsToFramesMaxFrameRate(p.Duration.Milliseconds):00}"; const string readability = "011"; const string interval = "06:14"; diff --git a/src/libse/SubtitleFormats/UnknownSubtitle7.cs b/src/libse/SubtitleFormats/UnknownSubtitle7.cs index 45cc08bf30..eee1149b70 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle7.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle7.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -121,7 +122,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string private static string EncodeTimeCode(TimeCode time) { - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle71.cs b/src/libse/SubtitleFormats/UnknownSubtitle71.cs index 4acdc6d222..0788d1e223 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle71.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle71.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -206,7 +207,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string private static string EncodeTimeCode(TimeCode time) { - var s = time.ToHHMMSSFF(); + var s = time.ToString(TimeFormatter.HhMmSsFf); return AddSpaces(s); } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle77.cs b/src/libse/SubtitleFormats/UnknownSubtitle77.cs index 6fae0dab3b..0aa1ae9847 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle77.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle77.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -23,7 +24,7 @@ public override string ToText(Subtitle subtitle, string title) //00:50:34:22 -> 00:50:39:13 //Ich muss dafür sorgen, //dass die Epsteins weiterleben - sb.AppendLine(string.Format(writeFormat, p.StartTime.ToHHMMSSFF(), p.EndTime.ToHHMMSSFF(), Environment.NewLine, HtmlUtil.RemoveHtmlTags(p.Text, true))); + sb.AppendLine(string.Format(writeFormat, p.StartTime.ToString(TimeFormatter.HhMmSsFf), p.EndTime.ToString(TimeFormatter.HhMmSsFf), Environment.NewLine, HtmlUtil.RemoveHtmlTags(p.Text, true))); } return sb.ToString(); } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle78.cs b/src/libse/SubtitleFormats/UnknownSubtitle78.cs index bfe62af041..c3d1219900 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle78.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle78.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -137,15 +138,15 @@ public override string ToText(Subtitle subtitle, string title) lastTimeCode = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].StartTime; } string today = DateTime.Now.ToString("YYYY-mm-DD"); - xml.LoadXml(xmpTemplate.Replace('\'', '"').Replace("[YYYY-MM-DD]", today).Replace("[TIME_CODE_FIRST]", firstTimeCode.ToHHMMSSFF()).Replace("[TIME_CODE_LAST]", lastTimeCode.ToHHMMSSFF())); + xml.LoadXml(xmpTemplate.Replace('\'', '"').Replace("[YYYY-MM-DD]", today).Replace("[TIME_CODE_FIRST]", firstTimeCode.ToString(TimeFormatter.HhMmSsFf)).Replace("[TIME_CODE_LAST]", lastTimeCode.ToString(TimeFormatter.HhMmSsFf))); var paragraphInsertNode = xml.DocumentElement.SelectSingleNode("TextSection"); foreach (Paragraph p in subtitle.Paragraphs) { XmlNode paragraph = xml.CreateElement("TextScreen"); paragraph.InnerXml = paragraphTemplate; - paragraph.SelectSingleNode("TimeCodeIn").InnerText = p.StartTime.ToHHMMSSFF(); - paragraph.SelectSingleNode("TimeCodeOut").InnerText = p.EndTime.ToHHMMSSFF(); + paragraph.SelectSingleNode("TimeCodeIn").InnerText = p.StartTime.ToString(TimeFormatter.HhMmSsFf); + paragraph.SelectSingleNode("TimeCodeOut").InnerText = p.EndTime.ToString(TimeFormatter.HhMmSsFf); var textBlockNodes = paragraph.SelectNodes("TextBlock"); textBlockNodes[0].SelectSingleNode("String").InnerText = p.Text; paragraphInsertNode.AppendChild(paragraph); diff --git a/src/libse/SubtitleFormats/UnknownSubtitle79.cs b/src/libse/SubtitleFormats/UnknownSubtitle79.cs index b98be20783..4d58da826b 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle79.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle79.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -140,7 +141,7 @@ private static void AddParagraph(Subtitle subtitle, Paragraph paragraph, string private static string EncodeTimeCode(TimeCode time) { - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } } } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle80.cs b/src/libse/SubtitleFormats/UnknownSubtitle80.cs index 0d71f1e42b..ce9acef5d1 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle80.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle80.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -72,7 +73,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string private static string EncodeTimeCode(TimeCode time) { - return "[" + time.ToHHMMSSFF().Remove(8, 1).Insert(8, ".") + "]"; + return "[" + time.ToString(TimeFormatter.HhMmSsFf).Remove(8, 1).Insert(8, ".") + "]"; } } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle81.cs b/src/libse/SubtitleFormats/UnknownSubtitle81.cs index 534ea10c95..c5d04cdf4d 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle81.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle81.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -42,7 +43,7 @@ SDI Media Group int count = 1; foreach (Paragraph p in subtitle.Paragraphs) { - sb.AppendLine($" {count}: {p.StartTime.ToHHMMSSPeriodFF()} {p.EndTime.ToHHMMSSPeriodFF()} {p.Duration.Seconds:00}.{MillisecondsToFrames(p.Duration.Milliseconds):00} {p.Text.Length}"); + sb.AppendLine($" {count}: {p.StartTime.ToString(TimeFormatter.HhMmSsPeriodFf)} {p.EndTime.ToString(TimeFormatter.HhMmSsPeriodFf)} {p.Duration.Seconds:00}.{MillisecondsToFrames(p.Duration.Milliseconds):00} {p.Text.Length}"); foreach (var line in EncodeText(p.Text).SplitToLines()) { sb.AppendLine(" " + line); diff --git a/src/libse/SubtitleFormats/UnknownSubtitle83.cs b/src/libse/SubtitleFormats/UnknownSubtitle83.cs index 333f7d7ec2..da3e115bcd 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle83.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle83.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -33,7 +34,7 @@ public override string ToText(Subtitle subtitle, string title) { var p = subtitle.Paragraphs[index++]; var lis = (int)Math.Round(MillisecondsToFrames(p.DurationTotalMilliseconds) / 2.0); - sb.AppendLine(string.Format(format, index, p.StartTime.ToHHMMSSFF(), p.EndTime.ToHHMMSSFF(), p.Duration.ToSSFF(), lis, p.Text.Length, p.Text)); + sb.AppendLine(string.Format(format, index, p.StartTime.ToString(TimeFormatter.HhMmSsFf), p.EndTime.ToString(TimeFormatter.HhMmSsFf), p.Duration.ToString(TimeFormatter.SsFf), lis, p.Text.Length, p.Text)); } return sb.ToString().ToRtf(); } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle84.cs b/src/libse/SubtitleFormats/UnknownSubtitle84.cs index 30c84d8a75..26f03f1c99 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle84.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle84.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -32,7 +33,7 @@ public override string ToText(Subtitle subtitle, string title) private static string EncodeTimeCode(TimeCode time) { //00:50:39:13 (last is frame) - return time.ToHHMMSSFF(); + return time.ToString(TimeFormatter.HhMmSsFf); } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/UnknownSubtitle95.cs b/src/libse/SubtitleFormats/UnknownSubtitle95.cs index 2b024ef430..dd17719b86 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle95.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle95.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Text; @@ -27,7 +28,7 @@ public override string ToText(Subtitle subtitle, string title) for (var index = 0; index < subtitle.Paragraphs.Count; index++) { var p = subtitle.Paragraphs[index]; - sb.AppendLine(string.Format(writeFormat, index + 1, p.StartTime.ToHHMMSSPeriodFF(), p.EndTime.ToHHMMSSPeriodFF(), p.Duration.ToHHMMSSPeriodFF(), Environment.NewLine, p.Text)); + sb.AppendLine(string.Format(writeFormat, index + 1, p.StartTime.ToString(TimeFormatter.HhMmSsPeriodFf), p.EndTime.ToString(TimeFormatter.HhMmSsPeriodFf), p.Duration.ToString(TimeFormatter.HhMmSsPeriodFf), Environment.NewLine, p.Text)); } return sb.ToString().Trim(); diff --git a/src/libse/SubtitleFormats/Xif.cs b/src/libse/SubtitleFormats/Xif.cs index 847b1d4577..06a66107c5 100644 --- a/src/libse/SubtitleFormats/Xif.cs +++ b/src/libse/SubtitleFormats/Xif.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using System; using System.Collections.Generic; using System.Globalization; @@ -102,7 +103,7 @@ public override string ToText(Subtitle subtitle, string title) var globalFileInfoNode = xml.DocumentElement.SelectSingleNode("FileHeader/GlobalFileInfo"); globalFileInfoNode.Attributes["ProgrammeName"].InnerText = title; globalFileInfoNode.Attributes["ProgrammeTitle"].InnerText = title; - globalFileInfoNode.Attributes["StopTime"].InnerText = lastTimeCode.ToHHMMSSFF(); + globalFileInfoNode.Attributes["StopTime"].InnerText = lastTimeCode.ToString(TimeFormatter.HhMmSsFf); globalFileInfoNode.Attributes["NumberOfCaptions"].InnerText = subtitle.Paragraphs.Count.ToString(CultureInfo.InvariantCulture); var fileBodyNode = xml.DocumentElement.SelectSingleNode("FileBody"); @@ -110,8 +111,8 @@ public override string ToText(Subtitle subtitle, string title) { XmlNode content = xml.CreateElement("ContentBlock"); content.InnerXml = paragraphTemplate; - content.SelectSingleNode("ContentBlock/ThreadedObject/TimingObject/TimeIn").Attributes["value"].InnerText = p.StartTime.ToHHMMSSFF(); - content.SelectSingleNode("ContentBlock/ThreadedObject/TimingObject/TimeOut").Attributes["value"].InnerText = p.EndTime.ToHHMMSSFF(); + content.SelectSingleNode("ContentBlock/ThreadedObject/TimingObject/TimeIn").Attributes["value"].InnerText = p.StartTime.ToString(TimeFormatter.HhMmSsFf); + content.SelectSingleNode("ContentBlock/ThreadedObject/TimingObject/TimeOut").Attributes["value"].InnerText = p.EndTime.ToString(TimeFormatter.HhMmSsFf); var paragraphNode = content.SelectSingleNode("ContentBlock/ThreadedObject/Content/SubtitleText/Paragraph"); var lines = HtmlUtil.RemoveHtmlTags(p.Text, true).SplitToLines(); diff --git a/src/libuilogic/Export/ExportHandlerDCinemaSmpte2014Png.cs b/src/libuilogic/Export/ExportHandlerDCinemaSmpte2014Png.cs index 80432d6ac5..2f0e851c7e 100644 --- a/src/libuilogic/Export/ExportHandlerDCinemaSmpte2014Png.cs +++ b/src/libuilogic/Export/ExportHandlerDCinemaSmpte2014Png.cs @@ -1,3 +1,4 @@ +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; using Nikse.SubtitleEdit.Core.Common; using System.Globalization; using System.Text; @@ -96,7 +97,7 @@ public void WriteParagraph(ImageParameter param) } _sb.AppendLine(""); + new TimeCode(param.StartTime).ToString(TimeFormatter.HhMmSsFf) + "\" TimeOut=\"" + new TimeCode( param.EndTime).ToString(TimeFormatter.HhMmSsFf) + "\">"); // if (param.Depth3D == 0) { _sb.AppendLine("urn:uuid:" + diff --git a/src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs b/src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs index ea20fe999e..7bf4682a04 100644 --- a/src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs +++ b/src/ui/Controls/AudioVisualizerControl/AudioVisualizer.cs @@ -1,4 +1,5 @@ -using Avalonia; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Avalonia; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Media; @@ -1800,7 +1801,7 @@ private static string GetFrameDisplayTime(double seconds) seconds = seconds + Se.Settings.General.CurrentVideoOffsetInMs / 1000.0; } - return new TimeCode(seconds * 1000.0).ToShortStringHHMMSSFF(); + return new TimeCode(seconds * 1000.0).ToString(TimeFormatter.ShortHhMmSsFf); } private readonly Pen _paintTimeLine = new Pen(Brushes.Gray, 1); diff --git a/src/ui/Controls/TimeCodeUpDown.cs b/src/ui/Controls/TimeCodeUpDown.cs index 9a7b5ea962..08483641aa 100644 --- a/src/ui/Controls/TimeCodeUpDown.cs +++ b/src/ui/Controls/TimeCodeUpDown.cs @@ -1,4 +1,5 @@ -using Avalonia; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; @@ -459,7 +460,7 @@ private string FormatTime(TimeSpan time) if (Se.Settings.General.UseFrameMode) { - return tc.ToHHMMSSFF(); + return tc.ToString(TimeFormatter.HhMmSsFf); } return tc.ToString(); diff --git a/src/ui/Features/Files/ExportEbuStl/ExportEbuStlViewModel.cs b/src/ui/Features/Files/ExportEbuStl/ExportEbuStlViewModel.cs index 91711709a5..94dfd3e124 100644 --- a/src/ui/Features/Files/ExportEbuStl/ExportEbuStlViewModel.cs +++ b/src/ui/Features/Files/ExportEbuStl/ExportEbuStlViewModel.cs @@ -1,3 +1,4 @@ +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Threading; @@ -347,7 +348,7 @@ private void Ok() var timeCodeStatus = SelectedTimeCodeStatus ?? TimeCodeStatusList.Last(); _header.TimeCodeStatus = TimeCodeStatusList.IndexOf(timeCodeStatus).ToString(CultureInfo.InvariantCulture); - _header.TimeCodeStartOfProgramme = new TimeCode(StartOfProgramme).ToHHMMSSFF().RemoveChar(':'); + _header.TimeCodeStartOfProgramme = new TimeCode(StartOfProgramme).ToString(TimeFormatter.HhMmSsFf).RemoveChar(':'); _header.RevisionNumber = SelectedRevisionNumber?.ToString("00") ?? "00"; _header.MaximumNumberOfDisplayableCharactersInAnyTextRow = SelectedMaxCharactersPerRow?.ToString("00") ?? "00"; diff --git a/src/ui/Features/Files/ExportPlainText/ExportPlainTextViewModel.cs b/src/ui/Features/Files/ExportPlainText/ExportPlainTextViewModel.cs index 2612df9262..e4acb453ac 100644 --- a/src/ui/Features/Files/ExportPlainText/ExportPlainTextViewModel.cs +++ b/src/ui/Features/Files/ExportPlainText/ExportPlainTextViewModel.cs @@ -1,3 +1,4 @@ +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -253,7 +254,7 @@ private string FormatTimeCode(double totalMilliseconds) { "hh:mm:ss,zzz" => tc.ToString(false), "hh:mm:ss.zzz" => tc.ToString().Replace(',', '.'), - "hh:mm:ss:ff" => tc.ToHHMMSSFF(), + "hh:mm:ss:ff" => tc.ToString(TimeFormatter.HhMmSsFf), _ => tc.ToString() }; } diff --git a/src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs b/src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs index 0793a52036..da07812600 100644 --- a/src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs +++ b/src/ui/Features/Files/FormatProperties/DcinemaSmpteProperties/DCinemaSmptePropertiesViewModel.cs @@ -1,3 +1,4 @@ +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Media; @@ -342,7 +343,7 @@ private async Task Import() if (double.TryParse(importer.StartTime, out var startTimeMs)) { var timeCode = new TimeCode(startTimeMs); - StartTime = timeCode.ToHHMMSSFF(); + StartTime = timeCode.ToString(TimeFormatter.HhMmSsFf); } FontId = importer.FontId ?? "theFontId"; diff --git a/src/ui/Features/Video/ShotChanges/ShotChangesViewModel.cs b/src/ui/Features/Video/ShotChanges/ShotChangesViewModel.cs index a18e5ae0f8..765682a1f2 100644 --- a/src/ui/Features/Video/ShotChanges/ShotChangesViewModel.cs +++ b/src/ui/Features/Video/ShotChanges/ShotChangesViewModel.cs @@ -1,4 +1,5 @@ -using Avalonia.Controls; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Avalonia.Controls; using Avalonia.Input; using Avalonia.Platform.Storage; using Avalonia.Threading; @@ -390,7 +391,7 @@ private async Task LoadTextFile(string fileName) } var ts = new TimeSpan(0, Convert.ToInt32(timeParts[0]), Convert.ToInt32(timeParts[1]), Convert.ToInt32(timeParts[2]), Convert.ToInt32(timeParts[3])); - sb.AppendLine(new TimeCode(ts).ToShortStringHHMMSSFF()); + sb.AppendLine(new TimeCode(ts).ToString(TimeFormatter.ShortHhMmSsFf)); } } } @@ -451,7 +452,7 @@ private async Task LoadTextFile(string fileName) var sb = new StringBuilder(); foreach (var ms in list.OrderBy(p => p)) { - sb.AppendLine(new TimeCode(ms).ToShortStringHHMMSSFF()); + sb.AppendLine(new TimeCode(ms).ToString(TimeFormatter.ShortHhMmSsFf)); } return sb.ToString(); diff --git a/src/ui/Logic/NetflixQualityCheck/NetflixCheckGlyph.cs b/src/ui/Logic/NetflixQualityCheck/NetflixCheckGlyph.cs index 884d8a0dc1..de6d0b352f 100644 --- a/src/ui/Logic/NetflixQualityCheck/NetflixCheckGlyph.cs +++ b/src/ui/Logic/NetflixQualityCheck/NetflixCheckGlyph.cs @@ -1,4 +1,5 @@ -using Avalonia.Platform; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Avalonia.Platform; using Nikse.SubtitleEdit.Core.Common; using Nikse.SubtitleEdit.Logic.Compression; using Nikse.SubtitleEdit.Logic.Config; @@ -75,7 +76,7 @@ public void Check(Subtitle subtitle, NetflixQualityController controller) if (!allowedGlyphsSet.Contains(curCodepoint)) { - var timeCode = paragraph.StartTime.ToHHMMSSFF(); + var timeCode = paragraph.StartTime.ToString(TimeFormatter.HhMmSsFf); var context = NetflixQualityController.StringContext(paragraph.Text, pos, 6); var comment = string.Format(Se.Language.Tools.NetflixCheckAndFix.GlyphCheckReport, $"U+{curCodepoint:X}", actualPos); diff --git a/src/ui/Logic/NetflixQualityCheck/NetflixCheckMaxLineLength.cs b/src/ui/Logic/NetflixQualityCheck/NetflixCheckMaxLineLength.cs index 612acf55e1..1fe59c502a 100644 --- a/src/ui/Logic/NetflixQualityCheck/NetflixCheckMaxLineLength.cs +++ b/src/ui/Logic/NetflixQualityCheck/NetflixCheckMaxLineLength.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using Nikse.SubtitleEdit.Core.Common.TextLengthCalculator; using Nikse.SubtitleEdit.Core.SubtitleFormats; using Nikse.SubtitleEdit.Logic.Config; @@ -35,7 +36,7 @@ public void Check(Subtitle subtitle, NetflixQualityController controller) if (CalculateJapaneseLength(text) > 11) { var comment = Se.Language.Tools.NetflixCheckAndFix.SingleVerticalLineLengthMax11; - controller.AddRecord(p, p.StartTime.ToHHMMSSFF(), line.Length.ToString(CultureInfo.InvariantCulture), comment, false); + controller.AddRecord(p, p.StartTime.ToString(TimeFormatter.HhMmSsFf), line.Length.ToString(CultureInfo.InvariantCulture), comment, false); } } else // Horizontal subtitles - Maximum 13 full-width characters per line @@ -43,7 +44,7 @@ public void Check(Subtitle subtitle, NetflixQualityController controller) if (CalculateJapaneseLength(text) > 13) { var comment = Se.Language.Tools.NetflixCheckAndFix.SingleHorizontalLineLengthMax13; - controller.AddRecord(p, p.StartTime.ToHHMMSSFF(), line.Length.ToString(CultureInfo.InvariantCulture), comment); + controller.AddRecord(p, p.StartTime.ToString(TimeFormatter.HhMmSsFf), line.Length.ToString(CultureInfo.InvariantCulture), comment); } } } diff --git a/src/ui/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs b/src/ui/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs index dab2e61e59..1a933e0659 100644 --- a/src/ui/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs +++ b/src/ui/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using Nikse.SubtitleEdit.Logic.Config; using System.Globalization; @@ -27,7 +28,7 @@ public void Check(Subtitle subtitle, NetflixQualityController controller) if (p.DurationTotalMilliseconds < 500) { string comment = Se.Language.Tools.NetflixCheckAndFix.MinimumDurationJapanese; - controller.AddRecord(p, p.StartTime.ToHHMMSSFF(), p.DurationTotalSeconds.ToString(CultureInfo.InvariantCulture), comment); + controller.AddRecord(p, p.StartTime.ToString(TimeFormatter.HhMmSsFf), p.DurationTotalSeconds.ToString(CultureInfo.InvariantCulture), comment); } continue; } diff --git a/src/ui/Logic/NetflixQualityCheck/NetflixCheckWhiteSpace.cs b/src/ui/Logic/NetflixQualityCheck/NetflixCheckWhiteSpace.cs index 5e0c30672d..1fcaba7a6f 100644 --- a/src/ui/Logic/NetflixQualityCheck/NetflixCheckWhiteSpace.cs +++ b/src/ui/Logic/NetflixQualityCheck/NetflixCheckWhiteSpace.cs @@ -1,4 +1,5 @@ -using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Nikse.SubtitleEdit.Core.Common; using Nikse.SubtitleEdit.Logic.Config; using System.Text.RegularExpressions; @@ -20,7 +21,7 @@ public NetflixCheckWhiteSpace(string name) private static void AddWhiteSpaceWarning(Paragraph p, NetflixQualityController report, string issue, int pos) { - string timeCode = p.StartTime.ToHHMMSSFF(); + string timeCode = p.StartTime.ToString(TimeFormatter.HhMmSsFf); string context = NetflixQualityController.StringContext(p.Text, pos, 6); string comment = string.Format(Se.Language.Tools.NetflixCheckAndFix.WhiteSpaceCheckForXReport, issue, pos); diff --git a/src/ui/Logic/ValueConverters/DoubleToDisplayShortConverter.cs b/src/ui/Logic/ValueConverters/DoubleToDisplayShortConverter.cs index c6d6b625f4..6e86066b67 100644 --- a/src/ui/Logic/ValueConverters/DoubleToDisplayShortConverter.cs +++ b/src/ui/Logic/ValueConverters/DoubleToDisplayShortConverter.cs @@ -1,3 +1,4 @@ +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; using Avalonia.Data.Converters; using Nikse.SubtitleEdit.Core.Common; using Nikse.SubtitleEdit.Logic.Config; @@ -16,7 +17,7 @@ public object Convert(object? value, Type targetType, object? parameter, Culture { if (Se.Settings.General.UseFrameMode) { - return new TimeCode(ms).ToShortStringHHMMSSFF(); + return new TimeCode(ms).ToString(TimeFormatter.ShortHhMmSsFf); } return new TimeCode(ms).ToShortString(); diff --git a/src/ui/Logic/ValueConverters/TimeSpanToDisplayFullConverter.cs b/src/ui/Logic/ValueConverters/TimeSpanToDisplayFullConverter.cs index b61d966b12..146088172c 100644 --- a/src/ui/Logic/ValueConverters/TimeSpanToDisplayFullConverter.cs +++ b/src/ui/Logic/ValueConverters/TimeSpanToDisplayFullConverter.cs @@ -1,4 +1,5 @@ -using Avalonia.Data.Converters; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Avalonia.Data.Converters; using System; using System.Globalization; using Nikse.SubtitleEdit.Core.Common; @@ -22,7 +23,7 @@ public object Convert(object? value, Type targetType, object? parameter, Culture if (Se.Settings.General.UseFrameMode) { - var resultFrames = new TimeCode(ts).ToHHMMSSFF(); + var resultFrames = new TimeCode(ts).ToString(TimeFormatter.HhMmSsFf); return resultFrames; } diff --git a/src/ui/Logic/ValueConverters/TimeSpanToDisplayShortConverter.cs b/src/ui/Logic/ValueConverters/TimeSpanToDisplayShortConverter.cs index 91d253503b..36625ed6e6 100644 --- a/src/ui/Logic/ValueConverters/TimeSpanToDisplayShortConverter.cs +++ b/src/ui/Logic/ValueConverters/TimeSpanToDisplayShortConverter.cs @@ -1,4 +1,5 @@ -using Avalonia.Data.Converters; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using Avalonia.Data.Converters; using System; using System.Globalization; using Nikse.SubtitleEdit.Core.Common; @@ -17,7 +18,7 @@ public object Convert(object? value, Type targetType, object? parameter, Culture { if (Se.Settings.General.UseFrameMode) { - return new TimeCode(ts).ToShortStringHHMMSSFF(); + return new TimeCode(ts).ToString(TimeFormatter.ShortHhMmSsFf); } var result = new TimeCode(ts).ToShortString(); From dedfcafa9bebe9fa7dd122f34549186a4d411a88 Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Thu, 11 Jun 2026 11:39:22 +0100 Subject: [PATCH 2/3] Add unit tests for the new ITimeFormatter classes Co-Authored-By: Claude Fable 5 --- tests/libse/Common/TimeFormatterTest.cs | 107 ++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 tests/libse/Common/TimeFormatterTest.cs diff --git a/tests/libse/Common/TimeFormatterTest.cs b/tests/libse/Common/TimeFormatterTest.cs new file mode 100644 index 0000000000..4f1792b027 --- /dev/null +++ b/tests/libse/Common/TimeFormatterTest.cs @@ -0,0 +1,107 @@ +using Nikse.SubtitleEdit.Core.Common; +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; + +namespace LibSETests.Common; + +[Collection("NonParallelTests")] +public class TimeFormatterTest +{ + private static string Format(double frameRate, TimeCode timeCode, ITimeFormatter formatter) + { + var original = Configuration.Settings.General.CurrentFrameRate; + try + { + Configuration.Settings.General.CurrentFrameRate = frameRate; + return timeCode.ToString(formatter); + } + finally + { + Configuration.Settings.General.CurrentFrameRate = original; + } + } + + [Theory] + [InlineData(0, 0, 0, 0, "00:00:00:00")] + [InlineData(1, 2, 3, 400, "01:02:03:10")] + [InlineData(0, 0, 1, 999, "00:00:02:00")] // frame count rounds up to frame rate -> carry to next second + [InlineData(0, 0, 59, 999, "00:01:00:00")] // carry rolls over into minutes + [InlineData(0, 59, 59, 999, "01:00:00:00")] // carry rolls over into hours + public void HhMmSsFf25Fps(int hours, int minutes, int seconds, int milliseconds, string expected) + { + Assert.Equal(expected, Format(25.0, new TimeCode(hours, minutes, seconds, milliseconds), TimeFormatter.HhMmSsFf)); + } + + [Fact] + public void HhMmSsFfHoursAbove24() + { + Assert.Equal("25:00:00:00", Format(25.0, new TimeCode(25, 0, 0, 0), TimeFormatter.HhMmSsFf)); + } + + [Fact] + public void HhMmSsFfNegative() + { + Assert.Equal("-00:00:05:00", Format(25.0, new TimeCode(-5000.0), TimeFormatter.HhMmSsFf)); + } + + [Fact] + public void HhMmSsFf2997Fps() + { + Assert.Equal("00:00:01:15", Format(29.97, new TimeCode(0, 0, 1, 500), TimeFormatter.HhMmSsFf)); + } + + [Fact] + public void HhMmSsFf23976FpsCarriesBefore999Milliseconds() + { + // at 23.976 fps, 999 ms rounds to 24 frames, which carries to the next second + Assert.Equal("00:00:02:00", Format(23.976, new TimeCode(0, 0, 1, 999), TimeFormatter.HhMmSsFf)); + } + + [Theory] + [InlineData(0, 0, 5, 0, "05:00")] + [InlineData(0, 2, 3, 400, "02:03:10")] + [InlineData(1, 2, 3, 400, "01:02:03:10")] + public void ShortHhMmSsFfTrimsLeadingZeroGroups(int hours, int minutes, int seconds, int milliseconds, string expected) + { + Assert.Equal(expected, Format(25.0, new TimeCode(hours, minutes, seconds, milliseconds), TimeFormatter.ShortHhMmSsFf)); + } + + [Fact] + public void ShortHhMmSsFfNegativeKeepsSignAfterTrim() + { + Assert.Equal("-05:00", Format(25.0, new TimeCode(-5000.0), TimeFormatter.ShortHhMmSsFf)); + } + + [Theory] + [InlineData(1, 2, 3, 400, "01:02:03")] + [InlineData(0, 0, 1, 400, "00:00:01")] // frames below carry threshold do not round seconds up + [InlineData(0, 0, 59, 999, "00:01:00")] // frame carry rounds the seconds up + public void HhMmSs25Fps(int hours, int minutes, int seconds, int milliseconds, string expected) + { + Assert.Equal(expected, Format(25.0, new TimeCode(hours, minutes, seconds, milliseconds), TimeFormatter.HhMmSs)); + } + + [Theory] + [InlineData(1, 2, 3, 400, "01:02:03;10")] + [InlineData(0, 0, 1, 999, "00:00:02;00")] + public void HhMmSsFfDropFrame25Fps(int hours, int minutes, int seconds, int milliseconds, string expected) + { + Assert.Equal(expected, Format(25.0, new TimeCode(hours, minutes, seconds, milliseconds), TimeFormatter.HhMmSsFfDropFrame)); + } + + [Theory] + [InlineData(0, 0, 5, 400, "05:10")] + [InlineData(0, 1, 5, 400, "05:10")] // minutes and hours are not included + [InlineData(0, 0, 59, 999, "60:00")] // carry increments seconds without rolling over into minutes + public void SsFf25Fps(int hours, int minutes, int seconds, int milliseconds, string expected) + { + Assert.Equal(expected, Format(25.0, new TimeCode(hours, minutes, seconds, milliseconds), TimeFormatter.SsFf)); + } + + [Theory] + [InlineData(1, 2, 3, 400, "01:02:03.10")] + [InlineData(0, 0, 1, 999, "00:00:02.00")] + public void HhMmSsPeriodFf25Fps(int hours, int minutes, int seconds, int milliseconds, string expected) + { + Assert.Equal(expected, Format(25.0, new TimeCode(hours, minutes, seconds, milliseconds), TimeFormatter.HhMmSsPeriodFf)); + } +} From b5dc86ecbebe967c349afd4ce57247ca95a8548f Mon Sep 17 00:00:00 2001 From: Ivandro Jao Date: Fri, 12 Jun 2026 02:46:34 +0100 Subject: [PATCH 3/3] Change Paragraph.Duration to TimeSpan and make ITimeFormatter TimeSpan-based - ITimeFormatter.Format now takes a TimeSpan instead of a TimeCode; TimeCode.ToString(ITimeFormatter) delegates via its TimeSpan property - Add TimeSpanExtensions in libse with ToString(ITimeFormatter), ToString(localize), ToShortString and ToShortDisplayString; TimeCode now delegates its string formatting to these extensions - Paragraph.Duration is now a TimeSpan; remove DurationTotalMilliseconds and DurationTotalSeconds, all callers go through Duration - Add TimeSpan overloads to subtitle format helpers (Edius, FilmEditXml, FinalCutProXml15, TimedText10, UnknownSubtitle76/90) so durations are formatted without creating TimeCode instances Co-Authored-By: Claude Fable 5 --- src/libse/Common/FixDurationLimits.cs | 4 +- src/libse/Common/Paragraph.cs | 16 ++-- src/libse/Common/Subtitle.cs | 6 +- src/libse/Common/TextEffect/KaraokeEffect.cs | 2 +- src/libse/Common/TextSplit.cs | 4 +- src/libse/Common/TimeCode.cs | 47 +---------- .../TimeFormatters/FrameBasedTimeFormatter.cs | 11 ++- .../Common/TimeFormatters/ITimeFormatter.cs | 7 +- .../ShortHhMmSsFfTimeFormatter.cs | 6 +- .../TimeFormatters/SsFfTimeFormatter.cs | 11 ++- src/libse/Common/TimeSpanExtensions.cs | 81 +++++++++++++++++++ src/libse/Common/UnknownFormatImporter.cs | 6 +- src/libse/Common/UnknownFormatImporterJson.cs | 2 +- src/libse/Common/Utilities.cs | 6 +- .../FixCommonErrors/FixLongDisplayTimes.cs | 2 +- .../FixOverlappingDisplayTimes.cs | 18 ++--- .../FixCommonErrors/FixShortDisplayTimes.cs | 18 ++--- src/libse/Forms/SplitLongLinesHelper.cs | 2 +- src/libse/Forms/TimeCodesBeautifier.cs | 2 +- .../SubtitleFormats/AdobeAfterEffectsFTME.cs | 2 +- src/libse/SubtitleFormats/CaptionsInc.cs | 2 +- src/libse/SubtitleFormats/CheetahCaption.cs | 6 +- .../SubtitleFormats/CheetahCaptionOld.cs | 6 +- src/libse/SubtitleFormats/Edius4Frames.cs | 5 ++ src/libse/SubtitleFormats/Edius4Ms.cs | 5 ++ .../SubtitleFormats/EdiusMarkerList2Frames.cs | 5 ++ .../SubtitleFormats/EdiusMarkerList2Ms.cs | 5 ++ .../SubtitleFormats/EdiusMarkerList3Frames.cs | 5 ++ .../SubtitleFormats/EdiusMarkerList3Ms.cs | 5 ++ src/libse/SubtitleFormats/ElrPrint.cs | 4 +- src/libse/SubtitleFormats/FLVCoreCuePoints.cs | 2 +- src/libse/SubtitleFormats/FilmEditXml.cs | 4 +- src/libse/SubtitleFormats/FinalCutProXCM.cs | 2 +- src/libse/SubtitleFormats/FinalCutProXXml.cs | 6 +- src/libse/SubtitleFormats/FinalCutProXml13.cs | 6 +- src/libse/SubtitleFormats/FinalCutProXml14.cs | 2 +- .../SubtitleFormats/FinalCutProXml14Text.cs | 4 +- src/libse/SubtitleFormats/FinalCutProXml15.cs | 23 +++--- .../SubtitleFormats/FinalCutProXmlGap.cs | 2 +- src/libse/SubtitleFormats/GooglePlayJson.cs | 2 +- src/libse/SubtitleFormats/JsonTed.cs | 2 +- src/libse/SubtitleFormats/JsonType13.cs | 4 +- src/libse/SubtitleFormats/JsonType18.cs | 2 +- src/libse/SubtitleFormats/JsonType19.cs | 2 +- src/libse/SubtitleFormats/JsonType3.cs | 2 +- src/libse/SubtitleFormats/JsonType8.cs | 2 +- src/libse/SubtitleFormats/JsonType8b.cs | 2 +- src/libse/SubtitleFormats/Lrc.cs | 2 +- src/libse/SubtitleFormats/Lrc3DigitsMs.cs | 2 +- src/libse/SubtitleFormats/LrcNoEndTime.cs | 2 +- src/libse/SubtitleFormats/NVivoTranscript.cs | 2 +- src/libse/SubtitleFormats/NciCaption.cs | 2 +- src/libse/SubtitleFormats/NkhCuePoints.cs | 2 +- src/libse/SubtitleFormats/Rtf2.cs | 2 +- .../SubtitleFormats/SmilTimesheetData.cs | 2 +- .../SubtitleFormats/SubtitleEditorProject.cs | 2 +- src/libse/SubtitleFormats/Ted20.cs | 6 +- src/libse/SubtitleFormats/TimedText10.cs | 27 +++++-- src/libse/SubtitleFormats/Titra.cs | 2 +- src/libse/SubtitleFormats/Ultech130.cs | 2 +- .../SubtitleFormats/UnknownSubtitle100.cs | 2 +- .../SubtitleFormats/UnknownSubtitle104.cs | 2 +- .../SubtitleFormats/UnknownSubtitle105.cs | 4 +- .../SubtitleFormats/UnknownSubtitle106.cs | 2 +- .../SubtitleFormats/UnknownSubtitle25.cs | 2 +- .../SubtitleFormats/UnknownSubtitle27.cs | 2 +- .../SubtitleFormats/UnknownSubtitle44.cs | 2 +- .../SubtitleFormats/UnknownSubtitle46.cs | 2 +- .../SubtitleFormats/UnknownSubtitle47.cs | 2 +- src/libse/SubtitleFormats/UnknownSubtitle5.cs | 2 +- .../SubtitleFormats/UnknownSubtitle59.cs | 2 +- .../SubtitleFormats/UnknownSubtitle76.cs | 5 ++ .../SubtitleFormats/UnknownSubtitle82.cs | 2 +- .../SubtitleFormats/UnknownSubtitle83.cs | 2 +- .../SubtitleFormats/UnknownSubtitle85.cs | 2 +- .../SubtitleFormats/UnknownSubtitle86.cs | 2 +- src/libse/SubtitleFormats/UnknownSubtitle9.cs | 2 +- .../SubtitleFormats/UnknownSubtitle90.cs | 5 ++ .../SubtitleFormats/UnknownSubtitle98.cs | 2 +- .../SubtitleFormats/UnknownSubtitle99.cs | 2 +- src/libse/SubtitleFormats/Xmp.cs | 2 +- src/libse/VobSub/VobSubWriter.cs | 2 +- src/libuilogic/Export/CustomTextFormatter.cs | 4 +- src/seconv/Core/SubtitleLinter.cs | 2 +- .../Files/Statistics/StatisticsViewModel.cs | 8 +- src/ui/Features/Main/MainViewModel.cs | 6 +- .../Shared/BinaryEdit/BinaryEditViewModel.cs | 6 +- .../PickTsTrack/PickTsTrackViewModel.cs | 2 +- .../Tools/BatchConvert/BatchConverter.cs | 6 +- .../Tools/BatchConvert/BatchStatics.cs | 6 +- .../SpeechToText/SpeechToTextTimingFixer.cs | 16 ++-- .../SpeechToText/SpeechToTextViewModel.cs | 4 +- .../ReviewSpeech/ReviewSpeechViewModel.cs | 4 +- .../TextToSpeech/TextToSpeechViewModel.cs | 4 +- .../NetflixCheckMaxDuration.cs | 2 +- .../NetflixCheckMinDuration.cs | 6 +- 96 files changed, 325 insertions(+), 228 deletions(-) create mode 100644 src/libse/Common/TimeSpanExtensions.cs diff --git a/src/libse/Common/FixDurationLimits.cs b/src/libse/Common/FixDurationLimits.cs index 58fa2ef1ee..af3e9a9aa0 100644 --- a/src/libse/Common/FixDurationLimits.cs +++ b/src/libse/Common/FixDurationLimits.cs @@ -29,7 +29,7 @@ private void FixShortDisplayTimes(Subtitle subtitle) for (int i = 0; i < subtitle.Paragraphs.Count; i++) { var p = subtitle.Paragraphs[i]; - var displayTime = p.DurationTotalMilliseconds; + var displayTime = p.Duration.TotalMilliseconds; if (displayTime < _minDurationMs) { var next = subtitle.GetParagraphOrDefault(i + 1); @@ -65,7 +65,7 @@ private void FixLongDisplayTimes(Subtitle subtitle) for (int i = 0; i < subtitle.Paragraphs.Count; i++) { var p = subtitle.Paragraphs[i]; - var displayTime = p.DurationTotalMilliseconds; + var displayTime = p.Duration.TotalMilliseconds; if (displayTime > _maxDurationMs) { p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + _maxDurationMs; diff --git a/src/libse/Common/Paragraph.cs b/src/libse/Common/Paragraph.cs index a3bea614a4..fa6a0fba4b 100644 --- a/src/libse/Common/Paragraph.cs +++ b/src/libse/Common/Paragraph.cs @@ -3,7 +3,7 @@ namespace Nikse.SubtitleEdit.Core.Common { - public class Paragraph + public class Paragraph { public int Number { get; set; } @@ -13,9 +13,7 @@ public class Paragraph public TimeCode EndTime { get; set; } - public TimeCode Duration => new TimeCode(EndTime.TotalMilliseconds - StartTime.TotalMilliseconds); - public double DurationTotalMilliseconds => EndTime.TotalMilliseconds - StartTime.TotalMilliseconds; - public double DurationTotalSeconds => (EndTime.TotalMilliseconds - StartTime.TotalMilliseconds) / TimeCode.BaseUnit; + public TimeSpan Duration => TimeSpan.FromMilliseconds(EndTime.TotalMilliseconds - StartTime.TotalMilliseconds); public bool Forced { get; set; } @@ -121,28 +119,28 @@ public double WordsPerMinute return 0; } - return 60.0 / DurationTotalSeconds * Text.CountWords(); + return 60.0 / Duration.TotalSeconds * Text.CountWords(); } } public double GetCharactersPerSecond() { - if (DurationTotalMilliseconds < 1) + if (Duration.TotalMilliseconds < 1) { return 999; } - return (double)Text.CountCharacters(true) / DurationTotalSeconds; + return (double)Text.CountCharacters(true) / Duration.TotalSeconds; } public double GetCharactersPerSecond(ICalcLength calc) { - if (DurationTotalMilliseconds < 1) + if (Duration.TotalMilliseconds < 1) { return 999; } - return (double)calc.CountCharacters(Text, true) / DurationTotalSeconds; + return (double)calc.CountCharacters(Text, true) / Duration.TotalSeconds; } } } diff --git a/src/libse/Common/Subtitle.cs b/src/libse/Common/Subtitle.cs index bb39a7e28a..1188cecd25 100644 --- a/src/libse/Common/Subtitle.cs +++ b/src/libse/Common/Subtitle.cs @@ -622,7 +622,7 @@ public void RecalculateDisplayTime(double maxCharactersPerSecond, int index, dou p.EndTime.TotalMilliseconds = wantedEndMs <= bestEndMs ? wantedEndMs : bestEndMs; - if (p.DurationTotalMilliseconds <= 0) + if (p.Duration.TotalMilliseconds <= 0) { p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 1; } @@ -658,7 +658,7 @@ public void SetFixedDuration(List selectedIndexes, double fixedDurationMill p.EndTime.TotalMilliseconds = wantedEndMs <= bestEndMs ? wantedEndMs : bestEndMs; - if (p.DurationTotalMilliseconds <= 0) + if (p.Duration.TotalMilliseconds <= 0) { p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 1; } @@ -857,7 +857,7 @@ public void Sort(SubtitleSortCriteria sortCriteria) Paragraphs = Paragraphs.OrderBy(p => p.EndTime.TotalMilliseconds).ThenBy(p => p.Number).ToList(); break; case SubtitleSortCriteria.Duration: - Paragraphs = Paragraphs.OrderBy(p => p.DurationTotalMilliseconds).ThenBy(p => p.Number).ToList(); + Paragraphs = Paragraphs.OrderBy(p => p.Duration.TotalMilliseconds).ThenBy(p => p.Number).ToList(); break; case SubtitleSortCriteria.Gap: var lookupDictionary = new Dictionary(); diff --git a/src/libse/Common/TextEffect/KaraokeEffect.cs b/src/libse/Common/TextEffect/KaraokeEffect.cs index 2a250a7620..0d61be43cf 100644 --- a/src/libse/Common/TextEffect/KaraokeEffect.cs +++ b/src/libse/Common/TextEffect/KaraokeEffect.cs @@ -17,7 +17,7 @@ public IEnumerable Transform(Paragraph paragraph, SKColor color, doub var fontInsertIndex = CalculateColorInsertIndex(text); text = text.Insert(fontInsertIndex, GetColor(color)); var result = _splitStrategy.Transform(text); - var duration = paragraph.DurationTotalMilliseconds - delay; + var duration = paragraph.Duration.TotalMilliseconds - delay; var durationPerSentence = duration / result.Length; var baseStartTime = paragraph.StartTime.TotalMilliseconds; diff --git a/src/libse/Common/TextSplit.cs b/src/libse/Common/TextSplit.cs index 0fca88620f..5fa5759019 100644 --- a/src/libse/Common/TextSplit.cs +++ b/src/libse/Common/TextSplit.cs @@ -323,12 +323,12 @@ public static Subtitle TryForWholeSentences(Subtitle inputSubtitle, string langu public static double CalcDurationToMove(Paragraph oldCurrent, Paragraph current, Paragraph next) { - if (current.DurationTotalMilliseconds < 0 || next.DurationTotalMilliseconds < 0) + if (current.Duration.TotalMilliseconds < 0 || next.Duration.TotalMilliseconds < 0) { return 0; } - var totalDuration = current.DurationTotalMilliseconds + next.DurationTotalMilliseconds; + var totalDuration = current.Duration.TotalMilliseconds + next.Duration.TotalMilliseconds; var totalChars = current.Text.Length + next.Text.Length; var durChar = totalDuration / totalChars; diff --git a/src/libse/Common/TimeCode.cs b/src/libse/Common/TimeCode.cs index 5218d70f1b..4cd711e45b 100644 --- a/src/libse/Common/TimeCode.cs +++ b/src/libse/Common/TimeCode.cs @@ -161,52 +161,11 @@ public TimeSpan TimeSpan public override string ToString() => ToString(false); - public string ToString(bool localize) - { - var ts = TimeSpan; - var decimalSeparator = localize ? CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator : ","; - var s = $"{ts.Hours + ts.Days * 24:00}:{ts.Minutes:00}:{ts.Seconds:00}{decimalSeparator}{ts.Milliseconds:000}"; - - return PrefixSign(s); - } - - public string ToShortString(bool localize = false) - { - var ts = TimeSpan; - var decimalSeparator = localize ? CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator : ","; - string s; - if (ts.Minutes == 0 && ts.Hours == 0 && ts.Days == 0) - { - s = $"{ts.Seconds:0}{decimalSeparator}{ts.Milliseconds:000}"; - - if (s == $"0{decimalSeparator}000") - { - return s; // no sign - } - } - else if (ts.Hours == 0 && ts.Days == 0) - { - s = $"{ts.Minutes:0}:{ts.Seconds:00}{decimalSeparator}{ts.Milliseconds:000}"; + public string ToString(bool localize) => TimeSpan.ToString(localize); - if (s == $"0:00{decimalSeparator}000") - { - return s; // no sign - } - } - else - { - s = $"{ts.Hours + ts.Days * 24:0}:{ts.Minutes:00}:{ts.Seconds:00}{decimalSeparator}{ts.Milliseconds:000}"; - - if (s == $"0:00:00{decimalSeparator}000") - { - return s; // no sign - } - } - - return PrefixSign(s); - } + public string ToShortString(bool localize = false) => TimeSpan.ToShortString(localize); - public string ToString(ITimeFormatter formatter) => formatter.Format(this); + public string ToString(ITimeFormatter formatter) => formatter.Format(TimeSpan); internal static string PrefixSign(string time, double totalMilliseconds) => totalMilliseconds >= 0 ? time : $"-{time.RemoveChar('-')}"; diff --git a/src/libse/Common/TimeFormatters/FrameBasedTimeFormatter.cs b/src/libse/Common/TimeFormatters/FrameBasedTimeFormatter.cs index c327805172..0f4e997c00 100644 --- a/src/libse/Common/TimeFormatters/FrameBasedTimeFormatter.cs +++ b/src/libse/Common/TimeFormatters/FrameBasedTimeFormatter.cs @@ -9,21 +9,20 @@ namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters /// public abstract class FrameBasedTimeFormatter : ITimeFormatter { - public string Format(TimeCode timeCode) + public string Format(TimeSpan timeSpan) { - var ts = timeCode.TimeSpan; - var frames = Math.Round(ts.Milliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate)); + var frames = Math.Round(timeSpan.Milliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate)); string s; if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001) { - s = FormatTime(ts.Add(new TimeSpan(0, 0, 1)), 0); + s = FormatTime(timeSpan.Add(new TimeSpan(0, 0, 1)), 0); } else { - s = FormatTime(ts, SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds)); + s = FormatTime(timeSpan, SubtitleFormat.MillisecondsToFramesMaxFrameRate(timeSpan.Milliseconds)); } - return TimeCode.PrefixSign(s, timeCode.TotalMilliseconds); + return TimeCode.PrefixSign(s, timeSpan.TotalMilliseconds); } protected abstract string FormatTime(TimeSpan ts, int frames); diff --git a/src/libse/Common/TimeFormatters/ITimeFormatter.cs b/src/libse/Common/TimeFormatters/ITimeFormatter.cs index a9c0fde264..cd1a659abf 100644 --- a/src/libse/Common/TimeFormatters/ITimeFormatter.cs +++ b/src/libse/Common/TimeFormatters/ITimeFormatter.cs @@ -1,10 +1,13 @@ +using System; + namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters { /// - /// Formats a as a string. Pass to . + /// Formats a as a string. Pass to + /// or . /// public interface ITimeFormatter { - string Format(TimeCode timeCode); + string Format(TimeSpan timeSpan); } } diff --git a/src/libse/Common/TimeFormatters/ShortHhMmSsFfTimeFormatter.cs b/src/libse/Common/TimeFormatters/ShortHhMmSsFfTimeFormatter.cs index 89e9082b19..1acc5a3aa3 100644 --- a/src/libse/Common/TimeFormatters/ShortHhMmSsFfTimeFormatter.cs +++ b/src/libse/Common/TimeFormatters/ShortHhMmSsFfTimeFormatter.cs @@ -1,3 +1,5 @@ +using System; + namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters { /// @@ -7,9 +9,9 @@ public class ShortHhMmSsFfTimeFormatter : ITimeFormatter { private static readonly HhMmSsFfTimeFormatter LongFormatter = new HhMmSsFfTimeFormatter(); - public string Format(TimeCode timeCode) + public string Format(TimeSpan timeSpan) { - var s = LongFormatter.Format(timeCode); + var s = LongFormatter.Format(timeSpan); var pre = string.Empty; if (s.StartsWith('-')) { diff --git a/src/libse/Common/TimeFormatters/SsFfTimeFormatter.cs b/src/libse/Common/TimeFormatters/SsFfTimeFormatter.cs index e9810f417e..7b8dacec07 100644 --- a/src/libse/Common/TimeFormatters/SsFfTimeFormatter.cs +++ b/src/libse/Common/TimeFormatters/SsFfTimeFormatter.cs @@ -9,15 +9,14 @@ namespace Nikse.SubtitleEdit.Core.Common.TimeFormatters /// public class SsFfTimeFormatter : ITimeFormatter { - public string Format(TimeCode timeCode) + public string Format(TimeSpan timeSpan) { - var ts = timeCode.TimeSpan; - var frames = Math.Round(ts.Milliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate)); + var frames = Math.Round(timeSpan.Milliseconds / (TimeCode.BaseUnit / Configuration.Settings.General.CurrentFrameRate)); var s = frames >= Configuration.Settings.General.CurrentFrameRate - 0.001 - ? $"{ts.Seconds + 1:00}:{0:00}" - : $"{ts.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}"; + ? $"{timeSpan.Seconds + 1:00}:{0:00}" + : $"{timeSpan.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(timeSpan.Milliseconds):00}"; - return TimeCode.PrefixSign(s, timeCode.TotalMilliseconds); + return TimeCode.PrefixSign(s, timeSpan.TotalMilliseconds); } } } diff --git a/src/libse/Common/TimeSpanExtensions.cs b/src/libse/Common/TimeSpanExtensions.cs new file mode 100644 index 0000000000..03255e5745 --- /dev/null +++ b/src/libse/Common/TimeSpanExtensions.cs @@ -0,0 +1,81 @@ +using Nikse.SubtitleEdit.Core.Common.TimeFormatters; +using System; +using System.Globalization; + +namespace Nikse.SubtitleEdit.Core.Common +{ + public static class TimeSpanExtensions + { + /// + /// Formats a with the given . + /// + public static string ToString(this TimeSpan timeSpan, ITimeFormatter formatter) + { + return formatter.Format(timeSpan); + } + + /// + /// Formats as "HH:MM:SS,mmm" (comma replaced by the culture's decimal separator when localized). + /// + public static string ToString(this TimeSpan timeSpan, bool localize) + { + var decimalSeparator = localize ? CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator : ","; + var s = $"{timeSpan.Hours + timeSpan.Days * 24:00}:{timeSpan.Minutes:00}:{timeSpan.Seconds:00}{decimalSeparator}{timeSpan.Milliseconds:000}"; + + return TimeCode.PrefixSign(s, timeSpan.TotalMilliseconds); + } + + public static string ToShortDisplayString(this TimeSpan timeSpan) + { + if (Math.Abs(timeSpan.TotalMilliseconds - TimeCode.MaxTimeTotalMilliseconds) < 0.01) + { + return "-"; + } + + if (Configuration.Settings?.General.UseTimeFormatHHMMSSFF == true) + { + return timeSpan.ToString(TimeFormatter.ShortHhMmSsFf); + } + + return timeSpan.ToShortString(true); + } + + /// + /// Formats as "HH:MM:SS,mmm" with leading zero groups trimmed. + /// + public static string ToShortString(this TimeSpan timeSpan, bool localize = false) + { + var decimalSeparator = localize ? CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator : ","; + string s; + if (timeSpan.Minutes == 0 && timeSpan.Hours == 0 && timeSpan.Days == 0) + { + s = $"{timeSpan.Seconds:0}{decimalSeparator}{timeSpan.Milliseconds:000}"; + + if (s == $"0{decimalSeparator}000") + { + return s; // no sign + } + } + else if (timeSpan.Hours == 0 && timeSpan.Days == 0) + { + s = $"{timeSpan.Minutes:0}:{timeSpan.Seconds:00}{decimalSeparator}{timeSpan.Milliseconds:000}"; + + if (s == $"0:00{decimalSeparator}000") + { + return s; // no sign + } + } + else + { + s = $"{timeSpan.Hours + timeSpan.Days * 24:0}:{timeSpan.Minutes:00}:{timeSpan.Seconds:00}{decimalSeparator}{timeSpan.Milliseconds:000}"; + + if (s == $"0:00:00{decimalSeparator}000") + { + return s; // no sign + } + } + + return TimeCode.PrefixSign(s, timeSpan.TotalMilliseconds); + } + } +} diff --git a/src/libse/Common/UnknownFormatImporter.cs b/src/libse/Common/UnknownFormatImporter.cs index b4e4b63056..739e7d79a6 100644 --- a/src/libse/Common/UnknownFormatImporter.cs +++ b/src/libse/Common/UnknownFormatImporter.cs @@ -71,13 +71,13 @@ public Subtitle AutoGuessImport(List lines, string fileName) { var sameLineSub = ImportTimeCodesInFramesAndTextOnSameLine(lines); if (sameLineSub.Paragraphs.Count < 10 && - (sameLineSub.Paragraphs.Count(p => p.DurationTotalMilliseconds < 0) > 2 || + (sameLineSub.Paragraphs.Count(p => p.Duration.TotalMilliseconds < 0) > 2 || sameLineSub.Paragraphs.Count(p => p.Text.Length > 100) > 1)) { // probably not a subtitle } else if (sameLineSub.Paragraphs.Count < 20 && - (sameLineSub.Paragraphs.Count(p => p.DurationTotalMilliseconds < 0) > 8 || + (sameLineSub.Paragraphs.Count(p => p.Duration.TotalMilliseconds < 0) > 8 || sameLineSub.Paragraphs.Count(p => p.Text.Length > 100) > 5)) { // probably not a subtitle @@ -797,7 +797,7 @@ private static Subtitle ImportTimeCodesOnSameSeparateLine(List lines) double averateDuration = 0; foreach (Paragraph a in subtitle.Paragraphs) { - double d = a.DurationTotalSeconds; + double d = a.Duration.TotalSeconds; if (d > 10) { d = 8; diff --git a/src/libse/Common/UnknownFormatImporterJson.cs b/src/libse/Common/UnknownFormatImporterJson.cs index ebe2e9fd26..a17ace83b2 100644 --- a/src/libse/Common/UnknownFormatImporterJson.cs +++ b/src/libse/Common/UnknownFormatImporterJson.cs @@ -107,7 +107,7 @@ private static Subtitle FixTimeCodeMsOrSeconds(Subtitle subtitle) var msFound = 0; foreach (var p in subtitle.Paragraphs) { - totalDuration += p.DurationTotalMilliseconds; + totalDuration += p.Duration.TotalMilliseconds; if (p.Style.Contains("\"start\"") || p.Style.Contains("\"startMs\"") || p.Style.Contains("\"start_ms\"") || diff --git a/src/libse/Common/Utilities.cs b/src/libse/Common/Utilities.cs index bc70225a47..c389317c4e 100644 --- a/src/libse/Common/Utilities.cs +++ b/src/libse/Common/Utilities.cs @@ -1394,7 +1394,7 @@ public static Paragraph GetOriginalParagraph(int index, Paragraph paragraph, Lis return null; } - var middle = paragraph.StartTime.TotalMilliseconds + paragraph.DurationTotalMilliseconds / 2.0; + var middle = paragraph.StartTime.TotalMilliseconds + paragraph.Duration.TotalMilliseconds / 2.0; if (index < originalParagraphs.Count) { var o = originalParagraphs[index]; @@ -2890,7 +2890,7 @@ public static SubtitleFormat LoadMatroskaTextSubtitle(MatroskaTrackInfo matroska for (int i = 0; i < subtitle.Paragraphs.Count; i++) { subtitle.Paragraphs[i].Text = subtitle.Paragraphs[i].Text.TrimEnd(); - if (subtitle.Paragraphs[i].DurationTotalMilliseconds < 1) + if (subtitle.Paragraphs[i].Duration.TotalMilliseconds < 1) { // fix subtitles without duration FixShortDisplayTime(subtitle, i); @@ -2929,7 +2929,7 @@ private static void FixShortDisplayTime(Subtitle s, int i) { Paragraph p = s.Paragraphs[i]; var minDisplayTime = Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds; - double displayTime = p.DurationTotalMilliseconds; + double displayTime = p.Duration.TotalMilliseconds; if (displayTime < minDisplayTime) { var next = s.GetParagraphOrDefault(i + 1); diff --git a/src/libse/Forms/FixCommonErrors/FixLongDisplayTimes.cs b/src/libse/Forms/FixCommonErrors/FixLongDisplayTimes.cs index 83843dd557..d10331d358 100644 --- a/src/libse/Forms/FixCommonErrors/FixLongDisplayTimes.cs +++ b/src/libse/Forms/FixCommonErrors/FixLongDisplayTimes.cs @@ -22,7 +22,7 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) maxDisplayTime = Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; } - double displayTime = p.DurationTotalMilliseconds; + double displayTime = p.Duration.TotalMilliseconds; bool allowFix = callbacks.AllowFix(p, Language.FixLongDisplayTime); if (allowFix && displayTime > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) diff --git a/src/libse/Forms/FixCommonErrors/FixOverlappingDisplayTimes.cs b/src/libse/Forms/FixCommonErrors/FixOverlappingDisplayTimes.cs index b5621e5efe..c493e9972a 100644 --- a/src/libse/Forms/FixCommonErrors/FixOverlappingDisplayTimes.cs +++ b/src/libse/Forms/FixCommonErrors/FixOverlappingDisplayTimes.cs @@ -26,7 +26,7 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) { var p = subtitle.Paragraphs[i]; var oldP = new Paragraph(p); - if (p.DurationTotalMilliseconds < 0) // negative display time... + if (p.Duration.TotalMilliseconds < 0) // negative display time... { bool isFixed = false; string status = string.Format(Language.StartTimeLaterThanEndTime, i + 1, p.StartTime, p.EndTime, p.Text, Environment.NewLine); @@ -100,18 +100,18 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) { int diffHalf = (int)(diff / 2); if (!Configuration.Settings.Tools.FixCommonErrorsFixOverlapAllowEqualEndStart && Math.Abs(p.StartTime.TotalMilliseconds - prev.EndTime.TotalMilliseconds) < 0.001 && - prev.DurationTotalMilliseconds > 100) + prev.Duration.TotalMilliseconds > 100) { if (callbacks.AllowFix(target, fixAction)) { if (!canBeEqual) { bool okEqual = true; - if (prev.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) + if (prev.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) { prev.EndTime.TotalMilliseconds--; } - else if (p.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) + else if (p.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) { p.StartTime.TotalMilliseconds++; } @@ -142,8 +142,8 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) callbacks.AddFixToListView(target, fixAction, oldPrevious, prev.ToString()); } } - else if (diff > 0 && currentOptimalDisplayTime <= p.DurationTotalMilliseconds - diffHalf && - prevOptimalDisplayTime <= prev.DurationTotalMilliseconds - diffHalf) + else if (diff > 0 && currentOptimalDisplayTime <= p.Duration.TotalMilliseconds - diffHalf && + prevOptimalDisplayTime <= prev.Duration.TotalMilliseconds - diffHalf) { if (callbacks.AllowFix(p, fixAction)) { @@ -167,8 +167,8 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) callbacks.AddFixToListView(p, fixAction, oldCurrent, p.ToString()); } } - else if (diff > 0 && currentWantedDisplayTime <= p.DurationTotalMilliseconds - diffHalf && - prevWantedDisplayTime <= prev.DurationTotalMilliseconds - diffHalf) + else if (diff > 0 && currentWantedDisplayTime <= p.Duration.TotalMilliseconds - diffHalf && + prevWantedDisplayTime <= prev.Duration.TotalMilliseconds - diffHalf) { if (callbacks.AllowFix(p, fixAction)) { @@ -206,7 +206,7 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) callbacks.AddFixToListView(p, fixAction, oldCurrent, p.ToString()); } } - else if (Math.Abs(p.StartTime.TotalMilliseconds - prev.EndTime.TotalMilliseconds) < 10 && p.DurationTotalMilliseconds > 1) + else if (Math.Abs(p.StartTime.TotalMilliseconds - prev.EndTime.TotalMilliseconds) < 10 && p.Duration.TotalMilliseconds > 1) { if (callbacks.AllowFix(p, fixAction)) { diff --git a/src/libse/Forms/FixCommonErrors/FixShortDisplayTimes.cs b/src/libse/Forms/FixCommonErrors/FixShortDisplayTimes.cs index a48fdac5b5..dfc8241f28 100644 --- a/src/libse/Forms/FixCommonErrors/FixShortDisplayTimes.cs +++ b/src/libse/Forms/FixCommonErrors/FixShortDisplayTimes.cs @@ -23,7 +23,7 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) { Paragraph p = subtitle.Paragraphs[i]; var skip = p.StartTime.IsMaxTime || p.EndTime.IsMaxTime; - double displayTime = p.DurationTotalMilliseconds; + double displayTime = p.Duration.TotalMilliseconds; if (!skip && displayTime < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) { Paragraph next = subtitle.GetParagraphOrDefault(i + 1); @@ -79,7 +79,7 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) Paragraph next = subtitle.GetParagraphOrDefault(i + 1); Paragraph nextNext = subtitle.GetParagraphOrDefault(i + 2); Paragraph prev = subtitle.GetParagraphOrDefault(i - 1); - double diffMs = temp.DurationTotalMilliseconds - p.DurationTotalMilliseconds; + double diffMs = temp.Duration.TotalMilliseconds - p.Duration.TotalMilliseconds; // Normal - just make current subtitle duration longer if (next == null || temp.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines < next.StartTime.TotalMilliseconds) @@ -94,7 +94,7 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) } // Start current subtitle earlier (max 50 ms) else if (Configuration.Settings.Tools.FixShortDisplayTimesAllowMoveStartTime && p.StartTime.TotalMilliseconds > Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds && - diffMs < 50 && (prev == null || prev.EndTime.TotalMilliseconds < p.EndTime.TotalMilliseconds - temp.DurationTotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines)) + diffMs < 50 && (prev == null || prev.EndTime.TotalMilliseconds < p.EndTime.TotalMilliseconds - temp.Duration.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines)) { noOfShortDisplayTimes = MoveStartTime(fixAction, noOfShortDisplayTimes, p, temp, next); } @@ -107,8 +107,8 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) if (callbacks.AllowFix(p, fixAction)) { string oldCurrent = p.ToString(); - p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + temp.DurationTotalMilliseconds; - var nextDurationMs = next.DurationTotalMilliseconds; + p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + temp.Duration.TotalMilliseconds; + var nextDurationMs = next.Duration.TotalMilliseconds; next.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; next.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds + nextDurationMs; noOfShortDisplayTimes++; @@ -117,12 +117,12 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) } // Make next subtitle duration shorter + make current subtitle duration longer else if (diffMs < 1000 && - Configuration.Settings.Tools.FixShortDisplayTimesAllowMoveStartTime && new Paragraph(next.Text, p.StartTime.TotalMilliseconds + temp.DurationTotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines, next.EndTime.TotalMilliseconds).GetCharactersPerSecond() < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds) + Configuration.Settings.Tools.FixShortDisplayTimesAllowMoveStartTime && new Paragraph(next.Text, p.StartTime.TotalMilliseconds + temp.Duration.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines, next.EndTime.TotalMilliseconds).GetCharactersPerSecond() < Configuration.Settings.General.SubtitleMaximumCharactersPerSeconds) { if (callbacks.AllowFix(p, fixAction)) { string oldCurrent = p.ToString(); - next.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + temp.DurationTotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; + next.StartTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + temp.Duration.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines; p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; noOfShortDisplayTimes++; callbacks.AddFixToListView(p, fixAction, oldCurrent, p.ToString()); @@ -146,7 +146,7 @@ public void Fix(Subtitle subtitle, IFixCallbacks callbacks) } // Start current subtitle earlier (max 200 ms) else if (Configuration.Settings.Tools.FixShortDisplayTimesAllowMoveStartTime && p.StartTime.TotalMilliseconds > Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds && - diffMs < 200 && (prev == null || prev.EndTime.TotalMilliseconds < p.EndTime.TotalMilliseconds - temp.DurationTotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines)) + diffMs < 200 && (prev == null || prev.EndTime.TotalMilliseconds < p.EndTime.TotalMilliseconds - temp.Duration.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines)) { noOfShortDisplayTimes = MoveStartTime(fixAction, noOfShortDisplayTimes, p, temp, next); } @@ -183,7 +183,7 @@ private int MoveStartTime(string fixAction, int noOfShortDisplayTimes, Paragraph p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; } - p.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds - temp.DurationTotalMilliseconds; + p.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds - temp.Duration.TotalMilliseconds; noOfShortDisplayTimes++; _callbacks.AddFixToListView(p, fixAction, oldCurrent, p.ToString()); } diff --git a/src/libse/Forms/SplitLongLinesHelper.cs b/src/libse/Forms/SplitLongLinesHelper.cs index ce9e42db96..225fb9e882 100644 --- a/src/libse/Forms/SplitLongLinesHelper.cs +++ b/src/libse/Forms/SplitLongLinesHelper.cs @@ -84,7 +84,7 @@ public static Subtitle SplitLongLinesInSubtitle(Subtitle subtitle, int totalLine } // calculate milliseconds per char - var millisecondsPerChar = oldParagraph.DurationTotalMilliseconds / (HtmlUtil.RemoveHtmlTags(text, true).Length - Environment.NewLine.Length); + var millisecondsPerChar = oldParagraph.Duration.TotalMilliseconds / (HtmlUtil.RemoveHtmlTags(text, true).Length - Environment.NewLine.Length); oldParagraph.Text = lines[firstLine]; diff --git a/src/libse/Forms/TimeCodesBeautifier.cs b/src/libse/Forms/TimeCodesBeautifier.cs index ec59f919f4..0643271821 100644 --- a/src/libse/Forms/TimeCodesBeautifier.cs +++ b/src/libse/Forms/TimeCodesBeautifier.cs @@ -1100,7 +1100,7 @@ private void AlignAndSetCue(Paragraph paragraph, bool isInCue, int newFrame) } // Duration cannot be negative - if (paragraph.DurationTotalMilliseconds < 0) + if (paragraph.Duration.TotalMilliseconds < 0) { paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds; } diff --git a/src/libse/SubtitleFormats/AdobeAfterEffectsFTME.cs b/src/libse/SubtitleFormats/AdobeAfterEffectsFTME.cs index bddd9f2df7..ba82c59a67 100644 --- a/src/libse/SubtitleFormats/AdobeAfterEffectsFTME.cs +++ b/src/libse/SubtitleFormats/AdobeAfterEffectsFTME.cs @@ -33,7 +33,7 @@ public override string ToText(Subtitle subtitle, string title) foreach (Paragraph p in subtitle.Paragraphs) { XmlNode paragraph = xml.CreateElement("marker"); - paragraph.InnerXml = string.Format(CultureInfo.InvariantCulture, innerXml, p.StartTime.TotalSeconds, p.DurationTotalSeconds); + paragraph.InnerXml = string.Format(CultureInfo.InvariantCulture, innerXml, p.StartTime.TotalSeconds, p.Duration.TotalSeconds); paragraph.SelectSingleNode("comment").Attributes["value"].InnerText = HtmlUtil.RemoveHtmlTags(p.Text, true).Replace(Environment.NewLine, "||"); root.AppendChild(paragraph); } diff --git a/src/libse/SubtitleFormats/CaptionsInc.cs b/src/libse/SubtitleFormats/CaptionsInc.cs index b1eb184f1b..01071870b7 100644 --- a/src/libse/SubtitleFormats/CaptionsInc.cs +++ b/src/libse/SubtitleFormats/CaptionsInc.cs @@ -253,7 +253,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string } } } - if (last != null && last.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (last != null && last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(last.Text); } diff --git a/src/libse/SubtitleFormats/CheetahCaption.cs b/src/libse/SubtitleFormats/CheetahCaption.cs index 3d37f0c2c3..5d9547d40d 100644 --- a/src/libse/SubtitleFormats/CheetahCaption.cs +++ b/src/libse/SubtitleFormats/CheetahCaption.cs @@ -108,7 +108,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string p.StartTime = DecodeTimestamp(buffer, i + 2); p.EndTime = DecodeTimestamp(buffer, i + 6); if (p.EndTime.Hours == 2 && p.EndTime.Minutes == 1 && p.EndTime.Seconds == 0 && p.EndTime.Milliseconds == 0 && - (p.DurationTotalMilliseconds < 0 || p.DurationTotalMilliseconds > 5000)) + (p.Duration.TotalMilliseconds < 0 || p.Duration.TotalMilliseconds > 5000)) { usedBytes = 20 - 4; } @@ -187,7 +187,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string i += length; } - if (last != null && (last.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds || last.DurationTotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds)) + if (last != null && (last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds || last.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds)) { last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(last.Text); } @@ -197,7 +197,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string var current = subtitle.Paragraphs[index]; var next = subtitle.Paragraphs[index + 1]; if (current.EndTime.Hours == 2 && current.EndTime.Minutes == 1 && current.EndTime.Seconds == 0 && current.EndTime.Milliseconds == 0 && - (current.DurationTotalMilliseconds < 0 || current.DurationTotalMilliseconds > 5000)) + (current.Duration.TotalMilliseconds < 0 || current.Duration.TotalMilliseconds > 5000)) { current.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; } diff --git a/src/libse/SubtitleFormats/CheetahCaptionOld.cs b/src/libse/SubtitleFormats/CheetahCaptionOld.cs index 8dcab3af2d..1286f8f27e 100644 --- a/src/libse/SubtitleFormats/CheetahCaptionOld.cs +++ b/src/libse/SubtitleFormats/CheetahCaptionOld.cs @@ -123,17 +123,17 @@ public void LoadSubtitle(Subtitle subtitle, byte[] buffer) { var paragraph = subtitle.Paragraphs[index]; var next = subtitle.GetParagraphOrDefault(index + 1); - if (paragraph.DurationTotalSeconds > 100) + if (paragraph.Duration.TotalSeconds > 100) { _errorCount++; } - if (Math.Abs(paragraph.EndTime.TotalMilliseconds) < 0.1 || paragraph.DurationTotalMilliseconds < 0.1) + if (Math.Abs(paragraph.EndTime.TotalMilliseconds) < 0.1 || paragraph.Duration.TotalMilliseconds < 0.1) { if (next != null) { paragraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; } - if (next == null || paragraph.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (next == null || paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); } diff --git a/src/libse/SubtitleFormats/Edius4Frames.cs b/src/libse/SubtitleFormats/Edius4Frames.cs index 0c8d070c86..8b92f3bafd 100644 --- a/src/libse/SubtitleFormats/Edius4Frames.cs +++ b/src/libse/SubtitleFormats/Edius4Frames.cs @@ -71,6 +71,11 @@ private static string EncodeTimeCode(TimeCode timeCode) return timeCode.ToString(TimeFormatter.HhMmSsFf); } + private static string EncodeTimeCode(TimeSpan timeSpan) + { + return timeSpan.ToString(TimeFormatter.HhMmSsFf); + } + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) { _errorCount = 0; diff --git a/src/libse/SubtitleFormats/Edius4Ms.cs b/src/libse/SubtitleFormats/Edius4Ms.cs index 4b2f6b0b0c..0c02f4ecde 100644 --- a/src/libse/SubtitleFormats/Edius4Ms.cs +++ b/src/libse/SubtitleFormats/Edius4Ms.cs @@ -70,6 +70,11 @@ private static string EncodeTimeCode(TimeCode timeCode) return timeCode.ToString(false).Replace(',', '.'); } + private static string EncodeTimeCode(TimeSpan timeSpan) + { + return timeSpan.ToString(false).Replace(',', '.'); + } + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) { _errorCount = 0; diff --git a/src/libse/SubtitleFormats/EdiusMarkerList2Frames.cs b/src/libse/SubtitleFormats/EdiusMarkerList2Frames.cs index 1e3b05ea10..9959dd69b3 100644 --- a/src/libse/SubtitleFormats/EdiusMarkerList2Frames.cs +++ b/src/libse/SubtitleFormats/EdiusMarkerList2Frames.cs @@ -44,6 +44,11 @@ private static string EncodeTimeCode(TimeCode timeCode) return timeCode.ToString(TimeFormatter.HhMmSsFf); } + private static string EncodeTimeCode(TimeSpan timeSpan) + { + return timeSpan.ToString(TimeFormatter.HhMmSsFf); + } + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) { _errorCount = 0; diff --git a/src/libse/SubtitleFormats/EdiusMarkerList2Ms.cs b/src/libse/SubtitleFormats/EdiusMarkerList2Ms.cs index 5caca53c5f..097fc84321 100644 --- a/src/libse/SubtitleFormats/EdiusMarkerList2Ms.cs +++ b/src/libse/SubtitleFormats/EdiusMarkerList2Ms.cs @@ -43,6 +43,11 @@ private static string EncodeTimeCode(TimeCode timeCode) return timeCode.ToString(false).Replace(',', ':'); } + private static string EncodeTimeCode(TimeSpan timeSpan) + { + return timeSpan.ToString(false).Replace(',', ':'); + } + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) { _errorCount = 0; diff --git a/src/libse/SubtitleFormats/EdiusMarkerList3Frames.cs b/src/libse/SubtitleFormats/EdiusMarkerList3Frames.cs index 90e2502040..c03e7ad25f 100644 --- a/src/libse/SubtitleFormats/EdiusMarkerList3Frames.cs +++ b/src/libse/SubtitleFormats/EdiusMarkerList3Frames.cs @@ -44,6 +44,11 @@ private static string EncodeTimeCode(TimeCode timeCode) return timeCode.ToString(TimeFormatter.HhMmSsFf); } + private static string EncodeTimeCode(TimeSpan timeSpan) + { + return timeSpan.ToString(TimeFormatter.HhMmSsFf); + } + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) { _errorCount = 0; diff --git a/src/libse/SubtitleFormats/EdiusMarkerList3Ms.cs b/src/libse/SubtitleFormats/EdiusMarkerList3Ms.cs index 236381d535..ed6486df29 100644 --- a/src/libse/SubtitleFormats/EdiusMarkerList3Ms.cs +++ b/src/libse/SubtitleFormats/EdiusMarkerList3Ms.cs @@ -43,6 +43,11 @@ private static string EncodeTimeCode(TimeCode timeCode) return timeCode.ToString(false).Replace(',', ':'); } + private static string EncodeTimeCode(TimeSpan timeSpan) + { + return timeSpan.ToString(false).Replace(',', ':'); + } + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) { _errorCount = 0; diff --git a/src/libse/SubtitleFormats/ElrPrint.cs b/src/libse/SubtitleFormats/ElrPrint.cs index 162f6ffeda..7d18d05d32 100644 --- a/src/libse/SubtitleFormats/ElrPrint.cs +++ b/src/libse/SubtitleFormats/ElrPrint.cs @@ -48,7 +48,7 @@ public override string ToText(Subtitle subtitle, string title) private static object GetDuration(Paragraph p) { string s; - var ts = p.Duration.TimeSpan; + var ts = p.Duration; var frames = MillisecondsToFrames(ts.Milliseconds); if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001) { @@ -58,7 +58,7 @@ private static object GetDuration(Paragraph p) { s = $"{ts.Seconds:00}:{MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}"; } - if (p.DurationTotalMilliseconds >= 0) + if (p.Duration.TotalMilliseconds >= 0) { return s; } diff --git a/src/libse/SubtitleFormats/FLVCoreCuePoints.cs b/src/libse/SubtitleFormats/FLVCoreCuePoints.cs index a582090c5e..0c70cb6d5b 100644 --- a/src/libse/SubtitleFormats/FLVCoreCuePoints.cs +++ b/src/libse/SubtitleFormats/FLVCoreCuePoints.cs @@ -52,7 +52,7 @@ public override string ToText(Subtitle subtitle, string title) name = xml.CreateElement("Name"); name.InnerText = "duration"; value = xml.CreateElement("Value"); - value.InnerText = p.DurationTotalMilliseconds.ToString(); + value.InnerText = p.Duration.TotalMilliseconds.ToString(); parameter.AppendChild(name); parameter.AppendChild(value); parameters.AppendChild(parameter); diff --git a/src/libse/SubtitleFormats/FilmEditXml.cs b/src/libse/SubtitleFormats/FilmEditXml.cs index daa7bcdf4b..d1f115ea35 100644 --- a/src/libse/SubtitleFormats/FilmEditXml.cs +++ b/src/libse/SubtitleFormats/FilmEditXml.cs @@ -101,9 +101,9 @@ public override string ToText(Subtitle subtitle, string title) return ToUtf8XmlString(xml); } - private static string EncodeDuration(TimeCode timeCode) + private static string EncodeDuration(TimeSpan timeSpan) { - return $"{timeCode.Seconds:00}:{MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"; + return $"{timeSpan.Seconds:00}:{MillisecondsToFramesMaxFrameRate(timeSpan.Milliseconds):00}"; } private static string EncodeTimeCode(TimeCode timeCode) diff --git a/src/libse/SubtitleFormats/FinalCutProXCM.cs b/src/libse/SubtitleFormats/FinalCutProXCM.cs index 5c5220be11..a0856efe5a 100644 --- a/src/libse/SubtitleFormats/FinalCutProXCM.cs +++ b/src/libse/SubtitleFormats/FinalCutProXCM.cs @@ -58,7 +58,7 @@ public override string ToText(Subtitle subtitle, string title) XmlNode chapterMarker = xml.CreateElement("chapter-marker"); var attr = xml.CreateAttribute("duration"); - attr.Value = Convert.ToInt64(p.DurationTotalSeconds * 2400000) + "/2400000s"; + attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; chapterMarker.Attributes.Append(attr); attr = xml.CreateAttribute("start"); diff --git a/src/libse/SubtitleFormats/FinalCutProXXml.cs b/src/libse/SubtitleFormats/FinalCutProXXml.cs index fe1cc889fa..422238cfd8 100644 --- a/src/libse/SubtitleFormats/FinalCutProXXml.cs +++ b/src/libse/SubtitleFormats/FinalCutProXXml.cs @@ -68,7 +68,7 @@ public override string ToText(Subtitle subtitle, string title) attr = xml.CreateAttribute("duration"); //attr.Value = "9529520/2400000s"; - attr.Value = Convert.ToInt64(p.DurationTotalSeconds * 2400000) + "/2400000s"; + attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; clip.Attributes.Append(attr); attr = xml.CreateAttribute("start"); @@ -81,7 +81,7 @@ public override string ToText(Subtitle subtitle, string title) clip.Attributes.Append(attr); attr = xml.CreateAttribute("audioDuration"); - attr.Value = Convert.ToInt64(p.DurationTotalSeconds * 2400000) + "/2400000s"; + attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; clip.Attributes.Append(attr); attr = xml.CreateAttribute("tcFormat"); @@ -91,7 +91,7 @@ public override string ToText(Subtitle subtitle, string title) XmlNode titleNode = clip.SelectSingleNode("title"); titleNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; titleNode.Attributes["name"].Value = HtmlUtil.RemoveHtmlTags(p.Text); - titleNode.Attributes["duration"].Value = Convert.ToInt64(p.DurationTotalSeconds * 60000) + "/60000s"; + titleNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 60000) + "/60000s"; titleNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; XmlNode text = clip.SelectSingleNode("title/text"); diff --git a/src/libse/SubtitleFormats/FinalCutProXml13.cs b/src/libse/SubtitleFormats/FinalCutProXml13.cs index 9c1a48691f..f5cfa200de 100644 --- a/src/libse/SubtitleFormats/FinalCutProXml13.cs +++ b/src/libse/SubtitleFormats/FinalCutProXml13.cs @@ -66,7 +66,7 @@ public override string ToText(Subtitle subtitle, string title) clip.Attributes.Append(attr); attr = xml.CreateAttribute("duration"); - attr.Value = Convert.ToInt64(p.DurationTotalSeconds * 2400000) + "/2400000s"; + attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; clip.Attributes.Append(attr); attr = xml.CreateAttribute("start"); @@ -78,7 +78,7 @@ public override string ToText(Subtitle subtitle, string title) clip.Attributes.Append(attr); attr = xml.CreateAttribute("audioDuration"); - attr.Value = Convert.ToInt64(p.DurationTotalSeconds * 2400000) + "/2400000s"; + attr.Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; clip.Attributes.Append(attr); attr = xml.CreateAttribute("tcFormat"); @@ -88,7 +88,7 @@ public override string ToText(Subtitle subtitle, string title) XmlNode titleNode = clip.SelectSingleNode("video"); titleNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; titleNode.Attributes["name"].Value = HtmlUtil.RemoveHtmlTags(p.Text); - titleNode.Attributes["duration"].Value = Convert.ToInt64(p.DurationTotalSeconds * 60000) + "/60000s"; + titleNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 60000) + "/60000s"; titleNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; XmlNode param = clip.SelectSingleNode("video/param"); diff --git a/src/libse/SubtitleFormats/FinalCutProXml14.cs b/src/libse/SubtitleFormats/FinalCutProXml14.cs index 85703700a3..fc7d8f6733 100644 --- a/src/libse/SubtitleFormats/FinalCutProXml14.cs +++ b/src/libse/SubtitleFormats/FinalCutProXml14.cs @@ -76,7 +76,7 @@ public override string ToText(Subtitle subtitle, string title) XmlNode generatorNode = video.SelectSingleNode("video"); generatorNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; - generatorNode.Attributes["duration"].Value = Convert.ToInt64(p.DurationTotalSeconds * 2400000) + "/2400000s"; + generatorNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 2400000) + "/2400000s"; generatorNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 2400000) + "/2400000s"; XmlNode param = video.SelectSingleNode("video/param"); diff --git a/src/libse/SubtitleFormats/FinalCutProXml14Text.cs b/src/libse/SubtitleFormats/FinalCutProXml14Text.cs index 4926536d05..2367d956bd 100644 --- a/src/libse/SubtitleFormats/FinalCutProXml14Text.cs +++ b/src/libse/SubtitleFormats/FinalCutProXml14Text.cs @@ -88,9 +88,9 @@ public override string ToText(Subtitle subtitle, string title) generatorNode.Attributes["offset"].Value = FinalCutProXml15.GetFrameTime(p.StartTime); } - if (IsNearleWholeNumber(p.DurationTotalSeconds)) + if (IsNearleWholeNumber(p.Duration.TotalSeconds)) { - generatorNode.Attributes["duration"].Value = Convert.ToInt64(p.DurationTotalSeconds) + "s"; + generatorNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds) + "s"; } else { diff --git a/src/libse/SubtitleFormats/FinalCutProXml15.cs b/src/libse/SubtitleFormats/FinalCutProXml15.cs index d62a315597..9d7d1e2d00 100644 --- a/src/libse/SubtitleFormats/FinalCutProXml15.cs +++ b/src/libse/SubtitleFormats/FinalCutProXml15.cs @@ -103,40 +103,45 @@ internal static string GetFrameDuration() } internal static string GetFrameTime(TimeCode timeCode) + { + return GetFrameTime(timeCode.TimeSpan); + } + + internal static string GetFrameTime(TimeSpan timeSpan) { if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 23.976) < 0.01) { - return Convert.ToInt64(timeCode.TotalSeconds * 2400000) + "/2400000s"; + return Convert.ToInt64(timeSpan.TotalSeconds * 2400000) + "/2400000s"; } else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 24) < 0.01) { - return Convert.ToInt64(timeCode.TotalSeconds * 2400000) + "/2400000s"; + return Convert.ToInt64(timeSpan.TotalSeconds * 2400000) + "/2400000s"; } else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 25) < 0.01) { - return Convert.ToInt64(timeCode.TotalSeconds * 2500000) + "/2500000s"; + return Convert.ToInt64(timeSpan.TotalSeconds * 2500000) + "/2500000s"; } else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 29.97) < 0.01) { - return Convert.ToInt64(timeCode.TotalSeconds * 3000000) + "/3000000s"; + return Convert.ToInt64(timeSpan.TotalSeconds * 3000000) + "/3000000s"; } else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 30) < 0.01) { - return Convert.ToInt64(timeCode.TotalSeconds * 3000000) + "/3000000s"; + return Convert.ToInt64(timeSpan.TotalSeconds * 3000000) + "/3000000s"; } else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 50) < 0.01) { - return Convert.ToInt64(timeCode.TotalSeconds * 5000000) + "/5000000s"; + return Convert.ToInt64(timeSpan.TotalSeconds * 5000000) + "/5000000s"; } else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 59.94) < 0.01) { - return Convert.ToInt64(timeCode.TotalSeconds * 6000000) + "/6000000s"; + return Convert.ToInt64(timeSpan.TotalSeconds * 6000000) + "/6000000s"; } else if (Math.Abs(Configuration.Settings.General.CurrentFrameRate - 60) < 0.01) { - return Convert.ToInt64(timeCode.TotalSeconds * 6000000) + "/6000000s"; + return Convert.ToInt64(timeSpan.TotalSeconds * 6000000) + "/6000000s"; } - return Convert.ToInt64(timeCode.TotalSeconds * 2500000) + "/2500000s"; + return Convert.ToInt64(timeSpan.TotalSeconds * 2500000) + "/2500000s"; } internal static string GetNdfDf() diff --git a/src/libse/SubtitleFormats/FinalCutProXmlGap.cs b/src/libse/SubtitleFormats/FinalCutProXmlGap.cs index a1a47ba4b6..f3a9b3cbfc 100644 --- a/src/libse/SubtitleFormats/FinalCutProXmlGap.cs +++ b/src/libse/SubtitleFormats/FinalCutProXmlGap.cs @@ -66,7 +66,7 @@ public override string ToText(Subtitle subtitle, string title) titleNode = titleNode.SelectSingleNode("title"); titleNode.Attributes["offset"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; titleNode.Attributes["name"].Value = HtmlUtil.RemoveHtmlTags(p.Text); - titleNode.Attributes["duration"].Value = Convert.ToInt64(p.DurationTotalSeconds * 60000) + "/60000s"; + titleNode.Attributes["duration"].Value = Convert.ToInt64(p.Duration.TotalSeconds * 60000) + "/60000s"; titleNode.Attributes["start"].Value = Convert.ToInt64(p.StartTime.TotalSeconds * 60000) + "/60000s"; titleNode.SelectSingleNode("text").InnerText = HtmlUtil.RemoveHtmlTags(p.Text); videoNode.AppendChild(titleNode); diff --git a/src/libse/SubtitleFormats/GooglePlayJson.cs b/src/libse/SubtitleFormats/GooglePlayJson.cs index 2b3368211e..e6d26eeb49 100644 --- a/src/libse/SubtitleFormats/GooglePlayJson.cs +++ b/src/libse/SubtitleFormats/GooglePlayJson.cs @@ -21,7 +21,7 @@ public override string ToText(Subtitle subtitle, string title) { sb.AppendLine(count > 0 ? ", {" : " {"); sb.AppendLine(" \"tStartMs\": " + p.StartTime.TotalMilliseconds.ToString(CultureInfo.InvariantCulture) + ","); - sb.AppendLine(" \"dDurationMs\": " + p.DurationTotalMilliseconds.ToString(CultureInfo.InvariantCulture) + ","); + sb.AppendLine(" \"dDurationMs\": " + p.Duration.TotalMilliseconds.ToString(CultureInfo.InvariantCulture) + ","); sb.AppendLine(" \"segs\": [ {"); sb.AppendLine(" \"utf8\": \"" + Json.EncodeJsonText(p.Text).Replace("
", "\\n") + "\""); sb.AppendLine(" } ]"); diff --git a/src/libse/SubtitleFormats/JsonTed.cs b/src/libse/SubtitleFormats/JsonTed.cs index 38a5bebd49..54b48e9a90 100644 --- a/src/libse/SubtitleFormats/JsonTed.cs +++ b/src/libse/SubtitleFormats/JsonTed.cs @@ -38,7 +38,7 @@ public override string ToText(Subtitle subtitle, string title) } sb.Append("{\"duration\":"); - sb.Append(p.DurationTotalMilliseconds.ToString(System.Globalization.CultureInfo.InvariantCulture)); + sb.Append(p.Duration.TotalMilliseconds.ToString(System.Globalization.CultureInfo.InvariantCulture)); sb.Append(",\"content\":\""); sb.Append(Json.EncodeJsonText(p.Text) + "\""); sb.Append(",\"startOfParagraph\":true"); diff --git a/src/libse/SubtitleFormats/JsonType13.cs b/src/libse/SubtitleFormats/JsonType13.cs index de6d13d228..61a2b1168d 100644 --- a/src/libse/SubtitleFormats/JsonType13.cs +++ b/src/libse/SubtitleFormats/JsonType13.cs @@ -21,7 +21,7 @@ public override string ToText(Subtitle subtitle, string title) var last = subtitle.Paragraphs.LastOrDefault(); if (last != null) { - duration = (last.StartTime.TotalSeconds + last.DurationTotalSeconds).ToString(CultureInfo.InvariantCulture); + duration = (last.StartTime.TotalSeconds + last.Duration.TotalSeconds).ToString(CultureInfo.InvariantCulture); } var createdAt = ""; @@ -47,7 +47,7 @@ public override string ToText(Subtitle subtitle, string title) } sb.AppendLine(" {"); - sb.AppendLine(" \"duration\": \"" + p.DurationTotalSeconds.ToString(CultureInfo.InvariantCulture) + "\","); + sb.AppendLine(" \"duration\": \"" + p.Duration.TotalSeconds.ToString(CultureInfo.InvariantCulture) + "\","); sb.AppendLine(" \"confidence\": null,"); sb.AppendLine(" \"name\": \"" + Json.EncodeJsonText(p.Text) + "\","); sb.AppendLine(" \"time\": \"" + p.StartTime.TotalSeconds.ToString(CultureInfo.InvariantCulture) + "\""); diff --git a/src/libse/SubtitleFormats/JsonType18.cs b/src/libse/SubtitleFormats/JsonType18.cs index 977cfc16c5..32d66ae2d9 100644 --- a/src/libse/SubtitleFormats/JsonType18.cs +++ b/src/libse/SubtitleFormats/JsonType18.cs @@ -26,7 +26,7 @@ public override string ToText(Subtitle subtitle, string title) sb.AppendLine(); sb.AppendLine(" {"); sb.AppendLine($" \"s\": {p.StartTime.TotalSeconds.ToString(CultureInfo.InvariantCulture)},"); - sb.AppendLine($" \"d\": {p.DurationTotalSeconds.ToString(CultureInfo.InvariantCulture)},"); + sb.AppendLine($" \"d\": {p.Duration.TotalSeconds.ToString(CultureInfo.InvariantCulture)},"); sb.AppendLine($" \"n\": \"{Json.EncodeJsonText(p.Text, "\\n")}\""); sb.Append(" }"); } diff --git a/src/libse/SubtitleFormats/JsonType19.cs b/src/libse/SubtitleFormats/JsonType19.cs index a7b06887e8..bbb7ec8606 100644 --- a/src/libse/SubtitleFormats/JsonType19.cs +++ b/src/libse/SubtitleFormats/JsonType19.cs @@ -29,7 +29,7 @@ public override string ToText(Subtitle subtitle, string title) sb.AppendLine(); sb.AppendLine(" {"); sb.AppendLine($" \"tStartMs\": {p.StartTime.TotalMilliseconds.ToString(CultureInfo.InvariantCulture)},"); - sb.AppendLine($" \"dDurationMs\": {p.DurationTotalMilliseconds.ToString(CultureInfo.InvariantCulture)},"); + sb.AppendLine($" \"dDurationMs\": {p.Duration.TotalMilliseconds.ToString(CultureInfo.InvariantCulture)},"); sb.AppendLine($" \"segs\": [{{ \"utf8\": \"{Json.EncodeJsonText(p.Text, "\\n")}\" }} ]"); sb.Append(" }"); } diff --git a/src/libse/SubtitleFormats/JsonType3.cs b/src/libse/SubtitleFormats/JsonType3.cs index de2aa8defa..00b956f1a4 100644 --- a/src/libse/SubtitleFormats/JsonType3.cs +++ b/src/libse/SubtitleFormats/JsonType3.cs @@ -23,7 +23,7 @@ public override string ToText(Subtitle subtitle, string title) } sb.Append("{\"duration\":"); - sb.Append(p.DurationTotalMilliseconds.ToString(System.Globalization.CultureInfo.InvariantCulture)); + sb.Append(p.Duration.TotalMilliseconds.ToString(System.Globalization.CultureInfo.InvariantCulture)); sb.Append(",\"content\":\""); sb.Append(Json.EncodeJsonText(p.Text) + "\""); sb.Append(",\"startOfParagraph\":false"); diff --git a/src/libse/SubtitleFormats/JsonType8.cs b/src/libse/SubtitleFormats/JsonType8.cs index 74d74e678a..7ce9983008 100644 --- a/src/libse/SubtitleFormats/JsonType8.cs +++ b/src/libse/SubtitleFormats/JsonType8.cs @@ -20,7 +20,7 @@ public override bool IsMine(List lines, string fileName) { return false; } - var avgDurSecs = subtitle.Paragraphs.Average(p => p.DurationTotalSeconds); + var avgDurSecs = subtitle.Paragraphs.Average(p => p.Duration.TotalSeconds); return avgDurSecs < 60; } diff --git a/src/libse/SubtitleFormats/JsonType8b.cs b/src/libse/SubtitleFormats/JsonType8b.cs index a6856d452d..f76489fa80 100644 --- a/src/libse/SubtitleFormats/JsonType8b.cs +++ b/src/libse/SubtitleFormats/JsonType8b.cs @@ -20,7 +20,7 @@ public override bool IsMine(List lines, string fileName) { return false; } - var avgDurSecs = subtitle.Paragraphs.Average(p => p.DurationTotalSeconds); + var avgDurSecs = subtitle.Paragraphs.Average(p => p.Duration.TotalSeconds); return avgDurSecs < 60 && avgDurSecs > 0.1; } diff --git a/src/libse/SubtitleFormats/Lrc.cs b/src/libse/SubtitleFormats/Lrc.cs index 03c3ebc3f3..b8cb82ab5d 100644 --- a/src/libse/SubtitleFormats/Lrc.cs +++ b/src/libse/SubtitleFormats/Lrc.cs @@ -318,7 +318,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string { p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; } - if (p.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (p.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { double duration = Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; p.EndTime = new TimeCode(p.StartTime.TotalMilliseconds + duration); diff --git a/src/libse/SubtitleFormats/Lrc3DigitsMs.cs b/src/libse/SubtitleFormats/Lrc3DigitsMs.cs index 75fcd317b1..0c460ed231 100644 --- a/src/libse/SubtitleFormats/Lrc3DigitsMs.cs +++ b/src/libse/SubtitleFormats/Lrc3DigitsMs.cs @@ -308,7 +308,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string { p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; } - if (p.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (p.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { double duration = Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; p.EndTime = new TimeCode(p.StartTime.TotalMilliseconds + duration); diff --git a/src/libse/SubtitleFormats/LrcNoEndTime.cs b/src/libse/SubtitleFormats/LrcNoEndTime.cs index d180c2b61c..1d03ef9095 100644 --- a/src/libse/SubtitleFormats/LrcNoEndTime.cs +++ b/src/libse/SubtitleFormats/LrcNoEndTime.cs @@ -298,7 +298,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string if (next != null && !p.StartTime.IsMaxTime && !next.StartTime.IsMaxTime) { p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (p.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (p.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(p.Text + "!"); } diff --git a/src/libse/SubtitleFormats/NVivoTranscript.cs b/src/libse/SubtitleFormats/NVivoTranscript.cs index 2bb0e0a19f..f27850c3c8 100644 --- a/src/libse/SubtitleFormats/NVivoTranscript.cs +++ b/src/libse/SubtitleFormats/NVivoTranscript.cs @@ -98,7 +98,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Configuration.Settings.General.NewEmptyDefaultMs; } - if (paragraph.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); } diff --git a/src/libse/SubtitleFormats/NciCaption.cs b/src/libse/SubtitleFormats/NciCaption.cs index 2746f50c95..c616904c08 100644 --- a/src/libse/SubtitleFormats/NciCaption.cs +++ b/src/libse/SubtitleFormats/NciCaption.cs @@ -226,7 +226,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string { Paragraph p = subtitle.GetParagraphOrDefault(i); Paragraph next = subtitle.GetParagraphOrDefault(i + 1); - if (p.DurationTotalMilliseconds <= 0 && next != null) + if (p.Duration.TotalMilliseconds <= 0 && next != null) { p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; } diff --git a/src/libse/SubtitleFormats/NkhCuePoints.cs b/src/libse/SubtitleFormats/NkhCuePoints.cs index 463de20070..278c4fe9c2 100644 --- a/src/libse/SubtitleFormats/NkhCuePoints.cs +++ b/src/libse/SubtitleFormats/NkhCuePoints.cs @@ -53,7 +53,7 @@ public override string ToText(Subtitle subtitle, string title) name = xml.CreateElement("Name"); name.InnerText = "duration"; value = xml.CreateElement("Value"); - value.InnerText = p.DurationTotalMilliseconds.ToString(); + value.InnerText = p.Duration.TotalMilliseconds.ToString(); parameter.AppendChild(name); parameter.AppendChild(value); parameters.AppendChild(parameter); diff --git a/src/libse/SubtitleFormats/Rtf2.cs b/src/libse/SubtitleFormats/Rtf2.cs index a9c15ca07c..39089c24bc 100644 --- a/src/libse/SubtitleFormats/Rtf2.cs +++ b/src/libse/SubtitleFormats/Rtf2.cs @@ -100,7 +100,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string subtitle.Paragraphs.Add(p); } - if (subtitle.Paragraphs.Count > 0 && subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].DurationTotalMilliseconds < 0.01) + if (subtitle.Paragraphs.Count > 0 && subtitle.Paragraphs[subtitle.Paragraphs.Count - 1].Duration.TotalMilliseconds < 0.01) { p = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(p.Text); diff --git a/src/libse/SubtitleFormats/SmilTimesheetData.cs b/src/libse/SubtitleFormats/SmilTimesheetData.cs index 0807fb0734..c02f1f97f7 100644 --- a/src/libse/SubtitleFormats/SmilTimesheetData.cs +++ b/src/libse/SubtitleFormats/SmilTimesheetData.cs @@ -217,7 +217,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string { paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); } - if (paragraph.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); } diff --git a/src/libse/SubtitleFormats/SubtitleEditorProject.cs b/src/libse/SubtitleFormats/SubtitleEditorProject.cs index f0376ff759..fd231b5d49 100644 --- a/src/libse/SubtitleFormats/SubtitleEditorProject.cs +++ b/src/libse/SubtitleFormats/SubtitleEditorProject.cs @@ -62,7 +62,7 @@ public override string ToText(Subtitle subtitle, string title) XmlNode paragraph = xml.CreateElement("subtitle"); XmlAttribute duration = xml.CreateAttribute("duration"); - duration.InnerText = ((int)Math.Round(p.DurationTotalMilliseconds)).ToString(CultureInfo.InvariantCulture); + duration.InnerText = ((int)Math.Round(p.Duration.TotalMilliseconds)).ToString(CultureInfo.InvariantCulture); paragraph.Attributes.Append(duration); XmlAttribute effect = xml.CreateAttribute("effect"); diff --git a/src/libse/SubtitleFormats/Ted20.cs b/src/libse/SubtitleFormats/Ted20.cs index c3978ec49c..c04bb78a22 100644 --- a/src/libse/SubtitleFormats/Ted20.cs +++ b/src/libse/SubtitleFormats/Ted20.cs @@ -102,17 +102,17 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string } var next = subtitle.GetParagraphOrDefault(index + 1); - if (paragraph.DurationTotalSeconds > 100) + if (paragraph.Duration.TotalSeconds > 100) { _errorCount++; } - if (Math.Abs(paragraph.EndTime.TotalMilliseconds) < 0.1 || paragraph.DurationTotalMilliseconds < 0.1) + if (Math.Abs(paragraph.EndTime.TotalMilliseconds) < 0.1 || paragraph.Duration.TotalMilliseconds < 0.1) { if (next != null) { paragraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; } - if (next == null || paragraph.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (next == null || paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); } diff --git a/src/libse/SubtitleFormats/TimedText10.cs b/src/libse/SubtitleFormats/TimedText10.cs index f3378bb79c..64f164cd58 100644 --- a/src/libse/SubtitleFormats/TimedText10.cs +++ b/src/libse/SubtitleFormats/TimedText10.cs @@ -101,10 +101,20 @@ public override bool IsMine(List lines, string fileName) internal static string ConvertToTimeString(TimeCode time) { - return ConvertToTimeString(time, Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormat); + return ConvertToTimeString(time.TimeSpan); + } + + internal static string ConvertToTimeString(TimeSpan timeSpan) + { + return ConvertToTimeString(timeSpan, Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormat); } internal static string ConvertToTimeString(TimeCode time, string timeCodeFormat) + { + return ConvertToTimeString(time.TimeSpan, timeCodeFormat); + } + + internal static string ConvertToTimeString(TimeSpan timeSpan, string timeCodeFormat) { timeCodeFormat = timeCodeFormat.Trim().ToLowerInvariant(); if (timeCodeFormat == "source" && !string.IsNullOrWhiteSpace(Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormatSource)) @@ -112,23 +122,24 @@ internal static string ConvertToTimeString(TimeCode time, string timeCodeFormat) timeCodeFormat = Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormatSource.Trim().ToLowerInvariant(); } + var hours = timeSpan.Hours + timeSpan.Days * 24; switch (timeCodeFormat) { case "source": case "seconds": - return string.Format(CultureInfo.InvariantCulture, "{0:0.0##}s", time.TotalSeconds); + return string.Format(CultureInfo.InvariantCulture, "{0:0.0##}s", timeSpan.TotalSeconds); case "milliseconds": - return string.Format(CultureInfo.InvariantCulture, "{0}ms", time.TotalMilliseconds); + return string.Format(CultureInfo.InvariantCulture, "{0}ms", timeSpan.TotalMilliseconds); case "ticks": - return string.Format(CultureInfo.InvariantCulture, "{0}t", TimeSpan.FromMilliseconds(time.TotalMilliseconds).Ticks); + return string.Format(CultureInfo.InvariantCulture, "{0}t", timeSpan.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); + return string.Format(CultureInfo.InvariantCulture, "{0:00}:{1:00}:{2:00}.{3:000}", hours, timeSpan.Minutes, timeSpan.Seconds, timeSpan.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)); + return string.Format(CultureInfo.InvariantCulture, "{0:00}:{1:00}:{2:00}.{3:00}", hours, timeSpan.Minutes, timeSpan.Seconds, (int)Math.Round(timeSpan.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); + return string.Format(CultureInfo.InvariantCulture, "{0:00}:{1:00}:{2:00},{3:000}", hours, timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds); default: - return string.Format(CultureInfo.InvariantCulture, "{0:00}:{1:00}:{2:00}:{3:00}", time.Hours, time.Minutes, time.Seconds, MillisecondsToFramesMaxFrameRate(time.Milliseconds)); + return string.Format(CultureInfo.InvariantCulture, "{0:00}:{1:00}:{2:00}:{3:00}", hours, timeSpan.Minutes, timeSpan.Seconds, MillisecondsToFramesMaxFrameRate(timeSpan.Milliseconds)); } } diff --git a/src/libse/SubtitleFormats/Titra.cs b/src/libse/SubtitleFormats/Titra.cs index 687a0faae1..21e2c68b94 100644 --- a/src/libse/SubtitleFormats/Titra.cs +++ b/src/libse/SubtitleFormats/Titra.cs @@ -44,7 +44,7 @@ public override string ToText(Subtitle subtitle, string title) { index++; var text = HtmlUtil.RemoveHtmlTags(p.Text, true); - sb.AppendLine(string.Format(writeFormat, index, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), GetMaxCharsForDuration(p.DurationTotalSeconds) + "c", Environment.NewLine, text)); + sb.AppendLine(string.Format(writeFormat, index, EncodeTimeCode(p.StartTime), EncodeTimeCode(p.EndTime), GetMaxCharsForDuration(p.Duration.TotalSeconds) + "c", Environment.NewLine, text)); sb.AppendLine(); if (!text.Contains(Environment.NewLine)) { diff --git a/src/libse/SubtitleFormats/Ultech130.cs b/src/libse/SubtitleFormats/Ultech130.cs index ec3606cb94..04cfeb2a9e 100644 --- a/src/libse/SubtitleFormats/Ultech130.cs +++ b/src/libse/SubtitleFormats/Ultech130.cs @@ -283,7 +283,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + 2500; } - if (last.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(last.Text); } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle100.cs b/src/libse/SubtitleFormats/UnknownSubtitle100.cs index 7b08660f19..7bae143148 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle100.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle100.cs @@ -26,7 +26,7 @@ public override string ToText(Subtitle subtitle, string title) private static string GetTimeCodeString(Paragraph paragraph) { - return $"#{paragraph.StartTime.TotalMilliseconds:00000000}{paragraph.DurationTotalMilliseconds:000000}"; + return $"#{paragraph.StartTime.TotalMilliseconds:00000000}{paragraph.Duration.TotalMilliseconds:000000}"; } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) diff --git a/src/libse/SubtitleFormats/UnknownSubtitle104.cs b/src/libse/SubtitleFormats/UnknownSubtitle104.cs index 4e4dc32d46..96682ca167 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle104.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle104.cs @@ -77,7 +77,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string else { p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (p.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (p.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle105.cs b/src/libse/SubtitleFormats/UnknownSubtitle105.cs index ce720a5bac..ba96f5535d 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle105.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle105.cs @@ -18,10 +18,10 @@ public override string ToText(Subtitle subtitle, string title) for (var index = 0; index < subtitle.Paragraphs.Count; index++) { var p = subtitle.Paragraphs[index]; - sb.AppendLine($"{EncodeTime(p.DurationTotalSeconds)}"); + sb.AppendLine($"{EncodeTime(p.Duration.TotalSeconds)}"); sb.AppendLine(p.Text); - seconds += p.DurationTotalSeconds; + seconds += p.Duration.TotalSeconds; var next = subtitle.GetParagraphOrDefault(index + 1); if (next != null && (next.StartTime.TotalMilliseconds - p.EndTime.TotalMilliseconds) > 100) { diff --git a/src/libse/SubtitleFormats/UnknownSubtitle106.cs b/src/libse/SubtitleFormats/UnknownSubtitle106.cs index db8c5ef7c6..b1f5dba092 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle106.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle106.cs @@ -82,7 +82,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Configuration.Settings.General.NewEmptyDefaultMs; } - if (paragraph.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle25.cs b/src/libse/SubtitleFormats/UnknownSubtitle25.cs index 4c3e339f04..7cc0077497 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle25.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle25.cs @@ -32,7 +32,7 @@ public override string ToText(Subtitle subtitle, string title) Paragraph last = null; foreach (var p in subtitle.Paragraphs) { - sb.AppendLine($"{MakeTimeCode(p.StartTime, last)} {MakeTimeCode(p.DurationTotalSeconds)}\r\n{p.Text}\r\n"); + sb.AppendLine($"{MakeTimeCode(p.StartTime, last)} {MakeTimeCode(p.Duration.TotalSeconds)}\r\n{p.Text}\r\n"); last = p; } return sb.ToString().Trim().Replace(Environment.NewLine, "\n"); diff --git a/src/libse/SubtitleFormats/UnknownSubtitle27.cs b/src/libse/SubtitleFormats/UnknownSubtitle27.cs index e1923e9766..a173f4f415 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle27.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle27.cs @@ -93,7 +93,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string current.EndTime.TotalMilliseconds = current.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(current.Text); } - if (current.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (current.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { current.EndTime.TotalMilliseconds = current.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle44.cs b/src/libse/SubtitleFormats/UnknownSubtitle44.cs index ee422cbeac..1b6a7a5520 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle44.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle44.cs @@ -124,7 +124,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string current.EndTime.TotalMilliseconds = current.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(current.Text); } - if (current.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (current.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { current.EndTime.TotalMilliseconds = current.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle46.cs b/src/libse/SubtitleFormats/UnknownSubtitle46.cs index c909e46a03..dbdb4ca8c1 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle46.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle46.cs @@ -79,7 +79,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string { paragraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; } - if (paragraph.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(p.Text); } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle47.cs b/src/libse/SubtitleFormats/UnknownSubtitle47.cs index 5327fc766b..a09544b690 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle47.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle47.cs @@ -81,7 +81,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string } - if (paragraph.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle5.cs b/src/libse/SubtitleFormats/UnknownSubtitle5.cs index 3cca5eca5a..dc7ab39deb 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle5.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle5.cs @@ -30,7 +30,7 @@ public override string ToText(Subtitle subtitle, string title) paragraph.Attributes.Append(start); XmlAttribute duration = xml.CreateAttribute("dur"); - duration.InnerText = $"{p.DurationTotalMilliseconds / 1000}".Replace(',', '.'); + duration.InnerText = $"{p.Duration.TotalMilliseconds / 1000}".Replace(',', '.'); paragraph.Attributes.Append(duration); paragraph.InnerText = p.Text; diff --git a/src/libse/SubtitleFormats/UnknownSubtitle59.cs b/src/libse/SubtitleFormats/UnknownSubtitle59.cs index e8a16a7a3f..d5b7aa7bec 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle59.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle59.cs @@ -176,7 +176,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string foreach (var p2 in subtitle.Paragraphs) { - if (p2.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (p2.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { p2.EndTime.TotalMilliseconds = p2.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle76.cs b/src/libse/SubtitleFormats/UnknownSubtitle76.cs index bb0f7b6467..e268a72ced 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle76.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle76.cs @@ -42,6 +42,11 @@ internal static string ConvertToTimeString(TimeCode time) return Convert.ToInt64(Math.Round(time.TotalMilliseconds)).ToString(CultureInfo.InvariantCulture); } + internal static string ConvertToTimeString(TimeSpan timeSpan) + { + return Convert.ToInt64(Math.Round(timeSpan.TotalMilliseconds)).ToString(CultureInfo.InvariantCulture); + } + public override string ToText(Subtitle subtitle, string title) { var xml = new XmlDocument(); diff --git a/src/libse/SubtitleFormats/UnknownSubtitle82.cs b/src/libse/SubtitleFormats/UnknownSubtitle82.cs index 4a7d0456c4..1a127a6558 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle82.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle82.cs @@ -32,7 +32,7 @@ public override string ToText(Subtitle subtitle, string title) paragraph.Attributes.Append(tAttribute); XmlAttribute dAttribute = xml.CreateAttribute("d"); - dAttribute.InnerText = Convert.ToInt64(p.DurationTotalMilliseconds).ToString(); + dAttribute.InnerText = Convert.ToInt64(p.Duration.TotalMilliseconds).ToString(); paragraph.Attributes.Append(dAttribute); paragraphInsertNode.AppendChild(paragraph); diff --git a/src/libse/SubtitleFormats/UnknownSubtitle83.cs b/src/libse/SubtitleFormats/UnknownSubtitle83.cs index da3e115bcd..2720ab44b1 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle83.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle83.cs @@ -33,7 +33,7 @@ public override string ToText(Subtitle subtitle, string title) for (int index = 0; index < subtitle.Paragraphs.Count;) { var p = subtitle.Paragraphs[index++]; - var lis = (int)Math.Round(MillisecondsToFrames(p.DurationTotalMilliseconds) / 2.0); + var lis = (int)Math.Round(MillisecondsToFrames(p.Duration.TotalMilliseconds) / 2.0); sb.AppendLine(string.Format(format, index, p.StartTime.ToString(TimeFormatter.HhMmSsFf), p.EndTime.ToString(TimeFormatter.HhMmSsFf), p.Duration.ToString(TimeFormatter.SsFf), lis, p.Text.Length, p.Text)); } return sb.ToString().ToRtf(); diff --git a/src/libse/SubtitleFormats/UnknownSubtitle85.cs b/src/libse/SubtitleFormats/UnknownSubtitle85.cs index 2a329f32f5..8cbc6d5391 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle85.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle85.cs @@ -125,7 +125,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string if (next.StartTime.TotalMilliseconds < p.EndTime.TotalMilliseconds) { p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; - if (p.DurationTotalMilliseconds < 0) + if (p.Duration.TotalMilliseconds < 0) { _errorCount++; } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle86.cs b/src/libse/SubtitleFormats/UnknownSubtitle86.cs index 87e41dd66f..a419ac667b 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle86.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle86.cs @@ -74,7 +74,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; } - if (p.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (p.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle9.cs b/src/libse/SubtitleFormats/UnknownSubtitle9.cs index 29440bbb2b..5453ab7f92 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle9.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle9.cs @@ -23,7 +23,7 @@ public override string ToText(Subtitle subtitle, string title) sb.AppendLine("
"); foreach (Paragraph p in subtitle.Paragraphs) { - sb.AppendLine($" {p.Text.Replace(Environment.NewLine, "
")}
"); + sb.AppendLine($" {p.Text.Replace(Environment.NewLine, "
")}
"); } sb.AppendLine("
"); sb.AppendLine(" "); diff --git a/src/libse/SubtitleFormats/UnknownSubtitle90.cs b/src/libse/SubtitleFormats/UnknownSubtitle90.cs index ab24291185..fb26aea409 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle90.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle90.cs @@ -32,6 +32,11 @@ private static double EncodeTimeCode(TimeCode time) return time.TotalSeconds; } + private static double EncodeTimeCode(TimeSpan timeSpan) + { + return timeSpan.TotalSeconds; + } + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) { _errorCount = 0; diff --git a/src/libse/SubtitleFormats/UnknownSubtitle98.cs b/src/libse/SubtitleFormats/UnknownSubtitle98.cs index 128dfdde4b..3b13ab0079 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle98.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle98.cs @@ -85,7 +85,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string { paragraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; } - if (paragraph.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); } diff --git a/src/libse/SubtitleFormats/UnknownSubtitle99.cs b/src/libse/SubtitleFormats/UnknownSubtitle99.cs index f213415aff..1277ebcec3 100644 --- a/src/libse/SubtitleFormats/UnknownSubtitle99.cs +++ b/src/libse/SubtitleFormats/UnknownSubtitle99.cs @@ -104,7 +104,7 @@ public override void LoadSubtitle(Subtitle subtitle, List lines, string { paragraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; } - if (paragraph.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (paragraph.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text); } diff --git a/src/libse/SubtitleFormats/Xmp.cs b/src/libse/SubtitleFormats/Xmp.cs index 09e4833c9d..4114fe5bec 100644 --- a/src/libse/SubtitleFormats/Xmp.cs +++ b/src/libse/SubtitleFormats/Xmp.cs @@ -68,7 +68,7 @@ private XmlNode CreateParagraphElement(XmlDocument xml, Paragraph paragraph) li.AppendChild(comment); var duration = xml.CreateElement("xmpDM", "duration", NamespaceDescription); - duration.InnerText = MillisecondsToFrames(paragraph.DurationTotalMilliseconds).ToString(CultureInfo.InvariantCulture); + duration.InnerText = MillisecondsToFrames(paragraph.Duration.TotalMilliseconds).ToString(CultureInfo.InvariantCulture); li.AppendChild(duration); var startTime = xml.CreateElement("xmpDM", "startTime", NamespaceDescription); diff --git a/src/libse/VobSub/VobSubWriter.cs b/src/libse/VobSub/VobSubWriter.cs index b8060cae92..c6090b8440 100644 --- a/src/libse/VobSub/VobSubWriter.cs +++ b/src/libse/VobSub/VobSubWriter.cs @@ -124,7 +124,7 @@ private byte[] GetSubImageBuffer(RunLengthTwoParts twoPartBuffer, NikseBitmap nb // Control Sequence Table // Write delay - subtitle duration - WriteEndianWord(Convert.ToInt32(p.DurationTotalMilliseconds * 90.0) >> 10, ms); + WriteEndianWord(Convert.ToInt32(p.Duration.TotalMilliseconds * 90.0) >> 10, ms); // next display control sequence table address (use current is last) WriteEndianWord(startDisplayControlSequenceTableAddress + 24, ms); // start of display control sequence table address diff --git a/src/libuilogic/Export/CustomTextFormatter.cs b/src/libuilogic/Export/CustomTextFormatter.cs index 61082254ad..94f207937c 100644 --- a/src/libuilogic/Export/CustomTextFormatter.cs +++ b/src/libuilogic/Export/CustomTextFormatter.cs @@ -238,10 +238,10 @@ private static string ReplaceStandardComponents(string template, TimeCode timeCo .Replace("f", $"{SubtitleFormat.MillisecondsToFramesMaxFrameRate(timeCode.Milliseconds):00}"); } - internal static string GetParagraph(string template, string start, string end, string text, string originalText, int number, string actor, TimeCode duration, string gap, string timeCodeTemplate, Paragraph p, string videoFileName) + internal static string GetParagraph(string template, string start, string end, string text, string originalText, int number, string actor, TimeSpan duration, string gap, string timeCodeTemplate, Paragraph p, string videoFileName) { var cps = p.GetCharactersPerSecond(); - var d = duration.ToString(); + var d = duration.ToString(false); if (timeCodeTemplate == "ff" || timeCodeTemplate == "f") { d = SubtitleFormat.MillisecondsToFrames(duration.TotalMilliseconds).ToString(CultureInfo.InvariantCulture); diff --git a/src/seconv/Core/SubtitleLinter.cs b/src/seconv/Core/SubtitleLinter.cs index 23aa09cce7..5ac31cd58a 100644 --- a/src/seconv/Core/SubtitleLinter.cs +++ b/src/seconv/Core/SubtitleLinter.cs @@ -71,7 +71,7 @@ public static LintReport Lint(string filePath) } // Duration checks - var durMs = p.DurationTotalMilliseconds; + var durMs = p.Duration.TotalMilliseconds; if (durMs < 0) { issues.Add(new LintIssue diff --git a/src/ui/Features/Files/Statistics/StatisticsViewModel.cs b/src/ui/Features/Files/Statistics/StatisticsViewModel.cs index db1916baa3..e44a9ce9e0 100644 --- a/src/ui/Features/Files/Statistics/StatisticsViewModel.cs +++ b/src/ui/Features/Files/Statistics/StatisticsViewModel.cs @@ -201,7 +201,7 @@ private void CalculateGeneralStatistics() maximumLineLength = Math.Max(len, maximumLineLength); totalLineLength += len; - var duration = p.DurationTotalMilliseconds; + var duration = p.Duration.TotalMilliseconds; minimumDuration = Math.Min(duration, minimumDuration); maximumDuration = Math.Max(duration, maximumDuration); totalDuration += duration; @@ -280,11 +280,11 @@ private void CalculateGeneralStatistics() aboveMaximumWpmCount++; } - if (p.DurationTotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) + if (p.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) { belowMinimumDurationCount++; } - if (p.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (p.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { aboveMaximumDurationCount++; } @@ -388,7 +388,7 @@ private string GetIndicesWithDuration(double duration) for (var i = 0; i < _subtitle.Paragraphs.Count; i++) { var p = _subtitle.Paragraphs[i]; - if (Math.Abs(p.DurationTotalMilliseconds - duration) < 0.01) + if (Math.Abs(p.Duration.TotalMilliseconds - duration) < 0.01) { if (indices.Count >= NumberOfLinesToShow) { diff --git a/src/ui/Features/Main/MainViewModel.cs b/src/ui/Features/Main/MainViewModel.cs index da6966fc21..8f0c7b1490 100644 --- a/src/ui/Features/Main/MainViewModel.cs +++ b/src/ui/Features/Main/MainViewModel.cs @@ -14358,10 +14358,10 @@ private bool LoadDvbFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, Matrosk if (pes == null && subtitle.Paragraphs.Count > 0) { var last = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; - if (last.DurationTotalMilliseconds < 100) + if (last.Duration.TotalMilliseconds < 100) { last.EndTime.TotalMilliseconds = msub.Start; - if (last.DurationTotalMilliseconds > + if (last.Duration.TotalMilliseconds > Se.Settings.General.SubtitleMaximumDisplayMilliseconds) { last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + 3000; @@ -14389,7 +14389,7 @@ private bool LoadDvbFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, Matrosk for (var index = 0; index < subtitle.Paragraphs.Count; index++) { var p = subtitle.Paragraphs[index]; - if (p.DurationTotalMilliseconds < 200) + if (p.Duration.TotalMilliseconds < 200) { p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 3000; } diff --git a/src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs b/src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs index 12701dd034..30435e981a 100644 --- a/src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs +++ b/src/ui/Features/Shared/BinaryEdit/BinaryEditViewModel.cs @@ -712,10 +712,10 @@ private static (Subtitle subtitle, List subtitleImages) ExtractMkvDvb if (pes == null && subtitle.Paragraphs.Count > 0) { var last = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; - if (last.DurationTotalMilliseconds < 100) + if (last.Duration.TotalMilliseconds < 100) { last.EndTime.TotalMilliseconds = msub.Start; - if (last.DurationTotalMilliseconds > Se.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (last.Duration.TotalMilliseconds > Se.Settings.General.SubtitleMaximumDisplayMilliseconds) { last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + 3000; } @@ -737,7 +737,7 @@ private static (Subtitle subtitle, List subtitleImages) ExtractMkvDvb for (var index = 0; index < subtitle.Paragraphs.Count; index++) { var p = subtitle.Paragraphs[index]; - if (p.DurationTotalMilliseconds < 200) + if (p.Duration.TotalMilliseconds < 200) { p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 3000; } diff --git a/src/ui/Features/Shared/PickTsTrack/PickTsTrackViewModel.cs b/src/ui/Features/Shared/PickTsTrack/PickTsTrackViewModel.cs index 7129c2d3df..faa9f32632 100644 --- a/src/ui/Features/Shared/PickTsTrack/PickTsTrackViewModel.cs +++ b/src/ui/Features/Shared/PickTsTrack/PickTsTrackViewModel.cs @@ -147,7 +147,7 @@ private bool TrackChanged() Number = p.Number, Show = p.StartTime.TimeSpan, Hide = p.EndTime.TimeSpan, - Duration = p.Duration.TimeSpan, + Duration = p.Duration, Text = p.Text, }; Rows.Add(cue); diff --git a/src/ui/Features/Tools/BatchConvert/BatchConverter.cs b/src/ui/Features/Tools/BatchConvert/BatchConverter.cs index 1d77c2df84..710de2acdf 100644 --- a/src/ui/Features/Tools/BatchConvert/BatchConverter.cs +++ b/src/ui/Features/Tools/BatchConvert/BatchConverter.cs @@ -463,10 +463,10 @@ public static List LoadDvbFromMatroska(MatroskaTra if (pes == null && subtitle.Paragraphs.Count > 0) { var last = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; - if (last.DurationTotalMilliseconds < 100) + if (last.Duration.TotalMilliseconds < 100) { last.EndTime.TotalMilliseconds = msub.Start; - if (last.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + 3000; } @@ -494,7 +494,7 @@ public static List LoadDvbFromMatroska(MatroskaTra for (var index = 0; index < subtitle.Paragraphs.Count; index++) { var p = subtitle.Paragraphs[index]; - if (p.DurationTotalMilliseconds < 200) + if (p.Duration.TotalMilliseconds < 200) { p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 3000; } diff --git a/src/ui/Features/Tools/BatchConvert/BatchStatics.cs b/src/ui/Features/Tools/BatchConvert/BatchStatics.cs index fdd1d79780..3801bc24c9 100644 --- a/src/ui/Features/Tools/BatchConvert/BatchStatics.cs +++ b/src/ui/Features/Tools/BatchConvert/BatchStatics.cs @@ -71,7 +71,7 @@ public static string CalculateGeneralStatistics(List batchItem maximumLineLength = Math.Max(len, maximumLineLength); totalLineLength += len; - var duration = p.DurationTotalMilliseconds; + var duration = p.Duration.TotalMilliseconds; minimumDuration = Math.Min(duration, minimumDuration); maximumDuration = Math.Max(duration, maximumDuration); totalDuration += duration; @@ -152,12 +152,12 @@ public static string CalculateGeneralStatistics(List batchItem aboveMaximumWpmCount++; } - if (p.DurationTotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) + if (p.Duration.TotalMilliseconds < Configuration.Settings.General.SubtitleMinimumDisplayMilliseconds) { belowMinimumDurationCount++; } - if (p.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (p.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { aboveMaximumDurationCount++; } diff --git a/src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs b/src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs index e6e24eda59..8345a7d28f 100644 --- a/src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs +++ b/src/ui/Features/Video/SpeechToText/SpeechToTextTimingFixer.cs @@ -62,7 +62,7 @@ public static Subtitle ShortenViaWavePeaks(Subtitle subtitle, WavePeakData2 wave var pctHere = FindPercentage(startPos - 0.05, startPos + 0.05, wavePeaks); if (Math.Abs(pctHere - (-1)) < 0.01) { - if (p.DurationTotalMilliseconds < minDurationMs) + if (p.Duration.TotalMilliseconds < minDurationMs) { s.Paragraphs[index] = oldP; } @@ -79,7 +79,7 @@ public static Subtitle ShortenViaWavePeaks(Subtitle subtitle, WavePeakData2 wave var pct = FindPercentage(startPosBack - 0.05, startPosBack + 0.05, wavePeaks); if (Math.Abs(pct - (-1)) < 0.01) { - if (p.DurationTotalMilliseconds < minDurationMs) + if (p.Duration.TotalMilliseconds < minDurationMs) { s.Paragraphs[index] = oldP; } @@ -87,7 +87,7 @@ public static Subtitle ShortenViaWavePeaks(Subtitle subtitle, WavePeakData2 wave return s; } - if (pct < percentageMax + 1 && p.DurationTotalSeconds < 5) + if (pct < percentageMax + 1 && p.Duration.TotalSeconds < 5) { startPosBack -= 0.025; var pct2 = FindPercentage(startPosBack - 0.05, startPosBack + 0.05, wavePeaks); @@ -128,7 +128,7 @@ public static Subtitle ShortenViaWavePeaks(Subtitle subtitle, WavePeakData2 wave var pctF = FindPercentage(startPosForward - 0.05, startPosForward + 0.05, wavePeaks); if (Math.Abs(pctF - (-1)) < 0.01) { - if (p.DurationTotalMilliseconds < minDurationMs) + if (p.Duration.TotalMilliseconds < minDurationMs) { s.Paragraphs[index] = oldP; } @@ -161,7 +161,7 @@ public static Subtitle ShortenViaWavePeaks(Subtitle subtitle, WavePeakData2 wave pctHere = FindPercentage(startPos - 0.05, startPos + 0.05, wavePeaks); if (Math.Abs(pctHere - (-1)) < 0.01) { - if (p.DurationTotalMilliseconds < minDurationMs) + if (p.Duration.TotalMilliseconds < minDurationMs) { s.Paragraphs[index] = oldP; } @@ -177,7 +177,7 @@ public static Subtitle ShortenViaWavePeaks(Subtitle subtitle, WavePeakData2 wave pctHere = FindPercentage(startPosForward - 0.05, startPosForward + 0.05, wavePeaks); if (Math.Abs(pctHere - (-1)) < 0.01) { - if (p.DurationTotalMilliseconds < 1000) + if (p.Duration.TotalMilliseconds < 1000) { s.Paragraphs[index] = oldP; } @@ -210,7 +210,7 @@ public static Subtitle ShortenViaWavePeaks(Subtitle subtitle, WavePeakData2 wave } } - if (p.DurationTotalMilliseconds < minDurationMs) + if (p.Duration.TotalMilliseconds < minDurationMs) { s.Paragraphs[index] = oldP; } @@ -225,7 +225,7 @@ public static Subtitle ShortenLongDuration(Subtitle subtitle) foreach (var p in s.Paragraphs) { - if (p.DurationTotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) + if (p.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { p.StartTime.TotalMilliseconds = p.EndTime.TotalMilliseconds - Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds; } diff --git a/src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs b/src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs index cb71aa7dff..4c8d38d624 100644 --- a/src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs +++ b/src/ui/Features/Video/SpeechToText/SpeechToTextViewModel.cs @@ -1303,10 +1303,10 @@ private static void FixNegativeDuration(Subtitle subtitle) { var paragraph = subtitle.Paragraphs[i]; if (i > 0 && - paragraph.DurationTotalMilliseconds < 5 && paragraph.DurationTotalMilliseconds > -20 && paragraph.StartTime.TotalMilliseconds > 20) + paragraph.Duration.TotalMilliseconds < 5 && paragraph.Duration.TotalMilliseconds > -20 && paragraph.StartTime.TotalMilliseconds > 20) { var prev = subtitle.Paragraphs[i - 1]; - if (prev.DurationTotalMilliseconds < 50) + if (prev.Duration.TotalMilliseconds < 50) { continue; } diff --git a/src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs b/src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs index 420341321f..51136eff63 100644 --- a/src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs +++ b/src/ui/Features/Video/TextToSpeech/ReviewSpeech/ReviewSpeechViewModel.cs @@ -846,7 +846,7 @@ private async Task TrimAndAdjustSpeed(ReviewRow row) } var mediaInfo = FfmpegMediaInfo.Parse(currentFile); - if (mediaInfo.Duration.TotalMilliseconds <= p.DurationTotalMilliseconds + addDuration) + if (mediaInfo.Duration.TotalMilliseconds <= p.Duration.TotalMilliseconds + addDuration) { return new TtsStepResult { @@ -861,7 +861,7 @@ private async Task TrimAndAdjustSpeed(ReviewRow row) }; } - var divisor = (decimal)(p.DurationTotalMilliseconds + addDuration); + var divisor = (decimal)(p.Duration.TotalMilliseconds + addDuration); if (divisor <= 0) { return new TtsStepResult diff --git a/src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs b/src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs index 9205dae2c6..4daf1426f4 100644 --- a/src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs +++ b/src/ui/Features/Video/TextToSpeech/TextToSpeechViewModel.cs @@ -2811,7 +2811,7 @@ private ResolvedVoice ResolveVoiceForParagraph(Paragraph paragraph, CastContext } // If audio already fits after silence removal/compression, no time-stretching needed - if (mediaInfo.Duration.TotalMilliseconds <= p.DurationTotalMilliseconds + addDuration) + if (mediaInfo.Duration.TotalMilliseconds <= p.Duration.TotalMilliseconds + addDuration) { resultList.Add(new TtsStepResult { @@ -2827,7 +2827,7 @@ private ResolvedVoice ResolveVoiceForParagraph(Paragraph paragraph, CastContext continue; } - var divisor = (decimal)(p.DurationTotalMilliseconds + addDuration); + var divisor = (decimal)(p.Duration.TotalMilliseconds + addDuration); if (divisor <= 0) { resultList.Add(new TtsStepResult diff --git a/src/ui/Logic/NetflixQualityCheck/NetflixCheckMaxDuration.cs b/src/ui/Logic/NetflixQualityCheck/NetflixCheckMaxDuration.cs index 729168d8fc..83cfcf4ea6 100644 --- a/src/ui/Logic/NetflixQualityCheck/NetflixCheckMaxDuration.cs +++ b/src/ui/Logic/NetflixQualityCheck/NetflixCheckMaxDuration.cs @@ -19,7 +19,7 @@ public void Check(Subtitle subtitle, NetflixQualityController controller) { foreach (Paragraph p in subtitle.Paragraphs) { - if (p.DurationTotalMilliseconds > 7000) + if (p.Duration.TotalMilliseconds > 7000) { var fixedParagraph = new Paragraph(p, false); fixedParagraph.EndTime.TotalMilliseconds = fixedParagraph.StartTime.TotalMilliseconds + 7000; diff --git a/src/ui/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs b/src/ui/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs index 1a933e0659..be8f19a7ed 100644 --- a/src/ui/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs +++ b/src/ui/Logic/NetflixQualityCheck/NetflixCheckMinDuration.cs @@ -25,16 +25,16 @@ public void Check(Subtitle subtitle, NetflixQualityController controller) if (controller.Language == "ja") { - if (p.DurationTotalMilliseconds < 500) + if (p.Duration.TotalMilliseconds < 500) { string comment = Se.Language.Tools.NetflixCheckAndFix.MinimumDurationJapanese; - controller.AddRecord(p, p.StartTime.ToString(TimeFormatter.HhMmSsFf), p.DurationTotalSeconds.ToString(CultureInfo.InvariantCulture), comment); + controller.AddRecord(p, p.StartTime.ToString(TimeFormatter.HhMmSsFf), p.Duration.TotalSeconds.ToString(CultureInfo.InvariantCulture), comment); } continue; } var next = subtitle.GetParagraphOrDefault(index + 1); - if (p.DurationTotalMilliseconds < 833 && !p.StartTime.IsMaxTime) + if (p.Duration.TotalMilliseconds < 833 && !p.StartTime.IsMaxTime) { Paragraph? fixedParagraph = null; var canBeFixed = false;