diff --git a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ProcesserApplication.kt b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ProcesserApplication.kt index d2159a10..b1e24b78 100644 --- a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ProcesserApplication.kt +++ b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/ProcesserApplication.kt @@ -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}"} } } \ No newline at end of file diff --git a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/config/FileUtil.kt b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/config/FileUtil.kt index ae8e3969..d5a59f84 100644 --- a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/config/FileUtil.kt +++ b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/config/FileUtil.kt @@ -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) + } } \ No newline at end of file diff --git a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/FfmpegTaskListener.kt b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/FfmpegTaskListener.kt index 81a9f448..9c58301c 100644 --- a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/FfmpegTaskListener.kt +++ b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/FfmpegTaskListener.kt @@ -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 } \ No newline at end of file diff --git a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListener.kt b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListener.kt index 893a8906..055a3ba3 100644 --- a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListener.kt +++ b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/SubtitleTaskListener.kt @@ -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) { diff --git a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListener.kt b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListener.kt index b86f3808..2f5ed4c7 100644 --- a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListener.kt +++ b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/listeners/VideoTaskListener.kt @@ -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) { diff --git a/shared/ffmpeg/src/main/kotlin/no/iktdev/mediaprocessing/ffmpeg/FFmpeg.kt b/shared/ffmpeg/src/main/kotlin/no/iktdev/mediaprocessing/ffmpeg/FFmpeg.kt index 087705b9..6a9d2c84 100644 --- a/shared/ffmpeg/src/main/kotlin/no/iktdev/mediaprocessing/ffmpeg/FFmpeg.kt +++ b/shared/ffmpeg/src/main/kotlin/no/iktdev/mediaprocessing/ffmpeg/FFmpeg.kt @@ -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!!