diff --git a/src/all/wpmangareader/build.gradle b/src/all/wpmangareader/build.gradle new file mode 100644 index 000000000..4336e1695 --- /dev/null +++ b/src/all/wpmangareader/build.gradle @@ -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" diff --git a/src/all/wpmangareader/res/mipmap-hdpi/ic_launcher.png b/src/all/wpmangareader/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..1d1d70a07 Binary files /dev/null and b/src/all/wpmangareader/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/all/wpmangareader/res/mipmap-mdpi/ic_launcher.png b/src/all/wpmangareader/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..0bd5eb343 Binary files /dev/null and b/src/all/wpmangareader/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/all/wpmangareader/res/mipmap-xhdpi/ic_launcher.png b/src/all/wpmangareader/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..bcd89feb8 Binary files /dev/null and b/src/all/wpmangareader/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/all/wpmangareader/res/mipmap-xxhdpi/ic_launcher.png b/src/all/wpmangareader/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..1682d5cb5 Binary files /dev/null and b/src/all/wpmangareader/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/all/wpmangareader/res/mipmap-xxxhdpi/ic_launcher.png b/src/all/wpmangareader/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d6b87794a Binary files /dev/null and b/src/all/wpmangareader/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/all/wpmangareader/res/web_hi_res_512.png b/src/all/wpmangareader/res/web_hi_res_512.png new file mode 100644 index 000000000..6bcf749cd Binary files /dev/null and b/src/all/wpmangareader/res/web_hi_res_512.png differ diff --git a/src/id/ngomik/src/eu/kanade/tachiyomi/extension/id/ngomik/Ngomik.kt b/src/all/wpmangareader/src/eu/kanade/tachiyomi/extension/all/wpmangareader/WPMangaReader.kt similarity index 81% rename from src/id/ngomik/src/eu/kanade/tachiyomi/extension/id/ngomik/Ngomik.kt rename to src/all/wpmangareader/src/eu/kanade/tachiyomi/extension/all/wpmangareader/WPMangaReader.kt index d1cef8f3e..6b228c334 100644 --- a/src/id/ngomik/src/eu/kanade/tachiyomi/extension/id/ngomik/Ngomik.kt +++ b/src/all/wpmangareader/src/eu/kanade/tachiyomi/extension/all/wpmangareader/WPMangaReader.kt @@ -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()?.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 { val document = response.asJsoup() @@ -103,14 +107,22 @@ class Ngomik : ParsedHttpSource() { name = element.text() } + // pages override fun pageListParse(document: Document): List { - return document.select("div#readerarea img").mapIndexed { i, element -> - Page(i, "", element.attr("src")) + val pages = mutableListOf() + + 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(), diff --git a/src/all/wpmangareader/src/eu/kanade/tachiyomi/extension/all/wpmangareader/WPMangaReaderFactory.kt b/src/all/wpmangareader/src/eu/kanade/tachiyomi/extension/all/wpmangareader/WPMangaReaderFactory.kt new file mode 100644 index 000000000..2aff36bb7 --- /dev/null +++ b/src/all/wpmangareader/src/eu/kanade/tachiyomi/extension/all/wpmangareader/WPMangaReaderFactory.kt @@ -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 = 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") diff --git a/src/id/mangakita/build.gradle b/src/id/mangakita/build.gradle deleted file mode 100644 index 5e75b22e7..000000000 --- a/src/id/mangakita/build.gradle +++ /dev/null @@ -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" diff --git a/src/id/mangakita/res/mipmap-hdpi/ic_launcher.png b/src/id/mangakita/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 0b7344464..000000000 Binary files a/src/id/mangakita/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/mangakita/res/mipmap-mdpi/ic_launcher.png b/src/id/mangakita/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index d788b2cf5..000000000 Binary files a/src/id/mangakita/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/mangakita/res/mipmap-xhdpi/ic_launcher.png b/src/id/mangakita/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 22060226e..000000000 Binary files a/src/id/mangakita/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/mangakita/res/mipmap-xxhdpi/ic_launcher.png b/src/id/mangakita/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 4f399525c..000000000 Binary files a/src/id/mangakita/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/mangakita/res/mipmap-xxxhdpi/ic_launcher.png b/src/id/mangakita/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 026d23076..000000000 Binary files a/src/id/mangakita/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/mangakita/res/web_hi_res_512.png b/src/id/mangakita/res/web_hi_res_512.png deleted file mode 100644 index 1f26b954e..000000000 Binary files a/src/id/mangakita/res/web_hi_res_512.png and /dev/null differ diff --git a/src/id/mangakita/src/eu/kanade/tachiyomi/extension/id/mangakita/MangaKita.kt b/src/id/mangakita/src/eu/kanade/tachiyomi/extension/id/mangakita/MangaKita.kt deleted file mode 100644 index 5cb9d24d4..000000000 --- a/src/id/mangakita/src/eu/kanade/tachiyomi/extension/id/mangakita/MangaKita.kt +++ /dev/null @@ -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 { - val pages = mutableListOf() - - 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() -} diff --git a/src/id/ngomik/build.gradle b/src/id/ngomik/build.gradle deleted file mode 100644 index b3d185f01..000000000 --- a/src/id/ngomik/build.gradle +++ /dev/null @@ -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" diff --git a/src/id/ngomik/res/mipmap-hdpi/ic_launcher.png b/src/id/ngomik/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 9c790e57d..000000000 Binary files a/src/id/ngomik/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/ngomik/res/mipmap-mdpi/ic_launcher.png b/src/id/ngomik/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 777b9bf46..000000000 Binary files a/src/id/ngomik/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/ngomik/res/mipmap-xhdpi/ic_launcher.png b/src/id/ngomik/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 55c7bc671..000000000 Binary files a/src/id/ngomik/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/ngomik/res/mipmap-xxhdpi/ic_launcher.png b/src/id/ngomik/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index e58a0c01b..000000000 Binary files a/src/id/ngomik/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/ngomik/res/mipmap-xxxhdpi/ic_launcher.png b/src/id/ngomik/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index c11757f0c..000000000 Binary files a/src/id/ngomik/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/id/ngomik/res/web_hi_res_512.png b/src/id/ngomik/res/web_hi_res_512.png deleted file mode 100644 index 27230a300..000000000 Binary files a/src/id/ngomik/res/web_hi_res_512.png and /dev/null differ