add WP MangaReader (multiple sources) (#5026)

* add WP MangaReader (multiple sources)

add factory source extension
add KomikMama source
move MangaKita to factory source
move Ngomik to factory source

* move standalone source to WPMangaReader 

move Ngomik to WPMangaReader
move MangaKita to WPMangaReader
This commit is contained in:
Riztard Lanthorn 2020-12-06 02:13:16 +07:00 committed by GitHub
parent ec3a78f0ef
commit 4cbf222b48
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 66 additions and 137 deletions

View File

@ -0,0 +1,12 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'WP MangaReader (multiple sources)'
pkgNameSuffix = 'all.wpmangareader'
extClass = '.WPMangaReaderFactory'
extVersionCode = 1
libVersion = '1.2'
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

View File

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.extension.id.ngomik
package eu.kanade.tachiyomi.extension.all.wpmangareader
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
@ -16,38 +16,41 @@ import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
class Ngomik : ParsedHttpSource() {
override val name = "Ngomik"
override val baseUrl = "https://ngomik.net"
override val lang = "id"
abstract class WPMangaReader(
override val name: String,
override val baseUrl: String,
override val lang: String,
val mangaUrlDirectory: String = "/manga-lists",
private val dateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US)
) : ParsedHttpSource() {
override val supportsLatest = true
override val client: OkHttpClient = network.cloudflareClient
override fun popularMangaSelector() = "div.imgu > a.series"
// popular
override fun popularMangaSelector() = ".utao .uta .imgu"
override fun popularMangaRequest(page: Int) = GET("$baseUrl/all-komik/page/$page/?order=popular", headers)
override fun popularMangaRequest(page: Int) = GET("$baseUrl$mangaUrlDirectory/page/$page/?order=popular", headers)
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
setUrlWithoutDomain(element.attr("href"))
title = element.attr("title")
thumbnail_url = element.select("img").attr("src")
title = element.select("a").attr("title")
setUrlWithoutDomain(element.select("a").attr("href"))
}
override fun popularMangaNextPageSelector() = "a.next.page-numbers"
override fun popularMangaNextPageSelector() = "div.pagination .next"
// latest
override fun latestUpdatesSelector() = popularMangaSelector()
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/all-komik/page/$page/?order=update", headers)
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl$mangaUrlDirectory/page/$page/?order=update", headers)
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
// search
override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
@ -56,7 +59,7 @@ class Ngomik : ParsedHttpSource() {
val order = filters.findInstance<OrderByFilter>()?.toUriPart()
return when {
order!!.isNotEmpty() -> GET("$baseUrl/all-komik/page/$page/?order=$order")
order!!.isNotEmpty() -> GET("$baseUrl$mangaUrlDirectory/page/$page/?order=$order")
genre!!.isNotEmpty() -> GET("$baseUrl/genres/$genre/page/$page/?s=$query")
else -> GET("$baseUrl/page/$page/?s=$query")
}
@ -66,13 +69,13 @@ class Ngomik : ParsedHttpSource() {
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
// manga details
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
title = document.select("h1[itemprop=headline]").text()
author = document.select("div.listinfo li:contains(Author:)").text().removePrefix("Author: ")
description = document.select(".desc").text()
genre = document.select("div.gnr > a").joinToString { it.text() }
status = parseStatus(document.select("div.listinfo li:contains(Status:)").text())
thumbnail_url = document.select("div[itemprop=image] > img").attr("src")
author = document.select(".listinfo li:contains(Author), .listinfo li:contains(komikus)").firstOrNull()?.ownText()
genre = document.select("div.gnr a").joinToString { it.text() }
status = parseStatus(document.select("div.listinfo li:contains(Status)").text())
thumbnail_url = document.select(".infomanga > div[itemprop=image] img").attr("src")
description = document.select(".desc").joinToString("\n") { it.text() }
}
private fun parseStatus(status: String) = when {
@ -81,7 +84,8 @@ class Ngomik : ParsedHttpSource() {
else -> SManga.UNKNOWN
}
override fun chapterListSelector() = "div.lch > a"
// chapters
override fun chapterListSelector() = "div.bxcl li .lch a"
override fun chapterListParse(response: Response): List<SChapter> {
val document = response.asJsoup()
@ -103,14 +107,22 @@ class Ngomik : ParsedHttpSource() {
name = element.text()
}
// pages
override fun pageListParse(document: Document): List<Page> {
return document.select("div#readerarea img").mapIndexed { i, element ->
Page(i, "", element.attr("src"))
val pages = mutableListOf<Page>()
document.select("#readerarea img").mapIndexed { i, element ->
val image = element.attr("src")
if (image != "") {
pages.add(Page(i, "", image))
}
}
return pages
}
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used")
// filters
override fun getFilterList() = FilterList(
Filter.Header("Order by filter cannot be used with others"),
OrderByFilter(),

View File

@ -0,0 +1,18 @@
package eu.kanade.tachiyomi.extension.all.wpmangareader
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceFactory
class WPMangaReaderFactory : SourceFactory {
override fun createSources(): List<Source> = listOf(
KomikMama(),
MangaKita(),
Ngomik()
)
}
class KomikMama : WPMangaReader("KomikMama", "https://komikmama.net", "id", "/manga-list")
class MangaKita : WPMangaReader("MangaKita", "https://mangakita.net", "id", "/daftar-manga")
class Ngomik : WPMangaReader("Ngomik", "https://ngomik.net", "id", "/all-komik")

View File

@ -1,12 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'MangaKita'
pkgNameSuffix = 'id.mangakita'
extClass = '.MangaKita'
extVersionCode = 2
libVersion = '1.2'
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

View File

@ -1,89 +0,0 @@
package eu.kanade.tachiyomi.extension.id.mangakita
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.online.ParsedHttpSource
import okhttp3.OkHttpClient
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
class MangaKita : ParsedHttpSource() {
override val name = "MangaKita"
override val baseUrl = "https://mangakita.net"
override val lang = "id"
override val supportsLatest = true
override val client: OkHttpClient = network.cloudflareClient
override fun popularMangaSelector() = ".utao .uta .imgu"
override fun popularMangaRequest(page: Int) = GET("$baseUrl/daftar-manga/page/$page/?order=popular", headers)
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
thumbnail_url = element.select("img").attr("src")
title = element.select("a").attr("title")
setUrlWithoutDomain(element.select("a").attr("href"))
}
override fun popularMangaNextPageSelector() = "div.pagination .next"
override fun latestUpdatesSelector() = popularMangaSelector()
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/daftar-manga/page/$page/?order=update", headers)
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/page/$page/?s=$query", headers)
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
author = document.select(".listinfo li:contains(Author)").firstOrNull()?.ownText()
genre = document.select(".gnr a").joinToString { it.text() }
status = parseStatus(document.select(".listinfo li:contains(Status)").text())
thumbnail_url = document.select(".infomanga > div img").attr("src")
description = document.select(".desc p").joinToString("\n") { it.text() }
}
private fun parseStatus(status: String) = when {
status.contains("Ongoing") -> SManga.ONGOING
status.contains("Completed") -> SManga.COMPLETED
else -> SManga.UNKNOWN
}
override fun chapterListSelector() = "div.bxcl li .lch a"
override fun chapterFromElement(element: Element) = SChapter.create().apply {
setUrlWithoutDomain(element.attr("href"))
name = element.text()
}
override fun pageListParse(document: Document): List<Page> {
val pages = mutableListOf<Page>()
document.select("#readerarea img").mapIndexed { i, element ->
val image = element.attr("src")
if (image != "") {
pages.add(Page(i, "", image))
}
}
return pages
}
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used")
override fun getFilterList() = FilterList()
}

View File

@ -1,12 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'Ngomik'
pkgNameSuffix = 'id.ngomik'
extClass = '.Ngomik'
extVersionCode = 4
libVersion = '1.2'
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB