From ea28acd6413c2a6dd50a2831e19f920e2f1e21e0 Mon Sep 17 00:00:00 2001 From: wasu <61418403+wasu-code@users.noreply.github.com> Date: Tue, 25 Mar 2025 05:20:43 +0100 Subject: [PATCH] Add OhJoySexToy (#8149) * Add OhJoySexToy * better CSS selectors * shorten description Description format vary per comic, some have one paragraph, others many, some include transcript, links or even more advanced HTML structures * override title in mangaDetailsParse * fix: wrong date element * use absolute urls * rename file (fix doubled file extension) * move SimpleDateFormat to class --- src/en/ohjoysextoy/build.gradle | 8 ++ .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2275 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1292 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3009 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5434 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 7498 bytes .../extension/en/ohjoysextoy/OhJoySexToy.kt | 133 ++++++++++++++++++ 7 files changed, 141 insertions(+) create mode 100644 src/en/ohjoysextoy/build.gradle create mode 100644 src/en/ohjoysextoy/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/ohjoysextoy/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/ohjoysextoy/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/ohjoysextoy/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/ohjoysextoy/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/ohjoysextoy/src/eu/kanade/tachiyomi/extension/en/ohjoysextoy/OhJoySexToy.kt diff --git a/src/en/ohjoysextoy/build.gradle b/src/en/ohjoysextoy/build.gradle new file mode 100644 index 000000000..d15c137cb --- /dev/null +++ b/src/en/ohjoysextoy/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = "Oh Joy Sex Toy" + extClass = ".OhJoySexToy" + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/ohjoysextoy/res/mipmap-hdpi/ic_launcher.png b/src/en/ohjoysextoy/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..821b81ef1fccca51c6833f0da888aa424e62c923 GIT binary patch literal 2275 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 DdjzrO literal 0 HcmV?d00001 diff --git a/src/en/ohjoysextoy/res/mipmap-xxhdpi/ic_launcher.png b/src/en/ohjoysextoy/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9a20be238c3826331e57d7cc40c391f14613323c GIT binary patch literal 5434 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 literal 0 HcmV?d00001 diff --git a/src/en/ohjoysextoy/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/ohjoysextoy/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..272be03c179a8cf11d997f03bf00bd4f53400c95 GIT binary patch literal 7498 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

qCnD!;ibmfG zps!~}ue7FS#;;ji=0f63+wU8c3fznec9Zc847lw&_#{ZrjfHqjW>f6$c?@cu2J)x)i zS5;}BqSGVL&-v3Hxy-oPjK?pcBI@<27uxl?=^sgZ9jXF5>Ow**}Lz{=!e9a=!{wz98A&Z zkji1d#p`L+vrHTKPq*Kz?dk4h$zK}icH)=xe;TK}r{#mhS%>iQZ2T9m`gQU% zF|aOE33W4b4~{U!I<%N)SLgBw%mTM3H!R($aj$#(^{nCt+9bWZnn(WHieW%97zPfP6bfxgQEeC>_;>m*={h zu27~uT5SEQDZ_akWB)pa9qw%@r1MM91Q}p4EzXC{ET=zSEeL?4vL7W19Z$$5l8#~a z++(+S<)pDjCW`lJ79Gw>K~q{}$2HF|*OALXtwMuaPSo1?yE%xJ*-guH$`w!?P%~r^ zHNP2qp}7n$B-%s=GyHO$9rfsJH|lztsqZor4*J4^5aT~yaMk(p=iGvYcjs*KIIdzS90I>sxLImkNhxdR6+wV{v^`=y3XWb&|`~l*9b{Jhciy|lq0pD5wIgd zX-`~UAFNn@(RT-N=X}72kK^z1k@`9r1+T=T(SX{U#YW|*nSYRlX)B=yp=5=^T`}S3 z#H~MvhdteNY572YM;bS3ZnUSH=)i}*kQqxwNQQfM z#n3>E)UOiM&rLKBes?>2CMyu36=;d zl}%b)OkcaG#^|_k=$=CVaTqYMT_9%BJ}~cgAnd%fTuLjONp0rTNuo3&NTh9AicQat zvqG`@G|$P7f&9H_;5ta}djJgxiIeMywpwKcqk*@$e22ymDs0F-k1qCRppx{OjlWK# zaM0Pf=ecHe;Z%~KeW8U10tMOWkT(*uQKynv%kF)VWBFtb4hPC$j~}MqaWY5r`$bj- zXaqG({d_7LV=pOB3rx&s0*Q3Z*WI1C^@b~biT;4F{6WWXg;99t?tu6Cg zw{CSPcwnN+%~~0A@-Nlteahag{!`{d#G*VrB(@rey~ouv*i$iDN>(lE62PwojQYva&qD0!@03SB z8~Ui9j+F{L*tq#JP@91P#0IIWtIJHi>3p7e?Fb^D&j+NF)@I6BS}Rg?C9eYfpl`r; zoqn0I`(7J^`FdBxqttO;&1Z zHcwVB>cf71y8i`OaakWcUnYarC-g z^%~^oeS|fi;q`W(fzb%{N_Up@b2rU}Pj=dv?PRD*7yV!ze_8XDc%x@#WTf&hUhleP z4jZ=k^kE=)0|KgWXR%|R^#UbB#mq|@{CYDK0o-|pXpo-Ebi-G#2#cOMG4xVvjf zbI}%GjCs|*V$f;k#}*AaIX!I&4?f(Q>QmlrXQQro|5yn4xS87Bh8?G*?u_w}=b}cX z==)it;J8voSMiYBxK@Zl#iK5Ku+nD5Q13-*>*M)=i?^pRd#=UmN{U;~bpFulG#dFe zka9*YRX&{bA`lLz11VN4-a;GqcWNiv!m~Vr%ao5_qyc{zZe%e_>NN*nWEdAnB};~u zNykbm*%hPN!D*}`9NS^sx$ zV8MbgR7&$bcP&kD@vNs@gf&piVGr&LK6+I;x>?8#zE=(j^8D4+Oq+%AEO+U;DXR7M z7GF4S8eBG0o9M+_cDHy|QIuq01vKjA+wjl2C!LvWQ(hl%;?s?iqfRM*`~ly{e_4ON zm!!!MUV8!LC>NPJvmcdQS>eI=y1s7qu3T-kLaub>=)2ap-fms92zeP=@h1bOSS^1t z^S&hgC-DN<%B_SWU=(Iv(R6{gdg?spIGKd0o|qF)a>*E7v$>>vNuD*nR;kSq^krD1 zbw(a+S6HA0-b(9dE};E1{D3upH9#5MhTJiezR3jVlU#!%^p(~k-`%oc0#Un$+W+sa bAtl(7o1vMv+T4uV90hbW4bUa(_M!g+X-Y4O literal 0 HcmV?d00001 diff --git a/src/en/ohjoysextoy/src/eu/kanade/tachiyomi/extension/en/ohjoysextoy/OhJoySexToy.kt b/src/en/ohjoysextoy/src/eu/kanade/tachiyomi/extension/en/ohjoysextoy/OhJoySexToy.kt new file mode 100644 index 000000000..339116377 --- /dev/null +++ b/src/en/ohjoysextoy/src/eu/kanade/tachiyomi/extension/en/ohjoysextoy/OhJoySexToy.kt @@ -0,0 +1,133 @@ +package eu.kanade.tachiyomi.extension.en.ohjoysextoy + +import eu.kanade.tachiyomi.network.GET +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.source.online.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import keiyoushi.utils.tryParse +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale + +private val MULTI_SPACE_REGEX = "\\s{6,}".toRegex() + +class OhJoySexToy : ParsedHttpSource() { + + override val name = "Oh Joy Sex Toy" + override val baseUrl = "https://www.ohjoysextoy.com" + override val lang = "en" + override val supportsLatest = true + + private val dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH) + + // Browse + + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/category/comic/page/$page/", headers) + + override fun popularMangaSelector(): String = ".comicthumbwrap" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + setUrlWithoutDomain(element.selectFirst(".comicarchiveframe > a")!!.absUrl("href")) + title = element.selectFirst(".comicthumbdate")!!.text().substringBefore(" by") + thumbnail_url = element.selectFirst(".comicarchiveframe > a > img")?.absUrl("src") + } + + override fun popularMangaNextPageSelector(): String = ".pagenav-left a" + + // Latest + + override fun latestUpdatesRequest(page: Int): Request = GET(baseUrl, headers) + + override fun latestUpdatesSelector(): String = "#MattsRecentComicsBar > ul > div" + + override fun latestUpdatesFromElement(element: Element): SManga = SManga.create().apply { + setUrlWithoutDomain(element.selectFirst(".comicarchiveframe > a")!!.absUrl("href")) + title = element.selectFirst(".comicthumbdate")!!.text().substringBefore(" by") + thumbnail_url = element.selectFirst(".comicarchiveframe > a > img")?.absUrl("src") + } + + override fun latestUpdatesNextPageSelector(): String? = null + + // Search + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/?s=$query", headers) + + override fun searchMangaSelector(): String = "h2.post-title" + + override fun searchMangaFromElement(element: Element): SManga = SManga.create().apply { + setUrlWithoutDomain(element.selectFirst("a")!!.absUrl("href")) + title = element.selectFirst("a")!!.text().substringBefore(" by") + } + + override fun searchMangaNextPageSelector(): String? = null + + // etc + + override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { + thumbnail_url = document.selectFirst("meta[property=\"og:image\"]") + ?.absUrl("content") + status = SManga.COMPLETED + title = document.selectFirst("meta[property=\"og:title\"]")!! + .attr("content") + .substringBefore(" by") + author = document.selectFirst("meta[property=\"og:title\"]") + ?.attr("content") + ?.substringAfter("by ", "") + description = parseDescription(document) + genre = document.select("meta[property=\"article:section\"]:not(:first-of-type)") + .eachAttr("content") + .joinToString() + update_strategy = UpdateStrategy.ONLY_FETCH_ONCE + setUrlWithoutDomain( + document.selectFirst("meta[property=\"og:url\"]")!!.absUrl("content"), + ) + } + + private fun parseDescription(document: Document): String { + val desc = document.selectFirst("meta[property=\"og:description\"]") + ?.attr("content") + ?.split(MULTI_SPACE_REGEX) + ?.get(0) + "..." + + val authorCredits = document.select(".entry div.ui-tabs div a") + .joinToString("\n") { link -> + "${link.text()}: ${link.absUrl("href")}" + } + + return listOf(desc, authorCredits, "(Full description and credits in WebView)").joinToString("\n\n") + } + + override fun chapterListRequest(manga: SManga): Request = GET("$baseUrl${manga.url}", headers) + + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + val dateString = document.selectFirst(".post-date")?.text() + + return listOf( + SChapter.create().apply { + name = document.title() + scanlator = document.selectFirst(".post-author a")?.text() + date_upload = dateFormat.tryParse(dateString) + setUrlWithoutDomain(response.request.url.toString()) + }, + ) + } + + override fun chapterListSelector(): String = throw UnsupportedOperationException() + + override fun chapterFromElement(element: Element): SChapter = throw UnsupportedOperationException() + + override fun pageListParse(document: Document): List { + return document.select("div.comicpane img") + .mapIndexed { index, img -> Page(index = index, imageUrl = img.absUrl("src")) } + } + + override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException() +}