Update changes for mangadex (#170)
* fixed latest updates fix genre tags add genre filter when searching added paging for browse * switch search selector to use popular * switched to scanlator to group not user who uploaded * fix some chapters on random manga not loading images * null safety
This commit is contained in:
parent
1d9104c3ee
commit
12673dbc0e
|
@ -6,8 +6,8 @@ ext {
|
|||
appName = 'Tachiyomi: MangaDex'
|
||||
pkgNameSuffix = "en.mangadex"
|
||||
extClass = '.Mangadex'
|
||||
extVersionCode = 1
|
||||
extVersionSuffix = 1
|
||||
extVersionCode = 2
|
||||
extVersionSuffix = 2
|
||||
libVersion = '1.2'
|
||||
}
|
||||
|
||||
|
|
|
@ -19,16 +19,17 @@ class Mangadex : ParsedHttpSource() {
|
|||
|
||||
override val lang = "en"
|
||||
|
||||
val internalLang = "gb"
|
||||
private val internalLang = "gb"
|
||||
|
||||
override val client = network.cloudflareClient
|
||||
|
||||
override fun popularMangaSelector() = latestUpdatesSelector()
|
||||
override fun popularMangaSelector() = ".table-responsive tbody tr"
|
||||
|
||||
override fun latestUpdatesSelector() = ".table-responsive tbody tr"
|
||||
override fun latestUpdatesSelector() = ".table-responsive tbody tr a.manga_title[href*=manga]"
|
||||
|
||||
override fun popularMangaRequest(page: Int): Request {
|
||||
return GET("$baseUrl/?page=search", headers)
|
||||
val pageStr = if (page != 1) "//" + ((page * 100) - 100) else ""
|
||||
return GET("$baseUrl/titles$pageStr", headers)
|
||||
}
|
||||
|
||||
override fun latestUpdatesRequest(page: Int): Request {
|
||||
|
@ -36,37 +37,51 @@ class Mangadex : ParsedHttpSource() {
|
|||
}
|
||||
|
||||
override fun popularMangaFromElement(element: Element): SManga {
|
||||
return latestUpdatesFromElement(element)
|
||||
}
|
||||
|
||||
override fun latestUpdatesFromElement(element: Element): SManga {
|
||||
val manga = SManga.create()
|
||||
element.select("a[href*=manga]").first().let {
|
||||
manga.setUrlWithoutDomain(it.attr("href"))
|
||||
manga.title = it.text().trim()
|
||||
manga.author = it.text().trim()
|
||||
manga.author = it?.text()?.trim()
|
||||
}
|
||||
return manga
|
||||
}
|
||||
|
||||
override fun popularMangaNextPageSelector() = null
|
||||
override fun latestUpdatesFromElement(element: Element): SManga {
|
||||
val manga = SManga.create()
|
||||
element.let {
|
||||
manga.setUrlWithoutDomain(it.attr("href"))
|
||||
manga.title = it.text().trim()
|
||||
}
|
||||
return manga
|
||||
}
|
||||
|
||||
override fun popularMangaNextPageSelector() = ".pagination li:not(.disabled) span[title*=last page]:not(disabled)"
|
||||
|
||||
override fun latestUpdatesNextPageSelector() = null
|
||||
|
||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||
val url = HttpUrl.parse("$baseUrl/?page=search")!!.newBuilder().addQueryParameter("title", query)
|
||||
val genres = mutableListOf<String>()
|
||||
|
||||
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
|
||||
when (filter) {
|
||||
is TextField -> url.addQueryParameter(filter.key, filter.state)
|
||||
is GenreList -> filter.state.forEach { genre ->
|
||||
when (genre.state) {
|
||||
true -> genres.add(genre.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (genres.isNotEmpty()) url.addQueryParameter("genre", genres.joinToString(","))
|
||||
|
||||
return GET(url.toString(), headers)
|
||||
}
|
||||
|
||||
override fun searchMangaSelector() = ".table.table-striped.table-hover.table-condensed tbody tr"
|
||||
|
||||
override fun searchMangaFromElement(element: Element): SManga {
|
||||
return latestUpdatesFromElement(element)
|
||||
return popularMangaFromElement(element)
|
||||
}
|
||||
|
||||
override fun searchMangaNextPageSelector() = null
|
||||
|
@ -75,13 +90,16 @@ class Mangadex : ParsedHttpSource() {
|
|||
val manga = SManga.create()
|
||||
val imageElement = document.select(".table-condensed").first()
|
||||
val infoElement = document.select(".table.table-condensed.edit").first()
|
||||
val genreElement = infoElement.select("tr:eq(3) td .genre")
|
||||
|
||||
manga.author = infoElement.select("tr:eq(1) td").first()?.text()
|
||||
manga.artist = infoElement.select("tr:eq(2) td").first()?.text()
|
||||
manga.status = parseStatus(infoElement.select("tr:eq(5) td").first()?.text())
|
||||
manga.description = infoElement.select("tr:eq(7) td").first()?.text()
|
||||
manga.thumbnail_url = imageElement.select("img").first()?.attr("src").let { baseUrl + "/" + it }
|
||||
manga.genre = infoElement.select("tr:eq(3) td").first()?.text()
|
||||
var genres = mutableListOf<String>()
|
||||
genreElement?.forEach { genres.add(it.text()) }
|
||||
manga.genre = genres.joinToString(", ")
|
||||
|
||||
return manga
|
||||
}
|
||||
|
@ -91,7 +109,7 @@ class Mangadex : ParsedHttpSource() {
|
|||
override fun chapterFromElement(element: Element): SChapter {
|
||||
val urlElement = element.select("td:eq(0)").first()
|
||||
val dateElement = element.select("td:eq(6)").first()
|
||||
val scanlatorElement = element.select("td:eq(3)").first()
|
||||
val scanlatorElement = element.select("td:eq(2)").first()
|
||||
|
||||
val chapter = SChapter.create()
|
||||
chapter.url = (urlElement.select("a").attr("href"))
|
||||
|
@ -114,7 +132,14 @@ class Mangadex : ParsedHttpSource() {
|
|||
return pages
|
||||
}
|
||||
|
||||
override fun imageUrlParse(document: Document) = baseUrl + document.select("#current_page").first().attr("src")
|
||||
override fun imageUrlParse(document: Document): String {
|
||||
val attr = document.select("#current_page").first().attr("src")
|
||||
|
||||
if (attr.startsWith("http")) {
|
||||
return attr
|
||||
}
|
||||
return baseUrl + attr
|
||||
}
|
||||
|
||||
private fun parseStatus(status: String?) = when {
|
||||
status == null -> SManga.UNKNOWN
|
||||
|
@ -125,10 +150,56 @@ class Mangadex : ParsedHttpSource() {
|
|||
}
|
||||
|
||||
private class TextField(name: String, val key: String) : Filter.Text(name)
|
||||
private class Genre(val id: String, name: String) : Filter.CheckBox(name)
|
||||
private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres)
|
||||
|
||||
|
||||
override fun getFilterList() = FilterList(
|
||||
TextField("Author", "author"),
|
||||
TextField("Artist", "artist")
|
||||
TextField("Artist", "artist"),
|
||||
GenreList(getGenreList())
|
||||
)
|
||||
|
||||
private fun getGenreList() = listOf(
|
||||
Genre("1", "4-koma"),
|
||||
Genre("2", "Action"),
|
||||
Genre("3", "Adventure"),
|
||||
Genre("4", "Award Winning"),
|
||||
Genre("5", "Comedy"),
|
||||
Genre("6", "Cooking"),
|
||||
Genre("7", "Doujinshi"),
|
||||
Genre("8", "Drama"),
|
||||
Genre("9", "Ecchi"),
|
||||
Genre("10", "Fantasy"),
|
||||
Genre("11", "Gender Bender"),
|
||||
Genre("12", "Harem"),
|
||||
Genre("13", "Historical"),
|
||||
Genre("14", "Horror"),
|
||||
Genre("15", "Josei"),
|
||||
Genre("16", "Martial Arts"),
|
||||
Genre("17", "Mecha"),
|
||||
Genre("18", "Medical"),
|
||||
Genre("19", "Music"),
|
||||
Genre("20", "Mystery"),
|
||||
Genre("21", "Oneshot"),
|
||||
Genre("22", "Psychological"),
|
||||
Genre("23", "Romance"),
|
||||
Genre("24", "School Life"),
|
||||
Genre("25", "Sci-Fi"),
|
||||
Genre("26", "Seinen"),
|
||||
Genre("27", "Shoujo"),
|
||||
Genre("28", "Shoujo Ai"),
|
||||
Genre("29", "Shounen"),
|
||||
Genre("30", "Shounen Ai"),
|
||||
Genre("31", "Slice of Life"),
|
||||
Genre("32", "Smut"),
|
||||
Genre("33", "Sports"),
|
||||
Genre("34", "Supernatural"),
|
||||
Genre("35", "Tragedy"),
|
||||
Genre("36", "Webtoon"),
|
||||
Genre("37", "Yaoi"),
|
||||
Genre("38", "Yuri"),
|
||||
Genre("39", "[no chapters]"),
|
||||
Genre("40", "Game")
|
||||
)
|
||||
}
|
Loading…
Reference in New Issue