From 8a4eeb91d3158efcd16b884bbb5dc6559d877d2e Mon Sep 17 00:00:00 2001 From: ScrubN <72096833+ScrubN@users.noreply.github.com> Date: Tue, 25 Jun 2024 17:34:47 -0400 Subject: [PATCH 1/5] Make videoLength calculation not dependent on Twitch API response --- TwitchDownloaderCore/VideoDownloader.cs | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/TwitchDownloaderCore/VideoDownloader.cs b/TwitchDownloaderCore/VideoDownloader.cs index 08b1a62e..52ce532b 100644 --- a/TwitchDownloaderCore/VideoDownloader.cs +++ b/TwitchDownloaderCore/VideoDownloader.cs @@ -96,7 +96,7 @@ private async Task DownloadAsyncImpl(FileInfo outputFileInfo, FileStream outputF var videoInfo = videoInfoResponse.data.video; var (playlist, airDate) = await GetVideoPlaylist(playlistUrl, cancellationToken); - var videoListCrop = GetStreamListTrim(playlist.Streams, videoInfo, out var videoLength, out var startOffset, out var endOffset); + var videoListCrop = GetStreamListTrim(playlist.Streams, out var videoLength, out var startOffset, out var endDuration); CheckAvailableStorageSpace(qualityPlaylist.StreamInfo.Bandwidth, videoLength); @@ -128,7 +128,7 @@ await FfmpegMetadata.SerializeAsync(metadataPath, videoInfo.owner.displayName, d var ffmpegRetries = 0; do { - ffmpegExitCode = await Task.Run(() => RunFfmpegVideoCopy(downloadFolder, outputFileInfo, concatListPath, metadataPath, startOffset, endOffset, videoLength), cancellationToken); + ffmpegExitCode = await Task.Run(() => RunFfmpegVideoCopy(downloadFolder, outputFileInfo, concatListPath, metadataPath, startOffset, endDuration, videoLength), cancellationToken); if (ffmpegExitCode != 0) { _progress.LogError($"Failed to finalize video (code {ffmpegExitCode}), retrying in 10 seconds..."); @@ -326,7 +326,7 @@ private async Task VerifyDownloadedParts(ICollection playlist, Rang } } - private int RunFfmpegVideoCopy(string tempFolder, FileInfo outputFile, string concatListPath, string metadataPath, decimal startOffset, decimal endOffset, TimeSpan videoLength) + private int RunFfmpegVideoCopy(string tempFolder, FileInfo outputFile, string concatListPath, string metadataPath, decimal startOffset, decimal endDuration, TimeSpan videoLength) { using var process = new Process { @@ -358,7 +358,7 @@ private int RunFfmpegVideoCopy(string tempFolder, FileInfo outputFile, string co }; // TODO: Make this optional - "Safe" and "Exact" trimming methods - if (endOffset > 0) + if (endDuration > 0) { args.Insert(0, "-t"); args.Insert(1, videoLength.TotalSeconds.ToString(CultureInfo.InvariantCulture)); @@ -438,15 +438,15 @@ private void HandleFfmpegOutput(string output, Regex encodingTimeRegex, TimeSpan return (playlist, airDate); } - private Range GetStreamListTrim(IList streamList, VideoInfo videoInfo, out TimeSpan videoLength, out decimal startOffset, out decimal endOffset) + private Range GetStreamListTrim(IList streamList, out TimeSpan videoLength, out decimal startOffset, out decimal endDuration) { startOffset = 0; - endOffset = 0; + endDuration = 0; var startIndex = 0; + var startTime = 0m; if (downloadOptions.TrimBeginning) { - var startTime = 0m; var trimTotalSeconds = (decimal)downloadOptions.TrimBeginningTime.TotalSeconds; foreach (var videoPart in streamList) { @@ -462,17 +462,18 @@ private Range GetStreamListTrim(IList streamList, VideoInfo videoIn } var endIndex = streamList.Count; + var endTime = streamList.Sum(x => x.PartInfo.Duration); + var endOffset = 0m; if (downloadOptions.TrimEnding) { - var endTime = streamList.Sum(x => x.PartInfo.Duration); var trimTotalSeconds = (decimal)downloadOptions.TrimEndingTime.TotalSeconds; for (var i = streamList.Count - 1; i >= 0; i--) { var videoPart = streamList[i]; if (endTime - videoPart.PartInfo.Duration < trimTotalSeconds) { - var offset = endTime - trimTotalSeconds; - if (offset > 0) endOffset = videoPart.PartInfo.Duration - offset; + endOffset = endTime - trimTotalSeconds; + if (endOffset > 0) endDuration = videoPart.PartInfo.Duration - endOffset; break; } @@ -482,9 +483,7 @@ private Range GetStreamListTrim(IList streamList, VideoInfo videoIn } } - videoLength = - (downloadOptions.TrimEnding ? downloadOptions.TrimEndingTime : TimeSpan.FromSeconds(videoInfo.lengthSeconds)) - - (downloadOptions.TrimBeginning ? downloadOptions.TrimBeginningTime : TimeSpan.Zero); + videoLength = TimeSpan.FromSeconds((double)((endTime - endOffset) - (startTime + startOffset))); return new Range(startIndex, endIndex); } From 5086a2ac3fe8ee0fee82899513ad5b32cfb032e0 Mon Sep 17 00:00:00 2001 From: ScrubN <72096833+ScrubN@users.noreply.github.com> Date: Tue, 25 Jun 2024 21:54:21 -0400 Subject: [PATCH 2/5] Implement "safe" trimming to disable fractional trimming --- TwitchDownloaderCore/Options/VideoDownloadOptions.cs | 2 ++ TwitchDownloaderCore/Tools/Enums.cs | 6 ++++++ TwitchDownloaderCore/VideoDownloader.cs | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/TwitchDownloaderCore/Options/VideoDownloadOptions.cs b/TwitchDownloaderCore/Options/VideoDownloadOptions.cs index 6f76881f..b1effc91 100644 --- a/TwitchDownloaderCore/Options/VideoDownloadOptions.cs +++ b/TwitchDownloaderCore/Options/VideoDownloadOptions.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using TwitchDownloaderCore.Tools; namespace TwitchDownloaderCore.Options { @@ -19,5 +20,6 @@ public class VideoDownloadOptions public string TempFolder { get; set; } public Func CacheCleanerCallback { get; set; } public Func FileCollisionCallback { get; set; } = info => info; + public VideoTrimMode TrimMode { get; set; } } } \ No newline at end of file diff --git a/TwitchDownloaderCore/Tools/Enums.cs b/TwitchDownloaderCore/Tools/Enums.cs index 1d2a4b94..8c7bdfaa 100644 --- a/TwitchDownloaderCore/Tools/Enums.cs +++ b/TwitchDownloaderCore/Tools/Enums.cs @@ -21,4 +21,10 @@ public enum TimestampFormat None, UtcFull } + + public enum VideoTrimMode + { + Safe, + Exact + } } \ No newline at end of file diff --git a/TwitchDownloaderCore/VideoDownloader.cs b/TwitchDownloaderCore/VideoDownloader.cs index 52ce532b..27b7e24e 100644 --- a/TwitchDownloaderCore/VideoDownloader.cs +++ b/TwitchDownloaderCore/VideoDownloader.cs @@ -483,6 +483,11 @@ private Range GetStreamListTrim(IList streamList, out TimeSpan vide } } + if (downloadOptions.TrimMode == VideoTrimMode.Safe) + { + startOffset = endOffset = endDuration = 0; + } + videoLength = TimeSpan.FromSeconds((double)((endTime - endOffset) - (startTime + startOffset))); return new Range(startIndex, endIndex); From d807eb50925a505e83230c4ab2e831ceef90cc87 Mon Sep 17 00:00:00 2001 From: ScrubN <72096833+ScrubN@users.noreply.github.com> Date: Wed, 26 Jun 2024 00:45:56 -0400 Subject: [PATCH 3/5] Implement in CLI --- TwitchDownloaderCLI/Modes/Arguments/VideoDownloadArgs.cs | 4 ++++ TwitchDownloaderCLI/Modes/DownloadVideo.cs | 1 + TwitchDownloaderCLI/README.md | 3 +++ 3 files changed, 8 insertions(+) diff --git a/TwitchDownloaderCLI/Modes/Arguments/VideoDownloadArgs.cs b/TwitchDownloaderCLI/Modes/Arguments/VideoDownloadArgs.cs index 2e2e6f0c..d419176a 100644 --- a/TwitchDownloaderCLI/Modes/Arguments/VideoDownloadArgs.cs +++ b/TwitchDownloaderCLI/Modes/Arguments/VideoDownloadArgs.cs @@ -1,5 +1,6 @@ using CommandLine; using TwitchDownloaderCLI.Models; +using TwitchDownloaderCore.Tools; namespace TwitchDownloaderCLI.Modes.Arguments { @@ -27,6 +28,9 @@ internal sealed class VideoDownloadArgs : IFileCollisionArgs, ITwitchDownloaderA [Option("bandwidth", Default = -1, HelpText = "The maximum bandwidth a thread will be allowed to use in kibibytes per second (KiB/s), or -1 for no maximum.")] public int ThrottleKib { get; set; } + [Option("trim-mode", Default = VideoTrimMode.Exact, HelpText = "Sets the trim handling. Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. Valid values are: Safe, Exact")] + public VideoTrimMode TrimMode { get; set; } + [Option("oauth", HelpText = "OAuth access token to download subscriber only VODs. DO NOT SHARE THIS WITH ANYONE.")] public string Oauth { get; set; } diff --git a/TwitchDownloaderCLI/Modes/DownloadVideo.cs b/TwitchDownloaderCLI/Modes/DownloadVideo.cs index 0e3bc722..37f2d6dd 100644 --- a/TwitchDownloaderCLI/Modes/DownloadVideo.cs +++ b/TwitchDownloaderCLI/Modes/DownloadVideo.cs @@ -68,6 +68,7 @@ private static VideoDownloadOptions GetDownloadOptions(VideoDownloadArgs inputOp TrimBeginningTime = inputOptions.TrimBeginningTime, TrimEnding = inputOptions.TrimEndingTime > TimeSpan.Zero, TrimEndingTime = inputOptions.TrimEndingTime, + TrimMode = inputOptions.TrimMode, FfmpegPath = string.IsNullOrWhiteSpace(inputOptions.FfmpegPath) ? FfmpegHandler.FfmpegExecutableName : Path.GetFullPath(inputOptions.FfmpegPath), TempFolder = inputOptions.TempFolder, CacheCleanerCallback = directoryInfos => diff --git a/TwitchDownloaderCLI/README.md b/TwitchDownloaderCLI/README.md index 3d88dae2..a88390c7 100644 --- a/TwitchDownloaderCLI/README.md +++ b/TwitchDownloaderCLI/README.md @@ -57,6 +57,9 @@ Time to trim ending. See [Time durations](#time-durations) for a more detailed e **--bandwidth** (Default: `-1`) The maximum bandwidth a thread will be allowed to use in kibibytes per second (KiB/s), or `-1` for no maximum. +**--trim-mode** +(Default: `Exact`) Sets the video trim handling. Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. Valid values are: `Safe`, `Exact`. + **--oauth** OAuth access token to download subscriber only VODs. **DO NOT SHARE YOUR OAUTH TOKEN WITH ANYONE.** From d2af84329eb11525a9b413020b788d24845332b8 Mon Sep 17 00:00:00 2001 From: ScrubN <72096833+ScrubN@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:36:41 -0400 Subject: [PATCH 4/5] Implement in WPF --- TwitchDownloaderWPF/App.config | 3 ++ TwitchDownloaderWPF/PageVodDownload.xaml | 9 ++++-- TwitchDownloaderWPF/PageVodDownload.xaml.cs | 29 +++++++++++++++++++ .../Properties/Settings.Designer.cs | 12 ++++++++ .../Properties/Settings.settings | 3 ++ TwitchDownloaderWPF/README.md | 2 ++ 6 files changed, 56 insertions(+), 2 deletions(-) diff --git a/TwitchDownloaderWPF/App.config b/TwitchDownloaderWPF/App.config index e7910a54..087773d6 100644 --- a/TwitchDownloaderWPF/App.config +++ b/TwitchDownloaderWPF/App.config @@ -232,6 +232,9 @@ False + + 1 + \ No newline at end of file diff --git a/TwitchDownloaderWPF/PageVodDownload.xaml b/TwitchDownloaderWPF/PageVodDownload.xaml index 5ed99359..87741d39 100644 --- a/TwitchDownloaderWPF/PageVodDownload.xaml +++ b/TwitchDownloaderWPF/PageVodDownload.xaml @@ -68,15 +68,20 @@ - + (?): + (?): - + + + + + diff --git a/TwitchDownloaderWPF/PageVodDownload.xaml.cs b/TwitchDownloaderWPF/PageVodDownload.xaml.cs index 9de33ad4..c2f74ddf 100644 --- a/TwitchDownloaderWPF/PageVodDownload.xaml.cs +++ b/TwitchDownloaderWPF/PageVodDownload.xaml.cs @@ -215,6 +215,12 @@ public VideoDownloadOptions GetOptions(string filename, string folder) FfmpegPath = "ffmpeg", TempFolder = Settings.Default.TempPath }; + + if (RadioTrimSafe.IsChecked == true) + options.TrimMode = VideoTrimMode.Safe; + else if (RadioTrimExact.IsChecked == true) + options.TrimMode = VideoTrimMode.Exact; + return options; } @@ -338,6 +344,11 @@ private void Page_Initialized(object sender, EventArgs e) WebRequest.DefaultWebProxy = null; numDownloadThreads.Value = Settings.Default.VodDownloadThreads; TextOauth.Text = Settings.Default.OAuth; + _ = (VideoTrimMode)Settings.Default.VodTrimMode switch + { + VideoTrimMode.Exact => RadioTrimExact.IsChecked = true, + _ => RadioTrimSafe.IsChecked = true, + }; } private void numDownloadThreads_ValueChanged(object sender, HandyControl.Data.FunctionEventArgs e) @@ -547,5 +558,23 @@ private async void TextUrl_OnKeyDown(object sender, KeyEventArgs e) e.Handled = true; } } + + private void RadioTrimSafe_OnCheckedStateChanged(object sender, RoutedEventArgs e) + { + if (IsInitialized) + { + Settings.Default.VodTrimMode = (int)VideoTrimMode.Safe; + Settings.Default.Save(); + } + } + + private void RadioTrimExact_OnCheckedStateChanged(object sender, RoutedEventArgs e) + { + if (IsInitialized) + { + Settings.Default.VodTrimMode = (int)VideoTrimMode.Exact; + Settings.Default.Save(); + } + } } } \ No newline at end of file diff --git a/TwitchDownloaderWPF/Properties/Settings.Designer.cs b/TwitchDownloaderWPF/Properties/Settings.Designer.cs index bc2bfb8b..ab2114d5 100644 --- a/TwitchDownloaderWPF/Properties/Settings.Designer.cs +++ b/TwitchDownloaderWPF/Properties/Settings.Designer.cs @@ -921,5 +921,17 @@ public bool AdjustUsernameVisibility { this["AdjustUsernameVisibility"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("1")] + public int VodTrimMode { + get { + return ((int)(this["VodTrimMode"])); + } + set { + this["VodTrimMode"] = value; + } + } } } diff --git a/TwitchDownloaderWPF/Properties/Settings.settings b/TwitchDownloaderWPF/Properties/Settings.settings index 7d8eb864..f3be4edd 100644 --- a/TwitchDownloaderWPF/Properties/Settings.settings +++ b/TwitchDownloaderWPF/Properties/Settings.settings @@ -227,6 +227,9 @@ False + + 1 + diff --git a/TwitchDownloaderWPF/README.md b/TwitchDownloaderWPF/README.md index 0e86ecb6..31b14dc4 100644 --- a/TwitchDownloaderWPF/README.md +++ b/TwitchDownloaderWPF/README.md @@ -45,6 +45,8 @@ To get started, input a valid link or ID to a VOD or highlight. If the VOD or hi **Quality**: Selects the quality of the download and provides an estimated file size. Occasionally Twitch calls the highest quality as 'Source' instead of the typical resolution formatting (1080p60 in the case of figure 1.1). +**Trim Mode**: Sets the video trim handling. Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. + **Trim**: Sets the start and end time to trim the video download in the format \[hours\] \[minutes\] \[seconds\]. Trimming the video will result in a smaller total download. **Download Threads**: The amount of parallel download threads to be dispatched. From 88d022a470d08af734640259f40fa14e0eafb0ab Mon Sep 17 00:00:00 2001 From: ScrubN <72096833+ScrubN@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:42:38 -0400 Subject: [PATCH 5/5] Update Translations --- TwitchDownloaderWPF/PageVodDownload.xaml | 6 +-- .../Translations/Strings.Designer.cs | 38 ++++++++++++++++++- .../Translations/Strings.es.resx | 12 ++++++ .../Translations/Strings.fr.resx | 12 ++++++ .../Translations/Strings.it.resx | 12 ++++++ .../Translations/Strings.ja.resx | 12 ++++++ .../Translations/Strings.pl.resx | 12 ++++++ .../Translations/Strings.pt-br.resx | 12 ++++++ TwitchDownloaderWPF/Translations/Strings.resx | 12 ++++++ .../Translations/Strings.ru.resx | 12 ++++++ .../Translations/Strings.tr.resx | 12 ++++++ .../Translations/Strings.uk.resx | 12 ++++++ .../Translations/Strings.zh-cn.resx | 12 ++++++ 13 files changed, 172 insertions(+), 4 deletions(-) diff --git a/TwitchDownloaderWPF/PageVodDownload.xaml b/TwitchDownloaderWPF/PageVodDownload.xaml index 87741d39..3b52ae01 100644 --- a/TwitchDownloaderWPF/PageVodDownload.xaml +++ b/TwitchDownloaderWPF/PageVodDownload.xaml @@ -68,7 +68,7 @@ - (?): + (?): (?): @@ -78,8 +78,8 @@ - - + + diff --git a/TwitchDownloaderWPF/Translations/Strings.Designer.cs b/TwitchDownloaderWPF/Translations/Strings.Designer.cs index e777c05e..9b2a83e4 100644 --- a/TwitchDownloaderWPF/Translations/Strings.Designer.cs +++ b/TwitchDownloaderWPF/Translations/Strings.Designer.cs @@ -2040,7 +2040,7 @@ public static string TitleGlobalSettings { } /// - /// Looks up a localized string similar to Select Render Rage (Seconds). + /// Looks up a localized string similar to Select Render Range (Seconds). /// public static string TitleRenderRange { get { @@ -2381,6 +2381,42 @@ public static string VideoTitle { } } + /// + /// Looks up a localized string similar to Trim Mode . + /// + public static string VideoTrimMode { + get { + return ResourceManager.GetString("VideoTrimMode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exact. + /// + public static string VideoTrimModeExact { + get { + return ResourceManager.GetString("VideoTrimModeExact", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Safe. + /// + public static string VideoTrimModeSafe { + get { + return ResourceManager.GetString("VideoTrimModeSafe", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video.. + /// + public static string VideoTrimModeTooltip { + get { + return ResourceManager.GetString("VideoTrimModeTooltip", resourceCulture); + } + } + /// /// Looks up a localized string similar to VOD/Clip Link:. /// diff --git a/TwitchDownloaderWPF/Translations/Strings.es.resx b/TwitchDownloaderWPF/Translations/Strings.es.resx index 20651baa..4acc408d 100644 --- a/TwitchDownloaderWPF/Translations/Strings.es.resx +++ b/TwitchDownloaderWPF/Translations/Strings.es.resx @@ -928,4 +928,16 @@ Remember my choice for this session + + Trim Mode Leave a trailing space + + + Safe + + + Exact + + + Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. + diff --git a/TwitchDownloaderWPF/Translations/Strings.fr.resx b/TwitchDownloaderWPF/Translations/Strings.fr.resx index 4387c5cf..7c0ea914 100644 --- a/TwitchDownloaderWPF/Translations/Strings.fr.resx +++ b/TwitchDownloaderWPF/Translations/Strings.fr.resx @@ -927,4 +927,16 @@ Remember my choice for this session + + Trim Mode Leave a trailing space + + + Safe + + + Exact + + + Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. + \ No newline at end of file diff --git a/TwitchDownloaderWPF/Translations/Strings.it.resx b/TwitchDownloaderWPF/Translations/Strings.it.resx index 4eefecd3..dc8b540b 100644 --- a/TwitchDownloaderWPF/Translations/Strings.it.resx +++ b/TwitchDownloaderWPF/Translations/Strings.it.resx @@ -928,4 +928,16 @@ Remember my choice for this session + + Trim Mode Leave a trailing space + + + Safe + + + Exact + + + Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. + diff --git a/TwitchDownloaderWPF/Translations/Strings.ja.resx b/TwitchDownloaderWPF/Translations/Strings.ja.resx index 98320801..8ee84dcb 100644 --- a/TwitchDownloaderWPF/Translations/Strings.ja.resx +++ b/TwitchDownloaderWPF/Translations/Strings.ja.resx @@ -926,4 +926,16 @@ Remember my choice for this session + + Trim Mode Leave a trailing space + + + Safe + + + Exact + + + Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. + \ No newline at end of file diff --git a/TwitchDownloaderWPF/Translations/Strings.pl.resx b/TwitchDownloaderWPF/Translations/Strings.pl.resx index 06119d9a..fa5d6c37 100644 --- a/TwitchDownloaderWPF/Translations/Strings.pl.resx +++ b/TwitchDownloaderWPF/Translations/Strings.pl.resx @@ -927,4 +927,16 @@ Remember my choice for this session + + Trim Mode Leave a trailing space + + + Safe + + + Exact + + + Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. + \ No newline at end of file diff --git a/TwitchDownloaderWPF/Translations/Strings.pt-br.resx b/TwitchDownloaderWPF/Translations/Strings.pt-br.resx index 1ee7a5f5..2b754c6f 100644 --- a/TwitchDownloaderWPF/Translations/Strings.pt-br.resx +++ b/TwitchDownloaderWPF/Translations/Strings.pt-br.resx @@ -926,4 +926,16 @@ Remember my choice for this session + + Trim Mode Leave a trailing space + + + Safe + + + Exact + + + Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. + \ No newline at end of file diff --git a/TwitchDownloaderWPF/Translations/Strings.resx b/TwitchDownloaderWPF/Translations/Strings.resx index cf47bc92..f378f4f2 100644 --- a/TwitchDownloaderWPF/Translations/Strings.resx +++ b/TwitchDownloaderWPF/Translations/Strings.resx @@ -926,4 +926,16 @@ Remember my choice for this session + + Trim Mode Leave a trailing space + + + Safe + + + Exact + + + Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. + \ No newline at end of file diff --git a/TwitchDownloaderWPF/Translations/Strings.ru.resx b/TwitchDownloaderWPF/Translations/Strings.ru.resx index 1445a5e2..02b3d590 100644 --- a/TwitchDownloaderWPF/Translations/Strings.ru.resx +++ b/TwitchDownloaderWPF/Translations/Strings.ru.resx @@ -927,4 +927,16 @@ Remember my choice for this session + + Trim Mode Leave a trailing space + + + Safe + + + Exact + + + Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. + \ No newline at end of file diff --git a/TwitchDownloaderWPF/Translations/Strings.tr.resx b/TwitchDownloaderWPF/Translations/Strings.tr.resx index 694d1a60..b2aa4e33 100644 --- a/TwitchDownloaderWPF/Translations/Strings.tr.resx +++ b/TwitchDownloaderWPF/Translations/Strings.tr.resx @@ -928,4 +928,16 @@ Remember my choice for this session + + Trim Mode Leave a trailing space + + + Safe + + + Exact + + + Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. + \ No newline at end of file diff --git a/TwitchDownloaderWPF/Translations/Strings.uk.resx b/TwitchDownloaderWPF/Translations/Strings.uk.resx index 7608071c..10717467 100644 --- a/TwitchDownloaderWPF/Translations/Strings.uk.resx +++ b/TwitchDownloaderWPF/Translations/Strings.uk.resx @@ -927,4 +927,16 @@ Remember my choice for this session + + Trim Mode Leave a trailing space + + + Safe + + + Exact + + + Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. + diff --git a/TwitchDownloaderWPF/Translations/Strings.zh-cn.resx b/TwitchDownloaderWPF/Translations/Strings.zh-cn.resx index ea4d50dd..d1a01a54 100644 --- a/TwitchDownloaderWPF/Translations/Strings.zh-cn.resx +++ b/TwitchDownloaderWPF/Translations/Strings.zh-cn.resx @@ -929,4 +929,16 @@ 记住我的选择 + + Trim Mode Leave a trailing space + + + Safe + + + Exact + + + Videos trimmed with exact trim may rarely experience video/audio stuttering within the first/last few seconds. Safe trimming is guaranteed to not stutter but may result in a slightly longer video. +