From c464b110da3ea6f191665af4839431615f35779c Mon Sep 17 00:00:00 2001 From: bskjon Date: Thu, 20 Mar 2025 00:19:56 +0100 Subject: [PATCH] Fixed duration to set progress --- .../processer/ffmpeg/FfmpegRunner.kt | 2 +- .../ffmpeg/progress/FfmpegProgressDecoder.kt | 30 +++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ffmpeg/FfmpegRunner.kt b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ffmpeg/FfmpegRunner.kt index e747332c..abb15062 100644 --- a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ffmpeg/FfmpegRunner.kt +++ b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ffmpeg/FfmpegRunner.kt @@ -111,7 +111,7 @@ class FfmpegRunner( fun onOutputChanged(line: String) { outputCache.add(line) writeToLog(line) - + decoder.defineDuration(line) decoder.parseVideoProgress(outputCache.toList())?.let { decoded -> try { val _progress = decoder.getProgress(decoded) diff --git a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ffmpeg/progress/FfmpegProgressDecoder.kt b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ffmpeg/progress/FfmpegProgressDecoder.kt index d92ae309..23a5b46f 100644 --- a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ffmpeg/progress/FfmpegProgressDecoder.kt +++ b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ffmpeg/progress/FfmpegProgressDecoder.kt @@ -1,5 +1,6 @@ package no.iktdev.mediaprocessing.processer.ffmpeg.progress +import mu.KotlinLogging import java.lang.StringBuilder import java.time.LocalTime import java.time.format.DateTimeFormatter @@ -7,6 +8,7 @@ import java.util.concurrent.TimeUnit import kotlin.math.floor class FfmpegProgressDecoder { + private val log = KotlinLogging.logger {} data class DecodedProgressData( val frame: Int?, @@ -81,13 +83,29 @@ class FfmpegProgressDecoder { } - fun isDuration(value: String): Boolean { - return value.contains("Duration", ignoreCase = true) - } - fun setDuration(value: String) { + val parsedDurations: MutableList = mutableListOf() + var hasReadContinue: Boolean = false + fun defineDuration(value: String) { + if (hasReadContinue) { + return + } + if (value.contains(Regex("progress=continue"))) { + hasReadContinue = true + } + val results = Regex("Duration:\\s*([^,]+),").find(value)?.groupValues?.firstOrNull() - durationTime = Regex("[0-9]+:[0-9]+:[0-9]+.[0-9]+").find(results.toString())?.value ?: "NA" - duration = timeSpanToSeconds(results) + log.info { "Identified duration for estimation $results" } + + val parsedDuration = Regex("[0-9]+:[0-9]+:[0-9]+.[0-9]+").find(results.toString())?.value ?: return + if (!parsedDurations.contains(parsedDuration)) { + parsedDurations.add(parsedDuration) + } + + val longestDuration = parsedDurations.mapNotNull { + timeSpanToSeconds(it) + }.maxOrNull() ?: return + + duration = longestDuration } private fun timeSpanToSeconds(time: String?): Int?