Update
This commit is contained in:
parent
3efc04744c
commit
9c7e42ae29
@ -57,7 +57,6 @@ dependencies {
|
|||||||
implementation("com.github.pgreze:kotlin-process:1.4.1")
|
implementation("com.github.pgreze:kotlin-process:1.4.1")
|
||||||
|
|
||||||
implementation(project(mapOf("path" to ":shared:eventi")))
|
implementation(project(mapOf("path" to ":shared:eventi")))
|
||||||
implementation(project(mapOf("path" to ":shared:contract")))
|
|
||||||
implementation(project(mapOf("path" to ":shared:common")))
|
implementation(project(mapOf("path" to ":shared:common")))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,8 +6,11 @@ import no.iktdev.exfl.coroutines.CoroutinesIO
|
|||||||
import no.iktdev.exfl.observable.Observables
|
import no.iktdev.exfl.observable.Observables
|
||||||
import no.iktdev.mediaprocessing.shared.common.DatabaseEnvConfig
|
import no.iktdev.mediaprocessing.shared.common.DatabaseEnvConfig
|
||||||
import no.iktdev.eventi.database.MySqlDataSource
|
import no.iktdev.eventi.database.MySqlDataSource
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.cal.RunnerManager
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.cal.TasksManager
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.tables.runners
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.tables.tasks
|
||||||
import no.iktdev.mediaprocessing.shared.common.getAppVersion
|
import no.iktdev.mediaprocessing.shared.common.getAppVersion
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.*
|
|
||||||
import no.iktdev.mediaprocessing.shared.common.toEventsDatabase
|
import no.iktdev.mediaprocessing.shared.common.toEventsDatabase
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication
|
import org.springframework.boot.autoconfigure.SpringBootApplication
|
||||||
import org.springframework.boot.runApplication
|
import org.springframework.boot.runApplication
|
||||||
|
|||||||
@ -2,11 +2,10 @@ package no.iktdev.mediaprocessing.converter
|
|||||||
|
|
||||||
import mu.KotlinLogging
|
import mu.KotlinLogging
|
||||||
import no.iktdev.mediaprocessing.shared.common.*
|
import no.iktdev.mediaprocessing.shared.common.*
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.ActiveMode
|
import no.iktdev.mediaprocessing.shared.common.database.cal.ActiveMode
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.RunnerManager
|
import no.iktdev.mediaprocessing.shared.common.database.cal.RunnerManager
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
import org.springframework.beans.factory.annotation.Value
|
|
||||||
import org.springframework.scheduling.annotation.EnableScheduling
|
import org.springframework.scheduling.annotation.EnableScheduling
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
|||||||
@ -8,8 +8,8 @@ import no.iktdev.library.subtitle.export.Export
|
|||||||
import no.iktdev.library.subtitle.reader.BaseReader
|
import no.iktdev.library.subtitle.reader.BaseReader
|
||||||
import no.iktdev.library.subtitle.reader.Reader
|
import no.iktdev.library.subtitle.reader.Reader
|
||||||
import no.iktdev.mediaprocessing.converter.ConverterEnv
|
import no.iktdev.mediaprocessing.converter.ConverterEnv
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.ConvertData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.ConvertData
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.SubtitleFormats
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.SubtitleFormats
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.jvm.Throws
|
import kotlin.jvm.Throws
|
||||||
|
|
||||||
|
|||||||
@ -8,12 +8,12 @@ import no.iktdev.eventi.data.EventStatus
|
|||||||
import no.iktdev.mediaprocessing.converter.*
|
import no.iktdev.mediaprocessing.converter.*
|
||||||
import no.iktdev.mediaprocessing.converter.convert.ConvertListener
|
import no.iktdev.mediaprocessing.converter.convert.ConvertListener
|
||||||
import no.iktdev.mediaprocessing.converter.convert.Converter2
|
import no.iktdev.mediaprocessing.converter.convert.Converter2
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.Status
|
import no.iktdev.mediaprocessing.shared.common.database.cal.Status
|
||||||
import no.iktdev.mediaprocessing.shared.common.services.TaskService
|
import no.iktdev.mediaprocessing.shared.common.services.TaskService
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.Task
|
import no.iktdev.mediaprocessing.shared.common.task.Task
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.ConvertData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.ConvertData
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.ConvertWorkPerformed
|
import no.iktdev.mediaprocessing.shared.common.contract.data.ConvertWorkPerformed
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.ConvertedData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.ConvertedData
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
|||||||
@ -46,7 +46,6 @@ dependencies {
|
|||||||
//implementation(project(mapOf("path" to ":shared")))
|
//implementation(project(mapOf("path" to ":shared")))
|
||||||
|
|
||||||
implementation(project(mapOf("path" to ":shared:eventi")))
|
implementation(project(mapOf("path" to ":shared:eventi")))
|
||||||
implementation(project(mapOf("path" to ":shared:contract")))
|
|
||||||
implementation(project(mapOf("path" to ":shared:common")))
|
implementation(project(mapOf("path" to ":shared:common")))
|
||||||
|
|
||||||
implementation("org.jetbrains.exposed:exposed-core:$exposedVersion")
|
implementation("org.jetbrains.exposed:exposed-core:$exposedVersion")
|
||||||
|
|||||||
@ -7,7 +7,8 @@ import no.iktdev.exfl.coroutines.CoroutinesIO
|
|||||||
import no.iktdev.exfl.observable.Observables
|
import no.iktdev.exfl.observable.Observables
|
||||||
import no.iktdev.mediaprocessing.shared.common.*
|
import no.iktdev.mediaprocessing.shared.common.*
|
||||||
import no.iktdev.eventi.database.MySqlDataSource
|
import no.iktdev.eventi.database.MySqlDataSource
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.*
|
import no.iktdev.mediaprocessing.shared.common.database.cal.RunnerManager
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.cal.TasksManager
|
||||||
import no.iktdev.streamit.library.db.tables.*
|
import no.iktdev.streamit.library.db.tables.*
|
||||||
import no.iktdev.streamit.library.db.tables.helper.cast_errors
|
import no.iktdev.streamit.library.db.tables.helper.cast_errors
|
||||||
import no.iktdev.streamit.library.db.tables.helper.data_audio
|
import no.iktdev.streamit.library.db.tables.helper.data_audio
|
||||||
|
|||||||
@ -5,13 +5,13 @@ import no.iktdev.eventi.data.EventStatus
|
|||||||
import no.iktdev.eventi.data.eventId
|
import no.iktdev.eventi.data.eventId
|
||||||
import no.iktdev.eventi.implementations.ActiveMode
|
import no.iktdev.eventi.implementations.ActiveMode
|
||||||
import no.iktdev.eventi.implementations.EventCoordinator
|
import no.iktdev.eventi.implementations.EventCoordinator
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ProcessType
|
import no.iktdev.mediaprocessing.shared.common.contract.ProcessType
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.MediaProcessStartEvent
|
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaProcessStartEvent
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.PermitWorkCreationEvent
|
import no.iktdev.mediaprocessing.shared.common.contract.data.PermitWorkCreationEvent
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.StartEventData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.StartEventData
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.context.ApplicationContext
|
import org.springframework.context.ApplicationContext
|
||||||
import org.springframework.stereotype.Component
|
import org.springframework.stereotype.Component
|
||||||
@ -73,7 +73,8 @@ class Coordinator(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
produceNewEvent(PermitWorkCreationEvent(
|
produceNewEvent(
|
||||||
|
no.iktdev.mediaprocessing.shared.common.contract.data.PermitWorkCreationEvent(
|
||||||
metadata = EventMetadata(
|
metadata = EventMetadata(
|
||||||
referenceId = referenceId,
|
referenceId = referenceId,
|
||||||
derivedFromEventId = eventToAttachTo.eventId(),
|
derivedFromEventId = eventToAttachTo.eventId(),
|
||||||
@ -81,7 +82,8 @@ class Coordinator(
|
|||||||
source = getProducerName()
|
source = getProducerName()
|
||||||
),
|
),
|
||||||
data = message
|
data = message
|
||||||
))
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getActiveTaskMode(): ActiveMode {
|
override fun getActiveTaskMode(): ActiveMode {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator
|
package no.iktdev.mediaprocessing.coordinator
|
||||||
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
|
||||||
|
|
||||||
abstract class CoordinatorEventListener(): EventsListenerContract<EventsManager, Coordinator>() {
|
abstract class CoordinatorEventListener(): EventsListenerContract<EventsManager, Coordinator>() {
|
||||||
abstract override val produceEvent: Events
|
abstract override val produceEvent: Events
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator
|
package no.iktdev.mediaprocessing.coordinator
|
||||||
|
|
||||||
import no.iktdev.mediaprocessing.shared.common.DatabaseEnvConfig
|
import no.iktdev.mediaprocessing.shared.common.DatabaseEnvConfig
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.allEvents
|
import no.iktdev.mediaprocessing.shared.common.database.tables.allEvents
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.events
|
import no.iktdev.mediaprocessing.shared.common.database.tables.events
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.runners
|
import no.iktdev.mediaprocessing.shared.common.database.tables.runners
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.tasks
|
import no.iktdev.mediaprocessing.shared.common.database.tables.tasks
|
||||||
import no.iktdev.mediaprocessing.shared.common.toEventsDatabase
|
import no.iktdev.mediaprocessing.shared.common.toEventsDatabase
|
||||||
|
|
||||||
class EventsDatabase() {
|
class EventsDatabase() {
|
||||||
|
|||||||
@ -1,18 +1,18 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator
|
package no.iktdev.mediaprocessing.coordinator
|
||||||
|
|
||||||
import no.iktdev.eventi.core.PersistentMessageHelper
|
import no.iktdev.eventi.core.PersistentMessageHelper
|
||||||
import no.iktdev.eventi.data.derivedFromEventId
|
|
||||||
import no.iktdev.eventi.data.eventId
|
import no.iktdev.eventi.data.eventId
|
||||||
import no.iktdev.eventi.data.referenceId
|
import no.iktdev.eventi.data.referenceId
|
||||||
import no.iktdev.eventi.data.toJson
|
import no.iktdev.eventi.data.toJson
|
||||||
import no.iktdev.eventi.database.DataSource
|
import no.iktdev.eventi.database.DataSource
|
||||||
import no.iktdev.eventi.database.isCausedByDuplicateError
|
import no.iktdev.eventi.database.isCausedByDuplicateError
|
||||||
import no.iktdev.eventi.database.isExposedSqlException
|
import no.iktdev.eventi.database.isExposedSqlException
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.*
|
import no.iktdev.mediaprocessing.shared.common.database.tables.allEvents
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.database.tables.events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.fromJsonWithDeserializer
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.fromJsonWithDeserializer
|
||||||
import org.jetbrains.exposed.exceptions.ExposedSQLException
|
import org.jetbrains.exposed.exceptions.ExposedSQLException
|
||||||
import org.jetbrains.exposed.sql.*
|
import org.jetbrains.exposed.sql.*
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package no.iktdev.mediaprocessing.coordinator.controller
|
|||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
||||||
import no.iktdev.mediaprocessing.coordinator.EventsManager
|
import no.iktdev.mediaprocessing.coordinator.EventsManager
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.RequestWorkProceed
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.RequestWorkProceed
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.http.HttpStatus
|
import org.springframework.http.HttpStatus
|
||||||
import org.springframework.http.ResponseEntity
|
import org.springframework.http.ResponseEntity
|
||||||
|
|||||||
@ -2,9 +2,9 @@ package no.iktdev.mediaprocessing.coordinator.controller
|
|||||||
|
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ProcessType
|
import no.iktdev.mediaprocessing.shared.common.contract.ProcessType
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.EventRequest
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.EventRequest
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.http.HttpStatus
|
import org.springframework.http.HttpStatus
|
||||||
import org.springframework.http.ResponseEntity
|
import org.springframework.http.ResponseEntity
|
||||||
|
|||||||
@ -1,63 +0,0 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator.mapping
|
|
||||||
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.reader.MetadataDto
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.reader.SummaryInfo
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
|
|
||||||
class MetadataMapping(val events: List<Event>) {
|
|
||||||
//var collection: String?
|
|
||||||
init {
|
|
||||||
// collection = findCollection()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* fun map(): MetadataDto? {
|
|
||||||
val baseInfo = events.find { it.data is BaseInfoPerformed }?.data as BaseInfoPerformed?
|
|
||||||
val mediaReadOut = events.find { it.data is VideoInfoPerformed }?.data as VideoInfoPerformed?
|
|
||||||
val meta = events.find { it.data is MetadataPerformed }?.data as MetadataPerformed?
|
|
||||||
|
|
||||||
val coverDownloadTask = events.find { it.data is CoverInfoPerformed }?.data as CoverInfoPerformed?
|
|
||||||
val cover = events.find { it.data is CoverDownloadWorkPerformed }?.data as CoverDownloadWorkPerformed?
|
|
||||||
|
|
||||||
if (!baseInfo.isSuccess()) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
val videoInfo = mediaReadOut?.toValueObject()
|
|
||||||
|
|
||||||
|
|
||||||
val mediaCover = if (coverDownloadTask != null || cover != null) {
|
|
||||||
val coverFile = cover?.coverFile?.let { File(it) }
|
|
||||||
MetadataCoverDto(
|
|
||||||
cover = coverFile?.name,
|
|
||||||
coverFile = cover?.coverFile,
|
|
||||||
coverUrl = coverDownloadTask?.url
|
|
||||||
)
|
|
||||||
} else null
|
|
||||||
|
|
||||||
return if (meta != null || videoInfo != null) {
|
|
||||||
|
|
||||||
MetadataDto(
|
|
||||||
title = videoInfo?.title ?: baseInfo?.title ?: meta?.data?.title ?: return null,
|
|
||||||
collection = collection ?: return null,
|
|
||||||
cover = mediaCover,
|
|
||||||
type = meta?.data?.type ?: videoInfo?.type ?: return null,
|
|
||||||
summary = meta?.data?.summary?.filter {it.summary != null }?.map { SummaryInfo(language = it.language, summary = it.summary!! ) } ?: emptyList(),
|
|
||||||
genres = meta?.data?.genres ?: emptyList(),
|
|
||||||
titles = (meta?.data?.altTitle ?: emptyList()) + listOfNotNull(videoInfo?.title, baseInfo?.title)
|
|
||||||
)
|
|
||||||
} else null
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun findCollection(): String? {
|
|
||||||
val mediaReadOut = events.find { it.data is VideoInfoPerformed }?.data as VideoInfoPerformed?
|
|
||||||
val baseInfo = events.find { it.data is BaseInfoPerformed }?.data as BaseInfoPerformed?
|
|
||||||
if (!baseInfo.isSuccess()) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
return mediaReadOut?.outDirectory?.let { File(it).name } ?: baseInfo?.title
|
|
||||||
}*/
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator.mapping
|
|
||||||
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.reader.OutputFilesDto
|
|
||||||
|
|
||||||
class OutputFilesMapping(val events: List<Event>) {
|
|
||||||
|
|
||||||
/*fun mapTo(): OutputFilesDto {
|
|
||||||
|
|
||||||
val videoResult = events.filter { it.data is ProcesserEncodeWorkPerformed }
|
|
||||||
.map { it.data as ProcesserEncodeWorkPerformed }
|
|
||||||
|
|
||||||
val subtitleResult = events.filter { it.data is ProcesserExtractWorkPerformed && it.isSuccess() }.map { it.data as ProcesserExtractWorkPerformed }.filter { !it.outFile.isNullOrBlank() }
|
|
||||||
val convertedSubtitleResult = events.filter { it.data is ConvertWorkPerformed && it.isSuccess() }.map { it.data as ConvertWorkPerformed }
|
|
||||||
|
|
||||||
val referenceId = events.firstOrNull()?.referenceId ?: throw RuntimeException("No Id")
|
|
||||||
val subtitles = try {
|
|
||||||
toSubtitleList(subtitleResult, convertedSubtitleResult)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
System.err.println("Exception of $referenceId")
|
|
||||||
System.err.print("EventIds:\n" + events.joinToString("\n") { it.eventId } + "\n")
|
|
||||||
e.printStackTrace()
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
|
|
||||||
return OutputFilesDto(
|
|
||||||
video = videoResult.lastOrNull { it.isSuccess() }?.outFile,
|
|
||||||
subtitles = subtitles
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun toSubtitleList(extracted: List<ProcesserExtractWorkPerformed>, converted: List<ConvertWorkPerformed>): List<String> {
|
|
||||||
val sub1 = extracted.mapNotNull { it.outFile }
|
|
||||||
val sub2 = converted.flatMap { it.outFiles }
|
|
||||||
return sub1 + sub2
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
@ -1,68 +0,0 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator.mapping
|
|
||||||
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.reader.MediaProcessedDto
|
|
||||||
|
|
||||||
class ProcessMapping(val events: List<Event>) {
|
|
||||||
|
|
||||||
/* fun map(): MediaProcessedDto? {
|
|
||||||
val referenceId = events.firstOrNull()?.referenceId ?: return null
|
|
||||||
val processStarted = getProcessStarted()
|
|
||||||
val meta = MetadataMapping(events)
|
|
||||||
return MediaProcessedDto(
|
|
||||||
referenceId = referenceId,
|
|
||||||
process = processStarted?.type,
|
|
||||||
inputFile = processStarted?.file,
|
|
||||||
collection = meta.collection,
|
|
||||||
metadata = meta.map(),
|
|
||||||
videoDetails = VideoDetailsMapper(events).mapTo(),
|
|
||||||
outputFiles = OutputFilesMapping(events).mapTo()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getProcessStarted(): MediaProcessStarted? {
|
|
||||||
return events.lastOrNull { it.data is MediaProcessStarted }?.data as MediaProcessStarted?
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fun waitsForEncode(): Boolean {
|
|
||||||
val arguments = events.filter { it.event == KafkaEvents.EventMediaParameterEncodeCreated }
|
|
||||||
val created = events.filter { it.event == KafkaEvents.EventWorkEncodeCreated}
|
|
||||||
|
|
||||||
val performedEvents = events.filter { it.event == KafkaEvents.EventWorkEncodePerformed }
|
|
||||||
|
|
||||||
val performed = performedEvents.filter { it.isSuccess() }
|
|
||||||
val isSkipped = performedEvents.filter { it.isSkipped() }
|
|
||||||
|
|
||||||
return (arguments.isNotEmpty() && created.isEmpty()) || created.size > performed.size + isSkipped.size
|
|
||||||
}
|
|
||||||
|
|
||||||
fun waitsForExtract(): Boolean {
|
|
||||||
// Check if message is declared as skipped with statis
|
|
||||||
val arguments = events.filter { it.event == KafkaEvents.EventMediaParameterExtractCreated }.filter { it.data.isSuccess() }
|
|
||||||
val created = events.filter { it.event == KafkaEvents.EventWorkExtractCreated }
|
|
||||||
|
|
||||||
val performedEvents = events.filter { it.event == KafkaEvents.EventWorkExtractPerformed }
|
|
||||||
|
|
||||||
val performed = performedEvents.filter { it.isSuccess() }
|
|
||||||
val isSkipped = performedEvents.filter { it.isSkipped() }
|
|
||||||
|
|
||||||
|
|
||||||
return (arguments.isNotEmpty() && created.isEmpty()) || created.size > performed.size + isSkipped.size
|
|
||||||
}
|
|
||||||
|
|
||||||
fun waitsForConvert(): Boolean {
|
|
||||||
val created = events.filter { it.event == KafkaEvents.EventWorkConvertCreated }
|
|
||||||
val performedEvents = events.filter { it.event == KafkaEvents.EventWorkConvertPerformed }
|
|
||||||
|
|
||||||
val performed = performedEvents.filter { it.isSuccess() }
|
|
||||||
val isSkipped = performedEvents.filter { it.isSkipped() }
|
|
||||||
|
|
||||||
return created.size > performed.size + isSkipped.size
|
|
||||||
}
|
|
||||||
|
|
||||||
fun canCollect(): Boolean {
|
|
||||||
return (!waitsForEncode() && !waitsForExtract() && !waitsForConvert())
|
|
||||||
}*/
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator.mapping
|
|
||||||
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.reader.SerieInfo
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.reader.VideoDetails
|
|
||||||
|
|
||||||
class VideoDetailsMapper(val events: List<Event>) {
|
|
||||||
|
|
||||||
/* fun mapTo(): VideoDetails? {
|
|
||||||
val mediaReadOut = events.lastOrNull { it.data is VideoInfoPerformed }?.data as VideoInfoPerformed?
|
|
||||||
val proper = mediaReadOut?.toValueObject() ?: return null
|
|
||||||
|
|
||||||
val details = VideoDetails(
|
|
||||||
type = proper.type,
|
|
||||||
fullName = proper.fullName,
|
|
||||||
serieInfo = if (proper !is EpisodeInfo) null else SerieInfo(
|
|
||||||
episodeTitle = proper.episodeTitle,
|
|
||||||
episodeNumber = proper.episode,
|
|
||||||
seasonNumber = proper.season,
|
|
||||||
title = proper.title
|
|
||||||
)
|
|
||||||
)
|
|
||||||
return details
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
@ -1,157 +0,0 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator.tasks.event
|
|
||||||
|
|
||||||
/*
|
|
||||||
@Service
|
|
||||||
class CollectAndStoreTask() {
|
|
||||||
val log = KotlinLogging.logger {}
|
|
||||||
|
|
||||||
|
|
||||||
val producesEvent: KafkaEvents = KafkaEvents.EventCollectAndStore
|
|
||||||
|
|
||||||
val requiredEvents: List<KafkaEvents> = listOf(
|
|
||||||
EventMediaProcessStarted,
|
|
||||||
EventMediaProcessCompleted
|
|
||||||
)
|
|
||||||
val listensForEvents: List<KafkaEvents> = KafkaEvents.entries
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fun onProcessEvents(event: PersistentMessage, events: List<PersistentMessage>): MessageDataWrapper? {
|
|
||||||
|
|
||||||
log.info { "${event.referenceId} triggered by ${event.event}" }
|
|
||||||
|
|
||||||
val started = events.lastOrSuccessOf(EventMediaProcessStarted) ?: return null
|
|
||||||
val completed = events.lastOrSuccessOf(EventMediaProcessCompleted) ?: return null
|
|
||||||
if (!started.data.isSuccess() || !completed.data.isSuccess()) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
val mapped = ProcessMapping(events).map() ?: return null
|
|
||||||
val collection = mapped.metadata?.collection ?: mapped.collection ?: return null
|
|
||||||
|
|
||||||
val subtitlesStored = mapped.outputFiles?.subtitles?.let {
|
|
||||||
storeSubtitles(collection = collection, subtitles = it)
|
|
||||||
} ?: false
|
|
||||||
|
|
||||||
val videoFile = mapped.outputFiles?.video?.let { File(it).name }
|
|
||||||
val videoInfo = mapped.videoDetails
|
|
||||||
|
|
||||||
|
|
||||||
val genres = mapped.metadata?.genres?.let {
|
|
||||||
storeAndGetGenres(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
val catalogId = mapped.metadata?.let { meta ->
|
|
||||||
if (videoInfo == null || videoFile == null)
|
|
||||||
null
|
|
||||||
else
|
|
||||||
storeCatalog(metadata = meta,genres = genres, videoFile = videoFile, videoDetails = videoInfo)
|
|
||||||
} ?: return SimpleMessageData(Status.ERROR, "Unable to store catalog when metadata is null", event.eventId)
|
|
||||||
|
|
||||||
mapped.metadata?.let {
|
|
||||||
storeMetadata(catalogId = catalogId, metadata = it)
|
|
||||||
storeTitles(it.collection, it.title, contentTitles = it.titles)
|
|
||||||
}
|
|
||||||
|
|
||||||
return SimpleMessageData(Status.COMPLETED, derivedFromEventId = event.eventId)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun storeSubtitles(collection: String, subtitles: List<String>): Boolean {
|
|
||||||
val result = subtitles.map { subtitle ->
|
|
||||||
val subtitleFile = File(subtitle)
|
|
||||||
val language = subtitleFile.parentFile.name
|
|
||||||
subtitle to executeWithStatus(getStoreDatabase()) {
|
|
||||||
SubtitleQuery(
|
|
||||||
collection = collection,
|
|
||||||
associatedWithVideo = subtitleFile.nameWithoutExtension,
|
|
||||||
language = language,
|
|
||||||
format = subtitleFile.extension.uppercase(),
|
|
||||||
file = subtitleFile.name
|
|
||||||
).insert()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.none { !it.second }
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun storeMetadata(catalogId: Int, metadata: MetadataDto) {
|
|
||||||
metadata.summary.forEach {
|
|
||||||
withTransaction(getStoreDatabase()) {
|
|
||||||
SummaryQuery(
|
|
||||||
cid = catalogId,
|
|
||||||
language = it.language,
|
|
||||||
description = it.summary
|
|
||||||
).insert()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun storeTitles(collection: String, usedTitle: String, contentTitles: List<String>) {
|
|
||||||
try {
|
|
||||||
withTransaction(getStoreDatabase()) {
|
|
||||||
titles.insertIgnore {
|
|
||||||
it[titles.masterTitle] = collection
|
|
||||||
it[titles.title] = NameHelper.normalize(usedTitle)
|
|
||||||
it[titles.type] = 1
|
|
||||||
}
|
|
||||||
titles.insertIgnore {
|
|
||||||
it[titles.masterTitle] = usedTitle
|
|
||||||
it[titles.title] = NameHelper.normalize(usedTitle)
|
|
||||||
it[titles.type] = 2
|
|
||||||
}
|
|
||||||
contentTitles.forEach { title ->
|
|
||||||
titles.insertIgnore {
|
|
||||||
it[titles.masterTitle] = usedTitle
|
|
||||||
it[titles.title] = title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun storeAndGetGenres(genres: List<String>): String? {
|
|
||||||
return withTransaction(getStoreDatabase()) {
|
|
||||||
val gq = GenreQuery( *genres.toTypedArray() )
|
|
||||||
gq.insertAndGetIds()
|
|
||||||
gq.getIds().joinToString(",")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun storeCatalog(metadata: MetadataDto, videoDetails: VideoDetails, videoFile: String, genres: String?): Int? {
|
|
||||||
val precreatedCatalogQuery = CatalogQuery(
|
|
||||||
title = NameHelper.normalize(metadata.title),
|
|
||||||
cover = metadata.cover?.cover,
|
|
||||||
type = metadata.type,
|
|
||||||
collection = metadata.collection,
|
|
||||||
genres = genres
|
|
||||||
)
|
|
||||||
|
|
||||||
val result = when (videoDetails.type) {
|
|
||||||
"serie" -> {
|
|
||||||
val serieInfo = videoDetails.serieInfo ?: throw RuntimeException("SerieInfo missing in VideoDetails for Serie! $videoFile")
|
|
||||||
executeOrException {
|
|
||||||
precreatedCatalogQuery.insertWithSerie(
|
|
||||||
episodeTitle = serieInfo.episodeTitle ?: "",
|
|
||||||
videoFile = videoFile,
|
|
||||||
episode = serieInfo.episodeNumber,
|
|
||||||
season = serieInfo.seasonNumber
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"movie" -> {
|
|
||||||
executeOrException {
|
|
||||||
precreatedCatalogQuery.insertWithMovie(videoFile)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else -> throw RuntimeException("${videoDetails.type} is not supported!")
|
|
||||||
}
|
|
||||||
val ignoreException = result?.cause is SQLIntegrityConstraintViolationException && (result as ExposedSQLException).errorCode == 1062
|
|
||||||
return if (result == null || ignoreException ) {
|
|
||||||
return withTransaction(getStoreDatabase()) {
|
|
||||||
precreatedCatalogQuery.getId()
|
|
||||||
}
|
|
||||||
} else null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}*/
|
|
||||||
@ -2,12 +2,11 @@ package no.iktdev.mediaprocessing.coordinator.tasksV2.implementations
|
|||||||
|
|
||||||
import mu.KotlinLogging
|
import mu.KotlinLogging
|
||||||
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.ProcessType
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ProcessType
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaProcessStartEvent
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.MediaProcessStartEvent
|
import no.iktdev.mediaprocessing.shared.common.contract.data.az
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.az
|
|
||||||
|
|
||||||
abstract class WorkTaskListener: CoordinatorEventListener() {
|
abstract class WorkTaskListener: CoordinatorEventListener() {
|
||||||
private val log = KotlinLogging.logger {}
|
private val log = KotlinLogging.logger {}
|
||||||
|
|||||||
@ -7,11 +7,11 @@ import no.iktdev.eventi.data.EventStatus
|
|||||||
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
||||||
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
||||||
import no.iktdev.mediaprocessing.shared.common.parsing.FileNameParser
|
import no.iktdev.mediaprocessing.shared.common.parsing.FileNameParser
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.BaseInfo
|
import no.iktdev.mediaprocessing.shared.common.contract.data.BaseInfo
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.BaseInfoEvent
|
import no.iktdev.mediaprocessing.shared.common.contract.data.BaseInfoEvent
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.StartEventData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.StartEventData
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|||||||
@ -10,11 +10,11 @@ import no.iktdev.eventi.database.executeOrException
|
|||||||
import no.iktdev.eventi.database.executeWithStatus
|
import no.iktdev.eventi.database.executeWithStatus
|
||||||
import no.iktdev.eventi.database.withTransaction
|
import no.iktdev.eventi.database.withTransaction
|
||||||
import no.iktdev.mediaprocessing.shared.common.parsing.NameHelper
|
import no.iktdev.mediaprocessing.shared.common.parsing.NameHelper
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.*
|
import no.iktdev.mediaprocessing.shared.common.contract.data.*
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.SubtitleFormats
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.SubtitleFormats
|
||||||
import no.iktdev.mediaprocessing.shared.contract.reader.*
|
import no.iktdev.mediaprocessing.shared.common.contract.reader.*
|
||||||
import no.iktdev.streamit.library.db.query.CatalogQuery
|
import no.iktdev.streamit.library.db.query.CatalogQuery
|
||||||
import no.iktdev.streamit.library.db.query.GenreQuery
|
import no.iktdev.streamit.library.db.query.GenreQuery
|
||||||
import no.iktdev.streamit.library.db.query.SubtitleQuery
|
import no.iktdev.streamit.library.db.query.SubtitleQuery
|
||||||
|
|||||||
@ -11,11 +11,11 @@ import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
|||||||
import no.iktdev.mediaprocessing.coordinator.taskManager
|
import no.iktdev.mediaprocessing.coordinator.taskManager
|
||||||
import no.iktdev.mediaprocessing.coordinator.tasksV2.implementations.WorkTaskListener
|
import no.iktdev.mediaprocessing.coordinator.tasksV2.implementations.WorkTaskListener
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.*
|
import no.iktdev.mediaprocessing.shared.common.contract.data.*
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.isOnly
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.isOnly
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|||||||
@ -9,10 +9,10 @@ import no.iktdev.eventi.implementations.EventCoordinator
|
|||||||
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
||||||
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
||||||
import no.iktdev.mediaprocessing.shared.common.DownloadClient
|
import no.iktdev.mediaprocessing.shared.common.DownloadClient
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.*
|
import no.iktdev.mediaprocessing.shared.common.contract.data.*
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|||||||
@ -9,8 +9,8 @@ import no.iktdev.mediaprocessing.coordinator.Coordinator
|
|||||||
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
||||||
import no.iktdev.mediaprocessing.shared.common.parsing.NameHelper
|
import no.iktdev.mediaprocessing.shared.common.parsing.NameHelper
|
||||||
import no.iktdev.mediaprocessing.shared.common.parsing.Regexes
|
import no.iktdev.mediaprocessing.shared.common.parsing.Regexes
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.*
|
import no.iktdev.mediaprocessing.shared.common.contract.data.*
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
|||||||
@ -9,11 +9,11 @@ import no.iktdev.mediaprocessing.coordinator.Coordinator
|
|||||||
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
||||||
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.EncodeWorkArgumentsMapping
|
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.EncodeWorkArgumentsMapping
|
||||||
import no.iktdev.mediaprocessing.shared.common.Preference
|
import no.iktdev.mediaprocessing.shared.common.Preference
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.*
|
import no.iktdev.mediaprocessing.shared.common.contract.data.*
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|||||||
@ -12,9 +12,9 @@ import no.iktdev.mediaprocessing.coordinator.Coordinator
|
|||||||
import no.iktdev.mediaprocessing.coordinator.taskManager
|
import no.iktdev.mediaprocessing.coordinator.taskManager
|
||||||
import no.iktdev.mediaprocessing.coordinator.tasksV2.implementations.WorkTaskListener
|
import no.iktdev.mediaprocessing.coordinator.tasksV2.implementations.WorkTaskListener
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.*
|
import no.iktdev.mediaprocessing.shared.common.contract.data.*
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
|||||||
@ -8,11 +8,11 @@ import no.iktdev.eventi.implementations.EventCoordinator
|
|||||||
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
||||||
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
||||||
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.ExtractWorkArgumentsMapping
|
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.ExtractWorkArgumentsMapping
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.*
|
import no.iktdev.mediaprocessing.shared.common.contract.data.*
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|||||||
@ -12,9 +12,9 @@ import no.iktdev.mediaprocessing.coordinator.Coordinator
|
|||||||
import no.iktdev.mediaprocessing.coordinator.taskManager
|
import no.iktdev.mediaprocessing.coordinator.taskManager
|
||||||
import no.iktdev.mediaprocessing.coordinator.tasksV2.implementations.WorkTaskListener
|
import no.iktdev.mediaprocessing.coordinator.tasksV2.implementations.WorkTaskListener
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.*
|
import no.iktdev.mediaprocessing.shared.common.contract.data.*
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
|||||||
@ -13,11 +13,11 @@ import no.iktdev.mediaprocessing.shared.common.parsing.FileNameDeterminate
|
|||||||
import no.iktdev.mediaprocessing.shared.common.parsing.NameHelper
|
import no.iktdev.mediaprocessing.shared.common.parsing.NameHelper
|
||||||
import no.iktdev.mediaprocessing.shared.common.parsing.Regexes
|
import no.iktdev.mediaprocessing.shared.common.parsing.Regexes
|
||||||
import no.iktdev.mediaprocessing.shared.common.parsing.isCharOnlyUpperCase
|
import no.iktdev.mediaprocessing.shared.common.parsing.isCharOnlyUpperCase
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.*
|
import no.iktdev.mediaprocessing.shared.common.contract.data.*
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.EpisodeInfo
|
import no.iktdev.mediaprocessing.shared.common.contract.data.EpisodeInfo
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.MovieInfo
|
import no.iktdev.mediaprocessing.shared.common.contract.data.MovieInfo
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.pyMetadata
|
import no.iktdev.mediaprocessing.shared.common.contract.data.pyMetadata
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import java.io.FileFilter
|
import java.io.FileFilter
|
||||||
|
|||||||
@ -9,11 +9,11 @@ import no.iktdev.eventi.data.isSuccessful
|
|||||||
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
||||||
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
||||||
import no.iktdev.eventi.database.toEpochSeconds
|
import no.iktdev.eventi.database.toEpochSeconds
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.BaseInfoEvent
|
import no.iktdev.mediaprocessing.shared.common.contract.data.BaseInfoEvent
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.MediaMetadataReceivedEvent
|
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaMetadataReceivedEvent
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.az
|
import no.iktdev.mediaprocessing.shared.common.contract.data.az
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.scheduling.annotation.EnableScheduling
|
import org.springframework.scheduling.annotation.EnableScheduling
|
||||||
import org.springframework.scheduling.annotation.Scheduled
|
import org.springframework.scheduling.annotation.Scheduled
|
||||||
|
|||||||
@ -10,16 +10,16 @@ import no.iktdev.eventi.data.dataAs
|
|||||||
import no.iktdev.eventi.implementations.EventCoordinator
|
import no.iktdev.eventi.implementations.EventCoordinator
|
||||||
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
import no.iktdev.mediaprocessing.coordinator.Coordinator
|
||||||
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.MediaFileStreamsParsedEvent
|
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaFileStreamsParsedEvent
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.MediaFileStreamsReadEvent
|
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaFileStreamsReadEvent
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioStream
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioStream
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.SubtitleStream
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.SubtitleStream
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoStream
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoStream
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
|||||||
@ -14,13 +14,13 @@ import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
|
|||||||
import no.iktdev.mediaprocessing.shared.common.SharedConfig
|
import no.iktdev.mediaprocessing.shared.common.SharedConfig
|
||||||
import no.iktdev.mediaprocessing.shared.common.runner.CodeToOutput
|
import no.iktdev.mediaprocessing.shared.common.runner.CodeToOutput
|
||||||
import no.iktdev.mediaprocessing.shared.common.runner.getOutputUsing
|
import no.iktdev.mediaprocessing.shared.common.runner.getOutputUsing
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.MediaFileStreamsReadEvent
|
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaFileStreamsReadEvent
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.StartEventData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.StartEventData
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|||||||
@ -3,11 +3,11 @@ package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping
|
|||||||
import no.iktdev.exfl.using
|
import no.iktdev.exfl.using
|
||||||
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams.AudioArguments
|
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams.AudioArguments
|
||||||
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams.VideoArguments
|
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams.VideoArguments
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.EncodeArgumentData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.EncodeArgumentData
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioStream
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioStream
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.EncodingPreference
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.EncodingPreference
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoStream
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoStream
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class EncodeWorkArgumentsMapping(
|
class EncodeWorkArgumentsMapping(
|
||||||
|
|||||||
@ -2,8 +2,8 @@ package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping
|
|||||||
|
|
||||||
import no.iktdev.exfl.using
|
import no.iktdev.exfl.using
|
||||||
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams.SubtitleArguments
|
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams.SubtitleArguments
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.ExtractArgumentData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.ExtractArgumentData
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class ExtractWorkArgumentsMapping(
|
class ExtractWorkArgumentsMapping(
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping
|
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping
|
||||||
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioArgumentsDto
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioArgumentsDto
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoArgumentsDto
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoArgumentsDto
|
||||||
|
|
||||||
fun toFfmpegWorkerArguments(
|
fun toFfmpegWorkerArguments(
|
||||||
videoArguments: VideoArgumentsDto?,
|
videoArguments: VideoArgumentsDto?,
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams
|
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams
|
||||||
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioArgumentsDto
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioArgumentsDto
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioPreference
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioPreference
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioStream
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioStream
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
|
||||||
|
|
||||||
class AudioArguments(
|
class AudioArguments(
|
||||||
val audioStream: AudioStream,
|
val audioStream: AudioStream,
|
||||||
@ -12,42 +12,70 @@ class AudioArguments(
|
|||||||
) {
|
) {
|
||||||
fun isAudioCodecEqual() = audioStream.codec_name.lowercase() == preference.codec.lowercase()
|
fun isAudioCodecEqual() = audioStream.codec_name.lowercase() == preference.codec.lowercase()
|
||||||
|
|
||||||
fun isSurroundButNotEAC3(): Boolean {
|
/**
|
||||||
return audioStream.channels > 2 && audioStream.codec_name.lowercase() != "eac3"
|
* Checks whether its ac3 or eac3, as google cast supports this and most other devices.
|
||||||
|
*/
|
||||||
|
fun isOfSupportedSurroundCodec(): Boolean {
|
||||||
|
return audioStream.codec_name.lowercase() in listOf("eac3", "ac3")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isSurroundAndEAC3(): Boolean {
|
|
||||||
return audioStream.channels > 2 && audioStream.codec_name.lowercase() == "eac3"
|
|
||||||
}
|
|
||||||
|
|
||||||
fun isSurround(): Boolean {
|
fun isSurround(): Boolean {
|
||||||
return audioStream.channels > 2
|
return audioStream.channels > 2
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun shouldUseEAC3(): Boolean {
|
|
||||||
return (preference.defaultToEAC3OnSurroundDetected && audioStream.channels > 2 && audioStream.codec_name.lowercase() != "eac3")
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getAudioArguments(): AudioArgumentsDto {
|
fun getAudioArguments(): AudioArgumentsDto {
|
||||||
val optionalParams = mutableListOf<String>()
|
val optionalParams = mutableListOf<String>()
|
||||||
|
|
||||||
val codecParams = if (isAudioCodecEqual() || isSurroundAndEAC3()) {
|
if (!isSurround()) {
|
||||||
listOf("-acodec", "copy")
|
return if (isAudioCodecEqual()) {
|
||||||
} else if (!isSurroundButNotEAC3() && shouldUseEAC3()) {
|
asPassthrough()
|
||||||
listOf("-c:a", "eac3")
|
|
||||||
} else {
|
} else {
|
||||||
val codecSwap = mutableListOf("-c:a", preference.codec)
|
asStereo()
|
||||||
if (audioStream.channels > 2 && !preference.preserveChannels) {
|
|
||||||
codecSwap.addAll(listOf("-ac", "2"))
|
|
||||||
}
|
}
|
||||||
codecSwap
|
} else {
|
||||||
|
if (preference.forceStereo) {
|
||||||
|
return asStereo()
|
||||||
|
}
|
||||||
|
if (preference.passthroughOnGenerallySupportedSurroundSound && isOfSupportedSurroundCodec()) {
|
||||||
|
return asPassthrough()
|
||||||
|
} else if (preference.passthroughOnGenerallySupportedSurroundSound && !isOfSupportedSurroundCodec()) {
|
||||||
|
return asSurround()
|
||||||
|
}
|
||||||
|
if (preference.convertToEac3OnUnsupportedSurround ) {
|
||||||
|
return asSurround()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return asStereo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun index(): Int {
|
||||||
|
return allStreams.audioStream.indexOf(audioStream)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun asPassthrough(): AudioArgumentsDto {
|
||||||
return AudioArgumentsDto(
|
return AudioArgumentsDto(
|
||||||
index = allStreams.audioStream.indexOf(audioStream),
|
index = index()
|
||||||
codecParameters = codecParams,
|
)
|
||||||
optionalParameters = optionalParams
|
}
|
||||||
|
fun asStereo(): AudioArgumentsDto {
|
||||||
|
return AudioArgumentsDto(
|
||||||
|
index = index(),
|
||||||
|
codecParameters = listOf(
|
||||||
|
"-c:a", preference.codec,
|
||||||
|
"-ac", "2"
|
||||||
|
), optionalParameters = emptyList()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
fun asSurround(): AudioArgumentsDto {
|
||||||
|
return AudioArgumentsDto(
|
||||||
|
index = index(),
|
||||||
|
codecParameters = listOf(
|
||||||
|
"-c:a", "eac3"
|
||||||
|
), optionalParameters = emptyList()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams
|
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams
|
||||||
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.SubtitleArgumentsDto
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.SubtitleArgumentsDto
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.SubtitleStream
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.SubtitleStream
|
||||||
|
|
||||||
class SubtitleArguments(val subtitleStreams: List<SubtitleStream>) {
|
class SubtitleArguments(val subtitleStreams: List<SubtitleStream>) {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams
|
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams
|
||||||
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoArgumentsDto
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoArgumentsDto
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoPreference
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoPreference
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoStream
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoStream
|
||||||
|
|
||||||
class VideoArguments(
|
class VideoArguments(
|
||||||
val videoStream: VideoStream,
|
val videoStream: VideoStream,
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package no.iktdev.mediaprocessing.coordinator.utils
|
|||||||
import mu.KotlinLogging
|
import mu.KotlinLogging
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.*
|
import no.iktdev.mediaprocessing.shared.common.persistance.*
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
|
|
||||||
val log = KotlinLogging.logger {}
|
val log = KotlinLogging.logger {}
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import mu.KotlinLogging
|
|||||||
import no.iktdev.mediaprocessing.coordinator.*
|
import no.iktdev.mediaprocessing.coordinator.*
|
||||||
import no.iktdev.mediaprocessing.shared.common.SharedConfig
|
import no.iktdev.mediaprocessing.shared.common.SharedConfig
|
||||||
import no.iktdev.mediaprocessing.shared.common.extended.isSupportedVideoFile
|
import no.iktdev.mediaprocessing.shared.common.extended.isSupportedVideoFile
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ProcessType
|
import no.iktdev.mediaprocessing.shared.common.contract.ProcessType
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.context.ApplicationContext
|
import org.springframework.context.ApplicationContext
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package no.iktdev.mediaprocessing.coordinator.reader
|
|||||||
/*
|
/*
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import no.iktdev.mediaprocessing.shared.kafka.core.CoordinatorProducer
|
import no.iktdev.mediaprocessing.shared.kafka.core.CoordinatorProducer
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ProcessType
|
import no.iktdev.mediaprocessing.shared.common.contract.ProcessType
|
||||||
import no.iktdev.mediaprocessing.shared.kafka.dto.events_result.BaseInfoPerformed
|
import no.iktdev.mediaprocessing.shared.kafka.dto.events_result.BaseInfoPerformed
|
||||||
import no.iktdev.mediaprocessing.shared.kafka.dto.events_result.ProcessStarted
|
import no.iktdev.mediaprocessing.shared.kafka.dto.events_result.ProcessStarted
|
||||||
import no.iktdev.mediaprocessing.shared.kafka.dto.Status
|
import no.iktdev.mediaprocessing.shared.kafka.dto.Status
|
||||||
|
|||||||
@ -3,9 +3,9 @@ package no.iktdev.mediaprocessing.coordinator.tasks.event.ffmpeg
|
|||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.google.gson.reflect.TypeToken
|
import com.google.gson.reflect.TypeToken
|
||||||
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams.AudioArguments
|
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams.AudioArguments
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioPreference
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioPreference
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioStream
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioStream
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
import org.junit.jupiter.api.Assertions.*
|
import org.junit.jupiter.api.Assertions.*
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
@ -17,7 +17,7 @@ class EncodeArgumentCreatorTaskTest {
|
|||||||
val audio = AudioArguments(
|
val audio = AudioArguments(
|
||||||
audioStream = audioStreamsEAC().first(),
|
audioStream = audioStreamsEAC().first(),
|
||||||
allStreams = ParsedMediaStreams(listOf(), audioStreamsEAC(), listOf()),
|
allStreams = ParsedMediaStreams(listOf(), audioStreamsEAC(), listOf()),
|
||||||
preference = AudioPreference(preserveChannels = true, forceStereo = false, defaultToEAC3OnSurroundDetected = true)
|
preference = AudioPreference(preserveChannels = true, forceStereo = false, convertToEac3OnUnsupportedSurround = true)
|
||||||
)
|
)
|
||||||
val arguments = audio.getAudioArguments()
|
val arguments = audio.getAudioArguments()
|
||||||
assertThat(arguments.codecParameters).isEqualTo(listOf("-acodec", "copy"))
|
assertThat(arguments.codecParameters).isEqualTo(listOf("-acodec", "copy"))
|
||||||
@ -75,4 +75,6 @@ class EncodeArgumentCreatorTaskTest {
|
|||||||
val type = object : TypeToken<List<AudioStream>>() {}.type
|
val type = object : TypeToken<List<AudioStream>>() {}.type
|
||||||
return Gson().fromJson<List<AudioStream>>(streams, type)
|
return Gson().fromJson<List<AudioStream>>(streams, type)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,35 @@
|
|||||||
|
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping
|
||||||
|
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaFileStreamsParsedEvent
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.data.az
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioPreference
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.EncodingPreference
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoPreference
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.fromJsonWithDeserializer
|
||||||
|
import org.junit.jupiter.api.Assertions.*
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
class EncodeWorkArgumentsMappingTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun parse() {
|
||||||
|
val event = data.fromJsonWithDeserializer(Events.EventMediaParseStreamPerformed)
|
||||||
|
val parser = EncodeWorkArgumentsMapping(
|
||||||
|
"potato.mkv",
|
||||||
|
"potato.mp4",
|
||||||
|
File(".\\potato.mp4"),
|
||||||
|
event.az<MediaFileStreamsParsedEvent>()!!.data!!,
|
||||||
|
EncodingPreference(VideoPreference(), AudioPreference())
|
||||||
|
)
|
||||||
|
val result = parser.getArguments()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
val data = """
|
||||||
|
{"metadata":{"derivedFromEventId":"308267f3-6eee-4250-9dc4-0f54edb1a120","eventId":"51970dfb-790d-48e4-a37e-ae0915bb1b70","referenceId":"d8be4d8f-64c2-4df1-aed1-e66cdc7163b4","status":"Success","created":"2024-07-19T18:45:31.956816095"},"data":{"videoStream":[{"index":0,"codec_name":"hevc","codec_long_name":"H.265 / HEVC (High Efficiency Video Coding)","codec_type":"video","codec_tag_string":"[0][0][0][0]","codec_tag":"0x0000","r_frame_rate":"24000/1001","avg_frame_rate":"24000/1001","time_base":"1/1000","start_pts":0,"start_time":"0.000000","disposition":{"default":1,"dub":0,"original":0,"comment":0,"lyrics":0,"karaoke":0,"forced":0,"hearing_impaired":0,"visual_impaired":0,"clean_effects":0,"attached_pic":0,"timed_thumbnails":0},"tags":{"title":"Presented By EMBER","BPS":"1288407","DURATION":"00:23:40.002000000","NUMBER_OF_FRAMES":"34046","NUMBER_OF_BYTES":"228692681","_STATISTICS_WRITING_APP":"mkvmerge v69.0.0 (\u0027Day And Age\u0027) 64-bit","_STATISTICS_WRITING_DATE_UTC":"2024-01-06 04:19:11","_STATISTICS_TAGS":"BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES"},"profile":"Main 10","width":1920,"height":1080,"coded_width":1920,"coded_height":1080,"closed_captions":0,"has_b_frames":2,"sample_aspect_ratio":"1:1","display_aspect_ratio":"16:9","pix_fmt":"yuv420p10le","level":120,"color_range":"tv","color_space":"bt709","color_transfer":"bt709","color_primaries":"bt709","refs":1},{"index":18,"codec_name":"png","codec_long_name":"PNG (Portable Network Graphics) image","codec_type":"video","codec_tag_string":"[0][0][0][0]","codec_tag":"0x0000","r_frame_rate":"90000/1","avg_frame_rate":"0/0","time_base":"1/90000","start_pts":0,"start_time":"0.000000","disposition":{"default":0,"dub":0,"original":0,"comment":0,"lyrics":0,"karaoke":0,"forced":0,"hearing_impaired":0,"visual_impaired":0,"clean_effects":0,"attached_pic":1,"timed_thumbnails":0},"tags":{"filename":"cover.png","mimetype":"image/png"},"duration":"1421.100000","duration_ts":127899000,"width":350,"height":197,"coded_width":350,"coded_height":197,"closed_captions":0,"has_b_frames":0,"sample_aspect_ratio":"1:1","display_aspect_ratio":"350:197","pix_fmt":"rgb24","level":-99,"color_range":"pc","refs":1}],"audioStream":[{"index":1,"codec_name":"eac3","codec_long_name":"ATSC A/52B (AC-3, E-AC-3)","codec_type":"audio","codec_tag_string":"[0][0][0][0]","codec_tag":"0x0000","r_frame_rate":"0/0","avg_frame_rate":"0/0","time_base":"1/1000","start_pts":12,"start_time":"0.012000","disposition":{"default":1,"dub":0,"original":0,"comment":0,"lyrics":0,"karaoke":0,"forced":0,"hearing_impaired":0,"visual_impaired":0,"clean_effects":0,"attached_pic":0,"timed_thumbnails":0},"tags":{"BPS":"128000","DURATION":"00:23:41.088000000","NUMBER_OF_FRAMES":"44409","NUMBER_OF_BYTES":"22737408","_STATISTICS_WRITING_APP":"mkvmerge v69.0.0 (\u0027Day And Age\u0027) 64-bit","_STATISTICS_WRITING_DATE_UTC":"2024-01-06 04:19:11","_STATISTICS_TAGS":"BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES","language":"jpn"},"sample_fmt":"fltp","sample_rate":"48000","channels":2,"bits_per_sample":0}],"subtitleStream":[{"index":2,"codec_name":"ass","codec_long_name":"ASS (Advanced SSA) subtitle","codec_type":"subtitle","codec_tag_string":"[0][0][0][0]","codec_tag":"0x0000","r_frame_rate":"0/0","avg_frame_rate":"0/0","time_base":"1/1000","start_pts":0,"start_time":"0.000000","duration":"1421.100000","duration_ts":1421100,"disposition":{"default":1,"dub":0,"original":0,"comment":0,"lyrics":0,"karaoke":0,"forced":0,"hearing_impaired":0,"visual_impaired":0,"clean_effects":0,"attached_pic":0,"timed_thumbnails":0},"tags":{"BPS":"110","DURATION":"00:21:01.710000000","NUMBER_OF_FRAMES":"255","NUMBER_OF_BYTES":"17392","_STATISTICS_WRITING_APP":"mkvmerge v69.0.0 (\u0027Day And Age\u0027) 64-bit","_STATISTICS_WRITING_DATE_UTC":"2024-01-06 04:19:11","_STATISTICS_TAGS":"BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES","language":"eng"}}]},"eventType":"EventMediaParseStreamPerformed"}
|
||||||
|
""".trimIndent()
|
||||||
@ -0,0 +1,256 @@
|
|||||||
|
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams
|
||||||
|
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.Preference
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioPreference
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioStream
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
|
||||||
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
|
import org.junit.jupiter.api.Assertions.*
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
class AudioArgumentsTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun validateChecks1() {
|
||||||
|
val data = Gson().fromJson(ac3AudioStreamJson, AudioStream::class.java)
|
||||||
|
val audioArguments = AudioArguments(
|
||||||
|
allStreams = ParsedMediaStreams(
|
||||||
|
audioStream = listOf(data), videoStream = emptyList(), subtitleStream = emptyList()),
|
||||||
|
preference = Preference.getPreference().encodePreference.audio,
|
||||||
|
audioStream = data
|
||||||
|
)
|
||||||
|
assertThat(audioArguments.isAudioCodecEqual()).isFalse()
|
||||||
|
assertThat(audioArguments.isSurround()).isTrue()
|
||||||
|
|
||||||
|
assertThat(audioArguments.getAudioArguments().codecParameters).isEqualTo(listOf("-acodec", "copy"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun validateChecks2() {
|
||||||
|
val data = Gson().fromJson(eac3AudioStreamJson, AudioStream::class.java)
|
||||||
|
val audioArguments = AudioArguments(
|
||||||
|
allStreams = ParsedMediaStreams(
|
||||||
|
audioStream = listOf(data), videoStream = emptyList(), subtitleStream = emptyList()),
|
||||||
|
preference = Preference.getPreference().encodePreference.audio,
|
||||||
|
audioStream = data
|
||||||
|
)
|
||||||
|
assertThat(audioArguments.isAudioCodecEqual()).isFalse()
|
||||||
|
assertThat(audioArguments.isSurround()).isTrue()
|
||||||
|
|
||||||
|
assertThat(audioArguments.getAudioArguments().codecParameters).isEqualTo(listOf("-acodec", "copy"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun validateChecks3() {
|
||||||
|
val data = Gson().fromJson(aacSurroundAudioStreamJson, AudioStream::class.java)
|
||||||
|
val audioArguments = AudioArguments(
|
||||||
|
allStreams = ParsedMediaStreams(
|
||||||
|
audioStream = listOf(data), videoStream = emptyList(), subtitleStream = emptyList()),
|
||||||
|
preference = Preference.getPreference().encodePreference.audio,
|
||||||
|
audioStream = data
|
||||||
|
)
|
||||||
|
assertThat(audioArguments.isAudioCodecEqual()).isTrue()
|
||||||
|
assertThat(audioArguments.isSurround()).isTrue()
|
||||||
|
|
||||||
|
assertThat(audioArguments.getAudioArguments().codecParameters).isEqualTo(listOf("-c:a", "eac3"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun validateChecks4() {
|
||||||
|
val data = Gson().fromJson(aacStereoAudioStreamJson, AudioStream::class.java)
|
||||||
|
val audioArguments = AudioArguments(
|
||||||
|
allStreams = ParsedMediaStreams(
|
||||||
|
audioStream = listOf(data), videoStream = emptyList(), subtitleStream = emptyList()),
|
||||||
|
preference = Preference.getPreference().encodePreference.audio,
|
||||||
|
audioStream = data
|
||||||
|
)
|
||||||
|
assertThat(audioArguments.isAudioCodecEqual()).isTrue()
|
||||||
|
assertThat(audioArguments.isSurround()).isFalse()
|
||||||
|
|
||||||
|
assertThat(audioArguments.getAudioArguments().codecParameters).isEqualTo(listOf("-acodec", "copy"))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val ac3AudioStreamJson = """
|
||||||
|
{
|
||||||
|
"index": 1,
|
||||||
|
"codec_name": "ac3",
|
||||||
|
"codec_long_name": "ATSC A/52A (AC-3)",
|
||||||
|
"codec_type": "audio",
|
||||||
|
"codec_tag_string": "[0][0][0][0]",
|
||||||
|
"codec_tag": "0x0000",
|
||||||
|
"sample_fmt": "fltp",
|
||||||
|
"sample_rate": "48000",
|
||||||
|
"channels": 6,
|
||||||
|
"channel_layout": "5.1(side)",
|
||||||
|
"bits_per_sample": 0,
|
||||||
|
"dmix_mode": "-1",
|
||||||
|
"ltrt_cmixlev": "-1.000000",
|
||||||
|
"ltrt_surmixlev": "-1.000000",
|
||||||
|
"loro_cmixlev": "-1.000000",
|
||||||
|
"loro_surmixlev": "-1.000000",
|
||||||
|
"r_frame_rate": "0/0",
|
||||||
|
"avg_frame_rate": "0/0",
|
||||||
|
"time_base": "1/1000",
|
||||||
|
"start_pts": -5,
|
||||||
|
"start_time": "-0.005000",
|
||||||
|
"bit_rate": "448000",
|
||||||
|
"disposition": {
|
||||||
|
"default": 1,
|
||||||
|
"dub": 0,
|
||||||
|
"original": 0,
|
||||||
|
"comment": 0,
|
||||||
|
"lyrics": 0,
|
||||||
|
"karaoke": 0,
|
||||||
|
"forced": 0,
|
||||||
|
"hearing_impaired": 0,
|
||||||
|
"visual_impaired": 0,
|
||||||
|
"clean_effects": 0,
|
||||||
|
"attached_pic": 0,
|
||||||
|
"timed_thumbnails": 0
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"language": "eng",
|
||||||
|
"ENCODER": "Lavc60.31.102 ac3",
|
||||||
|
"DURATION": "01:05:13.024000000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""".trimIndent()
|
||||||
|
val eac3AudioStreamJson = """
|
||||||
|
{
|
||||||
|
"index": 1,
|
||||||
|
"codec_name": "eac3",
|
||||||
|
"codec_long_name": "E-AC3",
|
||||||
|
"codec_type": "audio",
|
||||||
|
"codec_tag_string": "[0][0][0][0]",
|
||||||
|
"codec_tag": "0x0000",
|
||||||
|
"sample_fmt": "fltp",
|
||||||
|
"sample_rate": "48000",
|
||||||
|
"channels": 6,
|
||||||
|
"channel_layout": "5.1(side)",
|
||||||
|
"bits_per_sample": 0,
|
||||||
|
"dmix_mode": "-1",
|
||||||
|
"ltrt_cmixlev": "-1.000000",
|
||||||
|
"ltrt_surmixlev": "-1.000000",
|
||||||
|
"loro_cmixlev": "-1.000000",
|
||||||
|
"loro_surmixlev": "-1.000000",
|
||||||
|
"r_frame_rate": "0/0",
|
||||||
|
"avg_frame_rate": "0/0",
|
||||||
|
"time_base": "1/1000",
|
||||||
|
"start_pts": -5,
|
||||||
|
"start_time": "-0.005000",
|
||||||
|
"bit_rate": "448000",
|
||||||
|
"disposition": {
|
||||||
|
"default": 1,
|
||||||
|
"dub": 0,
|
||||||
|
"original": 0,
|
||||||
|
"comment": 0,
|
||||||
|
"lyrics": 0,
|
||||||
|
"karaoke": 0,
|
||||||
|
"forced": 0,
|
||||||
|
"hearing_impaired": 0,
|
||||||
|
"visual_impaired": 0,
|
||||||
|
"clean_effects": 0,
|
||||||
|
"attached_pic": 0,
|
||||||
|
"timed_thumbnails": 0
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"language": "eng",
|
||||||
|
"ENCODER": "Lavc60.31.102 ac3",
|
||||||
|
"DURATION": "01:05:13.024000000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""".trimIndent()
|
||||||
|
val aacStereoAudioStreamJson = """
|
||||||
|
{
|
||||||
|
"index": 1,
|
||||||
|
"codec_name": "aac",
|
||||||
|
"codec_long_name": "AAC (Advanced Audio Coding)",
|
||||||
|
"profile": "LC",
|
||||||
|
"codec_type": "audio",
|
||||||
|
"codec_tag_string": "mp4a",
|
||||||
|
"codec_tag": "0x6134706d",
|
||||||
|
"sample_fmt": "fltp",
|
||||||
|
"sample_rate": "48000",
|
||||||
|
"channels": 2,
|
||||||
|
"channel_layout": "2",
|
||||||
|
"bits_per_sample": 0,
|
||||||
|
"r_frame_rate": "0/0",
|
||||||
|
"avg_frame_rate": "0/0",
|
||||||
|
"time_base": "1/48000",
|
||||||
|
"start_pts": 0,
|
||||||
|
"start_time": "0.000000",
|
||||||
|
"duration_ts": 376210896,
|
||||||
|
"duration": "7837.727000",
|
||||||
|
"bit_rate": "224000",
|
||||||
|
"nb_frames": "367396",
|
||||||
|
"disposition": {
|
||||||
|
"default": 1,
|
||||||
|
"dub": 0,
|
||||||
|
"original": 0,
|
||||||
|
"comment": 0,
|
||||||
|
"lyrics": 0,
|
||||||
|
"karaoke": 0,
|
||||||
|
"forced": 0,
|
||||||
|
"hearing_impaired": 0,
|
||||||
|
"visual_impaired": 0,
|
||||||
|
"clean_effects": 0,
|
||||||
|
"attached_pic": 0,
|
||||||
|
"timed_thumbnails": 0
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"creation_time": "2022-02-08T20:37:35.000000Z",
|
||||||
|
"language": "eng",
|
||||||
|
"handler_name": "SoundHandler",
|
||||||
|
"vendor_id": "[0][0][0][0]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""".trimIndent()
|
||||||
|
|
||||||
|
val aacSurroundAudioStreamJson = """
|
||||||
|
{
|
||||||
|
"index": 1,
|
||||||
|
"codec_name": "aac",
|
||||||
|
"codec_long_name": "AAC (Advanced Audio Coding)",
|
||||||
|
"profile": "LC",
|
||||||
|
"codec_type": "audio",
|
||||||
|
"codec_tag_string": "mp4a",
|
||||||
|
"codec_tag": "0x6134706d",
|
||||||
|
"sample_fmt": "fltp",
|
||||||
|
"sample_rate": "48000",
|
||||||
|
"channels": 6,
|
||||||
|
"channel_layout": "5.1",
|
||||||
|
"bits_per_sample": 0,
|
||||||
|
"r_frame_rate": "0/0",
|
||||||
|
"avg_frame_rate": "0/0",
|
||||||
|
"time_base": "1/48000",
|
||||||
|
"start_pts": 0,
|
||||||
|
"start_time": "0.000000",
|
||||||
|
"duration_ts": 376210896,
|
||||||
|
"duration": "7837.727000",
|
||||||
|
"bit_rate": "224000",
|
||||||
|
"nb_frames": "367396",
|
||||||
|
"disposition": {
|
||||||
|
"default": 1,
|
||||||
|
"dub": 0,
|
||||||
|
"original": 0,
|
||||||
|
"comment": 0,
|
||||||
|
"lyrics": 0,
|
||||||
|
"karaoke": 0,
|
||||||
|
"forced": 0,
|
||||||
|
"hearing_impaired": 0,
|
||||||
|
"visual_impaired": 0,
|
||||||
|
"clean_effects": 0,
|
||||||
|
"attached_pic": 0,
|
||||||
|
"timed_thumbnails": 0
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"creation_time": "2022-02-08T20:37:35.000000Z",
|
||||||
|
"language": "eng",
|
||||||
|
"handler_name": "SoundHandler",
|
||||||
|
"vendor_id": "[0][0][0][0]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""".trimIndent()
|
||||||
|
}
|
||||||
@ -50,7 +50,6 @@ dependencies {
|
|||||||
|
|
||||||
//implementation(project(mapOf("path" to ":shared")))
|
//implementation(project(mapOf("path" to ":shared")))
|
||||||
implementation(project(mapOf("path" to ":shared:eventi")))
|
implementation(project(mapOf("path" to ":shared:eventi")))
|
||||||
implementation(project(mapOf("path" to ":shared:contract")))
|
|
||||||
implementation(project(mapOf("path" to ":shared:common")))
|
implementation(project(mapOf("path" to ":shared:common")))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,8 +6,11 @@ import no.iktdev.exfl.coroutines.CoroutinesIO
|
|||||||
import no.iktdev.exfl.observable.Observables
|
import no.iktdev.exfl.observable.Observables
|
||||||
import no.iktdev.mediaprocessing.shared.common.DatabaseEnvConfig
|
import no.iktdev.mediaprocessing.shared.common.DatabaseEnvConfig
|
||||||
import no.iktdev.eventi.database.MySqlDataSource
|
import no.iktdev.eventi.database.MySqlDataSource
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.cal.RunnerManager
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.cal.TasksManager
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.tables.runners
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.tables.tasks
|
||||||
import no.iktdev.mediaprocessing.shared.common.getAppVersion
|
import no.iktdev.mediaprocessing.shared.common.getAppVersion
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.*
|
|
||||||
import no.iktdev.mediaprocessing.shared.common.toEventsDatabase
|
import no.iktdev.mediaprocessing.shared.common.toEventsDatabase
|
||||||
import org.jetbrains.exposed.sql.transactions.TransactionManager
|
import org.jetbrains.exposed.sql.transactions.TransactionManager
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication
|
import org.springframework.boot.autoconfigure.SpringBootApplication
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package no.iktdev.mediaprocessing.processer
|
|||||||
|
|
||||||
import mu.KotlinLogging
|
import mu.KotlinLogging
|
||||||
import no.iktdev.mediaprocessing.shared.common.SharedConfig
|
import no.iktdev.mediaprocessing.shared.common.SharedConfig
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.ProcesserEventInfo
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.ProcesserEventInfo
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.messaging.simp.SimpMessagingTemplate
|
import org.springframework.messaging.simp.SimpMessagingTemplate
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
|
|||||||
@ -2,10 +2,10 @@ package no.iktdev.mediaprocessing.processer
|
|||||||
|
|
||||||
import mu.KotlinLogging
|
import mu.KotlinLogging
|
||||||
import no.iktdev.mediaprocessing.shared.common.*
|
import no.iktdev.mediaprocessing.shared.common.*
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.ActiveMode
|
import no.iktdev.mediaprocessing.shared.common.database.cal.ActiveMode
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.RunnerManager
|
import no.iktdev.mediaprocessing.shared.common.database.cal.RunnerManager
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
import org.springframework.scheduling.annotation.EnableScheduling
|
import org.springframework.scheduling.annotation.EnableScheduling
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
package no.iktdev.mediaprocessing.processer.ffmpeg.progress
|
package no.iktdev.mediaprocessing.processer.ffmpeg.progress
|
||||||
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.ProcesserProgress
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.ProcesserProgress
|
||||||
|
|
||||||
data class FfmpegDecodedProgress(
|
data class FfmpegDecodedProgress(
|
||||||
val progress: Int = -1,
|
val progress: Int = -1,
|
||||||
|
|||||||
@ -13,13 +13,13 @@ import no.iktdev.mediaprocessing.processer.ffmpeg.FfmpegRunner
|
|||||||
import no.iktdev.mediaprocessing.processer.ffmpeg.FfmpegTaskService
|
import no.iktdev.mediaprocessing.processer.ffmpeg.FfmpegTaskService
|
||||||
import no.iktdev.mediaprocessing.processer.ffmpeg.progress.FfmpegDecodedProgress
|
import no.iktdev.mediaprocessing.processer.ffmpeg.progress.FfmpegDecodedProgress
|
||||||
import no.iktdev.mediaprocessing.processer.taskManager
|
import no.iktdev.mediaprocessing.processer.taskManager
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.Status
|
import no.iktdev.mediaprocessing.shared.common.database.cal.Status
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.Task
|
import no.iktdev.mediaprocessing.shared.common.task.Task
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.EncodeArgumentData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.EncodeArgumentData
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.EncodeWorkPerformedEvent
|
import no.iktdev.mediaprocessing.shared.common.contract.data.EncodeWorkPerformedEvent
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.EncodedData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.EncodedData
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.ProcesserEventInfo
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.ProcesserEventInfo
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.WorkStatus
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.WorkStatus
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|||||||
@ -12,13 +12,13 @@ import no.iktdev.mediaprocessing.processer.ffmpeg.FfmpegTaskService
|
|||||||
import no.iktdev.mediaprocessing.processer.ffmpeg.progress.FfmpegDecodedProgress
|
import no.iktdev.mediaprocessing.processer.ffmpeg.progress.FfmpegDecodedProgress
|
||||||
import no.iktdev.mediaprocessing.processer.taskManager
|
import no.iktdev.mediaprocessing.processer.taskManager
|
||||||
import no.iktdev.mediaprocessing.shared.common.limitedWhile
|
import no.iktdev.mediaprocessing.shared.common.limitedWhile
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.Status
|
import no.iktdev.mediaprocessing.shared.common.database.cal.Status
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.Task
|
import no.iktdev.mediaprocessing.shared.common.task.Task
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.ExtractArgumentData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.ExtractArgumentData
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.ExtractWorkPerformedEvent
|
import no.iktdev.mediaprocessing.shared.common.contract.data.ExtractWorkPerformedEvent
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.ExtractedData
|
import no.iktdev.mediaprocessing.shared.common.contract.data.ExtractedData
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.ProcesserEventInfo
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.ProcesserEventInfo
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.WorkStatus
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.WorkStatus
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|||||||
@ -11,7 +11,6 @@ findProject(":apps:processer")?.name = "processer"
|
|||||||
|
|
||||||
findProject(":shared")?.name = "shared"
|
findProject(":shared")?.name = "shared"
|
||||||
findProject(":shared:eventi")?.name = "eventi"
|
findProject(":shared:eventi")?.name = "eventi"
|
||||||
findProject(":shared:contract")?.name = "contract"
|
|
||||||
findProject(":shared:common")?.name = "common"
|
findProject(":shared:common")?.name = "common"
|
||||||
|
|
||||||
include("apps")
|
include("apps")
|
||||||
@ -22,5 +21,4 @@ include("apps:processer")
|
|||||||
|
|
||||||
include("shared")
|
include("shared")
|
||||||
include("shared:eventi")
|
include("shared:eventi")
|
||||||
include("shared:contract")
|
|
||||||
include("shared:common")
|
include("shared:common")
|
||||||
|
|||||||
@ -43,7 +43,6 @@ dependencies {
|
|||||||
|
|
||||||
|
|
||||||
implementation(project(mapOf("path" to ":shared:eventi")))
|
implementation(project(mapOf("path" to ":shared:eventi")))
|
||||||
implementation(project(mapOf("path" to ":shared:contract")))
|
|
||||||
|
|
||||||
testImplementation(platform("org.junit:junit-bom:5.9.1"))
|
testImplementation(platform("org.junit:junit-bom:5.9.1"))
|
||||||
testImplementation("org.junit.jupiter:junit-jupiter")
|
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package no.iktdev.mediaprocessing.shared.common
|
|||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.google.gson.GsonBuilder
|
import com.google.gson.GsonBuilder
|
||||||
import mu.KotlinLogging
|
import mu.KotlinLogging
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.PreferenceDto
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.PreferenceDto
|
||||||
|
|
||||||
private val log = KotlinLogging.logger {}
|
private val log = KotlinLogging.logger {}
|
||||||
class Preference {
|
class Preference {
|
||||||
@ -17,7 +17,7 @@ class Preference {
|
|||||||
log.info { "[Audio]: Language = " + preference.encodePreference.audio.language }
|
log.info { "[Audio]: Language = " + preference.encodePreference.audio.language }
|
||||||
log.info { "[Audio]: Channels = " + preference.encodePreference.audio.channels }
|
log.info { "[Audio]: Channels = " + preference.encodePreference.audio.channels }
|
||||||
log.info { "[Audio]: Sample rate = " + preference.encodePreference.audio.sample_rate }
|
log.info { "[Audio]: Sample rate = " + preference.encodePreference.audio.sample_rate }
|
||||||
log.info { "[Audio]: Use EAC3 for surround = " + preference.encodePreference.audio.defaultToEAC3OnSurroundDetected }
|
log.info { "[Audio]: Use EAC3 for surround = " + preference.encodePreference.audio.convertToEac3OnUnsupportedSurround }
|
||||||
|
|
||||||
log.info { "[Video]: Codec = " + preference.encodePreference.video.codec }
|
log.info { "[Video]: Codec = " + preference.encodePreference.video.codec }
|
||||||
log.info { "[Video]: Pixel format = " + preference.encodePreference.video.pixelFormat }
|
log.info { "[Video]: Pixel format = " + preference.encodePreference.video.pixelFormat }
|
||||||
|
|||||||
@ -1,11 +1,10 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.common
|
package no.iktdev.mediaprocessing.shared.common
|
||||||
|
|
||||||
import mu.KotlinLogging
|
import mu.KotlinLogging
|
||||||
import no.iktdev.mediaprocessing.shared.common.persistance.ActiveMode
|
import no.iktdev.mediaprocessing.shared.common.database.cal.ActiveMode
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.Task
|
import no.iktdev.mediaprocessing.shared.common.task.Task
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
import org.springframework.beans.factory.annotation.Autowired
|
|
||||||
import org.springframework.scheduling.annotation.EnableScheduling
|
import org.springframework.scheduling.annotation.EnableScheduling
|
||||||
import org.springframework.scheduling.annotation.Scheduled
|
import org.springframework.scheduling.annotation.Scheduled
|
||||||
import javax.annotation.PostConstruct
|
import javax.annotation.PostConstruct
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract
|
package no.iktdev.mediaprocessing.shared.common.contract
|
||||||
|
|
||||||
import com.google.gson.reflect.TypeToken
|
import com.google.gson.reflect.TypeToken
|
||||||
import mu.KotlinLogging
|
import mu.KotlinLogging
|
||||||
import no.iktdev.eventi.core.WGson
|
import no.iktdev.eventi.core.WGson
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.*
|
import no.iktdev.mediaprocessing.shared.common.contract.data.*
|
||||||
|
|
||||||
private val log = KotlinLogging.logger {}
|
private val log = KotlinLogging.logger {}
|
||||||
object EventToClazzTable {
|
object EventToClazzTable {
|
||||||
@ -27,7 +27,7 @@ object EventToClazzTable {
|
|||||||
Events.EventMediaReadStreamPerformed to MediaFileStreamsReadEvent::class.java,
|
Events.EventMediaReadStreamPerformed to MediaFileStreamsReadEvent::class.java,
|
||||||
Events.EventMediaMetadataSearchPerformed to MediaMetadataReceivedEvent::class.java,
|
Events.EventMediaMetadataSearchPerformed to MediaMetadataReceivedEvent::class.java,
|
||||||
Events.EventMediaReadOutNameAndType to MediaOutInformationConstructedEvent::class.java,
|
Events.EventMediaReadOutNameAndType to MediaOutInformationConstructedEvent::class.java,
|
||||||
Events.EventMediaWorkProceedPermitted to PermitWorkCreationEvent::class.java,
|
Events.EventMediaWorkProceedPermitted to no.iktdev.mediaprocessing.shared.common.contract.data.PermitWorkCreationEvent::class.java,
|
||||||
Events.EventMediaProcessCompleted to MediaProcessCompletedEvent::class.java
|
Events.EventMediaProcessCompleted to MediaProcessCompletedEvent::class.java
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract
|
package no.iktdev.mediaprocessing.shared.common.contract
|
||||||
|
|
||||||
enum class Events(val event: String) {
|
enum class Events(val event: String) {
|
||||||
EventMediaProcessStarted ("event:media-process:started"),
|
EventMediaProcessStarted ("event:media-process:started"),
|
||||||
@ -1,8 +1,8 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract
|
package no.iktdev.mediaprocessing.shared.common.contract
|
||||||
|
|
||||||
import no.iktdev.eventi.implementations.EventCoordinator
|
import no.iktdev.eventi.implementations.EventCoordinator
|
||||||
import no.iktdev.eventi.implementations.EventListenerImpl
|
import no.iktdev.eventi.implementations.EventListenerImpl
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
|
|
||||||
abstract class EventsListenerContract<E: EventsManagerContract, C: EventCoordinator<Event, E>>: EventListenerImpl<Event, E>() {
|
abstract class EventsListenerContract<E: EventsManagerContract, C: EventCoordinator<Event, E>>: EventListenerImpl<Event, E>() {
|
||||||
abstract override val produceEvent: Events
|
abstract override val produceEvent: Events
|
||||||
@ -1,8 +1,8 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract
|
package no.iktdev.mediaprocessing.shared.common.contract
|
||||||
|
|
||||||
import no.iktdev.eventi.implementations.EventsManagerImpl
|
import no.iktdev.eventi.implementations.EventsManagerImpl
|
||||||
import no.iktdev.eventi.database.DataSource
|
import no.iktdev.eventi.database.DataSource
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
|
|
||||||
abstract class EventsManagerContract(dataSource: DataSource) : EventsManagerImpl<Event>(dataSource) {
|
abstract class EventsManagerContract(dataSource: DataSource) : EventsManagerImpl<Event>(dataSource) {
|
||||||
}
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract
|
package no.iktdev.mediaprocessing.shared.common.contract
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventImpl
|
import no.iktdev.eventi.data.EventImpl
|
||||||
import no.iktdev.eventi.data.isSuccessful
|
import no.iktdev.eventi.data.isSuccessful
|
||||||
@ -7,12 +7,12 @@ fun List<EventImpl>.lastOrSuccess(): EventImpl? {
|
|||||||
return this.lastOrNull { it.isSuccessful() } ?: this.lastOrNull()
|
return this.lastOrNull { it.isSuccessful() } ?: this.lastOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun List<EventImpl>.lastOrSuccessOf(event: Events): EventImpl? {
|
fun List<EventImpl>.lastOrSuccessOf(event: no.iktdev.mediaprocessing.shared.common.contract.Events): EventImpl? {
|
||||||
val validEvents = this.filter { it.eventType == event }
|
val validEvents = this.filter { it.eventType == event }
|
||||||
return validEvents.lastOrNull { it.isSuccessful() } ?: validEvents.lastOrNull()
|
return validEvents.lastOrNull { it.isSuccessful() } ?: validEvents.lastOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun List<EventImpl>.lastOrSuccessOf(event: Events, predicate: (EventImpl) -> Boolean): EventImpl? {
|
fun List<EventImpl>.lastOrSuccessOf(event: no.iktdev.mediaprocessing.shared.common.contract.Events, predicate: (EventImpl) -> Boolean): EventImpl? {
|
||||||
val validEvents = this.filter { it.eventType == event && predicate(it) }
|
val validEvents = this.filter { it.eventType == event && predicate(it) }
|
||||||
return validEvents.lastOrNull()
|
return validEvents.lastOrNull()
|
||||||
}
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
package no.iktdev.mediaprocessing.shared.common.contract
|
||||||
|
|
||||||
|
enum class ProcessType {
|
||||||
|
FLOW,
|
||||||
|
MANUAL
|
||||||
|
}
|
||||||
@ -1,8 +1,8 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventImpl
|
import no.iktdev.eventi.data.EventImpl
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
data class BaseInfoEvent(
|
data class BaseInfoEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,9 +1,9 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.SubtitleFormats
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.SubtitleFormats
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.tasks.TaskData
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.tasks.TaskData
|
||||||
|
|
||||||
data class ConvertWorkCreatedEvent(
|
data class ConvertWorkCreatedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
class ConvertWorkPerformed(
|
class ConvertWorkPerformed(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,8 +1,8 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.tasks.TaskData
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.tasks.TaskData
|
||||||
|
|
||||||
data class EncodeArgumentCreatedEvent(
|
data class EncodeArgumentCreatedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
data class EncodeWorkCreatedEvent(
|
data class EncodeWorkCreatedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
data class EncodeWorkPerformedEvent(
|
data class EncodeWorkPerformedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,8 +1,8 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventImpl
|
import no.iktdev.eventi.data.EventImpl
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
abstract class Event: EventImpl() {
|
abstract class Event: EventImpl() {
|
||||||
abstract override val eventType: Events
|
abstract override val eventType: Events
|
||||||
@ -1,8 +1,8 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.tasks.TaskData
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.tasks.TaskData
|
||||||
|
|
||||||
data class ExtractArgumentCreatedEvent(
|
data class ExtractArgumentCreatedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
data class ExtractWorkCreatedEvent(
|
data class ExtractWorkCreatedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
data class ExtractWorkPerformedEvent(
|
data class ExtractWorkPerformedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
data class MediaCoverDownloadedEvent(
|
data class MediaCoverDownloadedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
data class MediaCoverInfoReceivedEvent(
|
data class MediaCoverInfoReceivedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,8 +1,8 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
|
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
|
||||||
|
|
||||||
class MediaFileStreamsParsedEvent(
|
class MediaFileStreamsParsedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,9 +1,9 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import no.iktdev.eventi.data.EventImpl
|
import no.iktdev.eventi.data.EventImpl
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
class MediaFileStreamsReadEvent(
|
class MediaFileStreamsReadEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
data class MediaMetadataReceivedEvent(
|
data class MediaMetadataReceivedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,9 +1,9 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
data class MediaOutInformationConstructedEvent(
|
data class MediaOutInformationConstructedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,9 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ProcessType
|
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
|
|
||||||
|
|
||||||
data class MediaProcessCompletedEvent(
|
data class MediaProcessCompletedEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,9 +1,9 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
import no.iktdev.mediaprocessing.shared.contract.ProcessType
|
import no.iktdev.mediaprocessing.shared.common.contract.ProcessType
|
||||||
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
|
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
|
||||||
|
|
||||||
data class MediaProcessStartEvent(
|
data class MediaProcessStartEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.data
|
package no.iktdev.mediaprocessing.shared.common.contract.data
|
||||||
|
|
||||||
import no.iktdev.eventi.data.EventMetadata
|
import no.iktdev.eventi.data.EventMetadata
|
||||||
import no.iktdev.mediaprocessing.shared.contract.Events
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
|
||||||
data class PermitWorkCreationEvent(
|
data class PermitWorkCreationEvent(
|
||||||
override val metadata: EventMetadata,
|
override val metadata: EventMetadata,
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.dto
|
package no.iktdev.mediaprocessing.shared.common.contract.dto
|
||||||
|
|
||||||
enum class WorkStatus {
|
enum class WorkStatus {
|
||||||
Pending,
|
Pending,
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.dto
|
package no.iktdev.mediaprocessing.shared.common.contract.dto
|
||||||
|
|
||||||
data class EventRequest(
|
data class EventRequest(
|
||||||
val file: String, // FullPath
|
val file: String, // FullPath
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.dto
|
package no.iktdev.mediaprocessing.shared.common.contract.dto
|
||||||
|
|
||||||
data class ProcesserEventInfo(
|
data class ProcesserEventInfo(
|
||||||
val referenceId: String,
|
val referenceId: String,
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.dto
|
package no.iktdev.mediaprocessing.shared.common.contract.dto
|
||||||
|
|
||||||
data class RequestWorkProceed(
|
data class RequestWorkProceed(
|
||||||
val referenceId: String,
|
val referenceId: String,
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.dto
|
package no.iktdev.mediaprocessing.shared.common.contract.dto
|
||||||
|
|
||||||
abstract class Requester {
|
abstract class Requester {
|
||||||
abstract val source: String
|
abstract val source: String
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.dto.tasks
|
package no.iktdev.mediaprocessing.shared.common.contract.dto.tasks
|
||||||
|
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
|
|
||||||
@ -1,8 +1,7 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.ffmpeg
|
package no.iktdev.mediaprocessing.shared.common.contract.ffmpeg
|
||||||
|
|
||||||
data class AudioArgumentsDto(
|
data class AudioArgumentsDto(
|
||||||
val index: Int,
|
val index: Int,
|
||||||
val codecParameters: List<String> = listOf("-acodec", "copy"),
|
val codecParameters: List<String> = listOf("-acodec", "copy"),
|
||||||
val optionalParameters: List<String> = listOf()
|
val optionalParameters: List<String> = listOf()
|
||||||
|
|
||||||
)
|
)
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.ffmpeg
|
package no.iktdev.mediaprocessing.shared.common.contract.ffmpeg
|
||||||
|
|
||||||
data class ParsedMediaStreams(
|
data class ParsedMediaStreams(
|
||||||
val videoStream: List<VideoStream> = listOf(),
|
val videoStream: List<VideoStream> = listOf(),
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.ffmpeg
|
package no.iktdev.mediaprocessing.shared.common.contract.ffmpeg
|
||||||
|
|
||||||
data class PreferenceDto(
|
data class PreferenceDto(
|
||||||
val encodePreference: EncodingPreference = EncodingPreference(video = VideoPreference(), audio = AudioPreference()),
|
val encodePreference: EncodingPreference = EncodingPreference(video = VideoPreference(), audio = AudioPreference()),
|
||||||
@ -38,6 +38,7 @@ data class AudioPreference(
|
|||||||
val channels: Int? = null,
|
val channels: Int? = null,
|
||||||
val language: String = "eng", //ISO3 format
|
val language: String = "eng", //ISO3 format
|
||||||
val preserveChannels: Boolean = true,
|
val preserveChannels: Boolean = true,
|
||||||
val defaultToEAC3OnSurroundDetected: Boolean = true,
|
val passthroughOnGenerallySupportedSurroundSound: Boolean = true,
|
||||||
|
val convertToEac3OnUnsupportedSurround: Boolean = true,
|
||||||
val forceStereo: Boolean = false
|
val forceStereo: Boolean = false
|
||||||
)
|
)
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.ffmpeg
|
package no.iktdev.mediaprocessing.shared.common.contract.ffmpeg
|
||||||
|
|
||||||
data class SubtitleArgumentsDto(
|
data class SubtitleArgumentsDto(
|
||||||
val index: Int,
|
val index: Int,
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.ffmpeg
|
package no.iktdev.mediaprocessing.shared.common.contract.ffmpeg
|
||||||
|
|
||||||
|
|
||||||
data class VideoAndAudioDto(
|
data class VideoAndAudioDto(
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.ffmpeg
|
package no.iktdev.mediaprocessing.shared.common.contract.ffmpeg
|
||||||
|
|
||||||
data class VideoArgumentsDto(
|
data class VideoArgumentsDto(
|
||||||
val index: Int,
|
val index: Int,
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.reader
|
package no.iktdev.mediaprocessing.shared.common.contract.reader
|
||||||
|
|
||||||
data class MetadataDto(
|
data class MetadataDto(
|
||||||
val title: String,
|
val title: String,
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.reader
|
package no.iktdev.mediaprocessing.shared.common.contract.reader
|
||||||
|
|
||||||
data class SubtitlesDto(
|
data class SubtitlesDto(
|
||||||
val collection: String,
|
val collection: String,
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.contract.reader
|
package no.iktdev.mediaprocessing.shared.common.contract.reader
|
||||||
|
|
||||||
data class VideoDetails(
|
data class VideoDetails(
|
||||||
val serieInfo: SerieInfo? = null,
|
val serieInfo: SerieInfo? = null,
|
||||||
@ -0,0 +1,181 @@
|
|||||||
|
package no.iktdev.mediaprocessing.shared.common.database.cal
|
||||||
|
|
||||||
|
import mu.KotlinLogging
|
||||||
|
import no.iktdev.eventi.core.PersistentMessageHelper
|
||||||
|
import no.iktdev.eventi.data.eventId
|
||||||
|
import no.iktdev.eventi.data.referenceId
|
||||||
|
import no.iktdev.eventi.data.toJson
|
||||||
|
import no.iktdev.eventi.database.DataSource
|
||||||
|
import no.iktdev.eventi.database.isCausedByDuplicateError
|
||||||
|
import no.iktdev.eventi.database.isExposedSqlException
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.tables.allEvents
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.tables.events
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.Events
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.fromJsonWithDeserializer
|
||||||
|
import org.jetbrains.exposed.exceptions.ExposedSQLException
|
||||||
|
import org.jetbrains.exposed.sql.*
|
||||||
|
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
||||||
|
|
||||||
|
open class EventsManager(dataSource: DataSource) : EventsManagerContract(dataSource) {
|
||||||
|
val log = KotlinLogging.logger {}
|
||||||
|
|
||||||
|
|
||||||
|
override fun storeEvent(event: Event): Boolean {
|
||||||
|
|
||||||
|
no.iktdev.eventi.database.withTransaction(dataSource.database) {
|
||||||
|
allEvents.insert {
|
||||||
|
it[referenceId] = event.referenceId()
|
||||||
|
it[eventId] = event.eventId()
|
||||||
|
it[events.event] = event.eventType.event
|
||||||
|
it[data] = event.toJson()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val existing = getEventsWith(event.referenceId())
|
||||||
|
|
||||||
|
val derivedId = event.metadata.derivedFromEventId
|
||||||
|
if (derivedId != null) {
|
||||||
|
val isNewEventOrphan = existing.none { it.eventId() == derivedId }
|
||||||
|
if (isNewEventOrphan) {
|
||||||
|
log.warn { "Message not saved! ${event.referenceId()} with eventId(${event.eventId()}) for event ${event.eventType} has derivedEventId($derivedId) which does not exist!" }
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val exception = no.iktdev.eventi.database.executeOrException(dataSource.database) {
|
||||||
|
events.insert {
|
||||||
|
it[referenceId] = event.referenceId()
|
||||||
|
it[eventId] = event.eventId()
|
||||||
|
it[events.event] = event.eventType.event
|
||||||
|
it[data] = event.toJson()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val success = if (exception != null) {
|
||||||
|
if (exception.isExposedSqlException()) {
|
||||||
|
if ((exception as ExposedSQLException).isCausedByDuplicateError()) {
|
||||||
|
log.debug { "Error is of SQLIntegrityConstraintViolationException" }
|
||||||
|
log.error { exception.message }
|
||||||
|
exception.printStackTrace()
|
||||||
|
} else {
|
||||||
|
log.debug { "Error code is: ${exception.errorCode}" }
|
||||||
|
log.error { exception.message }
|
||||||
|
exception.printStackTrace()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.error { exception.message }
|
||||||
|
exception.printStackTrace()
|
||||||
|
}
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
if (success) {
|
||||||
|
//deleteSupersededEvents(referenceId = event.referenceId(), eventId = event.eventId(), event = event.eventType, derivedFromId = event.derivedFromEventId())
|
||||||
|
}
|
||||||
|
return success
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private val exemptedFromSingleEvent = listOf(
|
||||||
|
Events.EventWorkConvertCreated,
|
||||||
|
Events.EventWorkExtractCreated,
|
||||||
|
Events.EventWorkConvertPerformed,
|
||||||
|
Events.EventWorkExtractPerformed
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun isExempted(event: Events): Boolean {
|
||||||
|
return event in exemptedFromSingleEvent
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
override fun readAvailableEvents(): List<List<Event>> {
|
||||||
|
return no.iktdev.eventi.database.withTransaction(dataSource.database) {
|
||||||
|
events.selectAll()
|
||||||
|
.groupBy { it[events.referenceId] }
|
||||||
|
.mapNotNull { it.value.mapNotNull { v -> v.toEvent() } }.filter { it.none { e -> e.eventType == Events.EventMediaProcessCompleted } }
|
||||||
|
} ?: emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun readAvailableEventsFor(referenceId: String): List<Event> {
|
||||||
|
val events = no.iktdev.eventi.database.withTransaction(dataSource.database) {
|
||||||
|
events.select { events.referenceId eq referenceId }
|
||||||
|
.mapNotNull { it.toEvent() }
|
||||||
|
} ?: emptyList()
|
||||||
|
return if (events.any { it.eventType == Events.EventMediaProcessCompleted }) emptyList() else events
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAllEvents(): List<List<Event>> {
|
||||||
|
val events = no.iktdev.eventi.database.withTransaction(dataSource.database) {
|
||||||
|
events.selectAll()
|
||||||
|
.groupBy { it[events.referenceId] }
|
||||||
|
.mapNotNull { it.value.mapNotNull { v -> v.toEvent() } }
|
||||||
|
} ?: emptyList()
|
||||||
|
return events.filter { it.none { it.eventType == Events.EventMediaProcessCompleted } }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
override fun getEventsWith(referenceId: String): List<Event> {
|
||||||
|
return no.iktdev.eventi.database.withTransaction(dataSource.database) {
|
||||||
|
events.select {
|
||||||
|
(events.referenceId eq referenceId)
|
||||||
|
}
|
||||||
|
.orderBy(events.created, SortOrder.ASC)
|
||||||
|
.mapNotNull { it.toEvent() }
|
||||||
|
} ?: emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param referenceId Reference
|
||||||
|
* @param eventId Current eventId for the message, required to prevent deletion of itself
|
||||||
|
* @param event Current event for the message
|
||||||
|
*/
|
||||||
|
private fun deleteSupersededEvents(referenceId: String, eventId: String, event: Events, derivedFromId: String?) {
|
||||||
|
val forRemoval = mutableListOf<Event>()
|
||||||
|
|
||||||
|
val present = getEventsWith(referenceId).filter { it.metadata.derivedFromEventId != null }
|
||||||
|
val helper = PersistentMessageHelper<Event>(present)
|
||||||
|
|
||||||
|
val replaced = if (!isExempted(event)) present.find { it.eventId() != eventId && it.eventType == event } else null
|
||||||
|
val orphaned = replaced?.let { helper.getEventsRelatedTo(it.eventId()) }?.toMutableSet() ?: mutableSetOf()
|
||||||
|
//orphaned.addAll(helper.findOrphanedEvents())
|
||||||
|
|
||||||
|
forRemoval.addAll(orphaned)
|
||||||
|
|
||||||
|
deleteSupersededEvents(forRemoval)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes the events
|
||||||
|
*/
|
||||||
|
private fun deleteSupersededEvents(superseded: List<Event>) {
|
||||||
|
no.iktdev.eventi.database.withTransaction(dataSource) {
|
||||||
|
superseded.forEach { duplicate ->
|
||||||
|
events.deleteWhere {
|
||||||
|
(referenceId eq duplicate.referenceId()) and
|
||||||
|
(eventId eq duplicate.eventId()) and
|
||||||
|
(event eq duplicate.eventType.event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun ResultRow.toEvent(): Event? {
|
||||||
|
val kev = try {
|
||||||
|
Events.toEvent(this[events.event])
|
||||||
|
} catch (e: IllegalArgumentException) {
|
||||||
|
e.printStackTrace()
|
||||||
|
return null
|
||||||
|
}?: return null
|
||||||
|
return this[events.data].fromJsonWithDeserializer(kev)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,9 +1,10 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.common.persistance
|
package no.iktdev.mediaprocessing.shared.common.database.cal
|
||||||
|
|
||||||
import mu.KotlinLogging
|
import mu.KotlinLogging
|
||||||
import no.iktdev.eventi.database.DataSource
|
import no.iktdev.eventi.database.DataSource
|
||||||
import no.iktdev.eventi.database.executeOrException
|
import no.iktdev.eventi.database.executeOrException
|
||||||
import no.iktdev.eventi.database.withDirtyRead
|
import no.iktdev.eventi.database.withDirtyRead
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.tables.runners
|
||||||
import no.iktdev.mediaprocessing.shared.common.getAppVersion
|
import no.iktdev.mediaprocessing.shared.common.getAppVersion
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.sql.and
|
||||||
import org.jetbrains.exposed.sql.insert
|
import org.jetbrains.exposed.sql.insert
|
||||||
@ -1,14 +1,16 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.common.persistance
|
package no.iktdev.mediaprocessing.shared.common.database.cal
|
||||||
|
|
||||||
import mu.KotlinLogging
|
import mu.KotlinLogging
|
||||||
import no.iktdev.eventi.data.eventId
|
import no.iktdev.eventi.data.eventId
|
||||||
import no.iktdev.eventi.data.referenceId
|
import no.iktdev.eventi.data.referenceId
|
||||||
import no.iktdev.eventi.data.toJson
|
import no.iktdev.eventi.data.toJson
|
||||||
import no.iktdev.eventi.database.*
|
import no.iktdev.eventi.database.*
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.tables.events
|
||||||
|
import no.iktdev.mediaprocessing.shared.common.database.tables.tasks
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.Task
|
import no.iktdev.mediaprocessing.shared.common.task.Task
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
import no.iktdev.mediaprocessing.shared.common.task.TaskType
|
||||||
import no.iktdev.mediaprocessing.shared.common.task.TaskDoz
|
import no.iktdev.mediaprocessing.shared.common.task.TaskDoz
|
||||||
import no.iktdev.mediaprocessing.shared.contract.data.Event
|
|
||||||
import org.jetbrains.exposed.exceptions.ExposedSQLException
|
import org.jetbrains.exposed.exceptions.ExposedSQLException
|
||||||
import org.jetbrains.exposed.sql.*
|
import org.jetbrains.exposed.sql.*
|
||||||
import org.jetbrains.exposed.sql.javatime.CurrentDateTime
|
import org.jetbrains.exposed.sql.javatime.CurrentDateTime
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package no.iktdev.mediaprocessing.shared.common.persistance
|
package no.iktdev.mediaprocessing.shared.common.database.tables
|
||||||
|
|
||||||
import org.jetbrains.exposed.dao.id.IntIdTable
|
import org.jetbrains.exposed.dao.id.IntIdTable
|
||||||
import org.jetbrains.exposed.sql.Column
|
import org.jetbrains.exposed.sql.Column
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user