diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasks/event/MetadataAndBaseInfoToCoverTask.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasks/event/MetadataAndBaseInfoToCoverTask.kt index 9d6f803c..e762ace4 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasks/event/MetadataAndBaseInfoToCoverTask.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasks/event/MetadataAndBaseInfoToCoverTask.kt @@ -3,6 +3,7 @@ package no.iktdev.mediaprocessing.coordinator.tasks.event import mu.KotlinLogging import no.iktdev.mediaprocessing.coordinator.Coordinator import no.iktdev.mediaprocessing.coordinator.TaskCreator +import no.iktdev.mediaprocessing.shared.common.parsing.NameHelper import no.iktdev.mediaprocessing.shared.common.persistance.PersistentMessage import no.iktdev.mediaprocessing.shared.kafka.core.KafkaEvents import no.iktdev.mediaprocessing.shared.kafka.dto.MessageDataWrapper @@ -51,7 +52,7 @@ class MetadataAndBaseInfoToCoverTask(@Autowired override var coordinator: Coordi CoverInfoPerformed( status = Status.COMPLETED, url = coverUrl, - outFileBaseName = coverTitle, + outFileBaseName = NameHelper.normalize(coverTitle), outDir = fileOut.outDirectory, derivedFromEventId = event.eventId ) diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasks/event/MetadataAndBaseInfoToFileOut.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasks/event/MetadataAndBaseInfoToFileOut.kt index 7fb7f3b3..dee43f22 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasks/event/MetadataAndBaseInfoToFileOut.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/tasks/event/MetadataAndBaseInfoToFileOut.kt @@ -9,6 +9,7 @@ import no.iktdev.mediaprocessing.shared.common.SharedConfig import no.iktdev.mediaprocessing.shared.common.datasource.toEpochSeconds import no.iktdev.mediaprocessing.shared.common.lastOrSuccessOf 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.persistance.PersistentMessage import no.iktdev.mediaprocessing.shared.kafka.core.KafkaEnv @@ -134,7 +135,7 @@ class MetadataAndBaseInfoToFileOut(@Autowired override var coordinator: Coordina } } - fun getOutputDirectory() = SharedConfig.outgoingContent.using(getTitle()) + fun getOutputDirectory() = SharedConfig.outgoingContent.using(NameHelper.normalize(getTitle())) diff --git a/shared/common/build.gradle.kts b/shared/common/build.gradle.kts index 0af13992..15575895 100644 --- a/shared/common/build.gradle.kts +++ b/shared/common/build.gradle.kts @@ -39,6 +39,8 @@ dependencies { implementation("org.jetbrains.exposed:exposed-jdbc:$exposedVersion") implementation("org.jetbrains.exposed:exposed-java-time:$exposedVersion") implementation ("mysql:mysql-connector-java:8.0.29") + implementation("org.apache.commons:commons-lang3:3.12.0") + implementation(project(mapOf("path" to ":shared:kafka"))) implementation(project(mapOf("path" to ":shared:contract"))) diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/parsing/FileNameDeterminate.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/parsing/FileNameDeterminate.kt index ec86beb8..9d02599a 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/parsing/FileNameDeterminate.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/parsing/FileNameDeterminate.kt @@ -76,7 +76,7 @@ class FileNameDeterminate(val title: String, val sanitizedName: String, val ctyp var cleaned = Regex("(?<=\\w)[_.](?=\\w)").replace(input, " ") cleaned = Regexes.illegalCharacters.replace(cleaned, " - ") cleaned = Regexes.trimWhiteSpaces.replace(cleaned, " ") - return cleaned + return NameHelper.normalize(cleaned) } open internal class Base(val title: String, val sanitizedName: String) { @@ -130,8 +130,7 @@ class FileNameDeterminate(val title: String, val sanitizedName: String, val ctyp * 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 matchResult = Regexes.SeasonEpisodeBlock.find(inputText) val season = matchResult?.groups?.get(1)?.value val episode = matchResult?.groups?.get(2)?.value return season to episode @@ -149,10 +148,15 @@ class FileNameDeterminate(val title: String, val sanitizedName: String, val ctyp } fun findEpisodeTitle(): String? { + var startPosition: Int = 0 + startPosition = Regexes.SeasonEpisodeBlock.find(sanitizedName)?.value?.let { block -> + sanitizedName.indexOf(block) + block.length + } ?: 0 + val seCombo = findSeasonAndEpisode(sanitizedName) val episodeNumber = findEpisodeNumber() - val startPosition = if (seCombo.second != null) sanitizedName.indexOf(seCombo.second!!)+ seCombo.second!!.length + startPosition = if (startPosition != 0) startPosition else 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) diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/parsing/NameHelper.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/parsing/NameHelper.kt new file mode 100644 index 00000000..898fee68 --- /dev/null +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/parsing/NameHelper.kt @@ -0,0 +1,12 @@ +package no.iktdev.mediaprocessing.shared.common.parsing + +import org.apache.commons.lang3.StringUtils +import java.text.Normalizer + +object NameHelper { + fun normalize(text: String): String { + val normalized = Normalizer.normalize(text, Normalizer.Form.NFC) + val result = normalized.replace("\\p{M}".toRegex(), "") + return StringUtils.stripAccents(result) + } +} \ No newline at end of file diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/parsing/Regexes.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/parsing/Regexes.kt index 69b721e2..778db243 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/parsing/Regexes.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/parsing/Regexes.kt @@ -3,6 +3,6 @@ package no.iktdev.mediaprocessing.shared.common.parsing object Regexes { val illegalCharacters = Regex("""[\\\\\\/\\:\\*\\?\\\"\\<\\>|!`()\[\]]""") val trimWhiteSpaces = Regex("\\s{2,}") - val seasonAndEpisode = Regex("""(?i)\b(?:S|Season)\s*(\d+).*?(?:E|Episode)?\s*(\d+)\b""", RegexOption.IGNORE_CASE) + val SeasonEpisodeBlock = Regex("""(?i)\b(?:S|Season)\s*(\d+).*?(?:E|Episode)?\s*(\d+)\b""", RegexOption.IGNORE_CASE) val season = Regex("""(?i)\b(?:S|Season)\s*-?\s*(\d+)""", RegexOption.IGNORE_CASE) } \ No newline at end of file