MyHentaiGallery: minor cleanup, fix URLs ()

* MyHentaiGallery: minor cleanup, fix URLs

* use markdown syntax

* update categories
This commit is contained in:
Vetle Ledaal 2025-04-28 15:16:57 +02:00 committed by Draff
parent 30e8681278
commit fe5b10916f
No known key found for this signature in database
GPG Key ID: E8A89F3211677653
2 changed files with 108 additions and 68 deletions
src/en/myhentaigallery
build.gradle
src/eu/kanade/tachiyomi/extension/en/myhentaigallery

@ -1,7 +1,7 @@
ext { ext {
extName = 'MyHentaiGallery' extName = 'MyHentaiGallery'
extClass = '.MyHentaiGallery' extClass = '.MyHentaiGallery'
extVersionCode = 5 extVersionCode = 6
isNsfw = true isNsfw = true
} }

@ -32,16 +32,16 @@ class MyHentaiGallery : ParsedHttpSource() {
// Popular // Popular
override fun popularMangaRequest(page: Int): Request { override fun popularMangaRequest(page: Int): Request {
return GET("$baseUrl/gallery/category/2/$page", headers) return GET("$baseUrl/views/$page", headers)
} }
override fun popularMangaSelector() = "div.comic-inner" override fun popularMangaSelector() = "div.comic-inner"
override fun popularMangaFromElement(element: Element): SManga { override fun popularMangaFromElement(element: Element): SManga {
return SManga.create().apply { return SManga.create().apply {
title = element.select("h2").text() title = element.selectFirst("h2")!!.text()
setUrlWithoutDomain(element.select("a").attr("href")) setUrlWithoutDomain(element.selectFirst("a")!!.attr("href"))
thumbnail_url = element.select("img").attr("abs:src") thumbnail_url = element.selectFirst("img")?.absUrl("src")
} }
} }
@ -49,7 +49,7 @@ class MyHentaiGallery : ParsedHttpSource() {
// Latest // Latest
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/gallery/$page") override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/gpage/$page", headers)
override fun latestUpdatesSelector() = popularMangaSelector() override fun latestUpdatesSelector() = popularMangaSelector()
@ -59,11 +59,11 @@ class MyHentaiGallery : ParsedHttpSource() {
// Search // Search
private fun searchMangaByIdRequest(id: String) = GET("$baseUrl/gallery/thumbnails/$id", headers) private fun searchMangaByIdRequest(id: String) = GET("$baseUrl/g/$id", headers)
private fun searchMangaByIdParse(response: Response, id: String): MangasPage { private fun searchMangaByIdParse(response: Response, id: String): MangasPage {
val details = mangaDetailsParse(response) val details = mangaDetailsParse(response)
details.url = "/gallery/thumbnails/$id" details.url = "/g/$id"
return MangasPage(listOf(details), false) return MangasPage(listOf(details), false)
} }
@ -80,9 +80,13 @@ class MyHentaiGallery : ParsedHttpSource() {
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
return if (query.isNotBlank()) { return if (query.isNotBlank()) {
GET("$baseUrl/search/$page?query=$query", headers) val url = "$baseUrl/search".toHttpUrl().newBuilder()
.addPathSegment(page.toString())
.addQueryParameter("query", query)
.build()
GET(url, headers)
} else { } else {
val url = "$baseUrl/gallery/category".toHttpUrl().newBuilder() val url = "$baseUrl/g/category".toHttpUrl().newBuilder()
filters.forEach { filter -> filters.forEach { filter ->
when (filter) { when (filter) {
@ -107,17 +111,26 @@ class MyHentaiGallery : ParsedHttpSource() {
// Details // Details
override fun mangaDetailsParse(document: Document): SManga { override fun mangaDetailsParse(document: Document): SManga {
return document.select("div.comic-header").let { info -> return document.selectFirst("div.comic-header")!!.let { info ->
SManga.create().apply { SManga.create().apply {
title = info.select("h1").text() title = info.selectFirst("h1")!!.text()
genre = info.select("div:containsOwn(categories) a").joinToString { it.text() } genre = info.select("div:containsOwn(categories) a").joinToString { it.text() }
artist = info.select("div:containsOwn(artists) a").text() artist = info.select("div:containsOwn(artists) a").joinToString { it.text() }
thumbnail_url = document.selectFirst(".comic-listing .comic-inner img")?.attr("src") thumbnail_url = document.selectFirst(".comic-listing .comic-inner img")?.absUrl("src")
description = info.select("div:containsOwn(groups) a").let { groups -> description = buildString {
if (groups.isNotEmpty()) "Groups: ${groups.joinToString { it.text() }}\n" else "" info.select("div:containsOwn(groups) a")
} .takeIf { it.isNotEmpty() }
description += info.select("div:containsOwn(parodies) a").let { groups -> ?.also { if (isNotEmpty()) append("\n\n") }
if (groups.isNotEmpty()) "Parodies: ${groups.joinToString { it.text() }}" else "" ?.also { appendLine("Groups:") }
?.joinToString("\n") { "- ${it.text()}" }
?.also { append(it) }
info.select("div:containsOwn(parodies) a")
.takeIf { it.isNotEmpty() }
?.also { if (isNotEmpty()) append("\n\n") }
?.also { appendLine("Parodies:") }
?.joinToString("\n") { "- ${it.text()}" }
?.also { append(it) }
} }
} }
} }
@ -142,7 +155,8 @@ class MyHentaiGallery : ParsedHttpSource() {
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> {
return document.select("div.comic-thumb img[src]").mapIndexed { i, img -> return document.select("div.comic-thumb img[src]").mapIndexed { i, img ->
Page(i, "", img.attr("abs:src").replace("/thumbnail/", "/original/")) val imageUrl = img.absUrl("src").replace("/thumbnail/", "/original/")
Page(i, imageUrl = imageUrl)
} }
} }
@ -159,81 +173,107 @@ class MyHentaiGallery : ParsedHttpSource() {
private class GenreFilter : UriPartFilter( private class GenreFilter : UriPartFilter(
"Category", "Category",
arrayOf( arrayOf(
// copy($$(".catagory-inner > a").map(el => {var id = /\d+$/.exec(el.href.replace())[0]; var name = el.querySelector("h2").innerText; return `Pair("${name}", "${id}"),`;}).join("\n"))
Pair("<select>", "---"), Pair("<select>", "---"),
Pair("3D Comic", "3"), Pair("3D Comic", "3"),
Pair("Ahegao", "2740"), Pair("Ahegao", "23"),
Pair("Anal", "2741"), Pair("Anal", "25"),
Pair("Asian", "4"), Pair("Animated", "10"),
Pair("Asian", "54"),
Pair("Ass Expansion", "5"), Pair("Ass Expansion", "5"),
Pair("Aunt", "6"), Pair("Aunt", "6"),
Pair("BBW", "7"), Pair("BBW", "7"),
Pair("Beastiality", "8"), Pair("Beastiality", "8"),
Pair("Bimbofication", "3430"), Pair("Bimbofication", "2049"),
Pair("Bisexual", "9"), Pair("Bisexual", "9"),
Pair("Black & Interracial", "10"), Pair("Black | Interracial", "20"),
Pair("Body Swap", "11"), Pair("Body Swap", "11"),
Pair("Bondage", "12"), Pair("Bondage", "12"),
Pair("Breast Expansion", "13"), Pair("Breast Expansion", "13"),
Pair("Brother", "14"), Pair("Brother", "1012"),
Pair("Bukakke", "15"), Pair("Bukkake", "15"),
Pair("Catgirl", "2742"), Pair("Catgirl", "1201"),
Pair("Cheating", "16"), Pair("Cbt", "8133"),
Pair("Censored", "5136"),
Pair("Cheating", "49"),
Pair("Cosplay", "8157"),
Pair("Cousin", "17"), Pair("Cousin", "17"),
Pair("Crossdressing", "18"), Pair("Crossdressing", "43"),
Pair("Dad", "19"), Pair("Cuntboy", "8134"),
Pair("Daughter", "20"), Pair("Dad | Father", "788"),
Pair("Daughter", "546"),
Pair("Dick Growth", "21"), Pair("Dick Growth", "21"),
Pair("Ebony", "3533"), Pair("Double Penetration", "8135"),
Pair("Elf", "2744"), Pair("Ebony", "29"),
Pair("Exhibitionism", "2745"), Pair("Elf", "1714"),
Pair("Father", "22"), Pair("Exhibitionism", "1838"),
Pair("Femdom", "23"), Pair("Family", "2094"),
Pair("Foot Fetish", "3253"), Pair("Femboy | Tomgirl | Sissy", "8136"),
Pair("Furry", "24"), Pair("Femdom", "24"),
Pair("Futanari & Shemale & Dickgirl", "25"), Pair("Foot Fetish", "1873"),
Pair("Futanari X Female", "3416"), Pair("Forced", "18"),
Pair("Futanari X Futanari", "3415"), Pair("Furry", "14"),
Pair("Futanari | Shemale | Dickgirl", "19"),
Pair("Futanari X Female", "1951"),
Pair("Futanari X Futanari", "1885"),
Pair("Futanari X Male", "26"), Pair("Futanari X Male", "26"),
Pair("Gangbang", "27"), Pair("Gangbang", "27"),
Pair("Gay & Yaoi", "28"), Pair("Gay | Yaoi", "28"),
Pair("Gender Bending", "29"), Pair("Gender Bender", "16"),
Pair("Giantess", "30"), Pair("Giant", "8137"),
Pair("Giantess", "452"),
Pair("Gilf", "8138"),
Pair("Gloryhole", "31"), Pair("Gloryhole", "31"),
Pair("Hairy Female", "3418"), Pair("Group", "101"),
Pair("Hairy Female", "1986"),
Pair("Hardcore", "36"), Pair("Hardcore", "36"),
Pair("Harem", "37"), Pair("Harem", "53"),
Pair("Incest", "38"), Pair("Inflation | Stomach Bulge", "57"),
Pair("Inseki", "3417"), Pair("Inseki", "1978"),
Pair("Kemonomimi", "3368"), Pair("Kemonomimi", "1875"),
Pair("Lactation", "39"), Pair("Lactation", "39"),
Pair("Lesbian & Yuri & Girls Only", "40"), Pair("Lesbian | Yuri | Girls Only", "41"),
Pair("Milf", "41"), Pair("Milf", "30"),
Pair("Mind Break", "3419"), Pair("Mind Break", "2023"),
Pair("Mind Control & Hypnosis", "42"), Pair("Mind Control | Hypnosis", "42"),
Pair("Mom", "43"), Pair("Mom | Mother", "56"),
Pair("Mother", "44"), Pair("Monster", "8140"),
Pair("Monster Girl", "8139"),
Pair("Most Popular", "52"),
Pair("Muscle Girl", "45"), Pair("Muscle Girl", "45"),
Pair("Muscle Growth", "46"), Pair("Muscle Growth", "46"),
Pair("Nephew", "47"), Pair("Nephew", "47"),
Pair("Niece", "48"), Pair("Niece", "48"),
Pair("Orgy", "49"), Pair("Nipple Fuck | Nipple Penetration", "8141"),
Pair("Pegging", "50"), Pair("Pegging", "50"),
Pair("Possession", "51"), Pair("Possession", "51"),
Pair("Pregnant & Impregnation", "52"), Pair("Pregnant | Impregnation", "55"),
Pair("Rape", "53"), Pair("Public Use", "8142"),
Pair("Sister", "54"), Pair("Selfcest", "8143"),
Pair("Solo", "2746"), Pair("Sister", "58"),
Pair("Son", "55"), Pair("Slave", "8144"),
Pair("Spanking", "56"), Pair("Smegma", "8145"),
Pair("Stomach Bulge", "57"), Pair("Solo", "1865"),
Pair("Strap-On", "58"), Pair("Solo Futa", "8154"),
Pair("Solo Girl", "8146"),
Pair("Solo Male", "8147"),
Pair("Son", "62"),
Pair("Spanking", "38"),
Pair("Speechless", "8148"),
Pair("Strap-On", "61"),
Pair("Stuck In Wall", "8149"),
Pair("Superheroes", "59"), Pair("Superheroes", "59"),
Pair("Tentacles", "60"), Pair("Tentacles", "60"),
Pair("Threesome", "61"), Pair("Threesome", "40"),
Pair("Transformation", "62"), Pair("Tickling", "2065"),
Pair("Titty Fuck | Paizuri", "8150"),
Pair("Tomboy", "8153"),
Pair("Transformation", "37"),
Pair("Uncle", "63"), Pair("Uncle", "63"),
Pair("Urination", "64"), Pair("Urination", "64"),
Pair("Vore", "65"), Pair("Vanilla | Wholesome", "8151"),
Pair("Variant Set", "8152"),
Pair("Vore | Unbirth", "65"),
Pair("Weight Gain", "66"), Pair("Weight Gain", "66"),
), ),
) )