diff --git a/TwitchDownloaderCore/ChatRenderer.cs b/TwitchDownloaderCore/ChatRenderer.cs index 5241de47..2851ccd3 100644 --- a/TwitchDownloaderCore/ChatRenderer.cs +++ b/TwitchDownloaderCore/ChatRenderer.cs @@ -390,6 +390,8 @@ private FfmpegProcess GetFfmpegProcess(FileInfo fileInfo) } }; + _progress.LogVerbose($"Running \"{renderOptions.FfmpegPath}\" in \"{process.StartInfo.WorkingDirectory}\" with args: {process.StartInfo.Arguments}"); + process.Start(); process.BeginErrorReadLine(); process.BeginOutputReadLine(); diff --git a/TwitchDownloaderCore/VideoDownloader.cs b/TwitchDownloaderCore/VideoDownloader.cs index b32d10f6..3e1841d6 100644 --- a/TwitchDownloaderCore/VideoDownloader.cs +++ b/TwitchDownloaderCore/VideoDownloader.cs @@ -90,6 +90,8 @@ private async Task DownloadAsyncImpl(FileInfo outputFileInfo, FileStream outputF CheckAvailableStorageSpace(qualityPlaylist.StreamInfo.Bandwidth, videoLength); + var streamIds = GetStreamIds(playlist); + if (Directory.Exists(downloadFolder)) Directory.Delete(downloadFolder, true); TwitchHelper.CreateDirectory(downloadFolder); @@ -109,7 +111,7 @@ await FfmpegMetadata.SerializeAsync(metadataPath, downloadOptions.Id.ToString(), videoChapterResponse.data.video.moments.edges); var concatListPath = Path.Combine(downloadFolder, "concat.txt"); - await FfmpegConcatList.SerializeAsync(concatListPath, playlist, videoListCrop, cancellationToken); + await FfmpegConcatList.SerializeAsync(concatListPath, playlist, videoListCrop, streamIds, cancellationToken); outputFs.Close(); @@ -145,6 +147,20 @@ await FfmpegMetadata.SerializeAsync(metadataPath, downloadOptions.Id.ToString(), } } + private FfmpegConcatList.StreamIds GetStreamIds(M3U8 playlist) + { + var path = DownloadTools.RemoveQueryString(playlist.Streams.FirstOrDefault()?.Path ?? ""); + var extension = Path.GetExtension(path); + if (extension is ".mp4") + return FfmpegConcatList.StreamIds.Mp4; + + if (extension is ".ts") + return FfmpegConcatList.StreamIds.TransportStream; + + _progress.LogWarning("No file extension was found! Assuming TS."); + return FfmpegConcatList.StreamIds.TransportStream; + } + private void CheckAvailableStorageSpace(int bandwidth, TimeSpan videoLength) { var videoSizeInBytes = VideoSizeEstimator.EstimateVideoSize(bandwidth, @@ -318,7 +334,8 @@ private async Task VerifyDownloadedParts(ICollection playlist, Rang } } - private async Task RunFfmpegVideoCopy(string tempFolder, FileInfo outputFile, string concatListPath, string metadataPath, decimal startOffset, decimal endDuration, TimeSpan videoLength, bool disableAudioCopy, CancellationToken cancellationToken) + private async Task RunFfmpegVideoCopy(string tempFolder, FileInfo outputFile, string concatListPath, string metadataPath, decimal startOffset, decimal endDuration, TimeSpan videoLength, bool disableAudioCopy, + CancellationToken cancellationToken) { using var process = new Process { @@ -386,6 +403,8 @@ private async Task RunFfmpegVideoCopy(string tempFolder, FileInfo outputFil HandleFfmpegOutput(e.Data, encodingTimeRegex, videoLength); }; + _progress.LogVerbose($"Running \"{downloadOptions.FfmpegPath}\" in \"{process.StartInfo.WorkingDirectory}\" with args: {CombineArguments(process.StartInfo.ArgumentList)}"); + process.Start(); process.BeginErrorReadLine(); @@ -401,6 +420,17 @@ private async Task RunFfmpegVideoCopy(string tempFolder, FileInfo outputFil } while (!process.HasExited || !logQueue.IsEmpty); return process.ExitCode; + + static string CombineArguments(IEnumerable args) + { + return string.Join(' ', args.Select(x => + { + if (!x.StartsWith('"') && !x.StartsWith('\'') && x.Contains(' ')) + return $"\"{x}\""; + + return x; + })); + } } private void HandleFfmpegOutput(string output, Regex encodingTimeRegex, TimeSpan videoLength)