diff --git a/src/all/comickfun/AndroidManifest.xml b/src/all/comickfun/AndroidManifest.xml
index c0e9ad24b..8d693cfe8 100644
--- a/src/all/comickfun/AndroidManifest.xml
+++ b/src/all/comickfun/AndroidManifest.xml
@@ -13,14 +13,10 @@
-
-
+
+
+
+
diff --git a/src/all/comickfun/build.gradle b/src/all/comickfun/build.gradle
index 74a7456a8..84a93d9f2 100644
--- a/src/all/comickfun/build.gradle
+++ b/src/all/comickfun/build.gradle
@@ -6,7 +6,7 @@ ext {
extName = 'Comick'
pkgNameSuffix = 'all.comickfun'
extClass = '.ComickFunFactory'
- extVersionCode = 36
+ extVersionCode = 37
isNsfw = true
}
diff --git a/src/all/comickfun/src/eu/kanade/tachiyomi/extension/all/comickfun/ComickFun.kt b/src/all/comickfun/src/eu/kanade/tachiyomi/extension/all/comickfun/ComickFun.kt
index 6ce6eefbf..5010e42d5 100644
--- a/src/all/comickfun/src/eu/kanade/tachiyomi/extension/all/comickfun/ComickFun.kt
+++ b/src/all/comickfun/src/eu/kanade/tachiyomi/extension/all/comickfun/ComickFun.kt
@@ -4,6 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.EditTextPreference
import androidx.preference.PreferenceScreen
+import androidx.preference.SwitchPreferenceCompat
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.network.interceptor.rateLimit
@@ -59,7 +60,7 @@ abstract class ComickFun(
key = IGNORED_GROUPS_PREF
title = "Ignored Groups"
summary =
- "Chapters from these groups won't be shown.\nComma-separated list of group names (case-insensitive)"
+ "Chapters from these groups won't be shown.\nOne group name per line (case-insensitive)"
setOnPreferenceChangeListener { _, newValue ->
preferences.edit()
@@ -67,18 +68,33 @@ abstract class ComickFun(
.commit()
}
}.also(screen::addPreference)
+
+ SwitchPreferenceCompat(screen.context).apply {
+ key = INCLUDE_MU_TAGS_PREF
+ title = "Include Tags"
+ summaryOn = "More specific, but might contain spoilers!"
+ summaryOff = "Only the broader genres"
+ setDefaultValue(true)
+ }.also(screen::addPreference)
}
private val SharedPreferences.ignoredGroups
get() = getString(IGNORED_GROUPS_PREF, "")
?.lowercase()
- ?.split(",")
+ ?.split("\n")
?.map(String::trim)
?.filter(String::isNotEmpty)
?.sorted()
.orEmpty()
.toSet()
+ private val SharedPreferences.includeMuTags
+ get() = getBoolean(INCLUDE_MU_TAGS_PREF, true)
+
+ init {
+ preferences.newLineIgnoredGroups()
+ }
+
override fun headersBuilder() = Headers.Builder().apply {
add("Referer", "$baseUrl/")
add("User-Agent", "Tachiyomi ${System.getProperty("http.agent")}")
@@ -263,7 +279,7 @@ abstract class ComickFun(
override fun mangaDetailsParse(response: Response): SManga {
val mangaData = response.parseAs()
- return mangaData.toSManga()
+ return mangaData.toSManga(includeMuTags = preferences.includeMuTags)
}
override fun getMangaUrl(manga: SManga): String {
@@ -347,9 +363,28 @@ abstract class ComickFun(
override fun getFilterList() = getFilters()
+ private fun SharedPreferences.newLineIgnoredGroups() {
+ if (getBoolean(MIGRATED_IGNORED_GROUPS, false)) return
+ val ignoredGroups = getString(IGNORED_GROUPS_PREF, "").orEmpty()
+
+ edit()
+ .putString(
+ IGNORED_GROUPS_PREF,
+ ignoredGroups
+ .split(",")
+ .map(String::trim)
+ .filter(String::isNotEmpty)
+ .joinToString("\n"),
+ )
+ .putBoolean(MIGRATED_IGNORED_GROUPS, true)
+ .apply()
+ }
+
companion object {
const val SLUG_SEARCH_PREFIX = "id:"
private const val IGNORED_GROUPS_PREF = "IgnoredGroups"
+ private const val INCLUDE_MU_TAGS_PREF = "IncludeMangaUpdatesTags"
+ private const val MIGRATED_IGNORED_GROUPS = "MigratedIgnoredGroups"
private const val limit = 20
val dateFormat by lazy {
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH).apply {
diff --git a/src/all/comickfun/src/eu/kanade/tachiyomi/extension/all/comickfun/ComickFunDto.kt b/src/all/comickfun/src/eu/kanade/tachiyomi/extension/all/comickfun/ComickFunDto.kt
index 4a8bf621c..a8c81b2e8 100644
--- a/src/all/comickfun/src/eu/kanade/tachiyomi/extension/all/comickfun/ComickFunDto.kt
+++ b/src/all/comickfun/src/eu/kanade/tachiyomi/extension/all/comickfun/ComickFunDto.kt
@@ -27,8 +27,9 @@ data class Manga(
val artists: List = emptyList(),
val authors: List = emptyList(),
val genres: List = emptyList(),
+ val demographic: String? = null,
) {
- fun toSManga() = SManga.create().apply {
+ fun toSManga(includeMuTags: Boolean = false) = SManga.create().apply {
// appennding # at end as part of migration from slug to hid
url = "/comic/${comic.hid}#"
title = comic.title
@@ -48,7 +49,19 @@ data class Manga(
thumbnail_url = parseCover(comic.cover, comic.mdCovers)
artist = artists.joinToString { it.name.trim() }
author = authors.joinToString { it.name.trim() }
- genre = (listOfNotNull(comic.origination) + genres)
+ genre = buildList {
+ comic.origination?.let(::add)
+ demographic?.let { add(Name(it)) }
+ addAll(genres)
+ addAll(comic.mdGenres.mapNotNull { it.name })
+ if (includeMuTags) {
+ comic.muGenres.categories.forEach { category ->
+ category.category?.title?.let { add(Name(it)) }
+ }
+ }
+ }
+ .distinctBy { it.name }
+ .filter { it.name.isNotBlank() }
.joinToString { it.name.trim() }
}
}
@@ -64,6 +77,8 @@ data class Comic(
@SerialName("translation_completed") val translationComplete: Boolean? = true,
@SerialName("md_covers") val mdCovers: List = emptyList(),
@SerialName("cover_url") val cover: String? = null,
+ @SerialName("md_comic_md_genres") val mdGenres: List,
+ @SerialName("mu_comics") val muGenres: MuComicCategories,
) {
val origination = when (country) {
"jp" -> Name("Manga")
@@ -73,6 +88,21 @@ data class Comic(
}
}
+@Serializable
+data class MdGenres(
+ @SerialName("md_genres") val name: Name? = null,
+)
+
+@Serializable
+data class MuComicCategories(
+ @SerialName("mu_comic_categories") val categories: List = emptyList(),
+)
+
+@Serializable
+data class MuCategories(
+ @SerialName("mu_categories") val category: Title? = null,
+)
+
@Serializable
data class MDcovers(
val b2key: String?,