From 44c2c074a895c6100e9ebfe93a4d7994b657befb Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 5 Dec 2023 13:39:07 +0200 Subject: [PATCH] [MangaDex] Language filter support --- .../parsers/site/all/MangaDexParser.kt | 13 ++++++++++++ .../kotatsu/parsers/MangaParserTest.kt | 20 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt index 53e2b361..b7a67d11 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt @@ -79,6 +79,10 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context MangaState.PAUSED -> append("hiatus") } } + filter.locale?.let { + append("&originalLanguage[]=") + append(it.language) + } } null -> { @@ -183,6 +187,15 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context } } + override suspend fun getAvailableLocales(): Set { + val head = webClient.httpGet("https://$domain/").parseHtml().head() + return head.getElementsByAttributeValue("property", "og:locale:alternate") + .mapNotNullToSet { meta -> + val raw = meta.attrOrNull("content") ?: return@mapNotNullToSet null + Locale(raw.substringBefore('_'), raw.substringAfter('_', "")) + } + } + private fun JSONObject.firstStringValue() = values().next() as String private fun JSONObject.selectByLocale(): String? { diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt index 9cf30e86..b3cf9130 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -115,6 +115,26 @@ internal class MangaParserTest { assert(list.all { it.source == source }) } + @ParameterizedTest(name = "{index}|locale|{0}") + @MangaSources + fun locale(source: MangaSource) = runTest { + val parser = context.newParserInstance(source) + val locales = parser.getAvailableLocales() + if (locales.isEmpty()) { + return@runTest + } + val filter = MangaListFilter.Advanced( + sortOrder = parser.availableSortOrders.first(), + tags = setOf(), + locale = locales.random(), + states = setOf(), + ) + val list = parser.getList(offset = 0, filter) + checkMangaList(list, filter.locale.toString()) + assert(list.all { it.source == source }) + } + + @ParameterizedTest(name = "{index}|details|{0}") @MangaSources fun details(source: MangaSource) = runTest {