From 0ca178aa52df45cbc31d5ff0781816ba4683c314 Mon Sep 17 00:00:00 2001 From: Mike <51273546+SnakeDoc83@users.noreply.github.com> Date: Sat, 8 Aug 2020 21:52:11 -0400 Subject: [PATCH] EroMuse - new extension for 8muses and Erofus (#4061) --- src/all/eromuse/build.gradle | 13 + .../eromuse/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2017 bytes .../eromuse/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1006 bytes .../eromuse/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2656 bytes .../eromuse/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5085 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 7154 bytes src/all/eromuse/res/web_hi_res_512.png | Bin 0 -> 43381 bytes .../extension/all/eromuse/EroMuse.kt | 349 ++++++++++++++++++ .../extension/all/eromuse/EroMuseFactory.kt | 162 ++++++++ 9 files changed, 524 insertions(+) create mode 100644 src/all/eromuse/build.gradle create mode 100644 src/all/eromuse/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/all/eromuse/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/all/eromuse/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/all/eromuse/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/all/eromuse/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/all/eromuse/res/web_hi_res_512.png create mode 100644 src/all/eromuse/src/eu/kanade/tachiyomi/extension/all/eromuse/EroMuse.kt create mode 100644 src/all/eromuse/src/eu/kanade/tachiyomi/extension/all/eromuse/EroMuseFactory.kt diff --git a/src/all/eromuse/build.gradle b/src/all/eromuse/build.gradle new file mode 100644 index 000000000..904f0b549 --- /dev/null +++ b/src/all/eromuse/build.gradle @@ -0,0 +1,13 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'EroMuse (8muses and Erofus)' + pkgNameSuffix = 'all.eromuse' + extClass = '.EroMuseFactory' + extVersionCode = 1 + libVersion = '1.2' + containsNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/all/eromuse/res/mipmap-hdpi/ic_launcher.png b/src/all/eromuse/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ed7255f26e3166649b0ff8cd46efbc7ec361b73b GIT binary patch literal 2017 zcmV<72Oju|P)>4wwsW?rbNx_Db~W2I!v5&TjjOc`mBb&xQ*lAWKQy|KQWo~Zq+v#0DC&7I zcd?ACNZ=nK6{g)vuOwV3Bt(>S8PbedlPS*S^vs>@ocH}h9go;^AF>_Y@!1PLf1SbS z^L_F8e$UQ!zF$HD1PBlyK!CN*IzmX$d<2U;7RIs8S8{@ynwnITlaoI=oz60s%T+1n za5|l3larH2pFMk~o)`5)1h=-fM!VhaXFSi_0JtH3+yHDIkEi4DdJZH69uM2$oYcf_R>X!{I=7cD7fLTrNjiS{goo{w!Et(Fp46>%+c%`xZ?xxm=Fe z*jTi*v0Dk^G8_w3lQ1Cf!DNJvN!Y@rr~AiLd;qM{;%hK73Os8lM{*ViLI zKObtf8XX-Sg5(y3AfD%O_wHSUhlhIwB_$<+VHmu9`xbF=aVRP(5@a0`g`nBlS(KKR zLa9_jE|-I*Y3Ou1jE|3lVHhMQCnG5-Nsy;}Q3$fxY&d%KsJDA)nubE5KyGd>Uc7jL zgoFeX7Z(e%P>Vv)=;$btlary*Xh74nHgqrCUCd-Mp`f4uBO@c&zkk11&O+#PI^4K%12&uQ|DqFxpn-t_ zT)K1#ot>SCj*ea=CoC)sPo6wMRaF)0>gs&H4v9igQ&SU?l9Hg+Y8T0&C===FLSjYgm5_Ip87Q&ZTw zb*op3N~OZVg9o8jt09xg5E&VX-rioYEDOC}kM8bnpXT>#LDSRIC@CrNc8^-E#)S(P z(B0h)tyT+}Oa_fc1EbLhhGB5|@?{JR4EVGLzZ5h+K8}|!U!tO-0ud1rpePEPH*dzR zTemPXGXsaifz;GgNTpK5$H&8DGGTal7-eN;7#kb&X)S&y$Y?YoCnpEDZ{NnQUAsV0 z6ch>t5)%{A*4BpE*;(*Bk27b^Kq{4D`}XbV?d?TrX(^hUo7eVTjA0m*mzSfhtqo&i zV@OX=2SrghdGaK>y1H=s^l9Yg=Ax#i28D%%kV>UcDwQ~N=n$Hlo7euss>NbKWo0F7 zHXH1AJ92VzAd|^(?%X+W90!i$U^1D|+}sR0D+@C- zGhPWi&!elW3o$V({R@`F&^MClHNBgOrpMynFX9@B-DZ z;W!Rvvl%@-J+N3Tg319zC}^b#2>KlYf_{e|5@fMh0)qaJps>Ng!GCZZw{jaNRv4b= zx#8jA8)O;Vp@Ik@q3!MM1#Y)n*v%5F2+Oilot>S3C(GDS7eok=CnqQW`Qyir|6T2Y z2*vR5@SE)H>>XqoTQb*?xs9$H)6>)cYBU;OPft%zu`J8E-EN3ESeE6SPN(Dj`}bYP zjvdnxLN?Bi^}7!m2%a|^wRi8{J@@b5Kil5k{?Cq%j(>?c+S=L-4Gj(F4;(n~7edHp zLWq+5z~1=e0sP^fB*pk2*v*Zr|9pFn7CyW00000NkvXXu0mjfM!~ab literal 0 HcmV?d00001 diff --git a/src/all/eromuse/res/mipmap-mdpi/ic_launcher.png b/src/all/eromuse/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..93b95f52e7be9ded1c5e57b1c7f2eea782a9af72 GIT binary patch literal 1006 zcmV5ic4FB>k(KPK(BC-@RzDg|-H5wiEHHfH@-q;VdMD)$*pszth->L%tmD}4}=bzypX8oI8RRO`zH6h%RMdpiU{fZOdZx!#uxWHK4l*VjW31UMWH zWV6|l>V3I@s;cPh?1Uf)5Cj3yXtbnyUn-#MIz~oDV6j*r2m*MXhtKD$9D!IYhNh;b zVtAhCF*rC_(nkJLf%WzEXW@H#dSJ8JpeRaZ2xyvywzf9#JP(J%fxEjq^!4>&e}BI+ z1k&j=>gwvi^E_HxTaipA;rIJ7H#b)q0>{V4XlQ5v$8q2|4o;^NZnqoBWU?{@LZJ|X z!60ll8#s;w%d+V2@5lZ9ePsx&uC5{yiNN7-fMr>*EQ`_6QTTj5pFIJb}%_P2|*AbiXv84R-kDbHa0e3Hk+}zxry1? zS;+Foj@+LraB*<~Ns@4KasrlRvAw;GgM$P3{eFy(kHc&>V_;wa>2&%-;Xhp<91bI$ zP9v2{fngXdEiDztG);rc<$}lK`EdA87l_B>h(scgWf`IIxo@2a+UJ-hZM0o2r1(yjP$}Rn?Cl zn?8wbHmeX((^~>HL}ZP}UZBM8r9r&Yxnj*zd9|D-RD3FtW+A ztel;l{n6ds{WB49Z-xJR7DOUyC8ACu`qkj}3laTT$n@^()*AYLBghwCG_vu9EN?EI cDpfwfUx|WJ9vX7zNB{r;07*qoM6N<$f_iq)`~Uy| literal 0 HcmV?d00001 diff --git a/src/all/eromuse/res/mipmap-xhdpi/ic_launcher.png b/src/all/eromuse/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..61a27645fa6399605a632ec52601c1e489002082 GIT binary patch literal 2656 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 CaGb>e literal 0 HcmV?d00001 diff --git a/src/all/eromuse/res/mipmap-xxxhdpi/ic_launcher.png b/src/all/eromuse/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..91ea439c794ee0866794daa09769a204f90f846d GIT binary patch literal 7154 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 literal 0 HcmV?d00001 diff --git a/src/all/eromuse/res/web_hi_res_512.png b/src/all/eromuse/res/web_hi_res_512.png new file mode 100644 index 0000000000000000000000000000000000000000..7be23d2f29d43aed1f585bd60edb190b571e4676 GIT binary patch literal 43381 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

R}9iw{GmRX_dI4Wgss;o%HlEnuSEUCR($vLc|? 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 literal 0 HcmV?d00001 diff --git a/src/all/eromuse/src/eu/kanade/tachiyomi/extension/all/eromuse/EroMuse.kt b/src/all/eromuse/src/eu/kanade/tachiyomi/extension/all/eromuse/EroMuse.kt new file mode 100644 index 000000000..8ff8ba023 --- /dev/null +++ b/src/all/eromuse/src/eu/kanade/tachiyomi/extension/all/eromuse/EroMuse.kt @@ -0,0 +1,349 @@ +package eu.kanade.tachiyomi.extension.all.eromuse + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.source.model.Filter +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.online.HttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.HttpUrl +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable + +@ExperimentalStdlibApi +open class EroMuse(override val name: String, override val baseUrl: String) : HttpSource() { + + override val lang = "en" + + override val supportsLatest = true + + override val client: OkHttpClient = network.cloudflareClient + + /** + * Browse, search, and latest all run through an ArrayDeque of requests that acts as a stack we push and pop to/from + * For the fetch functions, we only need to worry about pushing the first page to the stack because subsequent pages + * get pushed to the stack during parseManga(). Page 1's URL must include page=1 if the next page would be page=2, + * if page 2 is path_to/2, nothing special needs to be done. + */ + + // the stack - shouldn't need to touch these except for visibility + protected data class StackItem(val url: String, val pageType: Int) + private lateinit var stackItem: StackItem + protected val pageStack = ArrayDeque() + companion object { + const val VARIOUS_AUTHORS = 0 + const val AUTHOR = 1 + const val SEARCH_RESULTS_OR_BASE = 2 + } + protected lateinit var currentSortingMode: String + + // might need to override for new sources + private val nextPageSelector = ".pagination span.current + span a" + protected open val albumSelector = "a.c-tile:has(img):not(:has(.members-only))" + protected open val topLevelPathSegments = listOf("album", "Various-Authors") + private val pageQueryRegex = Regex("""page=\d+""") + + private fun Document.addNextPageToStack() { + this.select(nextPageSelector).firstOrNull()?.text()?.toIntOrNull()?.let { int -> + val nextPage = if (stackItem.url.contains(pageQueryRegex)) { + stackItem.url.replace(pageQueryRegex, "page=$int") + } else { + val httpUrl = HttpUrl.parse(stackItem.url)!! + val builder = if (httpUrl.pathSegments().last().toIntOrNull() is Int) { + httpUrl.newBuilder().removePathSegment(httpUrl.pathSegments().lastIndex) + } else { + httpUrl.newBuilder() + } + builder.addPathSegment(int.toString()).toString() + } + pageStack.add(StackItem(nextPage, stackItem.pageType)) + } + } + + protected fun Element.imgAttr(): String = if (this.hasAttr("data-src")) this.attr("abs:data-src") else this.attr("abs:src") + + private fun mangaFromElement(element: Element): SManga { + return SManga.create().apply { + setUrlWithoutDomain(element.attr("href")) + title = element.text() + thumbnail_url = element.select("img").firstOrNull()?.imgAttr() + } + } + + protected fun parseManga(document: Document): MangasPage { + fun internalParse(document: Document): List { + val authorDocument = if (stackItem.pageType == VARIOUS_AUTHORS) { + client.newCall(stackRequest()).execute().asJsoup() + } else { + document + } + authorDocument.addNextPageToStack() + return authorDocument.select(albumSelector).map { mangaFromElement(it) } + } + + if (stackItem.pageType in listOf(VARIOUS_AUTHORS, SEARCH_RESULTS_OR_BASE)) document.addNextPageToStack() + val mangas = when (stackItem.pageType) { + VARIOUS_AUTHORS -> { + document.select(albumSelector)?.let { elements -> elements.reversed().map { pageStack.addLast(StackItem(it.attr("abs:href"), AUTHOR)) } } + internalParse(document) + } + AUTHOR -> { + internalParse(document) + } + SEARCH_RESULTS_OR_BASE -> { + val searchMangas = mutableListOf() + document.select(albumSelector) + .map { element -> + val url = element.attr("abs:href") + when (HttpUrl.parse(url)!!.pathSegments().takeLastWhile { it !in topLevelPathSegments }.count()) { + // manga album + 2 -> { + searchMangas.add(mangaFromElement(element)) + } + // author album + 1 -> { + pageStack.addLast(StackItem(url, AUTHOR)) + if (searchMangas.isEmpty()) searchMangas += internalParse(client.newCall(stackRequest()).execute().asJsoup()) else null + } + // 0 doesn't need to be parsed; >= 3 probably doesn't need to be parsed but in some instances maybe we could do something + else -> null + } + } + searchMangas + } + else -> emptyList() + } + return MangasPage(mangas, pageStack.isNotEmpty()) + } + + protected fun stackRequest(): Request { + stackItem = pageStack.removeLast() + val url = if (stackItem.pageType == AUTHOR && currentSortingMode.isNotEmpty() && !stackItem.url.contains("sort")) { + HttpUrl.parse(stackItem.url)!!.newBuilder().addQueryParameter("sort", currentSortingMode).toString() + } else { + stackItem.url + } + return GET(url, headers) + } + + // Popular + + protected fun fetchManga(url: String, page: Int, sortingMode: String): Observable { + if (page == 1) { + pageStack.clear() + pageStack.addLast(StackItem(url, VARIOUS_AUTHORS)) + currentSortingMode = sortingMode + } + + return client.newCall(stackRequest()) + .asObservableSuccess() + .map { response -> parseManga(response.asJsoup()) } + } + + override fun fetchPopularManga(page: Int): Observable = fetchManga("$baseUrl/comics/album/Various-Authors", page, "") + + override fun popularMangaRequest(page: Int): Request = throw UnsupportedOperationException("Not used") + override fun popularMangaParse(response: Response): MangasPage = throw UnsupportedOperationException("Not used") + + // Latest + + override fun fetchLatestUpdates(page: Int): Observable = fetchManga("$baseUrl/comics/album/Various-Authors?sort=date", page, "date") + + override fun latestUpdatesRequest(page: Int): Request = throw UnsupportedOperationException("Not used") + override fun latestUpdatesParse(response: Response): MangasPage = throw UnsupportedOperationException("Not used") + + // Search + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + if (page == 1) { + pageStack.clear() + + val filterList = if (filters.isEmpty()) getFilterList() else filters + currentSortingMode = filterList.filterIsInstance().first().toQueryValue() + + if (query.isNotBlank()) { + val url = HttpUrl.parse("$baseUrl/search?q=$query")!!.newBuilder().apply { + if (currentSortingMode.isNotEmpty()) addQueryParameter("sort", currentSortingMode) + addQueryParameter("page", "1") + } + pageStack.addLast(StackItem(url.toString(), SEARCH_RESULTS_OR_BASE)) + } else { + val albumFilter = filterList.filterIsInstance().first().selection() + val url = HttpUrl.parse("$baseUrl/comics/${albumFilter.pathSegments}")!!.newBuilder().apply { + if (currentSortingMode.isNotEmpty()) addQueryParameter("sort", currentSortingMode) + if (albumFilter.pageType != AUTHOR) addQueryParameter("page", "1") + } + pageStack.addLast(StackItem(url.toString(), albumFilter.pageType)) + } + } + + return client.newCall(stackRequest()) + .asObservableSuccess() + .map { response -> parseManga(response.asJsoup()) } + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = throw UnsupportedOperationException("Not used") + override fun searchMangaParse(response: Response): MangasPage = throw UnsupportedOperationException("Not used") + + // Details + + override fun mangaDetailsParse(response: Response): SManga { + return SManga.create().apply { + with(response.asJsoup()) { + thumbnail_url = select("$albumSelector img").firstOrNull()?.imgAttr() + author = select("div.top-menu-breadcrumb li:nth-last-child(2)").text() + } + } + } + + // Chapters + + protected open val linkedChapterSelector = "a.c-tile:has(img)[href*=/comics/album/]" + protected open val pageThumbnailSelector = "a.c-tile:has(img)[href*=/comics/picture/] img" + + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + // Linked albums + val chapters = document.select(linkedChapterSelector) + .mapNotNull { + SChapter.create().apply { + name = it.text() + setUrlWithoutDomain(it.attr("href")) + } + } + .reversed() + .toMutableList() + // Self + document.select(pageThumbnailSelector).firstOrNull()?.let { + chapters.add( + SChapter.create().apply { + name = "Chapter" + setUrlWithoutDomain(response.request().url().toString()) + } + ) + } + return chapters + } + + // Pages + + protected open val pageThumbnailPathSegment = "/th/" + protected open val pageFullsizePathSegment = "/fl/" + + override fun pageListParse(response: Response): List { + return response.asJsoup().select(pageThumbnailSelector).mapIndexed { i, img -> + Page(i, "", img.imgAttr().replace(pageThumbnailPathSegment, pageFullsizePathSegment)) + } + } + + override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException("Not used") + + // Filters + + override fun getFilterList(): FilterList { + return FilterList( + Filter.Header("Text search only combines with sort!"), + Filter.Separator(), + AlbumFilter(getAlbumList()), + SortFilter(getSortList()) + ) + } + + protected class AlbumFilter(private val vals: Array>) : Filter.Select("Album", vals.map { it.first }.toTypedArray()) { + fun selection() = AlbumFilterData(vals[state].second, vals[state].third) + data class AlbumFilterData(val pathSegments: String, val pageType: Int) + } + protected open fun getAlbumList() = arrayOf( + Triple("Various Authors", "album/Various-Authors", VARIOUS_AUTHORS), + Triple("All Authors", "", SEARCH_RESULTS_OR_BASE), + Triple("MilfToon Comics", "album/MilfToon-Comics", AUTHOR), + Triple("Fakku Comics", "album/Fakku-Comics", AUTHOR), + Triple("BE Story Club Comics", "album/BE-Story-Club-Comics", AUTHOR), + Triple("ShadBase Comics", "album/ShadBase-Comics", AUTHOR), + Triple("ZZZ Comics", "album/ZZZ-Comics", AUTHOR), + Triple("PalComix Comics", "album/PalComix-Comics", AUTHOR), + Triple("Hentai and Manga English", "album/Hentai-and-Manga-English", AUTHOR), + Triple("MCC Comics", "album/MCC-Comics", AUTHOR), + Triple("Expansionfan Comics", "album/Expansionfan-Comics", AUTHOR), + Triple("JAB Comics", "album/JAB-Comics", AUTHOR), + Triple("Giantess Fan Comics", "album/Giantess-Fan-Comics", AUTHOR), + Triple("Renderotica Comics", "album/Renderotica-Comics", AUTHOR), + Triple("IllustratedInterracial.com Comics", "album/IllustratedInterracial_com-Comics", AUTHOR), + Triple("Giantess Club Comics", "album/Giantess-Club-Comics", AUTHOR), + Triple("Innocent Dickgirls Comics", "album/Innocent-Dickgirls-Comics", AUTHOR), + Triple("Locofuria Comics", "album/Locofuria-Comics", AUTHOR), + Triple("PigKing - CrazyDad Comics", "album/PigKing-CrazyDad-Comics", AUTHOR), + Triple("Cartoon Reality Comics", "album/Cartoon-Reality-Comics", AUTHOR), + Triple("Affect3D Comics", "album/Affect3D-Comics", AUTHOR), + Triple("TG Comics", "album/TG-Comics", AUTHOR), + Triple("Melkormancin.com Comics", "album/Melkormancin_com-Comics", AUTHOR), + Triple("Seiren.com.br Comics", "album/Seiren_com_br-Comics", AUTHOR), + Triple("Tracy Scops Comics", "album/Tracy-Scops-Comics", AUTHOR), + Triple("Fake Celebrities Sex Pictures", "album/Fake-Celebrities-Sex-Pictures", AUTHOR), + Triple("Fred Perry Comics", "album/Fred-Perry-Comics", AUTHOR), + Triple("Witchking00 Comics", "album/Witchking00-Comics", AUTHOR), + Triple("8muses Comics", "album/8muses-Comics", AUTHOR), + Triple("KAOS Comics", "album/KAOS-Comics", AUTHOR), + Triple("Vaesark Comics", "album/Vaesark-Comics", AUTHOR), + Triple("Fansadox Comics", "album/Fansadox-Comics", AUTHOR), + Triple("DreamTales Comics", "album/DreamTales-Comics", AUTHOR), + Triple("Croc Comics", "album/Croc-Comics", AUTHOR), + Triple("Jay Marvel Comics", "album/Jay-Marvel-Comics", AUTHOR), + Triple("JohnPersons.com Comics", "album/JohnPersons_com-Comics", AUTHOR), + Triple("MuscleFan Comics", "album/MuscleFan-Comics", AUTHOR), + Triple("Taboolicious.xxx Comics", "album/Taboolicious_xxx-Comics", AUTHOR), + Triple("MongoBongo Comics", "album/MongoBongo-Comics", AUTHOR), + Triple("Slipshine Comics", "album/Slipshine-Comics", AUTHOR), + Triple("Everfire Comics", "album/Everfire-Comics", AUTHOR), + Triple("PrismGirls Comics", "album/PrismGirls-Comics", AUTHOR), + Triple("Abimboleb Comics", "album/Abimboleb-Comics", AUTHOR), + Triple("Y3DF - Your3DFantasy.com Comics", "album/Y3DF-Your3DFantasy_com-Comics", AUTHOR), + Triple("Grow Comics", "album/Grow-Comics", AUTHOR), + Triple("OkayOkayOKOk Comics", "album/OkayOkayOKOk-Comics", AUTHOR), + Triple("Tufos Comics", "album/Tufos-Comics", AUTHOR), + Triple("Cartoon Valley", "album/Cartoon-Valley", AUTHOR), + Triple("3DMonsterStories.com Comics", "album/3DMonsterStories_com-Comics", AUTHOR), + Triple("Kogeikun Comics", "album/Kogeikun-Comics", AUTHOR), + Triple("The Foxxx Comics", "album/The-Foxxx-Comics", AUTHOR), + Triple("Theme Collections", "album/Theme-Collections", AUTHOR), + Triple("Interracial-Comics", "album/Interracial-Comics", AUTHOR), + Triple("Expansion Comics", "album/Expansion-Comics", AUTHOR), + Triple("Moiarte Comics", "album/Moiarte-Comics", AUTHOR), + Triple("Incognitymous Comics", "album/Incognitymous-Comics", AUTHOR), + Triple("DizzyDills Comics", "album/DizzyDills-Comics", AUTHOR), + Triple("DukesHardcoreHoneys.com Comics", "album/DukesHardcoreHoneys_com-Comics", AUTHOR), + Triple("Stormfeder Comics", "album/Stormfeder-Comics", AUTHOR), + Triple("Bimbo Story Club Comics", "album/Bimbo-Story-Club-Comics", AUTHOR), + Triple("Smudge Comics", "album/Smudge-Comics", AUTHOR), + Triple("Dollproject Comics", "album/Dollproject-Comics", AUTHOR), + Triple("SuperHeroineComixxx", "album/SuperHeroineComixxx", AUTHOR), + Triple("Karmagik Comics", "album/Karmagik-Comics", AUTHOR), + Triple("Blacknwhite.com Comics", "album/Blacknwhite_com-Comics", AUTHOR), + Triple("ArtOfJaguar Comics", "album/ArtOfJaguar-Comics", AUTHOR), + Triple("Kirtu.com Comics", "album/Kirtu_com-Comics", AUTHOR), + Triple("UberMonkey Comics", "album/UberMonkey-Comics", AUTHOR), + Triple("DarkSoul3D Comics", "album/DarkSoul3D-Comics", AUTHOR), + Triple("Markydaysaid Comics", "album/Markydaysaid-Comics", AUTHOR), + Triple("Central Comics", "album/Central-Comics", AUTHOR), + Triple("Frozen Parody Comics", "album/Frozen-Parody-Comics", AUTHOR), + Triple("Blacknwhitecomics.com Comix", "album/Blacknwhitecomics_com-Comix", AUTHOR) + ) + + protected class SortFilter(private val vals: Array>) : Filter.Select("Sort Order", vals.map { it.first }.toTypedArray()) { + fun toQueryValue() = vals[state].second + } + protected open fun getSortList() = arrayOf( + Pair("Views", ""), + Pair("Likes", "like"), + Pair("Date", "date"), + Pair("A-Z", "az") + ) +} diff --git a/src/all/eromuse/src/eu/kanade/tachiyomi/extension/all/eromuse/EroMuseFactory.kt b/src/all/eromuse/src/eu/kanade/tachiyomi/extension/all/eromuse/EroMuseFactory.kt new file mode 100644 index 000000000..51639c733 --- /dev/null +++ b/src/all/eromuse/src/eu/kanade/tachiyomi/extension/all/eromuse/EroMuseFactory.kt @@ -0,0 +1,162 @@ +package eu.kanade.tachiyomi.extension.all.eromuse + +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.source.SourceFactory +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.HttpUrl +import okhttp3.Response +import rx.Observable + +@ExperimentalStdlibApi +class EroMuseFactory : SourceFactory { + override fun createSources(): List = listOf( + EroMuse("8Muses", "https://comics.8muses.com"), + Erofus() + ) +} + +@ExperimentalStdlibApi +class Erofus : EroMuse("Erofus", "https://www.erofus.com") { + + override val albumSelector = "a.a-click" + override val topLevelPathSegments = listOf("various-authors", "comics") + + override fun fetchPopularManga(page: Int): Observable = fetchManga("$baseUrl/comics/various-authors?sort=viewed&page=1", page, "viewed") + override fun fetchLatestUpdates(page: Int): Observable = fetchManga("$baseUrl/comics/various-authors?sort=recent&page=1", page, "recent") + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + if (page == 1) { + pageStack.clear() + + val filterList = if (filters.isEmpty()) getFilterList() else filters + currentSortingMode = filterList.filterIsInstance().first().toQueryValue() + + if (query.isNotBlank()) { + // TODO possibly add genre search if a decent list of them can be built + pageStack.addLast(StackItem("$baseUrl/?search=$query&sort=$currentSortingMode&page=1", SEARCH_RESULTS_OR_BASE)) + } else { + val albumFilter = filterList.filterIsInstance().first().selection() + val url = HttpUrl.parse(baseUrl + albumFilter.pathSegments)!!.newBuilder() + .addQueryParameter("sort", currentSortingMode) + .addQueryParameter("page", "1") + + pageStack.addLast(StackItem(url.toString(), albumFilter.pageType)) + } + } + + return client.newCall(stackRequest()) + .asObservableSuccess() + .map { response -> parseManga(response.asJsoup()) } + } + + override fun mangaDetailsParse(response: Response): SManga { + return SManga.create().apply { + with(response.asJsoup()) { + thumbnail_url = select("$albumSelector img").firstOrNull()?.imgAttr() + author = select("div.navigation-breadcrumb li:nth-last-child(3)").text() + genre = select("div.album-tag-container a").joinToString { it.text() } + } + } + } + + override val linkedChapterSelector = "a.a-click:has(img)[href^=/comics/]" + override val pageThumbnailSelector = "a.a-click:has(img)[href*=/pic/] img" + + override val pageThumbnailPathSegment = "/thumb/" + override val pageFullsizePathSegment = "/medium/" + + override fun getAlbumList() = arrayOf( + Triple("Various Authors", "/comics/various-authors", VARIOUS_AUTHORS), + Triple("All Authors", "", SEARCH_RESULTS_OR_BASE), + Triple("Various Authors", "/comics/various-authors", AUTHOR), + Triple("TabooLicious.xxx Comics", "/comics/taboolicious_xxx-comics", AUTHOR), + Triple("Hentai and Manga English", "/comics/hentai-and-manga-english", AUTHOR), + Triple("IllustratedInterracial.com Comics", "/comics/illustratedinterracial_com-comics", AUTHOR), + Triple("ZZZ Comics", "/comics/zzz-comics", AUTHOR), + Triple("JohnPersons.com Comics", "/comics/johnpersons_com-comics", AUTHOR), + Triple("For members only", "/", AUTHOR), + Triple("PalComix Comics", "/comics/palcomix-comics", AUTHOR), + Triple("Melkormancin.com Comics", "/comics/melkormancin_com-comics", AUTHOR), + Triple("TG Comics", "/comics/tg-comics", AUTHOR), + Triple("ShadBase Comics", "/comics/shadbase-comics", AUTHOR), + Triple("Filthy Figments Comics", "/comics/filthy-figments-comics", AUTHOR), + Triple("Witchking00 Comics", "/comics/witchking00-comics", AUTHOR), + Triple("Tease Comix", "/comics/tease-comix", AUTHOR), + Triple("PrismGirls Comics", "/comics/prismgirls-comics", AUTHOR), + Triple("Croc Comics", "/comics/croc-comics", AUTHOR), + Triple("CRAZYXXX3DWORLD Comics", "/comics/crazyxxx3dworld-comics", AUTHOR), + Triple("Moiarte Comics", "/comics/moiarte-comics", AUTHOR), + Triple("Nicole Heat Comics", "/comics/nicole-heat-comics", AUTHOR), + Triple("Expansion Comics", "/comics/expansion-comics", AUTHOR), + Triple("DizzyDills Comics", "/comics/dizzydills-comics", AUTHOR), + Triple("Hustler Cartoons", "/comics/hustler-cartoons", AUTHOR), + Triple("ArtOfJaguar Comics", "/comics/artofjaguar-comics", AUTHOR), + Triple("Grow Comics", "/comics/grow-comics", AUTHOR), + Triple("Bimbo Story Club Comics", "/comics/bimbo-story-club-comics", AUTHOR), + Triple("HentaiTNA.com Comics", "/comics/hentaitna_com-comics", AUTHOR), + Triple("ZZomp Comics", "/comics/zzomp-comics", AUTHOR), + Triple("Seiren.com.br Comics", "/comics/seiren_com_br-comics", AUTHOR), + Triple("DukesHardcoreHoneys.com Comics", "/comics/dukeshardcorehoneys_com-comics", AUTHOR), + Triple("Frozen Parody Comics", "/comics/frozen-parody-comics", AUTHOR), + Triple("Giantess Club Comics", "/comics/giantess-club-comics", AUTHOR), + Triple("Ultimate3DPorn Comics", "/comics/ultimate3dporn-comics", AUTHOR), + Triple("Sean Harrington Comics", "/comics/sean-harrington-comics", AUTHOR), + Triple("Central Comics", "/comics/central-comics", AUTHOR), + Triple("Mana World Comics", "/comics/mana-world-comics", AUTHOR), + Triple("The Foxxx Comics", "/comics/the-foxxx-comics", AUTHOR), + Triple("Bloody Sugar Comics", "/comics/bloody-sugar-comics", AUTHOR), + Triple("Deuce Comics", "/comics/deuce-comics", AUTHOR), + Triple("Adult Empire Comics", "/comics/adult-empire-comics", AUTHOR), + Triple("SuperHeroineComixxx", "/comics/superheroinecomixxx", AUTHOR), + Triple("Sluttish Comics", "/comics/sluttish-comics", AUTHOR), + Triple("Damn3D Comics", "/comics/damn3d-comics", AUTHOR), + Triple("Fake Celebrities Sex Pictures", "/comics/fake-celebrities-sex-pictures", AUTHOR), + Triple("Secret Chest Comics", "/comics/secret-chest-comics", AUTHOR), + Triple("Project Bellerophon Comics", "/comics/project-bellerophon-comics", AUTHOR), + Triple("Smudge Comics", "/comics/smudge-comics", AUTHOR), + Triple("Superheroine Central Comics", "/comics/superheroine-central-comics", AUTHOR), + Triple("Jay Marvel Comics", "/comics/jay-marvel-comics", AUTHOR), + Triple("Fred Perry Comics", "/comics/fred-perry-comics", AUTHOR), + Triple("Seduced Amanda Comics", "/comics/seduced-amanda-comics", AUTHOR), + Triple("VGBabes Comics", "/comics/vgbabes-comics", AUTHOR), + Triple("SodomSluts.com Comics", "/comics/sodomsluts_com-comics", AUTHOR), + Triple("AKABUR Comics", "/comics/akabur-comics", AUTHOR), + Triple("eBluberry Comics", "/comics/ebluberry-comics", AUTHOR), + Triple("InterracialComicPorn.com Comics", "/comics/interracialcomicporn_com-comics", AUTHOR), + Triple("Dubh3d-Dubhgilla Comics", "/comics/dubh3d-dubhgilla-comics", AUTHOR), + Triple("Gush Bomb Comix", "/comics/gush-bomb-comix", AUTHOR), + Triple("Chiyoji Tomo Comics", "/comics/chiyoji-tomo-comics", AUTHOR), + Triple("Mangrowing Comics", "/comics/mangrowing-comics", AUTHOR), + Triple("eAdultComics Collection", "/comics/eadultcomics-collection", AUTHOR), + Triple("Skulltitti Comics", "/comics/skulltitti-comics", AUTHOR), + Triple("James Lemay Comics", "/comics/james-lemay-comics", AUTHOR), + Triple("TalesOfPleasure.com Comics", "/comics/talesofpleasure_com-comics", AUTHOR), + Triple("Eden Comics", "/comics/eden-comics", AUTHOR), + Triple("WorldOfPeach Comics", "/comics/worldofpeach-comics", AUTHOR), + Triple("Daniel40 Comics", "/comics/daniel40-comics", AUTHOR), + Triple("DontFapGirl Comics", "/comics/dontfapgirl-comics", AUTHOR), + Triple("Wingbird Comics", "/comics/wingbird-comics", AUTHOR), + Triple("Intrigue3d.com Comics", "/comics/intrigue3d_com-comics", AUTHOR), + Triple("Hentaikey Comics", "/comics/hentaikey-comics", AUTHOR), + Triple("Kamina1978 Comics", "/comics/kamina1978-comics", AUTHOR), + Triple("3DPerils Comics", "/comics/3dperils-comics", AUTHOR), + Triple("Tracy Scops Comics", "/comics/tracy-scops-comics", AUTHOR), + Triple("Shemale3D Comics", "/comics/shemale3d-comics", AUTHOR), + Triple("InterracialSex3D.com Comics", "/comics/Interracialsex3d-Com-Comix", AUTHOR), + Triple("MyHentaiGrid Comics", "/comics/myhentaigrid-comics", AUTHOR), + Triple("Magnifire Comics", "/comics/magnifire-comics", AUTHOR), + Triple("Reptileye Comics", "/comics/reptileye-comics", AUTHOR), + Triple("ProjectPinkXXX.com Comics", "/comics/projectpinkxxx_com-comics", AUTHOR), + Triple("CallMePlisskin Comics", "/comics/callmeplisskin-comics", AUTHOR) + ) + + override fun getSortList() = arrayOf( + Pair("Viewed", "viewed"), + Pair("Liked", "liked"), + Pair("Date", "recent"), + Pair("A-Z", "az") + ) +}