From ea57f820eede6e0bb9f0f17d6043cc78f883b4c3 Mon Sep 17 00:00:00 2001 From: 2Loong6 <1727963726@qq.com> Date: Mon, 20 Jul 2026 03:44:23 +0800 Subject: [PATCH 01/11] add romaji change --- .../assets/i18n/messages_en.properties | 2 + .../assets/i18n/messages_ja.properties | 2 + .../assets/i18n/messages_zh.properties | 2 + src/ja/kisslove/build.gradle.kts | 2 +- .../tachiyomi/extension/ja/kisslove/Dto.kt | 96 +++++++++++-------- .../extension/ja/kisslove/KissLove.kt | 50 ++++++---- 6 files changed, 95 insertions(+), 59 deletions(-) diff --git a/src/ja/kisslove/assets/i18n/messages_en.properties b/src/ja/kisslove/assets/i18n/messages_en.properties index d7ebc62d4d6..5e639f44560 100644 --- a/src/ja/kisslove/assets/i18n/messages_en.properties +++ b/src/ja/kisslove/assets/i18n/messages_en.properties @@ -4,3 +4,5 @@ all=All ongoing=Ongoing completed=Completed genreTip=Press 'Reset' to refresh filters after loading +useRomajiTitle=use romaji +useRomajiSummary=This feature requires "Update library manga titles to match source" to be enabled. diff --git a/src/ja/kisslove/assets/i18n/messages_ja.properties b/src/ja/kisslove/assets/i18n/messages_ja.properties index a1453ab3934..f782c1a9682 100644 --- a/src/ja/kisslove/assets/i18n/messages_ja.properties +++ b/src/ja/kisslove/assets/i18n/messages_ja.properties @@ -4,3 +4,5 @@ all=すべて ongoing=連載中 completed=完結 genreTip=読み込み後、「リセット」を押してフィルターを更新してください +useRomajiTitle=ローマ字タイトルを使用 +useRomajiSummary=この機能を使用するには、「ライブラリーのマンガのタイトルをソースに合わせて更新」が有効になっている必要があります。 diff --git a/src/ja/kisslove/assets/i18n/messages_zh.properties b/src/ja/kisslove/assets/i18n/messages_zh.properties index 6d91787331d..c24aafd4b01 100644 --- a/src/ja/kisslove/assets/i18n/messages_zh.properties +++ b/src/ja/kisslove/assets/i18n/messages_zh.properties @@ -4,3 +4,5 @@ all=全部 ongoing=连载中 completed=已完结 genreTip=加载后请点击“重置”以刷新筛选条件。 +useRomajiTitle=使用罗马音 +useRomajiSummary=该功能需要“更新书架中的漫画标题以匹配图源”开启 diff --git a/src/ja/kisslove/build.gradle.kts b/src/ja/kisslove/build.gradle.kts index 29d01ab5961..05b61311499 100644 --- a/src/ja/kisslove/build.gradle.kts +++ b/src/ja/kisslove/build.gradle.kts @@ -6,7 +6,7 @@ plugins { keiyoushi { name = "KissLove" - versionCode = 19 + versionCode = 20 contentWarning = ContentWarning.MIXED libVersion = "1.4" diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/Dto.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/Dto.kt index 1c4ef199407..9ea397babc2 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/Dto.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/Dto.kt @@ -42,50 +42,64 @@ data class Manga( val views: Long, @SerialName("vote_count") val voteCount: Long?, ) { - fun toSManga() = SManga.create().apply { - url = this@Manga.slug - title = this@Manga.name - artist = this@Manga.artists - author = this@Manga.authors - description = "${Jsoup.parse(this@Manga.description).text()}\n\n$otherName" - thumbnail_url = this@Manga.cover - genre = this@Manga.genres?.split(",")?.joinToString { it.trim() } - status = if (mStatus == 1) SManga.COMPLETED else SManga.ONGOING + fun toSManga(useRomajiTitle: Boolean = true): SManga { + val (mainName, extraName) = if (useRomajiTitle) { + name to otherName + } else { + val parts = otherName.split(Regex(",\\s*")) + .map { it.trim() } + .filter { it.isNotEmpty() } + + val (jpParts, nonJpParts) = parts.partition { hasJapaneseKana(it) } + + val mainTitle = if (jpParts.isNotEmpty()) { + jpParts.maxByOrNull { it.length } ?: jpParts.first() + } else { + parts.firstOrNull() ?: name + } + + val extra = buildExtraName(mainTitle, name, jpParts, nonJpParts) + + mainTitle to extra + } + + return SManga.create().apply { + url = this@Manga.slug + title = mainName + artist = this@Manga.artists + author = this@Manga.authors + description = "${Jsoup.parse(this@Manga.description).text()}\n\n$extraName" + thumbnail_url = this@Manga.cover + genre = this@Manga.genres?.split(",")?.joinToString { it.trim() } + status = if (mStatus == 1) SManga.COMPLETED else SManga.ONGOING + } } -} -@Serializable -data class ListPagedManga( - val currentPage: Long, - val items: List, - val totalItems: Long, - val totalPages: Long, -) + private fun hasJapaneseKana(text: String): Boolean { + val kanaRegex = Regex("[\\p{Script=Hiragana}\\p{Script=Katakana}]") + return kanaRegex.containsMatchIn(text) + } -@Serializable -data class MangaEntry( - val artists: String?, - val authors: String, - val cover: String, - val description: String = "", - val genres: List?, - val hidden: Int?, - val id: Long, - @SerialName("m_status") val mStatus: Int, - val name: String, - @SerialName("other_name") val otherName: String, - val slug: String, - @SerialName("trans_group") val transGroup: String, -) { - fun toSManga() = SManga.create().apply { - url = this@MangaEntry.slug - title = this@MangaEntry.name - artist = this@MangaEntry.artists - author = this@MangaEntry.authors - description = "${Jsoup.parse(this@MangaEntry.description).text()}\n\n$otherName" - thumbnail_url = this@MangaEntry.cover - genre = this@MangaEntry.genres?.joinToString { it.trim() } - status = if (mStatus == 1) SManga.COMPLETED else SManga.ONGOING + private fun buildExtraName( + mainTitle: String, + originalName: String, + jpParts: List, + nonJpParts: List, + ): String { + val extraParts = mutableListOf() + + extraParts.add(originalName) + + extraParts.addAll(nonJpParts) + + jpParts + .filter { it != mainTitle } + .forEach { extraParts.add(it) } + + return extraParts + .filter { it.isNotEmpty() } + .distinct() + .joinToString(", ") } } diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt index f0cb68ddbf0..39836a87ef8 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt @@ -1,7 +1,12 @@ package eu.kanade.tachiyomi.extension.ja.kisslove +import android.content.SharedPreferences +import androidx.preference.PreferenceScreen +import androidx.preference.SwitchPreferenceCompat +import eu.kanade.tachiyomi.lib.i18n.Intl import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.await +import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage @@ -9,8 +14,7 @@ import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource -import keiyoushi.annotation.Source -import keiyoushi.lib.i18n.Intl +import keiyoushi.utils.getPreferences import keiyoushi.utils.parseAs import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -23,8 +27,10 @@ import java.security.MessageDigest import java.text.SimpleDateFormat import java.util.* -@Source -abstract class KissLove : HttpSource() { +class KissLove : HttpSource(), ConfigurableSource { + override val name = "KissLove" + override val baseUrl = "https://klz9.com" + override val lang = "ja" override val supportsLatest = true private val intl = Intl( @@ -33,6 +39,7 @@ abstract class KissLove : HttpSource() { lang, this::class.java.classLoader!!, ) + private val preferences: SharedPreferences = getPreferences() private var cachedGenres: List? = null private val scope = CoroutineScope(Dispatchers.IO) @@ -45,11 +52,13 @@ abstract class KissLove : HttpSource() { override fun popularMangaParse(response: Response): MangasPage { val result = response.parseAs>() - val mangas = result.map { it.toSManga() } + val mangas = result.map { it.toSManga(preferences.getBoolean(USE_ROMAJI_PREF, true)) } return MangasPage(mangas, false) } - override fun getMangaUrl(manga: SManga): String = "$baseUrl/${manga.url}.html" + override fun getMangaUrl(manga: SManga): String { + return "$baseUrl/${manga.url}.html" + } override fun latestUpdatesRequest(page: Int): Request { val url = baseUrl.toHttpUrl().newBuilder() @@ -62,7 +71,7 @@ abstract class KissLove : HttpSource() { override fun latestUpdatesParse(response: Response): MangasPage { val result = response.parseAs() - val mangas = result.items.map { it.toSManga() } + val mangas = result.items.map { it.toSManga(preferences.getBoolean(USE_ROMAJI_PREF, true)) } val hasNextPage = result.currentPage < result.totalPages return MangasPage(mangas, hasNextPage) } @@ -82,7 +91,6 @@ abstract class KissLove : HttpSource() { } is StatusFilter -> addQueryParameter("status", filter.toUriPart()) - else -> {} } } @@ -90,12 +98,7 @@ abstract class KissLove : HttpSource() { return GET(url, sigAppend()) } - override fun searchMangaParse(response: Response): MangasPage { - val result = response.parseAs() - val mangas = result.items.map { it.toSManga() } - val hasNextPage = result.currentPage < result.totalPages - return MangasPage(mangas, hasNextPage) - } + override fun searchMangaParse(response: Response): MangasPage = latestUpdatesParse(response) override fun mangaDetailsRequest(manga: SManga): Request { val url = baseUrl.toHttpUrl().newBuilder() @@ -107,10 +110,12 @@ abstract class KissLove : HttpSource() { override fun mangaDetailsParse(response: Response): SManga { val result = response.parseAs() - return result.toSManga() + return result.toSManga(preferences.getBoolean(USE_ROMAJI_PREF, true)) } - override fun chapterListRequest(manga: SManga): Request = mangaDetailsRequest(manga) + override fun chapterListRequest(manga: SManga): Request { + return mangaDetailsRequest(manga) + } override fun chapterListParse(response: Response): List { val result = response.parseAs() @@ -210,7 +215,8 @@ abstract class KissLove : HttpSource() { intl["completed"] to "Completed", ) - private class StatusFilter(name: String, private val status: Array>) : Filter.Select(name, status.map { it.first }.toTypedArray()) { + private class StatusFilter(name: String, private val status: Array>) : + Filter.Select(name, status.map { it.first }.toTypedArray()) { fun toUriPart() = status[state].second } @@ -239,5 +245,15 @@ abstract class KissLove : HttpSource() { "h2.klimv1.xyz" to "j2.jfimv2.xyz", "h4.klimv1.xyz" to "j4.jfimv2.xyz", ) + const val USE_ROMAJI_PREF = "USE_ROMAJI_PREF" + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + SwitchPreferenceCompat(screen.context).apply { + key = USE_ROMAJI_PREF + title = intl["useRomajiTitle"] + summary = intl["useRomajiSummary"] + setDefaultValue(true) + }.let(screen::addPreference) } } From 425203daee9780a8cb6f2fd3c62117f04c4729a4 Mon Sep 17 00:00:00 2001 From: 2Loong6 <1727963726@qq.com> Date: Mon, 20 Jul 2026 03:53:42 +0800 Subject: [PATCH 02/11] fix formatter --- .../src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt index 39836a87ef8..b9c9c2ffa9a 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt @@ -27,7 +27,9 @@ import java.security.MessageDigest import java.text.SimpleDateFormat import java.util.* -class KissLove : HttpSource(), ConfigurableSource { +class KissLove : + HttpSource(), + ConfigurableSource { override val name = "KissLove" override val baseUrl = "https://klz9.com" override val lang = "ja" From 5847d0e402898ad5c81eeec8e8d16e2366b3f868 Mon Sep 17 00:00:00 2001 From: 2Loong6 <1727963726@qq.com> Date: Mon, 20 Jul 2026 04:15:16 +0800 Subject: [PATCH 03/11] apply spotless --- .../tachiyomi/extension/ja/kisslove/KissLove.kt | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt index b9c9c2ffa9a..58dc7e017a0 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt @@ -58,9 +58,7 @@ class KissLove : return MangasPage(mangas, false) } - override fun getMangaUrl(manga: SManga): String { - return "$baseUrl/${manga.url}.html" - } + override fun getMangaUrl(manga: SManga): String = "$baseUrl/${manga.url}.html" override fun latestUpdatesRequest(page: Int): Request { val url = baseUrl.toHttpUrl().newBuilder() @@ -115,9 +113,7 @@ class KissLove : return result.toSManga(preferences.getBoolean(USE_ROMAJI_PREF, true)) } - override fun chapterListRequest(manga: SManga): Request { - return mangaDetailsRequest(manga) - } + override fun chapterListRequest(manga: SManga): Request = mangaDetailsRequest(manga) override fun chapterListParse(response: Response): List { val result = response.parseAs() @@ -217,8 +213,7 @@ class KissLove : intl["completed"] to "Completed", ) - private class StatusFilter(name: String, private val status: Array>) : - Filter.Select(name, status.map { it.first }.toTypedArray()) { + private class StatusFilter(name: String, private val status: Array>) : Filter.Select(name, status.map { it.first }.toTypedArray()) { fun toUriPart() = status[state].second } From 86cfdaf0daf1499d75fe908cc3e40d88c00824f4 Mon Sep 17 00:00:00 2001 From: 2Loong6 <1727963726@qq.com> Date: Mon, 20 Jul 2026 04:19:12 +0800 Subject: [PATCH 04/11] add source annotation --- .../src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt index 58dc7e017a0..14485da1441 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt @@ -27,6 +27,7 @@ import java.security.MessageDigest import java.text.SimpleDateFormat import java.util.* +@Source class KissLove : HttpSource(), ConfigurableSource { From 65bb05fe9ff82e14fa2a683cbdee1db6cd71dddb Mon Sep 17 00:00:00 2001 From: 2Loong6 <1727963726@qq.com> Date: Mon, 20 Jul 2026 04:20:17 +0800 Subject: [PATCH 05/11] add source annotation --- .../src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt index 14485da1441..4616fb82556 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt @@ -14,6 +14,7 @@ import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource +import keiyoushi.annotation.Source import keiyoushi.utils.getPreferences import keiyoushi.utils.parseAs import kotlinx.coroutines.CoroutineScope From 166741ca17ccda4528669e22a00d53029ed04983 Mon Sep 17 00:00:00 2001 From: 2Loong6 <1727963726@qq.com> Date: Mon, 20 Jul 2026 04:32:14 +0800 Subject: [PATCH 06/11] fix constructor --- .../eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt index 4616fb82556..88beda68a7e 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt @@ -29,13 +29,14 @@ import java.text.SimpleDateFormat import java.util.* @Source -class KissLove : - HttpSource(), - ConfigurableSource { +class KissLove( override val name = "KissLove" override val baseUrl = "https://klz9.com" override val lang = "ja" override val supportsLatest = true +): + HttpSource(), + ConfigurableSource { private val intl = Intl( Locale.getDefault().language, From cdae5de874b80f0a9c15970b14c4087ff9de9a38 Mon Sep 17 00:00:00 2001 From: 2Loong6 <1727963726@qq.com> Date: Mon, 20 Jul 2026 04:34:36 +0800 Subject: [PATCH 07/11] add type --- .../eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt index 88beda68a7e..75a4c784346 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt @@ -30,10 +30,10 @@ import java.util.* @Source class KissLove( - override val name = "KissLove" - override val baseUrl = "https://klz9.com" - override val lang = "ja" - override val supportsLatest = true + override val name: String = "KissLove" + override val baseUrl: String = "https://klz9.com" + override val lang: String = "ja" + override val supportsLatest: Boolean = true ): HttpSource(), ConfigurableSource { From 1f16f06b51c2daa8b0e4fa0a16d9e5d34f8ec600 Mon Sep 17 00:00:00 2001 From: 2Loong6 <1727963726@qq.com> Date: Mon, 20 Jul 2026 04:38:17 +0800 Subject: [PATCH 08/11] fix formater --- .../tachiyomi/extension/ja/kisslove/KissLove.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt index 75a4c784346..0c7c80ec8fe 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt @@ -30,12 +30,11 @@ import java.util.* @Source class KissLove( - override val name: String = "KissLove" - override val baseUrl: String = "https://klz9.com" - override val lang: String = "ja" - override val supportsLatest: Boolean = true -): - HttpSource(), + override val name: String = "KissLove", + override val baseUrl: String = "https://klz9.com", + override val lang: String = "ja", + override val supportsLatest: Boolean = true, +) : HttpSource(), ConfigurableSource { private val intl = Intl( From 325faaae768964f698bbb395d02223d15a6aa564 Mon Sep 17 00:00:00 2001 From: 2Loong6 <1727963726@qq.com> Date: Mon, 20 Jul 2026 04:41:20 +0800 Subject: [PATCH 09/11] add id --- .../src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt index 0c7c80ec8fe..d693f487c2f 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt @@ -30,6 +30,7 @@ import java.util.* @Source class KissLove( + override val id: Long, override val name: String = "KissLove", override val baseUrl: String = "https://klz9.com", override val lang: String = "ja", From 8e87c1bd1b8ec48f3780abe72f673911883681d4 Mon Sep 17 00:00:00 2001 From: 2Loong6 <1727963726@qq.com> Date: Mon, 20 Jul 2026 05:07:36 +0800 Subject: [PATCH 10/11] fix problem --- .../eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt index d693f487c2f..bdd9329b511 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/KissLove.kt @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.extension.ja.kisslove import android.content.SharedPreferences import androidx.preference.PreferenceScreen import androidx.preference.SwitchPreferenceCompat -import eu.kanade.tachiyomi.lib.i18n.Intl import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.await import eu.kanade.tachiyomi.source.ConfigurableSource @@ -15,6 +14,7 @@ import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource import keiyoushi.annotation.Source +import keiyoushi.lib.i18n.Intl import keiyoushi.utils.getPreferences import keiyoushi.utils.parseAs import kotlinx.coroutines.CoroutineScope @@ -31,9 +31,9 @@ import java.util.* @Source class KissLove( override val id: Long, - override val name: String = "KissLove", - override val baseUrl: String = "https://klz9.com", - override val lang: String = "ja", + override val name: String, + override val baseUrl: String, + override val lang: String, override val supportsLatest: Boolean = true, ) : HttpSource(), ConfigurableSource { From 1bc36ac2e69d62817fcc7dd25abfec7bc7b48602 Mon Sep 17 00:00:00 2001 From: 2Loong6 <1727963726@qq.com> Date: Mon, 20 Jul 2026 06:08:56 +0800 Subject: [PATCH 11/11] fix search tag --- .../kanade/tachiyomi/extension/ja/kisslove/Dto.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/Dto.kt b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/Dto.kt index 9ea397babc2..90dc9fe1702 100644 --- a/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/Dto.kt +++ b/src/ja/kisslove/src/eu/kanade/tachiyomi/extension/ja/kisslove/Dto.kt @@ -6,6 +6,10 @@ import eu.kanade.tachiyomi.source.model.SManga import keiyoushi.utils.tryParse import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.jsonPrimitive import org.jsoup.Jsoup @Serializable @@ -24,7 +28,7 @@ data class Manga( val cover: String, @SerialName("daily_views") val dailyViews: Long?, val description: String = "", - val genres: String?, + @SerialName("genres") val genresRaw: JsonElement? = null, @SerialName("group_uploader") val groupUploader: Long?, val hidden: Int?, val id: Long, @@ -63,6 +67,12 @@ data class Manga( mainTitle to extra } + val genres = when (val raw = genresRaw) { + is JsonArray -> raw.map { it.jsonPrimitive.content } + is JsonPrimitive -> raw.content.split(",") + else -> emptyList() + } + return SManga.create().apply { url = this@Manga.slug title = mainName @@ -70,7 +80,7 @@ data class Manga( author = this@Manga.authors description = "${Jsoup.parse(this@Manga.description).text()}\n\n$extraName" thumbnail_url = this@Manga.cover - genre = this@Manga.genres?.split(",")?.joinToString { it.trim() } + genre = genres.joinToString { it.trim() } status = if (mStatus == 1) SManga.COMPLETED else SManga.ONGOING } }