NineManga: use SourceFactory

This commit is contained in:
Eugene 2019-10-27 18:14:44 -04:00
parent b81d7ad2aa
commit c547da3714
No known key found for this signature in database
GPG Key ID: E1FD745328866B0A
3 changed files with 717 additions and 716 deletions

View File

@ -4,8 +4,8 @@ apply plugin: 'kotlin-android'
ext { ext {
appName = 'Tachiyomi: NineManga' appName = 'Tachiyomi: NineManga'
pkgNameSuffix = "all.ninemanga" pkgNameSuffix = "all.ninemanga"
extClass = '.NineMangaEs; .NineMangaBr; .NineMangaEn; .NineMangaRu; .NineMangaDe; .NineMangaIt; .NineMangaFr' extClass = '.NineMangaFactory'
extVersionCode = 6 extVersionCode = 7
libVersion = '1.2' libVersion = '1.2'
} }

View File

@ -1,27 +1,32 @@
package eu.kanade.tachiyomi.extension.all.ninemanga package eu.kanade.tachiyomi.extension.all.ninemanga
import eu.kanade.tachiyomi.source.model.*
import okhttp3.Request
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
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 eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.HttpUrl import okhttp3.HttpUrl
import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import java.text.ParseException import java.text.ParseException
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.Calendar
import java.util.Locale
open class NineManga(override val name: String, override val baseUrl: String, override val lang: String) : ParsedHttpSource() { open class NineManga(override val name: String, override val baseUrl: String, override val lang: String) : ParsedHttpSource() {
override val supportsLatest: Boolean = true override val supportsLatest: Boolean = true
private fun newHeaders() = super.headersBuilder() private fun newHeaders() = super.headersBuilder()
.add("Accept-Language", "es-ES,es;q=0.9,en;q=0.8,gl;q=0.7") .add("Accept-Language", "es-ES,es;q=0.9,en;q=0.8,gl;q=0.7")
.add("Host", baseUrl.substringAfterLast("/")) // like: es.ninemanga.com .add("Host", baseUrl.substringAfterLast("/")) // like: es.ninemanga.com
.add("Connection", "keep-alive") .add("Connection", "keep-alive")
.add("Upgrade-Insecure-Requests", "1") .add("Upgrade-Insecure-Requests", "1")
.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) Gecko/20100101 Firefox/60") .add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) Gecko/20100101 Firefox/60")
.build() .build()
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/list/New-Update/", headers) // "$baseUrl/category/updated_$page.html" override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/list/New-Update/", headers) // "$baseUrl/category/updated_$page.html"
@ -45,7 +50,7 @@ open class NineManga(override val name: String, override val baseUrl: String, ov
override fun popularMangaNextPageSelector() = latestUpdatesNextPageSelector() override fun popularMangaNextPageSelector() = latestUpdatesNextPageSelector()
override fun mangaDetailsParse(document: Document) = SManga.create().apply { override fun mangaDetailsParse(document: Document) = SManga.create().apply {
document.select("div.bookintro").let { document.select("div.bookintro").let {
title = it.select("li > span:not([class])").text() title = it.select("li > span:not([class])").text()
genre = it.select("li[itemprop=genre] a").joinToString { e -> e.text() } genre = it.select("li[itemprop=genre] a").joinToString { e -> e.text() }
@ -80,13 +85,13 @@ open class NineManga(override val name: String, override val baseUrl: String, ov
val dateWords = date.split(" ") val dateWords = date.split(" ")
if (dateWords.size == 3) { if (dateWords.size == 3) {
if(dateWords[1].contains(",")){ if (dateWords[1].contains(",")) {
try { return try {
return SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date).time SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date).time
} catch (e: ParseException) { } catch (e: ParseException) {
return 0L 0L
} }
}else { } else {
val timeAgo = Integer.parseInt(dateWords[0]) val timeAgo = Integer.parseInt(dateWords[0])
return Calendar.getInstance().apply { return Calendar.getInstance().apply {
when (dateWords[1]) { when (dateWords[1]) {
@ -128,8 +133,8 @@ open class NineManga(override val name: String, override val baseUrl: String, ov
when (filter) { when (filter) {
is GenreList -> { is GenreList -> {
filter.state filter.state
.filter { genre -> genre.state } .filter { genre -> genre.state }
.forEach { genre -> url.addQueryParameter("category_id", genre.id) } .forEach { genre -> url.addQueryParameter("category_id", genre.id) }
} }
} }
} }
@ -147,76 +152,76 @@ open class NineManga(override val name: String, override val baseUrl: String, ov
open class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genre", genres) open class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genre", genres)
override fun getFilterList() = FilterList( override fun getFilterList() = FilterList(
GenreList(getGenreList()) GenreList(getGenreList())
) )
// $(document.querySelectorAll('.optionbox .typelist:nth-child(3) ul li.cate_list')).map((i, el)=>`Genre("${$(el).first().text().trim()}","${$(el).attr("cate_id")}")`).get().sort().join(",\n") // $(document.querySelectorAll('.optionbox .typelist:nth-child(3) ul li.cate_list')).map((i, el)=>`Genre("${$(el).first().text().trim()}", "${$(el).attr("cate_id")}")`).get().sort().join(",\n")
// http://en.ninemanga.com/search/?type=high // http://en.ninemanga.com/search/?type=high
open fun getGenreList() = listOf( open fun getGenreList() = listOf(
Genre("4-Koma","56"), Genre("4-Koma", "56"),
Genre("Action","1"), Genre("Action", "1"),
Genre("Adventure","2"), Genre("Adventure", "2"),
Genre("Anime","3"), Genre("Anime", "3"),
Genre("Award Winning","59"), Genre("Award Winning", "59"),
Genre("Bara","84"), Genre("Bara", "84"),
Genre("Comedy","4"), Genre("Comedy", "4"),
Genre("Cooking","5"), Genre("Cooking", "5"),
Genre("Crime","132"), Genre("Crime", "132"),
Genre("Demons","49"), Genre("Demons", "49"),
Genre("Doujinshi","45"), Genre("Doujinshi", "45"),
Genre("Drama","6"), Genre("Drama", "6"),
Genre("Fantasy","8"), Genre("Fantasy", "8"),
Genre("Game","126"), Genre("Game", "126"),
Genre("Gender Bender","9"), Genre("Gender Bender", "9"),
Genre("Historical","11"), Genre("Historical", "11"),
Genre("Horror","12"), Genre("Horror", "12"),
Genre("Isekai","127"), Genre("Isekai", "127"),
Genre("Josei","13"), Genre("Josei", "13"),
Genre("Live Action","14"), Genre("Live Action", "14"),
Genre("Magic","47"), Genre("Magic", "47"),
Genre("Magical Girls","130"), Genre("Magical Girls", "130"),
Genre("Manhua","15"), Genre("Manhua", "15"),
Genre("Manhwa","16"), Genre("Manhwa", "16"),
Genre("Martial Arts","17"), Genre("Martial Arts", "17"),
Genre("Matsumoto Tomokicomedy","37"), Genre("Matsumoto Tomokicomedy", "37"),
Genre("Mecha","18"), Genre("Mecha", "18"),
Genre("Medical","19"), Genre("Medical", "19"),
Genre("Military","51"), Genre("Military", "51"),
Genre("Music","20"), Genre("Music", "20"),
Genre("Mystery","21"), Genre("Mystery", "21"),
Genre("N/A","54"), Genre("N/A", "54"),
Genre("None","64"), Genre("None", "64"),
Genre("One Shot","22"), Genre("One Shot", "22"),
Genre("Oneshot","57"), Genre("Oneshot", "57"),
Genre("Philosophical","133"), Genre("Philosophical", "133"),
Genre("Psychological","23"), Genre("Psychological", "23"),
Genre("Reverse Harem","55"), Genre("Reverse Harem", "55"),
Genre("Romance Shoujo","38"), Genre("Romance Shoujo", "38"),
Genre("Romance","24"), Genre("Romance", "24"),
Genre("School Life","25"), Genre("School Life", "25"),
Genre("Sci-Fi","26"), Genre("Sci-Fi", "26"),
Genre("Seinen","27"), Genre("Seinen", "27"),
Genre("Shoujo Ai","44"), Genre("Shoujo Ai", "44"),
Genre("Shoujo","28"), Genre("Shoujo", "28"),
Genre("Shoujo-Ai","29"), Genre("Shoujo-Ai", "29"),
Genre("Shoujoai","48"), Genre("Shoujoai", "48"),
Genre("Shounen Ai","42"), Genre("Shounen Ai", "42"),
Genre("Shounen","30"), Genre("Shounen", "30"),
Genre("Shounen-Ai","31"), Genre("Shounen-Ai", "31"),
Genre("Shounenai","46"), Genre("Shounenai", "46"),
Genre("Slice Of Life","32"), Genre("Slice Of Life", "32"),
Genre("Sports","33"), Genre("Sports", "33"),
Genre("Staff Pick","60"), Genre("Staff Pick", "60"),
Genre("Super Power","62"), Genre("Super Power", "62"),
Genre("Superhero","131"), Genre("Superhero", "131"),
Genre("Supernatural","34"), Genre("Supernatural", "34"),
Genre("Suspense","53"), Genre("Suspense", "53"),
Genre("Thriller","129"), Genre("Thriller", "129"),
Genre("Tragedy","35"), Genre("Tragedy", "35"),
Genre("Vampire","52"), Genre("Vampire", "52"),
Genre("Webtoon","58"), Genre("Webtoon", "58"),
Genre("Webtoons","50"), Genre("Webtoons", "50"),
Genre("Wuxia","128"), Genre("Wuxia", "128"),
Genre("[No Chapters]","61") Genre("[No Chapters]", "61")
) )
} }