diff --git a/apps/converter/src/main/kotlin/no/iktdev/mediaprocessing/converter/tasks/ConvertService.kt b/apps/converter/src/main/kotlin/no/iktdev/mediaprocessing/converter/tasks/ConvertService.kt index f94c82fc..a9e6aea6 100644 --- a/apps/converter/src/main/kotlin/no/iktdev/mediaprocessing/converter/tasks/ConvertService.kt +++ b/apps/converter/src/main/kotlin/no/iktdev/mediaprocessing/converter/tasks/ConvertService.kt @@ -97,7 +97,8 @@ class ConvertService( ), data = ConvertedData( language = taskData.language, - outputFiles = outputFiles + outputFiles = outputFiles, + baseName = taskData.storeFileName ) )) onClearTask() diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/CompletedTaskListener.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/CompletedTaskListener.kt index 9eef48d6..166d6c9e 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/CompletedTaskListener.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/CompletedTaskListener.kt @@ -166,7 +166,7 @@ class CompletedTaskListener : CoordinatorEventListener() { ContentSubtitleStore.storeSubtitles( collection = usableCollection, language = it.language, - destinationFile = it.destination + destinationFile = File(it.destination) ) } } @@ -183,7 +183,10 @@ class CompletedTaskListener : CoordinatorEventListener() { onProduceEvent(MediaProcessCompletedEvent( metadata = event.makeDerivedEventInfo(EventStatus.Success, getProducerName()), data = CompletedEventData( - events.map { it.eventId() } + eventIdsCollected = events.map { it.eventId() }, + coverMoved = newCoverPath?.let { c -> CoverMoved(c.first, c.second) }, + videoMoved = newVideoPath?.let { v -> VideoMoved(v.first, v.second) }, + subtitlesMoved = newSubtitles?.map { s -> SubtitlesMoved(s.source, s.destination) } ?: emptyList() ) )) } diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/ConvertWorkTaskListener.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/ConvertWorkTaskListener.kt index 55f13a16..0ee103ba 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/ConvertWorkTaskListener.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/ConvertWorkTaskListener.kt @@ -64,11 +64,13 @@ class ConvertWorkTaskListener: WorkTaskListener() { } var language: String? = null + var storeAsFile: String? = null val file = if (event.eventType == Events.EventWorkExtractPerformed) { val foundEvent = event.az()?.data language = foundEvent?.language + storeAsFile = foundEvent?.storeFileName foundEvent?.outputFile } else if (event.eventType == Events.EventMediaProcessStarted) { val startEvent = event.az()?.data @@ -101,6 +103,7 @@ class ConvertWorkTaskListener: WorkTaskListener() { language = language ?: "unk", inputFile = convertFile.absolutePath, outputFileName = convertFile.nameWithoutExtension, + storeFileName = storeAsFile ?: convertFile.nameWithoutExtension, outputDirectory = convertFile.parentFile.absolutePath, allowOverwrite = true ) diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/CoverDownloadTaskListener.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/CoverDownloadTaskListener.kt index 7f37b29a..3e543a6f 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/CoverDownloadTaskListener.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/listeners/CoverDownloadTaskListener.kt @@ -57,7 +57,8 @@ class CoverDownloadTaskListener : CoordinatorEventListener() { client.getOutFile() } - val coversInDifferentFormats = SharedConfig.cachedContent.listFiles { it -> it.isFile && it.extension.lowercase() in client.contentTypeToExtension().values } ?: emptyArray() + val coversInDifferentFormats = SharedConfig.cachedContent.listFiles { it -> it.isFile && it.extension.lowercase() in client.contentTypeToExtension().values } + ?.filter { it.nameWithoutExtension.contains(data.outFileBaseName, ignoreCase = true) } ?: emptyList() val result = if (outFile?.exists() == true) { outFile diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/mapping/ExtractWorkArgumentsMapping.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/mapping/ExtractWorkArgumentsMapping.kt index 31d7aa6b..d8056f66 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/mapping/ExtractWorkArgumentsMapping.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/mapping/ExtractWorkArgumentsMapping.kt @@ -20,7 +20,8 @@ class ExtractWorkArgumentsMapping( inputFile = inputFile, language = it.language, arguments = it.codecParameters + it.optionalParameters + listOf("-map", "0:s:${it.index}"), - outputFileName = "${outFileFullName}.${it.language}.${it.format}" + outputFileName = "${outFileFullName}.${it.language}.${it.format}", + storeFileName = "${outFileFullName}.${it.format}" ) } diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/mapping/store/ContentCompletionMover.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/mapping/store/ContentCompletionMover.kt index 5e70afd9..0e8edf1c 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/mapping/store/ContentCompletionMover.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasksV2/mapping/store/ContentCompletionMover.kt @@ -60,20 +60,42 @@ class ContentCompletionMover(val collection: String, val events: List) { } - fun getMovableSubtitles(): Map> { + + data class MovableSubtitle( + val language: String, + val cachedFile: File, + val storeFile: String + ) + + fun getMovableSubtitles(): List { val extracted = events.filter { it.eventType == Events.EventWorkExtractPerformed }.mapNotNull { it.dataAs() } val converted = events.filter { it.eventType == Events.EventWorkConvertPerformed }.mapNotNull { it.dataAs() } - return extracted.groupBy { it.language }.mapValues { v -> v.value.map { File(it.outputFile) } } + - converted.groupBy { it.language }.mapValues { v -> v.value.flatMap { it.outputFiles }.map { File(it) } } + val items = mutableListOf() + + extracted.map { MovableSubtitle( + language = it.language, + cachedFile = File(it.outputFile), + storeFile = it.storeFileName + ) }.also { items.addAll(it) } + + converted.flatMap { it.outputFiles.map { outFile -> + MovableSubtitle( + language = it.language, + cachedFile = File(outFile), + storeFile = it.baseName + ) + } }.also { items.addAll(it) } + + return items } data class MovedSubtitle( val language: String, - val source: File, - val destination: File + val source: String, + val destination: String ) fun moveSubtitles(): List? { @@ -81,24 +103,22 @@ class ContentCompletionMover(val collection: String, val events: List) { val moved: MutableList = mutableListOf() val subtitles = getMovableSubtitles() - if (subtitles.isEmpty() || subtitles.values.isEmpty()) { + if (subtitles.isEmpty()) { return null } - for ((lang, files) in subtitles) { - val languageFolder = subtitleFolder.using(lang).also { + for (movable in subtitles) { + val languageFolder = subtitleFolder.using(movable.language).also { if (it.notExist()) { it.mkdirs() } } - for (file in files) { - val storeFile = languageFolder.using(file.name) - val success = file.moveTo(storeFile) - if (success) { - moved.add(MovedSubtitle(lang, file, storeFile)) - } + val storeFile = languageFolder.using(movable.storeFile) + val success = movable.cachedFile.moveTo(storeFile) + if (success) { + moved.add(MovedSubtitle(movable.language, movable.cachedFile.absolutePath, storeFile.absolutePath)) } - } + return moved } diff --git a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/services/ExtractService.kt b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/services/ExtractService.kt index 987fdfd6..54c4b5c9 100644 --- a/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/services/ExtractService.kt +++ b/apps/processer/src/main/kotlin/no/iktdev/mediaprocessing/processer/services/ExtractService.kt @@ -120,8 +120,9 @@ class ExtractService( source = getProducerName() ), data = ExtractedData( - taskData.language, - outputFile + language = taskData.language, + outputFile = outputFile, + storeFileName = taskData.storeFileName ) ) ) diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ConvertWorkCreatedEvent.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ConvertWorkCreatedEvent.kt index e898b719..91fd5c26 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ConvertWorkCreatedEvent.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ConvertWorkCreatedEvent.kt @@ -17,6 +17,7 @@ data class ConvertData( val language: String, val outputDirectory: String, val outputFileName: String, + val storeFileName: String, val formats: List = emptyList(), val allowOverwrite: Boolean ): TaskData() \ No newline at end of file diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ConvertWorkPerformed.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ConvertWorkPerformed.kt index 1efe16cd..e12ca942 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ConvertWorkPerformed.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ConvertWorkPerformed.kt @@ -13,5 +13,6 @@ class ConvertWorkPerformed( data class ConvertedData( val language: String, + val baseName: String, val outputFiles: List ) diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ExtractArgumentCreatedEvent.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ExtractArgumentCreatedEvent.kt index cf257c26..d9ca38f1 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ExtractArgumentCreatedEvent.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ExtractArgumentCreatedEvent.kt @@ -14,6 +14,7 @@ data class ExtractArgumentCreatedEvent( data class ExtractArgumentData( val arguments: List, val language: String, + val storeFileName: String, val outputFileName: String, override val inputFile: String ): TaskData() \ No newline at end of file diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ExtractWorkPerformedEvent.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ExtractWorkPerformedEvent.kt index 1bb82740..4633e931 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ExtractWorkPerformedEvent.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/ExtractWorkPerformedEvent.kt @@ -13,5 +13,6 @@ data class ExtractWorkPerformedEvent( data class ExtractedData( val language: String, + val storeFileName: String, val outputFile: String ) \ No newline at end of file diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/MediaProcessCompletedEvent.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/MediaProcessCompletedEvent.kt index bc2951a7..4a5b0055 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/MediaProcessCompletedEvent.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/data/MediaProcessCompletedEvent.kt @@ -10,5 +10,23 @@ data class MediaProcessCompletedEvent( ): Event() data class CompletedEventData( - val eventIdsCollected: List + val eventIdsCollected: List, + val videoMoved: VideoMoved?, + val coverMoved: CoverMoved?, + val subtitlesMoved: List +) + +data class SubtitlesMoved( + val source: String, + val destination: String +) + +data class CoverMoved( + val source: String, + val destination: String +) + +data class VideoMoved( + val source: String, + val destination: String ) \ No newline at end of file