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?,