This commit is contained in:
bskjon 2024-07-28 15:26:44 +02:00
parent 3efc04744c
commit 9c7e42ae29
115 changed files with 864 additions and 717 deletions

View File

@ -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")))

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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")

View File

@ -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

View File

@ -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 {

View File

@ -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

View File

@ -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() {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
}*/
}

View File

@ -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
}*/
}

View File

@ -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())
}*/
}

View File

@ -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
}*/
}

View File

@ -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
}
}*/

View File

@ -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 {}

View File

@ -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

View 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

View File

@ -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

View 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

View 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

View File

@ -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

View 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

View File

@ -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

View 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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View 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(

View File

@ -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(

View File

@ -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?,

View File

@ -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()
) )
} }
} }

View File

@ -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>) {
/** /**

View File

@ -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,

View File

@ -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 {}

View File

@ -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

View File

@ -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

View File

@ -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)
} }
} }

View File

@ -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()

View File

@ -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()
}

View File

@ -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")))

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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

View 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

View 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")

View File

@ -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")

View File

@ -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 }

View File

@ -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

View File

@ -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
) )

View File

@ -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"),

View File

@ -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

View File

@ -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) {
} }

View File

@ -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()
} }

View File

@ -0,0 +1,6 @@
package no.iktdev.mediaprocessing.shared.common.contract
enum class ProcessType {
FLOW,
MANUAL
}

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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

View File

@ -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,

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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()
) )

View File

@ -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(),

View File

@ -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
) )

View File

@ -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,

View File

@ -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(

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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)
}
}

View File

@ -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

View File

@ -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

View File

@ -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