From 8b615b8d69aaf1af6de61a74d71b750ed543d25a Mon Sep 17 00:00:00 2001 From: Claudemirovsky <63046606+Claudemirovsky@users.noreply.github.com> Date: Thu, 28 Dec 2023 13:19:03 -0300 Subject: [PATCH] feat(src/en): New source: Kiutaku (#19445) * feat(src/en): Create Kiutaku base * feat: Implement popular entries page * feat: Implement latest updates page * feat: Implement search * feat: Implement entry details page * feat: Implement chapter list page * feat: Parse page list * chore: Add source (fav)icon The source doesn't seems to have a logo, so I'm considering the favicon used by the site as their icon. --- src/en/kiutaku/AndroidManifest.xml | 22 +++ src/en/kiutaku/build.gradle | 12 ++ .../kiutaku/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3763 bytes .../kiutaku/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2166 bytes .../kiutaku/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4552 bytes .../kiutaku/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 8121 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11492 bytes .../tachiyomi/extension/en/kiutaku/Kiutaku.kt | 127 ++++++++++++++++++ .../en/kiutaku/KiutakuUrlActivity.kt | 41 ++++++ 9 files changed, 202 insertions(+) create mode 100644 src/en/kiutaku/AndroidManifest.xml create mode 100644 src/en/kiutaku/build.gradle create mode 100644 src/en/kiutaku/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/kiutaku/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/kiutaku/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/kiutaku/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/kiutaku/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/kiutaku/src/eu/kanade/tachiyomi/extension/en/kiutaku/Kiutaku.kt create mode 100644 src/en/kiutaku/src/eu/kanade/tachiyomi/extension/en/kiutaku/KiutakuUrlActivity.kt diff --git a/src/en/kiutaku/AndroidManifest.xml b/src/en/kiutaku/AndroidManifest.xml new file mode 100644 index 000000000..0b523e5bb --- /dev/null +++ b/src/en/kiutaku/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/src/en/kiutaku/build.gradle b/src/en/kiutaku/build.gradle new file mode 100644 index 000000000..74e905bbd --- /dev/null +++ b/src/en/kiutaku/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'Kiutaku' + pkgNameSuffix = 'en.kiutaku' + extClass = '.Kiutaku' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/kiutaku/res/mipmap-hdpi/ic_launcher.png b/src/en/kiutaku/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3deba530c60035dce1324ea59a72beb48d98bf59 GIT binary patch literal 3763 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 literal 0 HcmV?d00001 diff --git a/src/en/kiutaku/res/mipmap-xhdpi/ic_launcher.png b/src/en/kiutaku/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8134770437312fd220d94ec880878a9af132484c GIT binary patch literal 4552 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 literal 0 HcmV?d00001 diff --git a/src/en/kiutaku/res/mipmap-xxhdpi/ic_launcher.png b/src/en/kiutaku/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3e6b139c8de4a5fd9d3792d4331f4e42fc3a0053 GIT binary patch literal 8121 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 KMNUMnLSTXmK^lAj literal 0 HcmV?d00001 diff --git a/src/en/kiutaku/src/eu/kanade/tachiyomi/extension/en/kiutaku/Kiutaku.kt b/src/en/kiutaku/src/eu/kanade/tachiyomi/extension/en/kiutaku/Kiutaku.kt new file mode 100644 index 000000000..8a8d0fd04 --- /dev/null +++ b/src/en/kiutaku/src/eu/kanade/tachiyomi/extension/en/kiutaku/Kiutaku.kt @@ -0,0 +1,127 @@ +package eu.kanade.tachiyomi.extension.en.kiutaku + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.network.interceptor.rateLimitHost +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +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.source.online.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable + +class Kiutaku : ParsedHttpSource() { + + override val name = "Kiutaku" + + override val baseUrl = "https://kiutaku.com" + + override val lang = "en" + + override val supportsLatest = true + + override val client by lazy { + network.client.newBuilder() + .rateLimitHost(baseUrl.toHttpUrl(), 2) + .build() + } + + // ============================== Popular =============================== + private fun getPage(page: Int) = (page - 1) * 20 + + override fun popularMangaRequest(page: Int) = GET("$baseUrl/hot?start=${getPage(page)}", headers) + + override fun popularMangaSelector() = "div.blog > div.items-row" + + override fun popularMangaFromElement(element: Element) = SManga.create().apply { + setUrlWithoutDomain(element.selectFirst("a.item-link")!!.attr("href")) + thumbnail_url = element.selectFirst("img")?.attr("src") + title = element.selectFirst("h2")?.text() ?: "Cosplay" + } + + override fun popularMangaNextPageSelector() = "nav > a.pagination-next:not([disabled])" + + // =============================== Latest =============================== + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/?start=${getPage(page)}", headers) + + override fun latestUpdatesSelector() = popularMangaSelector() + + override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) + + override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() + + // =============================== Search =============================== + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return if (query.startsWith(PREFIX_SEARCH)) { // URL intent handler + val id = query.removePrefix(PREFIX_SEARCH) + client.newCall(GET("$baseUrl/$id")) + .asObservableSuccess() + .map(::searchMangaByIdParse) + } else { + super.fetchSearchManga(page, query, filters) + } + } + + private fun searchMangaByIdParse(response: Response): MangasPage { + val details = mangaDetailsParse(response.use { it.asJsoup() }) + return MangasPage(listOf(details), false) + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + return GET("$baseUrl/?search=$query&start=${getPage(page)}", headers) + } + + override fun searchMangaSelector() = popularMangaSelector() + + override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) + + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + + // =========================== Manga Details ============================ + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + status = SManga.COMPLETED + update_strategy = UpdateStrategy.ONLY_FETCH_ONCE + title = document.selectFirst("div.article-header")?.text() ?: "Cosplay" + genre = document.selectFirst("div.article-tags") + ?.select("a.tag > span") + ?.eachText() + ?.joinToString { it.trimStart('#') } + } + + // ============================== Chapters ============================== + // Fix chapter order + override fun chapterListParse(response: Response) = + super.chapterListParse(response).reversed() + + override fun chapterListSelector() = "nav.pagination:first-of-type a" + + override fun chapterFromElement(element: Element) = SChapter.create().apply { + setUrlWithoutDomain(element.attr("href")) + val text = element.text() + name = "Page $text" + chapter_number = text.toFloatOrNull() ?: 1F + } + + // =============================== Pages ================================ + override fun pageListParse(document: Document): List { + return document.select("div.article-fulltext img[src]").mapIndexed { index, item -> + Page(index, "", item.attr("src")) + } + } + + override fun imageUrlParse(document: Document): String { + throw UnsupportedOperationException("Not used.") + } + + companion object { + const val PREFIX_SEARCH = "id:" + } +} diff --git a/src/en/kiutaku/src/eu/kanade/tachiyomi/extension/en/kiutaku/KiutakuUrlActivity.kt b/src/en/kiutaku/src/eu/kanade/tachiyomi/extension/en/kiutaku/KiutakuUrlActivity.kt new file mode 100644 index 000000000..efd630127 --- /dev/null +++ b/src/en/kiutaku/src/eu/kanade/tachiyomi/extension/en/kiutaku/KiutakuUrlActivity.kt @@ -0,0 +1,41 @@ +package eu.kanade.tachiyomi.extension.en.kiutaku + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +/** + * Springboard that accepts https://kiutaku.com/ intents + * and redirects them to the main Tachiyomi process. + */ +class KiutakuUrlActivity : Activity() { + + private val tag = javaClass.simpleName + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + if (pathSegments != null && pathSegments.isNotEmpty()) { + val id = pathSegments.first() + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", "${Kiutaku.PREFIX_SEARCH}$id") + putExtra("filter", packageName) + } + + try { + startActivity(mainIntent) + } catch (e: ActivityNotFoundException) { + Log.e(tag, e.toString()) + } + } else { + Log.e(tag, "could not parse uri from intent $intent") + } + + finish() + exitProcess(0) + } +}