From a910431f4458b2dd6b00aeb0242090f95eb6294f Mon Sep 17 00:00:00 2001 From: KenjieDec <65448230+KenjieDec@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:27:27 +0700 Subject: [PATCH] Added SpyFakku (#3538) * Added SpyFakku * Changes - Combined SortFilter and OrderFilter into One Filter.Sort - Remove useless regex - Filter out empty tags - Rate limit added - etc --- src/en/spyfakku/build.gradle | 8 + .../spyfakku/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3186 bytes .../spyfakku/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1795 bytes .../spyfakku/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4367 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 8176 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11781 bytes .../extension/en/spyfakku/Filters.kt | 34 ++++ .../extension/en/spyfakku/SpyFakku.kt | 181 ++++++++++++++++++ .../extension/en/spyfakku/SpyFakkuDto.kt | 23 +++ 9 files changed, 246 insertions(+) create mode 100644 src/en/spyfakku/build.gradle create mode 100644 src/en/spyfakku/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/spyfakku/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/spyfakku/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/spyfakku/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/spyfakku/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/Filters.kt create mode 100644 src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/SpyFakku.kt create mode 100644 src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/SpyFakkuDto.kt diff --git a/src/en/spyfakku/build.gradle b/src/en/spyfakku/build.gradle new file mode 100644 index 000000000..e0c79991e --- /dev/null +++ b/src/en/spyfakku/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'SpyFakku' + extClass = '.SpyFakku' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/spyfakku/res/mipmap-hdpi/ic_launcher.png b/src/en/spyfakku/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..62e832f3b993e9f21b0cc75d695a866ff230fbd3 GIT binary patch literal 3186 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 Y5B9@R?!d;94gdfE07*qoM6N<$g74bz!~g&Q literal 0 HcmV?d00001 diff --git a/src/en/spyfakku/res/mipmap-mdpi/ic_launcher.png b/src/en/spyfakku/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2a79eef198053b241e16f0fd975b2c58a21e62a5 GIT binary patch literal 1795 zcmV+e2mJVnP)Px*y-7qtRA@u(T3c)sRT%zeW@q-&uI#Pd-L`Z~8j5jaPzbaVFwsO24e>@IL?sbl z^g&}tFfkAf1~uVeyLO{2whqRlqtC2_cq(pOuRSW=gcn|D`As zw(3@v3ADGj8!Di+eE$X(EgZ0SkjF@dKwkuJWYL(L!l?}`vLy*GTrburVMNFl0V@i8 z*yF&iD1#TT7ci1pbO(pSfk-3*x7#gSH=oZVnM|TsEGpR{x zixUGg0^YyH*QlU%LCXZ9(Wt2cBp5Gk;pA-d*+^M_hGAp^r18Zfa=9!Dg@T-gIF5ze z?SX?Og#j2JAFsI6dutf%>tyiA#R5vA`SXTt0!9k7a1^d>T**U*veu1)dGG?8K+b- zw`~GO3aldp9&_R;LLgnMKv!26=H})wJxzALfY0ZXKcl0gHGUp*0|Q%~*m1Rh!8zkJ zY>PlR95z*;)k)#!ZJb<)E-ko_Le}f`A{-9Oz!QlCL{UUXM+ZoDBEC}%T_y`6mayf#T?FY96CEYWw4|PLOH#X45iF9HZ~^L z1;s7jUE{#pF$VDqc?eQ%1+N5{9T#eCZ8cSZOnSJ-fhR*Wwp}h%-gl7P9}1CFtzV7F z^{J^TOioT#2wm91;l`|p{X>gsR6E|b0tx{m1;}+0$mjc<_~4Hs`tO!4O$t~b5KtSf z%3a7f5*PRG-IMz~AEEL2!)%rR8-ceK11&8rbrm2Je)=GTonZ#gT`OWNCxN&S309ZO zCI40$0Zz6Nxm-@J$i#)BPLj!3{5UD%otyeatjZF0Tu32crU03|iGiHM$@iWcMLCbF zEvUo-31szk0{)wgEGS4a`B}bpTdf6eOMy@*WJv)sX)6bue3V7RMd9#m9^d{WRANH! z#Q<@eBkLS8=-oGX+{x9ZVLkA+2^eM|O@Jy&eAMH>?sf*F840J8B@E1n_%~0U#mXf6 z{4`#Q(sJw&l864}E0#C&`-ZYmFc`F~fSPFBOJQ#ZgB`6jf*b{k>^v6`%oZh_n-K8T zof3XkRa~p!Z7Dzq*ik?Wf}wymC&~}?pfJmexRaCQJg@C*wob!A90&wz6fm-s*~7mX zSUbQKB9<#LAy99DdQWW24c?Xu`ThQe70^>kFB=(U8nf$`6(9tbTLC-4y5uzK^Z6_* zP|xDa0o-;B_znD60ILLDTGzSt66HD2nHDx!gejV*ttz z)(cJdlo9{|?FT?kD9f)BR<7|2RwqYGS?zJF(K#`>?pXLJFPT@00@>}6lS%TaIV-;Z luLdh6i&+e;G$vc?{|6sLZi|!g1Oxy8002ovPDHLkV1lLZCcgjx literal 0 HcmV?d00001 diff --git a/src/en/spyfakku/res/mipmap-xhdpi/ic_launcher.png b/src/en/spyfakku/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d99a4b02710176d3b1fb4189e4b2a41243c81604 GIT binary patch literal 4367 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 Bhk5`2 literal 0 HcmV?d00001 diff --git a/src/en/spyfakku/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/spyfakku/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f5bc697d1d6b2f623ced7a91b23fd19f764a5ce7 GIT binary patch literal 11781 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 RG1m>yP|;PcS9~4ue*m(`ez5=m literal 0 HcmV?d00001 diff --git a/src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/Filters.kt b/src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/Filters.kt new file mode 100644 index 000000000..6edc09536 --- /dev/null +++ b/src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/Filters.kt @@ -0,0 +1,34 @@ +package eu.kanade.tachiyomi.extension.en.spyfakku + +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.Filter.Sort.Selection +import eu.kanade.tachiyomi.source.model.FilterList + +fun getFilters(): FilterList { + return FilterList( + SortFilter("Sort by", Selection(0, false), getSortsList), + Filter.Separator(), + Filter.Header("Separate tags with commas (,)"), + Filter.Header("Prepend with dash (-) to exclude"), + TextFilter("Tags", "tag"), + TextFilter("Artists", "artist"), + TextFilter("Magazines", "magazine"), + TextFilter("Parodies", "parody"), + TextFilter("Circles", "circle"), + TextFilter("Pages", "pages"), + ) +} + +internal open class TextFilter(name: String, val type: String) : Filter.Text(name) +internal open class SortFilter(name: String, selection: Selection, private val vals: List>) : + Filter.Sort(name, vals.map { it.first }.toTypedArray(), selection) { + fun getValue() = vals[state!!.index].second +} + +private val getSortsList: List> = listOf( + Pair("ID", "id"), + Pair("Title", "title"), + Pair("Created", "created_at"), + Pair("Published", "published_at"), + Pair("Pages", "pages"), +) diff --git a/src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/SpyFakku.kt b/src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/SpyFakku.kt new file mode 100644 index 000000000..eac09feb4 --- /dev/null +++ b/src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/SpyFakku.kt @@ -0,0 +1,181 @@ +package eu.kanade.tachiyomi.extension.en.spyfakku + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.interceptor.rateLimit +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.HttpSource +import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.coroutines.runBlocking +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Element +import uy.kohesive.injekt.injectLazy +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.concurrent.TimeUnit + +class SpyFakku : HttpSource() { + + override val name = "SpyFakku" + + override val baseUrl = "https://spy.fakku.cc" + + private val baseImageUrl = "https://cdn.fakku.cc/data" + + override val lang = "en" + + override val supportsLatest = false + + private val json: Json by injectLazy() + + override val client = network.cloudflareClient.newBuilder() + .rateLimit(2, 1, TimeUnit.SECONDS) + .build() + + override fun headersBuilder() = super.headersBuilder() + .set("referer", "$baseUrl/") + .set("origin", baseUrl) + + override fun popularMangaRequest(page: Int): Request { + return GET(baseUrl, headers) + } + override fun popularMangaParse(response: Response): MangasPage { + val document = response.asJsoup() + + val mangas = document.select("article.entry").map(::popularMangaFromElement) + + val hasNextPage = document.selectFirst(".next") != null + + return MangasPage(mangas, hasNextPage) + } + + private fun popularMangaFromElement(element: Element) = SManga.create().apply { + with(element.selectFirst("a")!!) { + setUrlWithoutDomain(absUrl("href")) + title = attr("title") + } + thumbnail_url = element.selectFirst("img")?.absUrl("src") + } + + override fun searchMangaParse(response: Response) = popularMangaParse(response) + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = baseUrl.toHttpUrl().newBuilder().apply { + val terms = mutableListOf(query.trim()) + + filters.forEach { filter -> + when (filter) { + is SortFilter -> { + addQueryParameter("sort", filter.getValue()) + addQueryParameter("order", if (filter.state!!.ascending) "asc" else "desc") + } + + is TextFilter -> { + if (filter.state.isNotEmpty()) { + terms += filter.state.split(",").filter { it.isNotBlank() }.map { tag -> + val trimmed = tag.trim().replace(" ", "_") + (if (trimmed.startsWith("-")) "-" else "") + filter.type + "&:" + trimmed.removePrefix("-") + } + } + } + + else -> {} + } + } + addPathSegment("search") + addQueryParameter("q", terms.joinToString(" ")) + addQueryParameter("page", page.toString()) + }.build() + return GET(url, headers) + } + + override fun mangaDetailsRequest(manga: SManga): Request { + return GET(baseUrl + manga.url + ".json", headers) + } + + override fun pageListRequest(chapter: SChapter): Request { + return GET(baseUrl + chapter.url + ".json", headers) + } + + override fun getFilterList() = getFilters() + + private val dateFormat = SimpleDateFormat("EEEE, d MMM yyyy HH:mm (z)", Locale.ENGLISH) + private fun Hentai.toSManga() = SManga.create().apply { + title = this@toSManga.title + url = "/archive/$id/$slug" + author = artists?.joinToString { it.value } + artist = artists?.joinToString { it.value } + genre = tags?.joinToString { it.value } + thumbnail_url = "$baseImageUrl/$id/1/288.webp" + description = buildString { + circle?.joinToString { it.value }?.let { + append("Circles: ", it, "\n") + } + magazines?.joinToString { it.value }?.let { + append("Magazines: ", it, "\n") + } + parodies?.joinToString { it.value }?.let { + append("Parodies: ", it, "\n") + } + append( + "Created At: ", + dateFormat.format( + Date(createdAt * 1000), + ), + "\n", + ) + append("Pages: ", pages, "\n") + } + status = SManga.COMPLETED + update_strategy = UpdateStrategy.ONLY_FETCH_ONCE + initialized = true + } + + override fun mangaDetailsParse(response: Response): SManga = runBlocking { + response.parseAs().toSManga() + } + + override fun getMangaUrl(manga: SManga) = baseUrl + manga.url + + override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga) + override fun chapterListParse(response: Response): List { + val hentai = response.parseAs() + + return listOf( + SChapter.create().apply { + name = "Chapter" + url = "/archive/${hentai.id}/${hentai.slug}" + date_upload = hentai.createdAt * 1000 + }, + ) + } + + override fun getChapterUrl(chapter: SChapter) = baseUrl + chapter.url + + override fun pageListParse(response: Response): List { + val hentai = response.parseAs() + val range = 1..hentai.pages + val baseImageUrl = "$baseImageUrl/${hentai.id}/" + return range.map { + val imageUrl = baseImageUrl + it + Page(it - 1, imageUrl = imageUrl) + } + } + + private inline fun Response.parseAs(): T { + return json.decodeFromString(body.string()) + } + + override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() + override fun latestUpdatesParse(response: Response): MangasPage = throw UnsupportedOperationException() + override fun latestUpdatesRequest(page: Int): Request = throw UnsupportedOperationException() +} diff --git a/src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/SpyFakkuDto.kt b/src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/SpyFakkuDto.kt new file mode 100644 index 000000000..bad079437 --- /dev/null +++ b/src/en/spyfakku/src/eu/kanade/tachiyomi/extension/en/spyfakku/SpyFakkuDto.kt @@ -0,0 +1,23 @@ +package eu.kanade.tachiyomi.extension.en.spyfakku + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class Hentai( + val id: Int, + val slug: String, + val title: String, + val createdAt: Long, + val pages: Int, + val artists: List?, + val circle: List?, + val magazines: List?, + val parodies: List?, + val tags: List?, +) + +@Serializable +class Name( + @SerialName("name") val value: String, +)