diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 35eb1ddf..94a25f7f 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/EventConsumer.kt b/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/EventConsumer.kt deleted file mode 100644 index e79c94a0..00000000 --- a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/EventConsumer.kt +++ /dev/null @@ -1,47 +0,0 @@ -package no.iktdev.streamit.content.ui.kafka - -import com.google.gson.Gson -import mu.KotlinLogging -import no.iktdev.streamit.content.common.CommonConfig -import no.iktdev.streamit.content.common.DefaultKafkaReader -import no.iktdev.streamit.content.ui.kafka.converter.EventDataConverter -import no.iktdev.streamit.library.kafka.dto.Message -import no.iktdev.streamit.library.kafka.listener.ManualAcknowledgeMessageListener -import org.apache.kafka.clients.consumer.ConsumerRecord -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.kafka.listener.ContainerProperties -import org.springframework.stereotype.Service - -@Service -class EventConsumer: DefaultKafkaReader() { - @Autowired private lateinit var converter: EventDataConverter - companion object { - val idAndEvents: MutableMap> = mutableMapOf() - } - - private val log = KotlinLogging.logger {} - - private final val listener = object : ManualAcknowledgeMessageListener( - topic = CommonConfig.kafkaTopic, - consumer = defaultConsumer, - accepts = listOf() - ) { - override fun onMessageReceived(data: ConsumerRecord) { - applyUpdate(data.value().referenceId, data.key(), data.value()) - log.info { data.key() + Gson().toJson(data.value()) } - converter.convertEventToObject(data.value().referenceId) - } - } - - private fun applyUpdate(referenceId: String, eventKey: String, value: Message) { - val existingData = idAndEvents[referenceId] ?: mutableMapOf() - existingData[eventKey] = value - idAndEvents[referenceId] = existingData - } - - init { - defaultConsumer.autoCommit = false - defaultConsumer.ackModeOverride = ContainerProperties.AckMode.MANUAL - listener.listen() - } -} \ No newline at end of file diff --git a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataConverter.kt b/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataConverter.kt deleted file mode 100644 index 34116853..00000000 --- a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataConverter.kt +++ /dev/null @@ -1,33 +0,0 @@ -package no.iktdev.streamit.content.ui.kafka.converter - -import no.iktdev.mediaprocessing.shared.kafka.dto.Message -import no.iktdev.streamit.content.ui.dto.EventDataObject -import no.iktdev.streamit.content.ui.memActiveEventMap -import no.iktdev.streamit.content.ui.kafka.EventConsumer -import no.iktdev.streamit.content.ui.memSimpleConvertedEventsMap -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.stereotype.Component - -@Component -class EventDataConverter { - - @Autowired private lateinit var detailsConverter: EventDataDetailsSubConverter - @Autowired private lateinit var encodeConverter: EventDataEncodeSubConverter - @Autowired private lateinit var metadataConverter: EventDataMetadataSubConverter - @Autowired private lateinit var fileNameConverter: EventDataFilenameAndTypeDeterminerSubConverter - - fun convertEventToObject(eventReferenceId: String) { - val data = memActiveEventMap[eventReferenceId] ?: EventDataObject(id = eventReferenceId) - val collection = EventConsumer.idAndEvents[eventReferenceId] ?: emptyMap() - - detailsConverter.convertAndUpdate(data, collection.toMap()) - encodeConverter.convertAndUpdate(data, collection.toMap()) - metadataConverter.convertAndUpdate(data, collection.toMap()) - fileNameConverter.convertAndUpdate(data, collection.toMap()) - - - memActiveEventMap[eventReferenceId] = data - memSimpleConvertedEventsMap[eventReferenceId] = data.toSimple() - } - -} \ No newline at end of file diff --git a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataDetailsSubConverter.kt b/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataDetailsSubConverter.kt deleted file mode 100644 index ebf4abee..00000000 --- a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataDetailsSubConverter.kt +++ /dev/null @@ -1,31 +0,0 @@ -package no.iktdev.streamit.content.ui.kafka.converter - -import no.iktdev.streamit.content.common.deserializers.DeserializerRegistry -import no.iktdev.streamit.content.common.dto.reader.FileResult -import no.iktdev.streamit.content.ui.dto.Details -import no.iktdev.streamit.content.ui.dto.EventDataObject -import no.iktdev.streamit.library.kafka.KafkaEvents -import no.iktdev.streamit.library.kafka.dto.Message -import org.springframework.stereotype.Component - -@Component -class EventDataDetailsSubConverter : EventDataSubConverterBase() { - override fun convertEvents(eventData: EventDataObject, events: Map) { - val event = events.entries - .asSequence() - .filter { it.key == KafkaEvents.EVENT_READER_RECEIVED_FILE.event } - .filter { it.value.isSuccessful() } - .map { DeserializerRegistry.getDeserializerForEvent(it.key)?.deserialize(it.value) } - .filterIsInstance() - .lastOrNull() ?: return - - val deserialized = Details( - name = event.title, - file = event.file, - sanitizedName = event.sanitizedName - ) - eventData.details = deserialized - } - - -} \ No newline at end of file diff --git a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataEncodeSubConverter.kt b/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataEncodeSubConverter.kt deleted file mode 100644 index abb12873..00000000 --- a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataEncodeSubConverter.kt +++ /dev/null @@ -1,56 +0,0 @@ -package no.iktdev.streamit.content.ui.kafka.converter - -import no.iktdev.streamit.content.common.deserializers.DeserializerRegistry -import no.iktdev.streamit.content.common.dto.State -import no.iktdev.streamit.content.common.dto.reader.work.EncodeWork -import no.iktdev.streamit.content.ui.dto.Encode -import no.iktdev.streamit.content.ui.dto.EventDataObject -import no.iktdev.streamit.content.ui.dto.IO -import no.iktdev.streamit.library.kafka.KafkaEvents -import no.iktdev.streamit.library.kafka.dto.Message -import org.springframework.stereotype.Component - -@Component -class EventDataEncodeSubConverter : EventDataSubConverterBase() { - override fun convertEvents(eventData: EventDataObject, events: Map) { - val filteredEvents = events.entries - .asSequence() - .filter { - listOf( - KafkaEvents.EVENT_ENCODER_VIDEO_FILE_QUEUED.event, - KafkaEvents.EVENT_ENCODER_VIDEO_FILE_STARTED.event, - KafkaEvents.EVENT_ENCODER_VIDEO_FILE_ENDED.event - ).contains(it.key) - } - - val event = filteredEvents - .map { DeserializerRegistry.getDeserializerForEvent(it.key)?.deserialize(it.value) } - .filterIsInstance() - .lastOrNull() ?: return - - event.let { - eventData.details?.apply { this.collection = it.collection } - } - - eventData.io = IO(event.inFile, event.outFile) - eventData.encode = - if (eventData.encode != null) - eventData.encode?.apply { state = getState(filteredEvents).name } - else - Encode(state = getState(filteredEvents).name) - - } - - private fun getState(events: Sequence>): State { - val last = events.lastOrNull() - ?: return State.QUEUED - if (!last.value.isSuccessful()) return State.FAILURE - return when (last.key) { - KafkaEvents.EVENT_ENCODER_VIDEO_FILE_STARTED.event -> State.STARTED - KafkaEvents.EVENT_ENCODER_VIDEO_FILE_ENDED.event -> State.ENDED - else -> State.QUEUED - } - } - -} - diff --git a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataFilenameAndTypeDeterminerSubConverter.kt b/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataFilenameAndTypeDeterminerSubConverter.kt deleted file mode 100644 index af640b74..00000000 --- a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataFilenameAndTypeDeterminerSubConverter.kt +++ /dev/null @@ -1,40 +0,0 @@ -package no.iktdev.streamit.content.ui.kafka.converter - -import no.iktdev.streamit.content.common.deserializers.DeserializerRegistry -import no.iktdev.streamit.content.common.dto.ContentOutName -import no.iktdev.streamit.content.ui.dto.EventDataObject -import no.iktdev.streamit.library.kafka.KafkaEvents -import no.iktdev.streamit.library.kafka.dto.Message -import org.springframework.stereotype.Component - -@Component -class EventDataFilenameAndTypeDeterminerSubConverter : EventDataSubConverterBase() { - override fun convertEvents(eventData: EventDataObject, events: Map) { - - val convertedFileNameEvent = events.entries - .asSequence() - .filter { it.key == KafkaEvents.EVENT_READER_DETERMINED_FILENAME.event } - .filter { it.value.isSuccessful() } - .map { DeserializerRegistry.getDeserializerForEvent(it.key)?.deserialize(it.value) } - .filterIsInstance() - .lastOrNull() ?: return - - val convertedType = events.entries - .asSequence() - .filter { it -> listOf(KafkaEvents.EVENT_READER_DETERMINED_SERIE.event, KafkaEvents.EVENT_READER_DETERMINED_MOVIE.event).contains(it.key) } - .lastOrNull() - ?.toPair() - val type = when(convertedType?.first) { - KafkaEvents.EVENT_READER_DETERMINED_SERIE.event -> "serie" - KafkaEvents.EVENT_READER_DETERMINED_MOVIE.event -> "movie" - else -> null - } - - eventData.details = eventData.details?.apply { - this.title = convertedFileNameEvent.baseName - this.type = type - } - } - - -} \ No newline at end of file diff --git a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataMetadataSubConverter.kt b/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataMetadataSubConverter.kt deleted file mode 100644 index d9c43bf8..00000000 --- a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataMetadataSubConverter.kt +++ /dev/null @@ -1,14 +0,0 @@ -package no.iktdev.streamit.content.ui.kafka.converter - -import no.iktdev.streamit.content.ui.dto.EventDataObject -import no.iktdev.streamit.library.kafka.dto.Message -import org.springframework.stereotype.Component - - -@Component -class EventDataMetadataSubConverter: EventDataSubConverterBase() { - override fun convertEvents(eventData: EventDataObject, events: Map) { - - } - -} \ No newline at end of file diff --git a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataSubConverterBase.kt b/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataSubConverterBase.kt deleted file mode 100644 index 3413ce07..00000000 --- a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/kafka/converter/EventDataSubConverterBase.kt +++ /dev/null @@ -1,17 +0,0 @@ -package no.iktdev.streamit.content.ui.kafka.converter - -import no.iktdev.streamit.content.ui.dto.EventDataObject -import no.iktdev.streamit.library.kafka.dto.Message - -abstract class EventDataSubConverterBase { - - protected abstract fun convertEvents(eventData: EventDataObject, events: Map) - - fun convertAndUpdate(eventData: EventDataObject, events: Map) { - try { - convertEvents(eventData, events) - } catch (e: Exception) { - e.printStackTrace() - } - } -} \ No newline at end of file diff --git a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/socket/RequestTopic.kt b/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/socket/RequestTopic.kt deleted file mode 100644 index dc122a17..00000000 --- a/apps/ui/src/main/kotlin/no/iktdev/streamit/content/ui/socket/RequestTopic.kt +++ /dev/null @@ -1,47 +0,0 @@ -package no.iktdev.streamit.content.ui.socket - -import no.iktdev.streamit.content.common.CommonConfig -import no.iktdev.streamit.library.kafka.KafkaEvents -import no.iktdev.streamit.library.kafka.dto.Message -import no.iktdev.streamit.library.kafka.dto.Status -import no.iktdev.streamit.library.kafka.producer.DefaultProducer -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.messaging.handler.annotation.MessageMapping -import org.springframework.messaging.handler.annotation.Payload -import org.springframework.messaging.simp.SimpMessagingTemplate -import org.springframework.stereotype.Controller -import java.io.File - -@Controller -class RequestTopic( - @Autowired private val template: SimpMessagingTemplate? -) { - val messageProducer = DefaultProducer(CommonConfig.kafkaTopic) - - @MessageMapping("/request/start") - fun requestStartOn(@Payload fullName: String) { - val file = File(fullName) - if (file.exists()) { - try { - val message = Message( - status = Status(Status.SUCCESS), - data = fullName - ) - messageProducer.sendMessage(KafkaEvents.REQUEST_FILE_READ.event, message) - template?.convertAndSend("/response/request", RequestResponse(true, fullName)) - - } catch (e: Exception) { - template?.convertAndSend("/response/request", RequestResponse(false, fullName)) - - } - } else { - template?.convertAndSend("/response/request", RequestResponse(false, fullName)) - } - - } -} - -data class RequestResponse( - val success: Boolean, - val file: String -) \ No newline at end of file diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/DeserializingRegistry.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/DeserializingRegistry.kt index 56251e6e..fb3e5b0c 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/DeserializingRegistry.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/DeserializingRegistry.kt @@ -1,5 +1,10 @@ package no.iktdev.mediaprocessing.shared.common +import no.iktdev.mediaprocessing.shared.kafka.core.KafkaEvents +import no.iktdev.mediaprocessing.shared.kafka.dto.MessageDataWrapper +import no.iktdev.mediaprocessing.shared.kafka.dto.events_result.* +import kotlin.reflect.KClass + class DeserializingRegistry { companion object { val deserializables = mutableListOf?>>( diff --git a/shared/src/main/kotlin/Utils.kt b/shared/src/main/kotlin/Utils.kt deleted file mode 100644 index afd0d955..00000000 --- a/shared/src/main/kotlin/Utils.kt +++ /dev/null @@ -1,19 +0,0 @@ -import mu.KotlinLogging -import java.io.File -import java.io.RandomAccessFile - -private val logger = KotlinLogging.logger {} - -fun isFileAvailable(file: File): Boolean { - if (!file.exists()) return false - var stream: RandomAccessFile? = null - try { - stream = RandomAccessFile(file, "rw") - stream.close() - logger.info { "File ${file.name} is read and writable" } - return true - } catch (e: Exception) { - stream?.close() - } - return false -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/DownloadClient.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/DownloadClient.kt deleted file mode 100644 index 82687d86..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/DownloadClient.kt +++ /dev/null @@ -1,95 +0,0 @@ -package no.iktdev.mediaprocessing.shared - -import no.iktdev.exfl.using -import java.io.File -import java.io.FileOutputStream -import java.net.HttpURLConnection -import java.net.URL - -open class DownloadClient(val url: String, val outDir: File, val baseName: String) { - protected val http: HttpURLConnection = openConnection() - private val BUFFER_SIZE = 4096 - - private fun openConnection(): HttpURLConnection { - try { - return URL(url).openConnection() as HttpURLConnection - } catch (e: Exception) { - e.printStackTrace() - throw BadAddressException("Provided url is either not provided (null) or is not a valid http url") - } - } - - protected fun getLength(): Int { - return http.contentLength - } - - protected fun getProgress(read: Int, total: Int = getLength()): Int { - return ((read * 100) / total) - } - - suspend fun download(): File? { - val extension = getExtension() - ?: throw UnsupportedFormatException("Provided url does not contain a supported file extension") - val outFile = outDir.using("$baseName.$extension") - val inputStream = http.inputStream - val fos = FileOutputStream(outFile, false) - - var totalBytesRead = 0 - val buffer = ByteArray(BUFFER_SIZE) - inputStream.apply { - fos.use { fout -> - run { - var bytesRead = read(buffer) - while (bytesRead >= 0) { - fout.write(buffer, 0, bytesRead) - totalBytesRead += bytesRead - bytesRead = read(buffer) - // System.out.println(getProgress(totalBytesRead)) - } - } - } - } - inputStream.close() - fos.close() - return outFile - } - - open fun getExtension(): String? { - val possiblyExtension = url.lastIndexOf(".") + 1 - return if (possiblyExtension > 1) { - return url.toString().substring(possiblyExtension) - } else { - val mimeType = http.contentType ?: null - contentTypeToExtension()[mimeType] - } - } - - open fun contentTypeToExtension(): Map { - return mapOf( - "image/png" to "png", - "image/jpeg" to "jpg", - "image/webp" to "webp", - "image/bmp" to "bmp", - "image/tiff" to "tiff" - ) - } - - - class BadAddressException : java.lang.Exception { - constructor() : super() {} - constructor(message: String?) : super(message) {} - constructor(message: String?, cause: Throwable?) : super(message, cause) {} - } - - class UnsupportedFormatException : Exception { - constructor() : super() {} - constructor(message: String?) : super(message) {} - constructor(message: String?, cause: Throwable?) : super(message, cause) {} - } - - class InvalidFileException : Exception { - constructor() : super() {} - constructor(message: String?) : super(message) {} - constructor(message: String?, cause: Throwable?) : super(message, cause) {} - } -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/Preference.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/Preference.kt deleted file mode 100644 index 7236054e..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/Preference.kt +++ /dev/null @@ -1,55 +0,0 @@ -package no.iktdev.mediaprocessing.shared - -import com.google.gson.Gson -import mu.KotlinLogging -import no.iktdev.mediaprocessing.shared.dto.PreferenceDto -import org.slf4j.LoggerFactory - -private val log = KotlinLogging.logger {} -class Preference { - - companion object { - fun getPreference(): PreferenceDto { - val preference = readPreferenceFromFile() ?: PreferenceDto() - log.info { "[Audio]: Codec = " + preference.encodePreference.audio.codec } - 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 { "[Video]: Codec = " + preference.encodePreference.video.codec } - log.info { "[Video]: Pixel format = " + preference.encodePreference.video.pixelFormat } - log.info { "[Video]: Pixel format pass-through = " + preference.encodePreference.video.pixelFormatPassthrough.joinToString(", ") } - log.info { "[Video]: Threshold = " + preference.encodePreference.video.threshold } - - return preference - } - - private fun readPreferenceFromFile(): PreferenceDto? { - val prefFile = SharedConfig.preference - if (!prefFile.exists()) { - log.info("Preference file: ${prefFile.absolutePath} does not exists...") - log.info("Using default configuration") - return null - } - else { - log.info("Preference file: ${prefFile.absolutePath} found") - } - - return try { - val instr = prefFile.inputStream() - val text = instr.bufferedReader().use { it.readText() } - Gson().fromJson(text, PreferenceDto::class.java) - } - catch (e: Exception) { - log.error("Failed to read preference file: ${prefFile.absolutePath}.. Will use default configuration") - null - } - } - } - - - - - -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/SharedConfig.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/SharedConfig.kt deleted file mode 100644 index 2067a4c2..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/SharedConfig.kt +++ /dev/null @@ -1,22 +0,0 @@ -package no.iktdev.mediaprocessing.shared - -import java.io.File - -object SharedConfig { - var kafkaTopic: String = System.getenv("KAFKA_TOPIC") ?: "contentEvents" - var incomingContent: File = if (!System.getenv("DIRECTORY_CONTENT_INCOMING").isNullOrBlank()) File(System.getenv("DIRECTORY_CONTENT_INCOMING")) else File("/src/input") - val outgoingContent: File = if (!System.getenv("DIRECTORY_CONTENT_OUTGOING").isNullOrBlank()) File(System.getenv("DIRECTORY_CONTENT_OUTGOING")) else File("/src/output") - - val ffprobe: String = System.getenv("SUPPORTING_EXECUTABLE_FFPROBE") ?: "ffprobe" - val ffmpeg: String = System.getenv("SUPPORTING_EXECUTABLE_FFMPEG") ?: "no/iktdev/mediaprocessing/shared/contract/ffmpeg" - - val preference: File = File("/data/config/preference.json") -} - -object DatabaseConfig { - val address: String? = System.getenv("DATABASE_ADDRESS") - val port: String? = System.getenv("DATABASE_PORT") - val username: String? = System.getenv("DATABASE_USERNAME") - val password: String? = System.getenv("DATABASE_PASSWORD") - val database: String? = System.getenv("DATABASE_NAME") -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/datasource/DataSource.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/datasource/DataSource.kt deleted file mode 100644 index 254a261c..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/datasource/DataSource.kt +++ /dev/null @@ -1,34 +0,0 @@ -package no.iktdev.mediaprocessing.shared.datasource - -import org.jetbrains.exposed.sql.Database -import org.jetbrains.exposed.sql.Table -import java.time.Instant -import java.time.LocalDateTime -import java.time.ZoneId -import java.time.ZoneOffset - -abstract class DataSource(val databaseName: String, val address: String, val port: String?, val username: String, val password: String) { - - abstract fun createDatabase(): Database? - - abstract fun createTables(vararg tables: Table) - - abstract fun createDatabaseStatement(): String - - abstract fun toConnectionUrl(): String - - fun toPortedAddress(): String { - return if (!address.contains(":") && port?.isBlank() != true) { - "$address:$port" - } else address - } - -} - -fun timestampToLocalDateTime(timestamp: Int): LocalDateTime { - return Instant.ofEpochSecond(timestamp.toLong()).atZone(ZoneId.systemDefault()).toLocalDateTime() -} - -fun LocalDateTime.toEpochSeconds(): Long { - return this.toEpochSecond(ZoneOffset.ofTotalSeconds(ZoneOffset.systemDefault().rules.getOffset(LocalDateTime.now()).totalSeconds)) -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/datasource/MySqlDataSource.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/datasource/MySqlDataSource.kt deleted file mode 100644 index 10b38bc5..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/datasource/MySqlDataSource.kt +++ /dev/null @@ -1,84 +0,0 @@ -package no.iktdev.mediaprocessing.shared.datasource - -import no.iktdev.mediaprocessing.shared.DatabaseConfig -import org.jetbrains.exposed.sql.Database -import org.jetbrains.exposed.sql.SchemaUtils -import org.jetbrains.exposed.sql.Table -import org.jetbrains.exposed.sql.transactions.TransactionManager -import org.jetbrains.exposed.sql.transactions.transaction - -open class MySqlDataSource(databaseName: String, address: String, port: String = "", username: String, password: String): DataSource(databaseName = databaseName, address = address, port = port, username = username, password = password) { - companion object { - fun fromDatabaseEnv(): MySqlDataSource { - if (DatabaseConfig.database.isNullOrBlank()) throw RuntimeException("Database name is not defined in 'DATABASE_NAME'") - if (DatabaseConfig.username.isNullOrBlank()) throw RuntimeException("Database username is not defined in 'DATABASE_USERNAME'") - if (DatabaseConfig.address.isNullOrBlank()) throw RuntimeException("Database address is not defined in 'DATABASE_ADDRESS'") - return MySqlDataSource( - databaseName = DatabaseConfig.database, - address = DatabaseConfig.address, - port = DatabaseConfig.port ?: "", - username = DatabaseConfig.username, - password = DatabaseConfig.password ?: "" - ) - } - } - - override fun createDatabase(): Database? { - val ok = transaction(toDatabaseServerConnection()) { - val tmc = TransactionManager.current().connection - val query = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$databaseName'" - val stmt = tmc.prepareStatement(query, true) - - val resultSet = stmt.executeQuery() - val databaseExists = resultSet.next() - - if (!databaseExists) { - try { - exec(createDatabaseStatement()) - println("Database $databaseName created.") - true - } catch (e: Exception) { - e.printStackTrace() - false - } - } else { - println("Database $databaseName already exists.") - true - } - } - - return if (ok) toDatabase() else null - } - - override fun createTables(vararg tables: Table) { - transaction { - SchemaUtils.createMissingTablesAndColumns(*tables) - println("Database transaction completed") - } - } - - override fun createDatabaseStatement(): String { - return "CREATE DATABASE $databaseName" - } - - protected fun toDatabaseServerConnection(): Database { - return Database.connect( - toConnectionUrl(), - user = username, - password = password - ) - } - - fun toDatabase(): Database { - return Database.connect( - "${toConnectionUrl()}/$databaseName", - user = username, - password = password - ) - } - - override fun toConnectionUrl(): String { - return "jdbc:mysql://${toPortedAddress()}" - } - -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/datasource/TableDefaultOperations.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/datasource/TableDefaultOperations.kt deleted file mode 100644 index 0d7a0fb5..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/datasource/TableDefaultOperations.kt +++ /dev/null @@ -1,72 +0,0 @@ -package no.iktdev.mediaprocessing.shared.datasource - -import org.jetbrains.exposed.dao.id.EntityID -import org.jetbrains.exposed.sql.Column -import org.jetbrains.exposed.sql.Table -import org.jetbrains.exposed.sql.insert -import org.jetbrains.exposed.sql.statements.InsertStatement -import org.jetbrains.exposed.sql.update - -import org.jetbrains.exposed.sql.transactions.transaction - -open class TableDefaultOperations { - -} - -fun withTransaction(block: () -> T): T? { - return try { - transaction { - try { - block() - } catch (e: Exception) { - e.printStackTrace() - // log the error here or handle the exception as needed - throw e // Optionally, you can rethrow the exception if needed - } - } - } catch (e: Exception) { - e.printStackTrace() - // log the error here or handle the exception as needed - null - } -} - -fun insertWithSuccess(block: () -> T): Boolean { - return try { - transaction { - try { - block() - } catch (e: Exception) { - e.printStackTrace() - // log the error here or handle the exception as needed - throw e // Optionally, you can rethrow the exception if needed - } - } - true - } catch (e: Exception) { - e.printStackTrace() - false - } -} - -fun executeWithStatus(block: () -> T): Boolean { - return try { - transaction { - try { - block() - } catch (e: Exception) { - e.printStackTrace() - // log the error here or handle the exception as needed - throw e // Optionally, you can rethrow the exception if needed - } - } - true - } catch (e: Exception) { - e.printStackTrace() - false - } -} - - - - diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/extended/FileExt.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/extended/FileExt.kt deleted file mode 100644 index 6c1fc953..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/extended/FileExt.kt +++ /dev/null @@ -1,100 +0,0 @@ -package no.iktdev.mediaprocessing.shared.extended - -import java.io.File - -val validVideoFiles = listOf( - "mkv", - "avi", - "mp4", - "wmv", - "webm", - "mov" -) - -fun File.isSupportedVideoFile(): Boolean { - return this.isFile && validVideoFiles.contains(this.extension) -} - -fun getSanitizedFileName(name: String): String { - /** - * Modifies the input value and removes "[Text]" - * @param text "[TEST] Dummy - 01 [AZ 1080p] " - */ - fun removeBracketedText(text: String): String { - return Regex("\\[.*?]").replace(text, " ") - } - - /** - * - */ - fun removeParenthesizedText(text: String): String { - return Regex("\\(.*?\\)").replace(text, " ") - } - - /** - * - */ - fun removeResolutionAndTags(text: String): String { - return Regex("(.*?)(?=\\d+[pk]\\b)").replace(text, " ") - } - - fun removeInBetweenCharacters(text: String): String { - return Regex("[.]").replace(text, " ") - } - - /** - * @param text "example text with extra spaces" - * @return example text with extra spaces - */ - fun removeExtraWhiteSpace(text: String): String { - return Regex("\\s{2,}").replace(text, " ") - } - - return name - .let { removeBracketedText(it) } - .let { removeParenthesizedText(it) } - .let { removeResolutionAndTags(it) } - .let { removeInBetweenCharacters(it) } - .let { removeExtraWhiteSpace(it) } -} - - -fun File.getDesiredVideoFileName(): String? { - if (!this.isSupportedVideoFile()) return null - val cleanedFileName = getSanitizedFileName(this.nameWithoutExtension) - val parts = cleanedFileName.split(" - ") - return when { - parts.size == 2 && parts[1].matches(Regex("\\d{4}")) -> { - val title = parts[0] - val year = parts[1] - "$title ($year)" - } - - parts.size >= 3 && parts[1].matches(Regex("S\\d+")) && parts[2].matches(Regex("\\d+[vV]\\d+")) -> { - val title = parts[0] - val episodeWithRevision = parts[2] - val episodeParts = episodeWithRevision.split("v", "V") - val episodeNumber = episodeParts[0].toInt() - val revisionNumber = episodeParts[1].toInt() - val seasonEpisode = - "S${episodeNumber.toString().padStart(2, '0')}E${revisionNumber.toString().padStart(2, '0')}" - val episodeTitle = if (parts.size > 3) parts[3] else "" - "$title - $seasonEpisode - $episodeTitle" - } - - else -> cleanedFileName - }.trim() -} - -fun File.getGuessedVideoTitle(): String? { - val desiredFileName = getDesiredVideoFileName() ?: return null - val seasonRegex = Regex("\\sS[0-9]+(\\s- [0-9]+|\\s[0-9]+)", RegexOption.IGNORE_CASE) - if (seasonRegex.containsMatchIn(desiredFileName)) { - return seasonRegex.replace(desiredFileName, "").trim() - } else { - val result = if (desiredFileName.contains(" - ")) { - return desiredFileName.split(" - ").firstOrNull() ?: desiredFileName - } else desiredFileName - return result.trim() - } -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/kafka/CoordinatorProducer.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/kafka/CoordinatorProducer.kt deleted file mode 100644 index 8f9431c3..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/kafka/CoordinatorProducer.kt +++ /dev/null @@ -1,24 +0,0 @@ -package no.iktdev.mediaprocessing.shared.kafka - -import no.iktdev.mediaprocessing.shared.SharedConfig -import no.iktdev.mediaprocessing.shared.kafka.core.DefaultProducer -import no.iktdev.mediaprocessing.shared.kafka.core.KafkaEvents -import no.iktdev.mediaprocessing.shared.kafka.dto.Message -import no.iktdev.mediaprocessing.shared.kafka.dto.MessageDataWrapper -import no.iktdev.streamit.library.kafka.dto.Status - -class CoordinatorProducer(): DefaultProducer(SharedConfig.kafkaTopic) { - fun sendMessage(referenceId: String, event: KafkaEvents, data: MessageDataWrapper) { - super.sendMessage(event.event, Message( - referenceId = referenceId, - data = data - )) - } - fun sendMessage(referenceId: String, event: KafkaEvents, eventId: String, data: MessageDataWrapper) { - super.sendMessage(event.event, Message( - referenceId = referenceId, - eventId = eventId, - data = data - )) - } -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/parsing/FileNameDeterminate.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/parsing/FileNameDeterminate.kt deleted file mode 100644 index b69be8bc..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/parsing/FileNameDeterminate.kt +++ /dev/null @@ -1,160 +0,0 @@ -package no.iktdev.mediaprocessing.shared.parsing - -import no.iktdev.mediaprocessing.shared.kafka.dto.events_result.EpisodeInfo -import no.iktdev.mediaprocessing.shared.kafka.dto.events_result.MovieInfo -import no.iktdev.mediaprocessing.shared.kafka.dto.events_result.VideoInfo - - -class FileNameDeterminate(val title: String, val sanitizedName: String, val ctype: ContentType = ContentType.UNDEFINED) { - - enum class ContentType { - MOVIE, - SERIE, - UNDEFINED - } - - fun getDeterminedVideoInfo(): VideoInfo? { - return when (ctype) { - ContentType.MOVIE -> determineMovieFileName() - ContentType.SERIE -> determineSerieFileName() - ContentType.UNDEFINED -> determineUndefinedFileName() - } - } - - private fun determineMovieFileName(): MovieInfo? { - val movieEx = MovieEx(title, sanitizedName) - val stripped = when { - movieEx.isDefinedWithYear() -> sanitizedName.replace(movieEx.yearRegex(), "").trim() - movieEx.doesContainMovieKeywords() -> sanitizedName.replace(Regex("(?i)\\s*\\(\\s*movie\\s*\\)\\s*"), "").trim() - else -> sanitizedName - } - val nonResolutioned = movieEx.removeResolutionAndBeyond(stripped) ?: stripped - return MovieInfo(cleanup(nonResolutioned), cleanup(nonResolutioned)) - } - - private fun determineSerieFileName(): EpisodeInfo? { - val serieEx = SerieEx(title, sanitizedName) - - val (season, episode) = serieEx.findSeasonAndEpisode(sanitizedName) - val episodeNumberSingle = serieEx.findEpisodeNumber() - - val seasonNumber = season ?: "1" - val episodeNumber = episode ?: (episodeNumberSingle ?: return null) - val seasonEpisodeCombined = serieEx.getSeasonEpisodeCombined(seasonNumber, episodeNumber) - val episodeTitle = serieEx.findEpisodeTitle() - - val useTitle = if (title == sanitizedName) { - if (title.contains(" - ")) { - title.split(" - ").firstOrNull() ?: title - } else { - val seasonNumberIndex = if (title.indexOf(seasonNumber) < 0) title.length -1 else title.indexOf(seasonNumber) - val episodeNumberIndex = if (title.indexOf(episodeNumber) < 0) title.length -1 else title.indexOf(episodeNumber) - val closest = listOf(seasonNumberIndex, episodeNumberIndex).min() - val shrunkenTitle = title.substring(0, closest) - if (closest - shrunkenTitle.lastIndexOf(" ") < 3) { - title.substring(0, shrunkenTitle.lastIndexOf(" ")) - } else title.substring(0, closest) - - } - } else title - val fullName = "${useTitle.trim()} - $seasonEpisodeCombined ${if (episodeTitle.isNullOrEmpty()) "" else "- $episodeTitle"}".trim() - return EpisodeInfo(title, episodeNumber.toInt(), seasonNumber.toInt(), episodeTitle, fullName) - } - - private fun determineUndefinedFileName(): VideoInfo? { - val serieEx = SerieEx(title, sanitizedName) - val (season, episode) = serieEx.findSeasonAndEpisode(sanitizedName) - val episodeNumber = serieEx.findEpisodeNumber() - return if ((sanitizedName.contains(" - ") && episodeNumber != null) || season != null || episode != null) { - determineSerieFileName() - } else { - determineMovieFileName() - } - } - - private fun cleanup(input: String): String { - val cleaned = Regex("(?<=\\w)[_.](?=\\w)").replace(input, " ") - return Regex("\\s{2,}").replace(cleaned, " ") - } - - open internal class Base(val title: String, val sanitizedName: String) { - fun getMatch(regex: String): String? { - return Regex(regex, RegexOption.IGNORE_CASE).find(sanitizedName)?.value - } - - fun removeResolutionAndBeyond(input: String): String? { - val removalValue = Regex("(i?)([0-9].*[pk]|[ ._-]+[UHD]+[ ._-])").find(input)?.value ?: return null - return input.substring(0, input.indexOf(removalValue)) - } - - fun yearRegex(): Regex { - return Regex("[ .(][0-9]{4}[ .)]") - } - } - - internal class MovieEx(title: String, sanitizedName: String) : Base(title, sanitizedName) { - /** - * @return not null if matches " 2020 " or ".2020." - */ - fun isDefinedWithYear(): Boolean { - return getMatch(yearRegex().pattern)?.isNotBlank() ?: false - } - - /** - * Checks whether the filename contains the keyword movie, if so, default to movie - */ - fun doesContainMovieKeywords(): Boolean { - return getMatch("[(](?<=\\()movie(?=\\))[)]")?.isNotBlank() ?: false - } - } - - internal class SerieEx(title: String, sanitizedName: String) : Base(title, sanitizedName) { - - fun getSeasonEpisodeCombined(season: String, episode: String): String { - return StringBuilder() - .append("S") - .append(if (season.length < 2) season.padStart(2, '0') else season) - .append("E") - .append(if (episode.length < 2) episode.padStart(2, '0') else episode) - .toString().trim() - } - - - /** - * Sjekken matcher tekst som dette: - * Cool - Season 1 Episode 13 - * Cool - s1e13 - * Cool - S1E13 - * Cool - S1 13 - */ - fun findSeasonAndEpisode(inputText: String): Pair { - val regex = Regex("""(?i)\b(?:S|Season)\s*(\d+).*?(?:E|Episode)?\s*(\d+)\b""") - val matchResult = regex.find(inputText) - val season = matchResult?.groups?.get(1)?.value - val episode = matchResult?.groups?.get(2)?.value - return season to episode - } - - fun findEpisodeNumber(): String? { - val regex = Regex("\\b(\\d+)\\b") - val matchResult = regex.find(sanitizedName) - return matchResult?.value?.trim() - } - - fun findEpisodeTitle(): String? { - val seCombo = findSeasonAndEpisode(sanitizedName) - val episodeNumber = findEpisodeNumber() - - val startPosition = if (seCombo.second != null) sanitizedName.indexOf(seCombo.second!!)+ seCombo.second!!.length - else if (episodeNumber != null) sanitizedName.indexOf(episodeNumber) + episodeNumber.length else 0 - val availableText = sanitizedName.substring(startPosition) - - val cleanedEpisodeTitle = availableText.replace(Regex("""(?i)\b(?:season|episode|ep)\b"""), "") - .replace(Regex("""^\s*-\s*"""), "") - .replace(Regex("""\s+"""), " ") - .trim() - - return cleanedEpisodeTitle - } - } -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/parsing/FileNameParser.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/parsing/FileNameParser.kt deleted file mode 100644 index 6c0714ce..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/parsing/FileNameParser.kt +++ /dev/null @@ -1,95 +0,0 @@ -package no.iktdev.mediaprocessing.shared.parsing - -class FileNameParser(val fileName: String) { - var cleanedFileName: String - private set - - init { - cleanedFileName = fileName - .let { removeBracketedText(it) } - .let { removeParenthesizedText(it) } - .let { removeResolutionAndTags(it) } - .let { removeInBetweenCharacters(it) } - .let { removeExtraWhiteSpace(it) } - - } - - fun guessDesiredFileName(): String { - val parts = cleanedFileName.split(" - ") - return when { - parts.size == 2 && parts[1].matches(Regex("\\d{4}")) -> { - val title = parts[0] - val year = parts[1] - "$title ($year)" - } - - parts.size >= 3 && parts[1].matches(Regex("S\\d+")) && parts[2].matches(Regex("\\d+[vV]\\d+")) -> { - val title = parts[0] - val episodeWithRevision = parts[2] - val episodeParts = episodeWithRevision.split("v", "V") - val episodeNumber = episodeParts[0].toInt() - val revisionNumber = episodeParts[1].toInt() - val seasonEpisode = - "S${episodeNumber.toString().padStart(2, '0')}E${revisionNumber.toString().padStart(2, '0')}" - val episodeTitle = if (parts.size > 3) parts[3] else "" - "$title - $seasonEpisode - $episodeTitle" - } - - else -> cleanedFileName - }.trim() - } - - fun guessDesiredTitle(): String { - val desiredFileName = guessDesiredFileName() - val seasonRegex = Regex("\\sS[0-9]+(\\s- [0-9]+|\\s[0-9]+)", RegexOption.IGNORE_CASE) - if (seasonRegex.containsMatchIn(desiredFileName)) { - return seasonRegex.replace(desiredFileName, "").trim() - } else { - val result = if (desiredFileName.contains(" - ")) { - return desiredFileName.split(" - ").firstOrNull() ?: desiredFileName - } else desiredFileName - return result.trim() - } - } - - - /** - * Modifies the input value and removes "[Text]" - * @param text "[TEST] Dummy - 01 [AZ 1080p] " - */ - fun removeBracketedText(text: String): String { - return Regex("\\[.*?]").replace(text, " ") - } - - /** - * - */ - fun removeParenthesizedText(text: String): String { - return Regex("\\(.*?\\)").replace(text, " ") - } - - /** - * - */ - fun removeResolutionAndTags(text: String): String { - return Regex("(.*?)(?=\\d+[pk]\\b)").replace(text, " ") - } - - fun removeInBetweenCharacters(text: String): String { - return Regex("[.]").replace(text, " ") - } - - /** - * @param text "example text with extra spaces" - * @return example text with extra spaces - */ - fun removeExtraWhiteSpace(text: String): String { - return Regex("\\s{2,}").replace(text, " ") - } - - - private fun getMatch(regex: String): String? { - return Regex(regex).find(fileName)?.value ?: return null - } - -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/PersistentDataReader.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/PersistentDataReader.kt deleted file mode 100644 index fa6ba700..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/PersistentDataReader.kt +++ /dev/null @@ -1,33 +0,0 @@ -package no.iktdev.mediaprocessing.shared.persistance - -import com.google.gson.Gson -import no.iktdev.mediaprocessing.shared.datasource.withTransaction -import no.iktdev.mediaprocessing.shared.kafka.core.DeserializingRegistry -import no.iktdev.mediaprocessing.shared.kafka.core.KafkaEvents -import no.iktdev.mediaprocessing.shared.kafka.dto.MessageDataWrapper -import org.jetbrains.exposed.sql.ResultRow -import org.jetbrains.exposed.sql.SortOrder -import org.jetbrains.exposed.sql.select -import org.jetbrains.exposed.sql.selectAll -import java.time.LocalDateTime - -class PersistentDataReader { - val dzz = DeserializingRegistry() - - fun getAllMessages(): List> { - val events = withTransaction { - events.selectAll() - .groupBy { it[events.referenceId] } - } - return events?.mapNotNull { it.value.mapNotNull { v -> fromRowToPersistentMessage(v, dzz) } } ?: emptyList() - } - - fun getMessagesFor(referenceId: String): List { - return withTransaction { - events.select { events.referenceId eq referenceId } - .orderBy(events.created, SortOrder.ASC) - .mapNotNull { fromRowToPersistentMessage(it, dzz) } - } ?: emptyList() - } - -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/PersistentDataStore.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/PersistentDataStore.kt deleted file mode 100644 index 4d1268ad..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/PersistentDataStore.kt +++ /dev/null @@ -1,20 +0,0 @@ -package no.iktdev.mediaprocessing.shared.persistance - -import no.iktdev.mediaprocessing.shared.datasource.executeWithStatus -import no.iktdev.mediaprocessing.shared.datasource.withTransaction -import no.iktdev.mediaprocessing.shared.kafka.dto.Message -import org.jetbrains.exposed.sql.insert - -open class PersistentDataStore { - fun storeMessage(event: String, message: Message<*>): Boolean { - return executeWithStatus { - events.insert { - it[referenceId] = message.referenceId - it[eventId] = message.eventId - it[events.event] = event - it[data] = message.dataAsJson() - } - } - } - -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/PersistentMessage.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/PersistentMessage.kt deleted file mode 100644 index d07e6b44..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/PersistentMessage.kt +++ /dev/null @@ -1,33 +0,0 @@ -package no.iktdev.mediaprocessing.shared.persistance - -import com.google.gson.Gson -import no.iktdev.mediaprocessing.shared.kafka.core.DeserializingRegistry -import no.iktdev.mediaprocessing.shared.kafka.core.KafkaEvents -import no.iktdev.mediaprocessing.shared.kafka.dto.MessageDataWrapper -import org.jetbrains.exposed.sql.ResultRow -import java.time.LocalDateTime - -data class PersistentMessage( - val referenceId: String, - val eventId: String, - val event: KafkaEvents, - val data: MessageDataWrapper, - val created: LocalDateTime -) - -fun fromRowToPersistentMessage(row: ResultRow, dez: DeserializingRegistry): PersistentMessage? { - val kev = try { - KafkaEvents.valueOf(row[events.event]) - } catch (e: IllegalArgumentException) { - e.printStackTrace() - return null - } - val dzdata = dez.deserializeData(kev, row[events.data]) - return PersistentMessage( - referenceId = row[events.referenceId], - eventId = row[events.eventId], - event = kev, - data = dzdata, - created = row[events.created] - ) -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/events.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/events.kt deleted file mode 100644 index f6eca0b3..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/persistance/events.kt +++ /dev/null @@ -1,19 +0,0 @@ -package no.iktdev.mediaprocessing.shared.persistance - -import org.jetbrains.exposed.dao.id.IntIdTable -import org.jetbrains.exposed.sql.Column -import org.jetbrains.exposed.sql.javatime.CurrentDateTime -import org.jetbrains.exposed.sql.javatime.datetime -import java.time.LocalDateTime - -object events: IntIdTable() { - val referenceId: Column = varchar("referenceId", 50) - val eventId: Column = varchar("referenceId", 50) - val event: Column = varchar("event1",100) - val data: Column = text("data") - val created: Column = datetime("created").defaultExpression(CurrentDateTime) - - init { - uniqueIndex(referenceId, eventId, event) - } -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/runner/IRunner.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/runner/IRunner.kt deleted file mode 100644 index 4d48f51c..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/runner/IRunner.kt +++ /dev/null @@ -1,13 +0,0 @@ -package no.iktdev.mediaprocessing.shared.runner - -interface IRunner { - - fun onStarted() {} - - fun onOutputChanged(line: String) {} - - fun onEnded() {} - - fun onError(code: Int) - -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/runner/ResultRunner.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/runner/ResultRunner.kt deleted file mode 100644 index f5b81e38..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/runner/ResultRunner.kt +++ /dev/null @@ -1,20 +0,0 @@ -package no.iktdev.mediaprocessing.shared.runner - -import com.github.pgreze.process.Redirect -import com.github.pgreze.process.process - -data class CodeToOutput( - val statusCode: Int, - val output: List -) - -suspend fun getOutputUsing(executable: String, vararg arguments: String): CodeToOutput { - val result: MutableList = mutableListOf() - val code = process(executable, *arguments, - stderr = Redirect.CAPTURE, - stdout = Redirect.CAPTURE, - consumer = { - result.add(it) - }).resultCode - return CodeToOutput(statusCode = code, result) -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/runner/Runner.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/runner/Runner.kt deleted file mode 100644 index bfe8943b..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/runner/Runner.kt +++ /dev/null @@ -1,41 +0,0 @@ -package no.iktdev.mediaprocessing.shared.runner - -import kotlinx.coroutines.Job -import kotlinx.coroutines.cancel -import kotlinx.coroutines.cancelAndJoin -import kotlinx.coroutines.launch -import mu.KotlinLogging -import no.iktdev.exfl.coroutines.Coroutines - -open class Runner(open val executable: String, val daemonInterface: IRunner) { - private val logger = KotlinLogging.logger {} - - val scope = Coroutines.io() - var job: Job? = null - var executor: com.github.pgreze.process.ProcessResult? = null - open suspend fun run(parameters: List): Int { - daemonInterface.onStarted() - logger.info { "\nDaemon arguments: $executable \nParamters:\n${parameters.joinToString(" ")}" } - job = scope.launch { - executor = com.github.pgreze.process.process(executable, *parameters.toTypedArray(), - stdout = com.github.pgreze.process.Redirect.CAPTURE, - stderr = com.github.pgreze.process.Redirect.CAPTURE, - consumer = { - daemonInterface.onOutputChanged(it) - }) - } - job?.join() - - val resultCode = executor?.resultCode ?: -1 - if (resultCode == 0) { - daemonInterface.onEnded() - } else daemonInterface.onError(resultCode) - logger.info { "$executable result: $resultCode" } - return resultCode - } - - suspend fun cancel() { - job?.cancelAndJoin() - scope.cancel("Cancel operation triggered!") - } -} \ No newline at end of file diff --git a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/socket/SocketImplementation.kt b/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/socket/SocketImplementation.kt deleted file mode 100644 index 3b614421..00000000 --- a/shared/src/main/kotlin/no/iktdev/mediaprocessing/shared/socket/SocketImplementation.kt +++ /dev/null @@ -1,23 +0,0 @@ -package no.iktdev.mediaprocessing.shared.socket - -import org.springframework.context.annotation.Configuration -import org.springframework.messaging.simp.config.MessageBrokerRegistry -import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker -import org.springframework.web.socket.config.annotation.StompEndpointRegistry -import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer - -@Configuration -@EnableWebSocketMessageBroker -open class SocketImplementation: WebSocketMessageBrokerConfigurer { - - override fun registerStompEndpoints(registry: StompEndpointRegistry) { - registry.addEndpoint("/ws") - .setAllowedOrigins("*://localhost:*/*", "http://localhost:3000/") - .withSockJS() - } - - override fun configureMessageBroker(registry: MessageBrokerRegistry) { - registry.enableSimpleBroker("/topic") - registry.setApplicationDestinationPrefixes("/app") - } -} \ No newline at end of file