diff --git a/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/analyzer/contentDeterminator/FileNameDeterminate.kt b/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/analyzer/contentDeterminator/FileNameDeterminate.kt index 6f6b49d0..c963c61c 100644 --- a/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/analyzer/contentDeterminator/FileNameDeterminate.kt +++ b/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/analyzer/contentDeterminator/FileNameDeterminate.kt @@ -22,16 +22,18 @@ class FileNameDeterminate(val title: String, val sanitizedName: String, val ctyp private fun determineMovieFileName(): MovieInfo? { val movieEx = MovieEx(title, sanitizedName) - val result = when { + val stripped = when { movieEx.isDefinedWithYear() != null -> sanitizedName.replace(movieEx.isDefinedWithYear()!!, "").trim() movieEx.doesContainMovieKeywords() -> sanitizedName.replace(Regex("(?i)\\s*\\(\\s*movie\\s*\\)\\s*"), "").trim() else -> title } - return MovieInfo(title, result) + 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() @@ -69,10 +71,20 @@ class FileNameDeterminate(val title: String, val sanitizedName: String, val ctyp } } + 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)) + } } internal class MovieEx(title: String, sanitizedName: String) : Base(title, sanitizedName) { diff --git a/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/fileWatcher/FileWatcher.kt b/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/fileWatcher/FileWatcher.kt index 469ba6b8..59d4bbd3 100644 --- a/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/fileWatcher/FileWatcher.kt +++ b/Reader/src/main/kotlin/no/iktdev/streamit/content/reader/fileWatcher/FileWatcher.kt @@ -31,20 +31,19 @@ class FileWatcher: FileWatcherEvents { val queue = FileWatcherQueue() - val watcherChannel = CommonConfig.incomingContent?.asWatchChannel() + val watcherChannel = CommonConfig.incomingContent.asWatchChannel() init { Coroutines.io().launch { - if (watcherChannel == null) { - logger.error { "Can't start watcherChannel on null!" } - } - watcherChannel?.consumeEach { + watcherChannel.consumeEach { when (it.kind) { KWatchEvent.Kind.Deleted -> { queue.removeFromQueue(it.file, this@FileWatcher::onFileRemoved) } + KWatchEvent.Kind.Created, KWatchEvent.Kind.Initialized -> { queue.addToQueue(it.file, this@FileWatcher::onFilePending, this@FileWatcher::onFileAvailable) } + else -> { logger.info { "Ignoring event kind: ${it.kind.name} for file ${it.file.name}" } } diff --git a/Reader/src/test/kotlin/no/iktdev/streamit/content/reader/analyzer/contentDeterminator/FileNameDeterminateTest.kt b/Reader/src/test/kotlin/no/iktdev/streamit/content/reader/analyzer/contentDeterminator/FileNameDeterminateTest.kt index 45438551..353a8a80 100644 --- a/Reader/src/test/kotlin/no/iktdev/streamit/content/reader/analyzer/contentDeterminator/FileNameDeterminateTest.kt +++ b/Reader/src/test/kotlin/no/iktdev/streamit/content/reader/analyzer/contentDeterminator/FileNameDeterminateTest.kt @@ -58,6 +58,15 @@ class FileNameDeterminateTest { assertThat(fileNameDeterminate.getDeterminedVideoInfo()?.fullName).isEqualTo(namedTestData.expected) } + @Test + fun testWildStuff() { + val namedTestData = TestData("The Potato man", "The.Potato.man.2023.1080p.L950XL.x265-WIN10") + val fileNameDeterminate = FileNameDeterminate( + namedTestData.input, namedTestData.input, FileNameDeterminate.ContentType.UNDEFINED + ) + assertThat(fileNameDeterminate.getDeterminedVideoInfo()?.fullName).isEqualTo(namedTestData.expected) + } + companion object { @JvmStatic fun serieTestCases(): List> {