This commit is contained in:
Brage Skjønborg 2026-02-02 00:31:53 +01:00
parent d76388c28b
commit 174ac51736
6 changed files with 71 additions and 61 deletions

View File

@ -16,13 +16,12 @@ import no.iktdev.mediaprocessing.shared.common.event_task_contract.TaskRegistry
import no.iktdev.mediaprocessing.shared.common.getAppVersion
import no.iktdev.mediaprocessing.shared.database.DatabaseApplication
import no.iktdev.mediaprocessing.shared.database.DatabasebasedMediaProcessingApp
import org.springframework.boot.context.properties.ConfigurationPropertiesScan
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.boot.runApplication
import org.springframework.context.annotation.Configuration
@DatabasebasedMediaProcessingApp
@ConfigurationPropertiesScan("no.iktdev.mediaprocessing.processer")
class ProcesserApplication: DatabaseApplication() {
}
@ -78,6 +77,7 @@ class ProcesserConfig(
require(directoryProperties.logs.isNotBlank()) {
"directories.logs must be set"
}
log.info {"Logs will be stored in ${directoryProperties.logs}"}
}
}

View File

@ -11,11 +11,10 @@ class FileUtil(
private val dirs: DirectoryProperties,
private val mediaPaths: MediaPaths
) {
init {
assert(dirs.logs != null)
}
fun getTemporaryStoreFile(fileName: String): File =
File(mediaPaths.cache).using(fileName)
fun getLogDirectory(): File = File(dirs.logs)
fun getLogDirectory(): File {
return File(dirs.logs)
}
}

View File

@ -3,7 +3,19 @@ package no.iktdev.mediaprocessing.processer.listeners
import no.iktdev.eventi.tasks.TaskListener
import no.iktdev.eventi.tasks.TaskType
import no.iktdev.mediaprocessing.ffmpeg.FFmpeg
import no.iktdev.mediaprocessing.ffmpeg.FFmpeg.Listener
import java.io.File
abstract class FfmpegTaskListener(taskType: TaskType): TaskListener(taskType) {
abstract fun getFfmpeg(): FFmpeg
open fun getFfmpeg(listener: Listener? = null, execPath: String, logDirectory: File): FFmpeg {
return buildFfmpeg(
listener = listener,
execPath = execPath,
logDirectory = logDirectory,
).also {
it.onCreate()
}
}
abstract fun buildFfmpeg(listener: Listener? = null, execPath: String, logDirectory: File): FFmpeg
}

View File

@ -9,8 +9,8 @@ import no.iktdev.eventi.tasks.TaskType
import no.iktdev.exfl.using
import no.iktdev.mediaprocessing.ffmpeg.FFmpeg
import no.iktdev.mediaprocessing.ffmpeg.arguments.MpegArgument
import no.iktdev.mediaprocessing.processer.config.FileUtil
import no.iktdev.mediaprocessing.processer.config.ExecutablesConfig
import no.iktdev.mediaprocessing.processer.config.FileUtil
import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.ProcesserExtractResultEvent
import no.iktdev.mediaprocessing.shared.common.event_task_contract.tasks.ExtractSubtitleTask
import org.springframework.stereotype.Service
@ -60,7 +60,8 @@ class SubtitleTaskListener(
.outputFile(cachedOutFile.absolutePath)
.args(taskData.data.arguments)
val result = getFfmpeg()
val logDirectory = fileUtil.getLogDirectory().using("subtitles")
val result = getFfmpeg(execPath = executableConfig.ffmpeg, logDirectory = logDirectory)
withHeartbeatRunner {
reporter?.updateLastSeen(task.taskId)
}
@ -91,12 +92,10 @@ class SubtitleTaskListener(
return ProcesserExtractResultEvent(null, status, error = message).producedFrom(task)
}
override fun getFfmpeg(): FFmpeg {
val logDirectory = fileUtil.getLogDirectory().using("subtitles")
return SubtitleFFmpeg(null, executableConfig.ffmpeg, logDirectory)
override fun buildFfmpeg(listener: FFmpeg.Listener?, execPath: String, logDirectory: File): FFmpeg {
return SubtitleFFmpeg(listener, executableConfig.ffmpeg, logDirectory)
}
class SubtitleFFmpeg(override val listener: Listener? = null, private val executablePath: String, val logDirectory: File) :
FFmpeg(executable = executablePath, logDir = logDirectory) {

View File

@ -11,9 +11,9 @@ import no.iktdev.mediaprocessing.ffmpeg.FFmpeg
import no.iktdev.mediaprocessing.ffmpeg.arguments.MpegArgument
import no.iktdev.mediaprocessing.ffmpeg.decoder.FfmpegDecodedProgress
import no.iktdev.mediaprocessing.processer.CoordinatorClient
import no.iktdev.mediaprocessing.processer.config.FileUtil
import no.iktdev.mediaprocessing.processer.LocalProgressCache
import no.iktdev.mediaprocessing.processer.config.ExecutablesConfig
import no.iktdev.mediaprocessing.processer.config.FileUtil
import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.ProcesserEncodeResultEvent
import no.iktdev.mediaprocessing.shared.common.event_task_contract.tasks.EncodeTask
import org.springframework.stereotype.Service
@ -63,7 +63,12 @@ class VideoTaskListener(
.args(taskData.data.arguments)
.withProgress(true)
val result = getFfmpeg()
val logDirectory = fileUtil.getLogDirectory().using("encode")
val result = getFfmpeg(
listener = listener,
logDirectory = logDirectory,
execPath = executableConfig.ffmpeg
)
withHeartbeatRunner {
reporter?.updateLastSeen(task.taskId)
}
@ -97,53 +102,52 @@ class VideoTaskListener(
return ProcesserEncodeResultEvent(null, null, status, error = message).producedFrom(task)
}
val listener = object : FFmpeg.Listener {
var lastProgress: FfmpegDecodedProgress? = null
override fun onStarted(inputFile: String) {
}
override fun getFfmpeg(): FFmpeg {
val logDirectory = fileUtil.getLogDirectory().using("encode")
return VideoFFmpeg(execPath = executableConfig.ffmpeg,
logDirectory = logDirectory,
listener = object : FFmpeg.Listener {
var lastProgress: FfmpegDecodedProgress? = null
override fun onStarted(inputFile: String) {
override fun onCompleted(inputFile: String, outputFile: String) {
currentTask?.let {
coordinatorWebClient.reportProgress(
referenceId = it.referenceId.toString(),
taskId = it.taskId.toString(),
percent = FfmpegDecodedProgress(
100,
"",
lastProgress?.duration ?: "",
"0",
estimatedCompletion = "",
estimatedCompletionSeconds = 0
),
""
)
}
}
override fun onProgressChanged(
inputFile: String,
progress: FfmpegDecodedProgress
) {
lastProgress = progress
currentTask?.let {
localProgress.update(it.taskId, progress)
coordinatorWebClient.reportProgress(
referenceId = it.referenceId.toString(),
taskId = it.taskId.toString(),
percent = progress,
""
)
}
override fun onCompleted(inputFile: String, outputFile: String) {
currentTask?.let {
coordinatorWebClient.reportProgress(
referenceId = it.referenceId.toString(),
taskId = it.taskId.toString(),
percent = FfmpegDecodedProgress(
100,
"",
lastProgress?.duration ?: "",
"0",
estimatedCompletion = "",
estimatedCompletionSeconds = 0
),
""
)
}
}
override fun onProgressChanged(
inputFile: String,
progress: FfmpegDecodedProgress
) {
lastProgress = progress
currentTask?.let {
localProgress.update(it.taskId, progress)
coordinatorWebClient.reportProgress(
referenceId = it.referenceId.toString(),
taskId = it.taskId.toString(),
percent = progress,
""
)
}
}
})
}
}
override fun buildFfmpeg(listener: FFmpeg.Listener?, execPath: String, logDirectory: File): FFmpeg {
return VideoFFmpeg(execPath = executableConfig.ffmpeg,
logDirectory = logDirectory,
listener = listener)
}
class VideoFFmpeg(override val listener: Listener? = null, private val execPath: String, val logDirectory: File) :
FFmpeg(executable = execPath, logDir = logDirectory) {

View File

@ -36,10 +36,6 @@ open class FFmpeg(val executable: String, val logDir: File) {
open fun onCreate() {}
init {
onCreate()
}
protected lateinit var inputFile: String
open suspend fun run(argument: MpegArgument) {
inputFile = if (argument.inputFile == null) throw RuntimeException("Input file is required") else argument.inputFile!!