From 40a9d2ec6a2bbcdd281c133fd1b671c3ae7b1ba2 Mon Sep 17 00:00:00 2001 From: marioplus Date: Mon, 31 Mar 2025 23:07:40 +0800 Subject: [PATCH] feat(misskon): add source misskon. (#8225) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(misskon): add source misskon. refs: #1855 * feat(misskon): Improve network handling and code structure • Network enhancements: - Add headers parameter for `GET` methods - Implement standardized query with `HttpUrl` - Replace `attr()` with `asbUrl()` for safe path composition • Structural improvements: - Move date regex to companion object - Extract SimpleDateFormat as global constant - Refactor Filter logic into standalone class • Robustness upgrades: - Remove unsafe non-null assertion(!!) on date_upload - Adopt SManga.create().apply { } chaining pattern refs: #1855 * feat(misskon): improve code structure and null safety - Replace `attr()` with `absUrl()` for more reliable URL extraction - Remove non-null assertion (`!!`) from `thumbnail_url` as it's not critical - Fix usage of `select()` and `selectFirst()` to properly handle nullable cases refs: #1855 * chore(MissKon): remove needless blank line - Fix lint violation (no-consecutive-blank-lines) Closes: #1855 * refactor(MissKon): optimize URL handling and reuse utils * Remove baseUrl from category URLs (build dynamically when used) * Reuse existing utils for: - Date parsing - Filter queries * Standardize pagination URL construction Closes: #1855 * fix(MissKon): Correct URL template, set default gallery name, and unify selectors Closes: #1855 * refactor(MissKon): fix URL construction and client configuration - Fix string interpolation in search URL ("$it.url" → "${it.url}") - Remove MOBILE user agent restriction - Remove unused dependency - Add ONLY_FETCH_ONCE update strategy - Clean up selector syntax --- src/all/misskon/build.gradle | 8 ++ .../misskon/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4664 bytes .../misskon/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2554 bytes .../misskon/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 6816 bytes .../misskon/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 12445 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 17652 bytes .../extension/all/misskon/MissKon.kt | 135 ++++++++++++++++++ .../all/misskon/SimpleParsedHttpSource.kt | 39 +++++ .../all/misskon/SourceCategorySelector.kt | 128 +++++++++++++++++ 9 files changed, 310 insertions(+) create mode 100644 src/all/misskon/build.gradle create mode 100644 src/all/misskon/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/all/misskon/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/all/misskon/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/all/misskon/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/all/misskon/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/MissKon.kt create mode 100644 src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/SimpleParsedHttpSource.kt create mode 100644 src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/SourceCategorySelector.kt diff --git a/src/all/misskon/build.gradle b/src/all/misskon/build.gradle new file mode 100644 index 000000000..a9d790cb0 --- /dev/null +++ b/src/all/misskon/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'MissKon' + extClass = '.MissKon' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/all/misskon/res/mipmap-hdpi/ic_launcher.png b/src/all/misskon/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..13cbf5995e4edbe8467718e17accc01f1af42135 GIT binary patch literal 4664 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 QqW}N^07*qoM6N<$f)FFgC;$Ke literal 0 HcmV?d00001 diff --git a/src/all/misskon/res/mipmap-xhdpi/ic_launcher.png b/src/all/misskon/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9288b88bb14f7e88fef68c0896c8efb75a887ab8 GIT binary patch literal 6816 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 bMOXhH4#%K1A-$dm00000NkvXXu0mjf2tu|` literal 0 HcmV?d00001 diff --git a/src/all/misskon/res/mipmap-xxxhdpi/ic_launcher.png b/src/all/misskon/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2bdeeda35e81ee7d4e5e4d2c70fc9771b2baea36 GIT binary patch literal 17652 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 N!PC{xWt~$(695AajQIcn literal 0 HcmV?d00001 diff --git a/src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/MissKon.kt b/src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/MissKon.kt new file mode 100644 index 000000000..f3c80cb56 --- /dev/null +++ b/src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/MissKon.kt @@ -0,0 +1,135 @@ +package eu.kanade.tachiyomi.extension.all.misskon + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.interceptor.rateLimitHost +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +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.model.UpdateStrategy +import eu.kanade.tachiyomi.util.asJsoup +import keiyoushi.utils.firstInstance +import keiyoushi.utils.tryParse +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit + +class MissKon() : SimpleParsedHttpSource() { + + override val baseUrl = "https://misskon.com" + override val lang = "all" + override val name = "MissKon" + override val supportsLatest = true + + override val client = network.cloudflareClient.newBuilder() + .rateLimitHost(baseUrl.toHttpUrl(), 10, 1, TimeUnit.SECONDS) + .build() + + override fun simpleMangaSelector() = "article.item-list" + + override fun simpleMangaFromElement(element: Element): SManga { + val titleEL = element.selectFirst(".post-box-title")!! + return SManga.create().apply { + title = titleEL.text() + thumbnail_url = element.selectFirst(".post-thumbnail img")?.absUrl("data-src") + setUrlWithoutDomain(titleEL.selectFirst("a")!!.absUrl("href")) + update_strategy = UpdateStrategy.ONLY_FETCH_ONCE + } + } + + override fun simpleNextPageSelector(): String? = null + + // region popular + override fun popularMangaRequest(page: Int) = GET("$baseUrl/top3/", headers) + // endregion + + // region latest + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/page/$page", headers) + + override fun latestUpdatesNextPageSelector() = ".current + a.page" + // endregion + + // region Search + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val filter = filters.firstInstance() + return filter.selectedCategory?.let { + GET("$baseUrl${it.url}", headers) + } ?: run { + "$baseUrl/page/$page/".toHttpUrl().newBuilder() + .addEncodedQueryParameter("s", query) + .build() + .let { GET(it, headers) } + } + } + + override fun searchMangaNextPageSelector() = "div.content > div.pagination > span.current + a" + // endregion + + // region Details + override fun mangaDetailsParse(document: Document): SManga { + val postInnerEl = document.selectFirst("article > .post-inner")!! + return SManga.create().apply { + title = postInnerEl.select(".post-title").text() + genre = postInnerEl.select(".post-tag > a").joinToString { it.text() } + } + } + + override fun chapterListSelector() = "html" + + override fun chapterFromElement(element: Element): SChapter { + val dateStr = element.selectFirst(".entry img")?.absUrl("data-src") + ?.let { url -> + FULL_DATE_REGEX.find(url)?.groupValues?.get(1) + ?: YEAR_MONTH_REGEX.find(url)?.groupValues?.get(1)?.let { "$it/01" } + } + + return SChapter.create().apply { + chapter_number = 0F + setUrlWithoutDomain(element.selectFirst("link[rel=canonical]")!!.absUrl("href")) + name = "Gallery" + date_upload = FULL_DATE_FORMAT.tryParse(dateStr) + } + } + // endregion + + // region Pages + override fun pageListParse(document: Document): List { + val basePageUrl = document.selectFirst("link[rel=canonical]")!!.absUrl("href") + + val pages = mutableListOf() + document.select("div.post-inner div.page-link:nth-child(1) .post-page-numbers") + .forEachIndexed { index, pageEl -> + val doc = when (index) { + 0 -> document + else -> { + val url = "$basePageUrl${pageEl.text()}/" + client.newCall(GET(url, headers)).execute().asJsoup() + } + } + doc.select("div.post-inner > div.entry > p > img") + .map { it.absUrl("data-src") } + .forEach { pages.add(Page(pages.size, imageUrl = it)) } + } + return pages + } + // endregion + + override fun getFilterList(): FilterList = FilterList( + Filter.Header("NOTE: Unable to further search in the category!"), + Filter.Separator(), + SourceCategorySelector.create(), + ) + + companion object { + + private val FULL_DATE_REGEX = Regex("""/(\d{4}/\d{2}/\d{2})/""") + private val YEAR_MONTH_REGEX = Regex("""/(\d{4}/\d{2})/""") + + private val FULL_DATE_FORMAT = SimpleDateFormat("yyyy/MM/dd", Locale.US) + } +} diff --git a/src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/SimpleParsedHttpSource.kt b/src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/SimpleParsedHttpSource.kt new file mode 100644 index 000000000..29ff34487 --- /dev/null +++ b/src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/SimpleParsedHttpSource.kt @@ -0,0 +1,39 @@ +package eu.kanade.tachiyomi.extension.all.misskon + +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element + +abstract class SimpleParsedHttpSource : ParsedHttpSource() { + + abstract fun simpleMangaSelector(): String + + abstract fun simpleMangaFromElement(element: Element): SManga + + abstract fun simpleNextPageSelector(): String? + + // region popular + override fun popularMangaSelector() = simpleMangaSelector() + override fun popularMangaNextPageSelector() = simpleNextPageSelector() + override fun popularMangaFromElement(element: Element) = simpleMangaFromElement(element) + // endregion + + // region last + override fun latestUpdatesSelector() = simpleMangaSelector() + override fun latestUpdatesFromElement(element: Element) = simpleMangaFromElement(element) + override fun latestUpdatesNextPageSelector() = simpleNextPageSelector() + // endregion + + // region search + override fun searchMangaSelector() = simpleMangaSelector() + override fun searchMangaFromElement(element: Element) = simpleMangaFromElement(element) + override fun searchMangaNextPageSelector() = simpleNextPageSelector() + // endregion + + override fun chapterListSelector() = simpleMangaSelector() + override fun imageUrlParse(document: Document): String { + throw UnsupportedOperationException() + } + // endregion +} diff --git a/src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/SourceCategorySelector.kt b/src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/SourceCategorySelector.kt new file mode 100644 index 000000000..5e7a18ed7 --- /dev/null +++ b/src/all/misskon/src/eu/kanade/tachiyomi/extension/all/misskon/SourceCategorySelector.kt @@ -0,0 +1,128 @@ +package eu.kanade.tachiyomi.extension.all.misskon + +import eu.kanade.tachiyomi.extension.all.misskon.SourceCategorySelector.Companion.CategoryPresets.CHINESE +import eu.kanade.tachiyomi.extension.all.misskon.SourceCategorySelector.Companion.CategoryPresets.KOREAN +import eu.kanade.tachiyomi.extension.all.misskon.SourceCategorySelector.Companion.CategoryPresets.OTHER +import eu.kanade.tachiyomi.extension.all.misskon.SourceCategorySelector.Companion.CategoryPresets.TOP +import eu.kanade.tachiyomi.source.model.Filter + +data class SourceCategory(private val name: String, val url: String) { + override fun toString() = this.name +} + +class SourceCategorySelector( + name: String, + categories: List, +) : Filter.Select(name, categories.toTypedArray()) { + + val selectedCategory: SourceCategory? + get() = if (state > 0) values[state] else null + + companion object { + + private object CategoryPresets { + + val TOP = listOf( + SourceCategory("Top 3 days", "/top3/"), + SourceCategory("Top 7 days", "/top7/"), + SourceCategory("Top 30 days", "/top30/"), + SourceCategory("Top 60 days", "/top60/"), + ) + + val CHINESE = listOf( + SourceCategory("Chinese:[MTCos] 喵糖映画", "/tag/mtcos/"), + SourceCategory("Chinese:BoLoli", "/tag/bololi/"), + SourceCategory("Chinese:CANDY", "/tag/candy/"), + SourceCategory("Chinese:FEILIN", "/tag/feilin/"), + SourceCategory("Chinese:FToow", "/tag/ftoow/"), + SourceCategory("Chinese:GIRLT", "/tag/girlt/"), + SourceCategory("Chinese:HuaYan", "/tag/huayan/"), + SourceCategory("Chinese:HuaYang", "/tag/huayang/"), + SourceCategory("Chinese:IMISS", "/tag/imiss/"), + SourceCategory("Chinese:ISHOW", "/tag/ishow/"), + SourceCategory("Chinese:JVID", "/tag/jvid/"), + SourceCategory("Chinese:KelaGirls", "/tag/kelagirls/"), + SourceCategory("Chinese:Kimoe", "/tag/kimoe/"), + SourceCategory("Chinese:LegBaby", "/tag/legbaby/"), + SourceCategory("Chinese:MF", "/tag/mf/"), + SourceCategory("Chinese:MFStar", "/tag/mfstar/"), + SourceCategory("Chinese:MiiTao", "/tag/miitao/"), + SourceCategory("Chinese:MintYe", "/tag/mintye/"), + SourceCategory("Chinese:MISSLEG", "/tag/missleg/"), + SourceCategory("Chinese:MiStar", "/tag/mistar/"), + SourceCategory("Chinese:MTMeng", "/tag/mtmeng/"), + SourceCategory("Chinese:MyGirl", "/tag/mygirl/"), + SourceCategory("Chinese:PartyCat", "/tag/partycat/"), + SourceCategory("Chinese:QingDouKe", "/tag/qingdouke/"), + SourceCategory("Chinese:RuiSG", "/tag/ruisg/"), + SourceCategory("Chinese:SLADY", "/tag/slady/"), + SourceCategory("Chinese:TASTE", "/tag/taste/"), + SourceCategory("Chinese:TGOD", "/tag/tgod/"), + SourceCategory("Chinese:TouTiao", "/tag/toutiao/"), + SourceCategory("Chinese:TuiGirl", "/tag/tuigirl/"), + SourceCategory("Chinese:Tukmo", "/tag/tukmo/"), + SourceCategory("Chinese:UGIRLS", "/tag/ugirls/"), + SourceCategory("Chinese:UGIRLS - Ai You Wu App", "/tag/ugirls-ai-you-wu-app/"), + SourceCategory("Chinese:UXING", "/tag/uxing/"), + SourceCategory("Chinese:WingS", "/tag/wings/"), + SourceCategory("Chinese:XiaoYu", "/tag/xiaoyu/"), + SourceCategory("Chinese:XingYan", "/tag/xingyan/"), + SourceCategory("Chinese:XIUREN", "/tag/xiuren/"), + SourceCategory("Chinese:XR Uncensored", "/tag/xr-uncensored/"), + SourceCategory("Chinese:YouMei", "/tag/youmei/"), + SourceCategory("Chinese:YouMi", "/tag/youmi/"), + SourceCategory("Chinese:YouMi尤蜜", "/tag/youmiapp/"), + SourceCategory("Chinese:YouWu", "/tag/youwu/"), + ) + + val KOREAN = listOf( + SourceCategory("Korean:AG", "/tag/ag/"), + SourceCategory("Korean:Bimilstory", "/tag/bimilstory/"), + SourceCategory("Korean:BLUECAKE", "/tag/bluecake/"), + SourceCategory("Korean:CreamSoda", "/tag/creamsoda/"), + SourceCategory("Korean:DJAWA", "/tag/djawa/"), + SourceCategory("Korean:Espacia Korea", "/tag/espacia-korea/"), + SourceCategory("Korean:Fantasy Factory", "/tag/fantasy-factory/"), + SourceCategory("Korean:Fantasy Story", "/tag/fantasy-story/"), + SourceCategory("Korean:Glamarchive", "/tag/glamarchive/"), + SourceCategory("Korean:HIGH FANTASY", "/tag/high-fantasy/"), + SourceCategory("Korean:KIMLEMON", "/tag/kimlemon/"), + SourceCategory("Korean:KIREI", "/tag/kirei/"), + SourceCategory("Korean:KiSiA", "/tag/kisia/"), + SourceCategory("Korean:Korean Realgraphic", "/tag/korean-realgraphic/"), + SourceCategory("Korean:Lilynah", "/tag/lilynah/"), + SourceCategory("Korean:Lookas", "/tag/lookas/"), + SourceCategory("Korean:Loozy", "/tag/loozy/"), + SourceCategory("Korean:Moon Night Snap", "/tag/moon-night-snap/"), + SourceCategory("Korean:Paranhosu", "/tag/paranhosu/"), + SourceCategory("Korean:PhotoChips", "/tag/photochips/"), + SourceCategory("Korean:Pure Media", "/tag/pure-media/"), + SourceCategory("Korean:PUSSYLET", "/tag/pussylet/"), + SourceCategory("Korean:SAINT Photolife", "/tag/saint-photolife/"), + SourceCategory("Korean:SWEETBOX", "/tag/sweetbox/"), + SourceCategory("Korean:UHHUNG MAGAZINE", "/tag/uhhung-magazine/"), + SourceCategory("Korean:UMIZINE", "/tag/umizine/"), + SourceCategory("Korean:WXY ENT", "/tag/wxy-ent/"), + SourceCategory("Korean:Yo-U", "/tag/yo-u/"), + ) + + val OTHER = listOf( + SourceCategory("Other:AI Generated", "/tag/ai-generated/"), + SourceCategory("Other:Cosplay", "/tag/cosplay/"), + SourceCategory("Other:JP", "/tag/jp/"), + SourceCategory("Other:JVID", "/tag/jvid/"), + SourceCategory("Other:Patreon", "/tag/patreon/"), + ) + } + + fun create(): SourceCategorySelector { + val options = mutableListOf(SourceCategory("unselected", "")).apply { + addAll(TOP) + addAll(CHINESE) + addAll(KOREAN) + addAll(OTHER) + } + return SourceCategorySelector("Category", options) + } + } +}