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(project(mapOf("path" to ":shared:eventi")))
implementation(project(mapOf("path" to ":shared:contract")))
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.mediaprocessing.shared.common.DatabaseEnvConfig
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.persistance.*
import no.iktdev.mediaprocessing.shared.common.toEventsDatabase
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

View File

@ -2,11 +2,10 @@ package no.iktdev.mediaprocessing.converter
import mu.KotlinLogging
import no.iktdev.mediaprocessing.shared.common.*
import no.iktdev.mediaprocessing.shared.common.persistance.ActiveMode
import no.iktdev.mediaprocessing.shared.common.persistance.RunnerManager
import no.iktdev.mediaprocessing.shared.common.database.cal.ActiveMode
import no.iktdev.mediaprocessing.shared.common.database.cal.RunnerManager
import no.iktdev.mediaprocessing.shared.common.task.TaskType
import no.iktdev.mediaprocessing.shared.contract.data.Event
import org.springframework.beans.factory.annotation.Value
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
import org.springframework.scheduling.annotation.EnableScheduling
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.Reader
import no.iktdev.mediaprocessing.converter.ConverterEnv
import no.iktdev.mediaprocessing.shared.contract.data.ConvertData
import no.iktdev.mediaprocessing.shared.contract.dto.SubtitleFormats
import no.iktdev.mediaprocessing.shared.common.contract.data.ConvertData
import no.iktdev.mediaprocessing.shared.common.contract.dto.SubtitleFormats
import java.io.File
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.convert.ConvertListener
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.task.Task
import no.iktdev.mediaprocessing.shared.contract.data.ConvertData
import no.iktdev.mediaprocessing.shared.contract.data.ConvertWorkPerformed
import no.iktdev.mediaprocessing.shared.contract.data.ConvertedData
import no.iktdev.mediaprocessing.shared.common.contract.data.ConvertData
import no.iktdev.mediaprocessing.shared.common.contract.data.ConvertWorkPerformed
import no.iktdev.mediaprocessing.shared.common.contract.data.ConvertedData
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service

View File

@ -46,7 +46,6 @@ dependencies {
//implementation(project(mapOf("path" to ":shared")))
implementation(project(mapOf("path" to ":shared:eventi")))
implementation(project(mapOf("path" to ":shared:contract")))
implementation(project(mapOf("path" to ":shared:common")))
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.mediaprocessing.shared.common.*
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.helper.cast_errors
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.implementations.ActiveMode
import no.iktdev.eventi.implementations.EventCoordinator
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.ProcessType
import no.iktdev.mediaprocessing.shared.contract.data.Event
import no.iktdev.mediaprocessing.shared.contract.data.MediaProcessStartEvent
import no.iktdev.mediaprocessing.shared.contract.data.PermitWorkCreationEvent
import no.iktdev.mediaprocessing.shared.contract.data.StartEventData
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.ProcessType
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaProcessStartEvent
import no.iktdev.mediaprocessing.shared.common.contract.data.PermitWorkCreationEvent
import no.iktdev.mediaprocessing.shared.common.contract.data.StartEventData
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.ApplicationContext
import org.springframework.stereotype.Component
@ -73,15 +73,17 @@ class Coordinator(
}
produceNewEvent(PermitWorkCreationEvent(
metadata = EventMetadata(
referenceId = referenceId,
derivedFromEventId = eventToAttachTo.eventId(),
status = EventStatus.Success,
source = getProducerName()
),
data = message
))
produceNewEvent(
no.iktdev.mediaprocessing.shared.common.contract.data.PermitWorkCreationEvent(
metadata = EventMetadata(
referenceId = referenceId,
derivedFromEventId = eventToAttachTo.eventId(),
status = EventStatus.Success,
source = getProducerName()
),
data = message
)
)
}
override fun getActiveTaskMode(): ActiveMode {

View File

@ -1,7 +1,7 @@
package no.iktdev.mediaprocessing.coordinator
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
abstract class CoordinatorEventListener(): EventsListenerContract<EventsManager, Coordinator>() {
abstract override val produceEvent: Events

View File

@ -1,10 +1,10 @@
package no.iktdev.mediaprocessing.coordinator
import no.iktdev.mediaprocessing.shared.common.DatabaseEnvConfig
import no.iktdev.mediaprocessing.shared.common.persistance.allEvents
import no.iktdev.mediaprocessing.shared.common.persistance.events
import no.iktdev.mediaprocessing.shared.common.persistance.runners
import no.iktdev.mediaprocessing.shared.common.persistance.tasks
import no.iktdev.mediaprocessing.shared.common.database.tables.allEvents
import no.iktdev.mediaprocessing.shared.common.database.tables.events
import no.iktdev.mediaprocessing.shared.common.database.tables.runners
import no.iktdev.mediaprocessing.shared.common.database.tables.tasks
import no.iktdev.mediaprocessing.shared.common.toEventsDatabase
class EventsDatabase() {

View File

@ -1,18 +1,18 @@
package no.iktdev.mediaprocessing.coordinator
import no.iktdev.eventi.core.PersistentMessageHelper
import no.iktdev.eventi.data.derivedFromEventId
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.persistance.*
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.contract.data.Event
import no.iktdev.mediaprocessing.shared.contract.fromJsonWithDeserializer
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

View File

@ -3,7 +3,7 @@ package no.iktdev.mediaprocessing.coordinator.controller
import com.google.gson.Gson
import no.iktdev.mediaprocessing.coordinator.Coordinator
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.http.HttpStatus
import org.springframework.http.ResponseEntity

View File

@ -2,9 +2,9 @@ package no.iktdev.mediaprocessing.coordinator.controller
import com.google.gson.Gson
import no.iktdev.mediaprocessing.coordinator.Coordinator
import no.iktdev.mediaprocessing.shared.contract.ProcessType
import no.iktdev.mediaprocessing.shared.contract.dto.EventRequest
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
import no.iktdev.mediaprocessing.shared.common.contract.ProcessType
import no.iktdev.mediaprocessing.shared.common.contract.dto.EventRequest
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.HttpStatus
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 no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.contract.ProcessType
import no.iktdev.mediaprocessing.shared.contract.data.Event
import no.iktdev.mediaprocessing.shared.contract.data.MediaProcessStartEvent
import no.iktdev.mediaprocessing.shared.contract.data.az
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.ProcessType
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaProcessStartEvent
import no.iktdev.mediaprocessing.shared.common.contract.data.az
abstract class WorkTaskListener: CoordinatorEventListener() {
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.Coordinator
import no.iktdev.mediaprocessing.shared.common.parsing.FileNameParser
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.data.BaseInfo
import no.iktdev.mediaprocessing.shared.contract.data.BaseInfoEvent
import no.iktdev.mediaprocessing.shared.contract.data.Event
import no.iktdev.mediaprocessing.shared.contract.data.StartEventData
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.data.BaseInfo
import no.iktdev.mediaprocessing.shared.common.contract.data.BaseInfoEvent
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
import no.iktdev.mediaprocessing.shared.common.contract.data.StartEventData
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
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.withTransaction
import no.iktdev.mediaprocessing.shared.common.parsing.NameHelper
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.data.*
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
import no.iktdev.mediaprocessing.shared.contract.dto.SubtitleFormats
import no.iktdev.mediaprocessing.shared.contract.reader.*
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.data.*
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
import no.iktdev.mediaprocessing.shared.common.contract.dto.SubtitleFormats
import no.iktdev.mediaprocessing.shared.common.contract.reader.*
import no.iktdev.streamit.library.db.query.CatalogQuery
import no.iktdev.streamit.library.db.query.GenreQuery
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.tasksV2.implementations.WorkTaskListener
import no.iktdev.mediaprocessing.shared.common.task.TaskType
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.contract.data.*
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
import no.iktdev.mediaprocessing.shared.contract.dto.isOnly
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.common.contract.data.*
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
import no.iktdev.mediaprocessing.shared.common.contract.dto.isOnly
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
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.CoordinatorEventListener
import no.iktdev.mediaprocessing.shared.common.DownloadClient
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.contract.data.*
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.common.contract.data.*
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
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.shared.common.parsing.NameHelper
import no.iktdev.mediaprocessing.shared.common.parsing.Regexes
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.data.*
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.data.*
import org.springframework.beans.factory.annotation.Autowired
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.tasksV2.mapping.EncodeWorkArgumentsMapping
import no.iktdev.mediaprocessing.shared.common.Preference
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.contract.data.*
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.common.contract.data.*
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
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.tasksV2.implementations.WorkTaskListener
import no.iktdev.mediaprocessing.shared.common.task.TaskType
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.contract.data.*
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.common.contract.data.*
import org.springframework.beans.factory.annotation.Autowired
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.CoordinatorEventListener
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.ExtractWorkArgumentsMapping
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.contract.data.*
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.common.contract.data.*
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
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.tasksV2.implementations.WorkTaskListener
import no.iktdev.mediaprocessing.shared.common.task.TaskType
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.contract.data.*
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.common.contract.data.*
import org.springframework.beans.factory.annotation.Autowired
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.Regexes
import no.iktdev.mediaprocessing.shared.common.parsing.isCharOnlyUpperCase
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.data.*
import no.iktdev.mediaprocessing.shared.contract.data.EpisodeInfo
import no.iktdev.mediaprocessing.shared.contract.data.MovieInfo
import no.iktdev.mediaprocessing.shared.contract.data.pyMetadata
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.data.*
import no.iktdev.mediaprocessing.shared.common.contract.data.EpisodeInfo
import no.iktdev.mediaprocessing.shared.common.contract.data.MovieInfo
import no.iktdev.mediaprocessing.shared.common.contract.data.pyMetadata
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
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.Coordinator
import no.iktdev.eventi.database.toEpochSeconds
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.data.BaseInfoEvent
import no.iktdev.mediaprocessing.shared.contract.data.Event
import no.iktdev.mediaprocessing.shared.contract.data.MediaMetadataReceivedEvent
import no.iktdev.mediaprocessing.shared.contract.data.az
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.data.BaseInfoEvent
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaMetadataReceivedEvent
import no.iktdev.mediaprocessing.shared.common.contract.data.az
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.scheduling.annotation.EnableScheduling
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.mediaprocessing.coordinator.Coordinator
import no.iktdev.mediaprocessing.coordinator.CoordinatorEventListener
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.contract.data.Event
import no.iktdev.mediaprocessing.shared.contract.data.MediaFileStreamsParsedEvent
import no.iktdev.mediaprocessing.shared.contract.data.MediaFileStreamsReadEvent
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioStream
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.SubtitleStream
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoStream
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaFileStreamsParsedEvent
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaFileStreamsReadEvent
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioStream
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.SubtitleStream
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoStream
import org.springframework.beans.factory.annotation.Autowired
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.runner.CodeToOutput
import no.iktdev.mediaprocessing.shared.common.runner.getOutputUsing
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.contract.data.Event
import no.iktdev.mediaprocessing.shared.contract.data.MediaFileStreamsReadEvent
import no.iktdev.mediaprocessing.shared.contract.data.StartEventData
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.EventsListenerContract
import no.iktdev.mediaprocessing.shared.common.contract.EventsManagerContract
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
import no.iktdev.mediaprocessing.shared.common.contract.data.MediaFileStreamsReadEvent
import no.iktdev.mediaprocessing.shared.common.contract.data.StartEventData
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
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.mediaprocessing.coordinator.tasksV2.mapping.streams.AudioArguments
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams.VideoArguments
import no.iktdev.mediaprocessing.shared.contract.data.EncodeArgumentData
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioStream
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.EncodingPreference
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoStream
import no.iktdev.mediaprocessing.shared.common.contract.data.EncodeArgumentData
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioStream
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.VideoStream
import java.io.File
class EncodeWorkArgumentsMapping(

View File

@ -2,8 +2,8 @@ package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping
import no.iktdev.exfl.using
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams.SubtitleArguments
import no.iktdev.mediaprocessing.shared.contract.data.ExtractArgumentData
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
import no.iktdev.mediaprocessing.shared.common.contract.data.ExtractArgumentData
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
import java.io.File
class ExtractWorkArgumentsMapping(

View File

@ -1,7 +1,7 @@
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioArgumentsDto
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoArgumentsDto
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioArgumentsDto
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoArgumentsDto
fun toFfmpegWorkerArguments(
videoArguments: VideoArgumentsDto?,

View File

@ -1,9 +1,9 @@
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioArgumentsDto
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioPreference
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioStream
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.AudioArgumentsDto
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
class AudioArguments(
val audioStream: AudioStream,
@ -12,42 +12,70 @@ class AudioArguments(
) {
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 {
return audioStream.channels > 2
}
private fun shouldUseEAC3(): Boolean {
return (preference.defaultToEAC3OnSurroundDetected && audioStream.channels > 2 && audioStream.codec_name.lowercase() != "eac3")
}
fun getAudioArguments(): AudioArgumentsDto {
val optionalParams = mutableListOf<String>()
val codecParams = if (isAudioCodecEqual() || isSurroundAndEAC3()) {
listOf("-acodec", "copy")
} else if (!isSurroundButNotEAC3() && shouldUseEAC3()) {
listOf("-c:a", "eac3")
} else {
val codecSwap = mutableListOf("-c:a", preference.codec)
if (audioStream.channels > 2 && !preference.preserveChannels) {
codecSwap.addAll(listOf("-ac", "2"))
if (!isSurround()) {
return if (isAudioCodecEqual()) {
asPassthrough()
} else {
asStereo()
}
} else {
if (preference.forceStereo) {
return asStereo()
}
if (preference.passthroughOnGenerallySupportedSurroundSound && isOfSupportedSurroundCodec()) {
return asPassthrough()
} else if (preference.passthroughOnGenerallySupportedSurroundSound && !isOfSupportedSurroundCodec()) {
return asSurround()
}
if (preference.convertToEac3OnUnsupportedSurround ) {
return asSurround()
}
codecSwap
}
return AudioArgumentsDto(
index = allStreams.audioStream.indexOf(audioStream),
codecParameters = codecParams,
optionalParameters = optionalParams
)
return asStereo()
}
}
fun index(): Int {
return allStreams.audioStream.indexOf(audioStream)
}
fun asPassthrough(): AudioArgumentsDto {
return AudioArgumentsDto(
index = index()
)
}
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
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.SubtitleArgumentsDto
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.SubtitleStream
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.SubtitleArgumentsDto
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.SubtitleStream
class SubtitleArguments(val subtitleStreams: List<SubtitleStream>) {
/**

View File

@ -1,9 +1,9 @@
package no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoArgumentsDto
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoPreference
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.VideoStream
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoArgumentsDto
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoPreference
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.VideoStream
class VideoArguments(
val videoStream: VideoStream,

View File

@ -3,7 +3,7 @@ package no.iktdev.mediaprocessing.coordinator.utils
import mu.KotlinLogging
import no.iktdev.mediaprocessing.shared.common.persistance.*
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 {}

View File

@ -10,7 +10,7 @@ import mu.KotlinLogging
import no.iktdev.mediaprocessing.coordinator.*
import no.iktdev.mediaprocessing.shared.common.SharedConfig
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.context.ApplicationContext
import org.springframework.stereotype.Service

View File

@ -2,7 +2,7 @@ package no.iktdev.mediaprocessing.coordinator.reader
/*
import com.google.gson.Gson
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.ProcessStarted
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.reflect.TypeToken
import no.iktdev.mediaprocessing.coordinator.tasksV2.mapping.streams.AudioArguments
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioPreference
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.AudioStream
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
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
@ -17,7 +17,7 @@ class EncodeArgumentCreatorTaskTest {
val audio = AudioArguments(
audioStream = audioStreamsEAC().first(),
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()
assertThat(arguments.codecParameters).isEqualTo(listOf("-acodec", "copy"))
@ -75,4 +75,6 @@ class EncodeArgumentCreatorTaskTest {
val type = object : TypeToken<List<AudioStream>>() {}.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:eventi")))
implementation(project(mapOf("path" to ":shared:contract")))
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.mediaprocessing.shared.common.DatabaseEnvConfig
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.persistance.*
import no.iktdev.mediaprocessing.shared.common.toEventsDatabase
import org.jetbrains.exposed.sql.transactions.TransactionManager
import org.springframework.boot.autoconfigure.SpringBootApplication

View File

@ -2,7 +2,7 @@ package no.iktdev.mediaprocessing.processer
import mu.KotlinLogging
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.messaging.simp.SimpMessagingTemplate
import org.springframework.stereotype.Service

View File

@ -2,10 +2,10 @@ package no.iktdev.mediaprocessing.processer
import mu.KotlinLogging
import no.iktdev.mediaprocessing.shared.common.*
import no.iktdev.mediaprocessing.shared.common.persistance.ActiveMode
import no.iktdev.mediaprocessing.shared.common.persistance.RunnerManager
import no.iktdev.mediaprocessing.shared.common.database.cal.ActiveMode
import no.iktdev.mediaprocessing.shared.common.database.cal.RunnerManager
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.stereotype.Service

View File

@ -1,6 +1,6 @@
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(
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.progress.FfmpegDecodedProgress
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.contract.data.EncodeArgumentData
import no.iktdev.mediaprocessing.shared.contract.data.EncodeWorkPerformedEvent
import no.iktdev.mediaprocessing.shared.contract.data.EncodedData
import no.iktdev.mediaprocessing.shared.contract.dto.ProcesserEventInfo
import no.iktdev.mediaprocessing.shared.contract.dto.WorkStatus
import no.iktdev.mediaprocessing.shared.common.contract.data.EncodeArgumentData
import no.iktdev.mediaprocessing.shared.common.contract.data.EncodeWorkPerformedEvent
import no.iktdev.mediaprocessing.shared.common.contract.data.EncodedData
import no.iktdev.mediaprocessing.shared.common.contract.dto.ProcesserEventInfo
import no.iktdev.mediaprocessing.shared.common.contract.dto.WorkStatus
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
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.taskManager
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.contract.data.ExtractArgumentData
import no.iktdev.mediaprocessing.shared.contract.data.ExtractWorkPerformedEvent
import no.iktdev.mediaprocessing.shared.contract.data.ExtractedData
import no.iktdev.mediaprocessing.shared.contract.dto.ProcesserEventInfo
import no.iktdev.mediaprocessing.shared.contract.dto.WorkStatus
import no.iktdev.mediaprocessing.shared.common.contract.data.ExtractArgumentData
import no.iktdev.mediaprocessing.shared.common.contract.data.ExtractWorkPerformedEvent
import no.iktdev.mediaprocessing.shared.common.contract.data.ExtractedData
import no.iktdev.mediaprocessing.shared.common.contract.dto.ProcesserEventInfo
import no.iktdev.mediaprocessing.shared.common.contract.dto.WorkStatus
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import java.io.File

View File

@ -11,7 +11,6 @@ findProject(":apps:processer")?.name = "processer"
findProject(":shared")?.name = "shared"
findProject(":shared:eventi")?.name = "eventi"
findProject(":shared:contract")?.name = "contract"
findProject(":shared:common")?.name = "common"
include("apps")
@ -22,5 +21,4 @@ include("apps:processer")
include("shared")
include("shared:eventi")
include("shared:contract")
include("shared:common")

View File

@ -43,7 +43,6 @@ dependencies {
implementation(project(mapOf("path" to ":shared:eventi")))
implementation(project(mapOf("path" to ":shared:contract")))
testImplementation(platform("org.junit:junit-bom:5.9.1"))
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.GsonBuilder
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 {}
class Preference {
@ -17,7 +17,7 @@ class Preference {
log.info { "[Audio]: Language = " + preference.encodePreference.audio.language }
log.info { "[Audio]: Channels = " + preference.encodePreference.audio.channels }
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]: Pixel format = " + preference.encodePreference.video.pixelFormat }

View File

@ -1,11 +1,10 @@
package no.iktdev.mediaprocessing.shared.common
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.TaskType
import no.iktdev.mediaprocessing.shared.contract.data.Event
import org.springframework.beans.factory.annotation.Autowired
import no.iktdev.mediaprocessing.shared.common.contract.data.Event
import org.springframework.scheduling.annotation.EnableScheduling
import org.springframework.scheduling.annotation.Scheduled
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 mu.KotlinLogging
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 {}
object EventToClazzTable {
@ -27,7 +27,7 @@ object EventToClazzTable {
Events.EventMediaReadStreamPerformed to MediaFileStreamsReadEvent::class.java,
Events.EventMediaMetadataSearchPerformed to MediaMetadataReceivedEvent::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
)

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

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.isSuccessful
@ -7,12 +7,12 @@ fun List<EventImpl>.lastOrSuccess(): EventImpl? {
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 }
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) }
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.EventMetadata
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
data class BaseInfoEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.dto.SubtitleFormats
import no.iktdev.mediaprocessing.shared.contract.dto.tasks.TaskData
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.dto.SubtitleFormats
import no.iktdev.mediaprocessing.shared.common.contract.dto.tasks.TaskData
data class ConvertWorkCreatedEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
class ConvertWorkPerformed(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.dto.tasks.TaskData
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.dto.tasks.TaskData
data class EncodeArgumentCreatedEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
data class EncodeWorkCreatedEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
data class EncodeWorkPerformedEvent(
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.EventMetadata
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
abstract class Event: EventImpl() {
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.dto.tasks.TaskData
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.dto.tasks.TaskData
data class ExtractArgumentCreatedEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
data class ExtractWorkCreatedEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
data class ExtractWorkPerformedEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
data class MediaCoverDownloadedEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
data class MediaCoverInfoReceivedEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.ffmpeg.ParsedMediaStreams
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.ffmpeg.ParsedMediaStreams
class MediaFileStreamsParsedEvent(
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 no.iktdev.eventi.data.EventImpl
import no.iktdev.eventi.data.EventMetadata
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
class MediaFileStreamsReadEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
data class MediaMetadataReceivedEvent(
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.JsonObject
import no.iktdev.eventi.data.EventMetadata
import no.iktdev.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
data class MediaOutInformationConstructedEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.ProcessType
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
import no.iktdev.mediaprocessing.shared.common.contract.Events
data class MediaProcessCompletedEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.contract.ProcessType
import no.iktdev.mediaprocessing.shared.contract.dto.StartOperationEvents
import no.iktdev.mediaprocessing.shared.common.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.ProcessType
import no.iktdev.mediaprocessing.shared.common.contract.dto.StartOperationEvents
data class MediaProcessStartEvent(
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.mediaprocessing.shared.contract.Events
import no.iktdev.mediaprocessing.shared.common.contract.Events
data class PermitWorkCreationEvent(
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 {
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(
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(
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(
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 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

View File

@ -1,8 +1,7 @@
package no.iktdev.mediaprocessing.shared.contract.ffmpeg
package no.iktdev.mediaprocessing.shared.common.contract.ffmpeg
data class AudioArgumentsDto(
val index: Int,
val codecParameters: List<String> = listOf("-acodec", "copy"),
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(
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(
val encodePreference: EncodingPreference = EncodingPreference(video = VideoPreference(), audio = AudioPreference()),
@ -38,6 +38,7 @@ data class AudioPreference(
val channels: Int? = null,
val language: String = "eng", //ISO3 format
val preserveChannels: Boolean = true,
val defaultToEAC3OnSurroundDetected: Boolean = true,
val passthroughOnGenerallySupportedSurroundSound: Boolean = true,
val convertToEac3OnUnsupportedSurround: Boolean = true,
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(
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(

View File

@ -1,4 +1,4 @@
package no.iktdev.mediaprocessing.shared.contract.ffmpeg
package no.iktdev.mediaprocessing.shared.common.contract.ffmpeg
data class VideoArgumentsDto(
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(
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(
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(
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 no.iktdev.eventi.database.DataSource
import no.iktdev.eventi.database.executeOrException
import no.iktdev.eventi.database.withDirtyRead
import no.iktdev.mediaprocessing.shared.common.database.tables.runners
import no.iktdev.mediaprocessing.shared.common.getAppVersion
import org.jetbrains.exposed.sql.and
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 no.iktdev.eventi.data.eventId
import no.iktdev.eventi.data.referenceId
import no.iktdev.eventi.data.toJson
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.TaskType
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.sql.*
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.sql.Column

Some files were not shown because too many files have changed in this diff Show More