mirror of
https://github.com/tachiyomiorg/tachiyomi.git
synced 2024-11-19 22:39:18 +01:00
Add "Completed" filter; fix Mangahere; fix Mangafox (#604)
* Add "Compled" filter to all english sources; fix Mangahere manga title extraction; fix Mangafox search. * update Mangasee * update Batoto
This commit is contained in:
parent
1f14240251
commit
f1d84ccb49
@ -109,12 +109,17 @@ class Batoto(override val id: Int) : ParsedOnlineSource(), LoginSource {
|
|||||||
|
|
||||||
override fun latestUpdatesNextPageSelector() = "#show_more_row"
|
override fun latestUpdatesNextPageSelector() = "#show_more_row"
|
||||||
|
|
||||||
override fun searchMangaInitialUrl(query: String, filters: List<Filter>) = "$baseUrl/search_ajax?name=${Uri.encode(query)}&order_cond=views&order=desc&p=1&genre_cond=and&genres=${getFilterParams(filters)}"
|
override fun searchMangaInitialUrl(query: String, filters: List<Filter>) = "$baseUrl/search_ajax?name=${Uri.encode(query)}&order_cond=views&order=desc&p=1${getFilterParams(filters)}"
|
||||||
|
|
||||||
private fun getFilterParams(filters: List<Filter>): String = filters
|
private fun getFilterParams(filters: List<Filter>): String {
|
||||||
.map {
|
var genres = ""
|
||||||
";i" + it.id
|
var completed = ""
|
||||||
}.joinToString()
|
for (filter in filters) {
|
||||||
|
if (filter.equals(completedFilter)) completed = "&completed=c"
|
||||||
|
else genres += ";i" + filter.id
|
||||||
|
}
|
||||||
|
return if (genres.isEmpty()) completed else "&genres=$genres&genre_cond=and$completed"
|
||||||
|
}
|
||||||
|
|
||||||
override fun searchMangaRequest(page: MangasPage, query: String, filters: List<Filter>): Request {
|
override fun searchMangaRequest(page: MangasPage, query: String, filters: List<Filter>): Request {
|
||||||
if (page.page == 1) {
|
if (page.page == 1) {
|
||||||
@ -133,7 +138,7 @@ class Batoto(override val id: Int) : ParsedOnlineSource(), LoginSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
page.nextPageUrl = document.select(searchMangaNextPageSelector()).first()?.let {
|
page.nextPageUrl = document.select(searchMangaNextPageSelector()).first()?.let {
|
||||||
"$baseUrl/search_ajax?name=${Uri.encode(query)}&p=${page.page + 1}&order_cond=views&order=desc&genre_cond=and&genres=" + getFilterParams(filters)
|
"$baseUrl/search_ajax?name=${Uri.encode(query)}&order_cond=views&order=desc&p=${page.page + 1}${getFilterParams(filters)}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,11 +306,13 @@ class Batoto(override val id: Int) : ParsedOnlineSource(), LoginSource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val completedFilter = Filter("completed", "Completed")
|
||||||
// [...document.querySelectorAll("#advanced_options div.genre_buttons")].map((el,i) => {
|
// [...document.querySelectorAll("#advanced_options div.genre_buttons")].map((el,i) => {
|
||||||
// const onClick=el.getAttribute('onclick');const id=onClick.substr(14,onClick.length-16);return `Filter("${id}", "${el.textContent.trim()}")`
|
// const onClick=el.getAttribute('onclick');const id=onClick.substr(14,onClick.length-16);return `Filter("${id}", "${el.textContent.trim()}")`
|
||||||
// }).join(',\n')
|
// }).join(',\n')
|
||||||
// on https://bato.to/search
|
// on https://bato.to/search
|
||||||
override fun getFilterList(): List<Filter> = listOf(
|
override fun getFilterList(): List<Filter> = listOf(
|
||||||
|
completedFilter,
|
||||||
Filter("40", "4-Koma"),
|
Filter("40", "4-Koma"),
|
||||||
Filter("1", "Action"),
|
Filter("1", "Action"),
|
||||||
Filter("2", "Adventure"),
|
Filter("2", "Adventure"),
|
||||||
|
@ -62,10 +62,10 @@ class Kissmanga(override val id: Int) : ParsedOnlineSource() {
|
|||||||
val form = FormBody.Builder().apply {
|
val form = FormBody.Builder().apply {
|
||||||
add("authorArtist", "")
|
add("authorArtist", "")
|
||||||
add("mangaName", query)
|
add("mangaName", query)
|
||||||
add("status", "")
|
|
||||||
|
|
||||||
this@Kissmanga.filters.forEach { filter ->
|
this@Kissmanga.filters.forEach { filter ->
|
||||||
add("genres", if (filter in filters) "1" else "0")
|
if (filter.equals(completedFilter)) add("status", if (filter in filters) filter.id else "")
|
||||||
|
else add("genres", if (filter in filters) "1" else "0")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,9 +131,11 @@ class Kissmanga(override val id: Int) : ParsedOnlineSource() {
|
|||||||
|
|
||||||
override fun imageUrlParse(document: Document) = ""
|
override fun imageUrlParse(document: Document) = ""
|
||||||
|
|
||||||
|
private val completedFilter = Filter("Completed", "Completed")
|
||||||
// $("select[name=\"genres\"]").map((i,el) => `Filter("${i}", "${$(el).next().text().trim()}")`).get().join(',\n')
|
// $("select[name=\"genres\"]").map((i,el) => `Filter("${i}", "${$(el).next().text().trim()}")`).get().join(',\n')
|
||||||
// on http://kissmanga.com/AdvanceSearch
|
// on http://kissmanga.com/AdvanceSearch
|
||||||
override fun getFilterList(): List<Filter> = listOf(
|
override fun getFilterList(): List<Filter> = listOf(
|
||||||
|
completedFilter,
|
||||||
Filter("0", "Action"),
|
Filter("0", "Action"),
|
||||||
Filter("1", "Adult"),
|
Filter("1", "Adult"),
|
||||||
Filter("2", "Adventure"),
|
Filter("2", "Adventure"),
|
||||||
|
@ -50,10 +50,10 @@ class Mangafox(override val id: Int) : ParsedOnlineSource() {
|
|||||||
override fun searchMangaInitialUrl(query: String, filters: List<Filter>) =
|
override fun searchMangaInitialUrl(query: String, filters: List<Filter>) =
|
||||||
"$baseUrl/search.php?name_method=cw&advopts=1&order=za&sort=views&name=$query&page=1&${filters.map { it.id + "=1" }.joinToString("&")}"
|
"$baseUrl/search.php?name_method=cw&advopts=1&order=za&sort=views&name=$query&page=1&${filters.map { it.id + "=1" }.joinToString("&")}"
|
||||||
|
|
||||||
override fun searchMangaSelector() = "table#listing > tbody > tr:gt(0)"
|
override fun searchMangaSelector() = "div#mangalist > ul.list > li"
|
||||||
|
|
||||||
override fun searchMangaFromElement(element: Element, manga: Manga) {
|
override fun searchMangaFromElement(element: Element, manga: Manga) {
|
||||||
element.select("a.series_preview").first().let {
|
element.select("a.title").first().let {
|
||||||
manga.setUrlWithoutDomain(it.attr("href"))
|
manga.setUrlWithoutDomain(it.attr("href"))
|
||||||
manga.title = it.text()
|
manga.title = it.text()
|
||||||
}
|
}
|
||||||
@ -132,6 +132,7 @@ class Mangafox(override val id: Int) : ParsedOnlineSource() {
|
|||||||
// $('select.genres').map((i,el)=>`Filter("${$(el).attr('name')}", "${$(el).next().text().trim()}")`).get().join(',\n')
|
// $('select.genres').map((i,el)=>`Filter("${$(el).attr('name')}", "${$(el).next().text().trim()}")`).get().join(',\n')
|
||||||
// on http://kissmanga.com/AdvanceSearch
|
// on http://kissmanga.com/AdvanceSearch
|
||||||
override fun getFilterList(): List<Filter> = listOf(
|
override fun getFilterList(): List<Filter> = listOf(
|
||||||
|
Filter("is_completed", "Completed"),
|
||||||
Filter("genres[Action]", "Action"),
|
Filter("genres[Action]", "Action"),
|
||||||
Filter("genres[Adult]", "Adult"),
|
Filter("genres[Adult]", "Adult"),
|
||||||
Filter("genres[Adventure]", "Adventure"),
|
Filter("genres[Adventure]", "Adventure"),
|
||||||
|
@ -30,13 +30,17 @@ class Mangahere(override val id: Int) : ParsedOnlineSource() {
|
|||||||
|
|
||||||
override fun latestUpdatesSelector() = "div.directory_list > ul > li"
|
override fun latestUpdatesSelector() = "div.directory_list > ul > li"
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element, manga: Manga) {
|
private fun mangaFromElement(query: String, element: Element, manga: Manga) {
|
||||||
element.select("div.title > a").first().let {
|
element.select(query).first().let {
|
||||||
manga.setUrlWithoutDomain(it.attr("href"))
|
manga.setUrlWithoutDomain(it.attr("href"))
|
||||||
manga.title = it.attr("title")
|
manga.title = if (it.hasAttr("title")) it.attr("title") else if (it.hasAttr("rel")) it.attr("rel") else it.text()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun popularMangaFromElement(element: Element, manga: Manga) {
|
||||||
|
mangaFromElement("div.title > a", element, manga)
|
||||||
|
}
|
||||||
|
|
||||||
override fun latestUpdatesFromElement(element: Element, manga: Manga) {
|
override fun latestUpdatesFromElement(element: Element, manga: Manga) {
|
||||||
popularMangaFromElement(element, manga)
|
popularMangaFromElement(element, manga)
|
||||||
}
|
}
|
||||||
@ -50,10 +54,7 @@ class Mangahere(override val id: Int) : ParsedOnlineSource() {
|
|||||||
override fun searchMangaSelector() = "div.result_search > dl:has(dt)"
|
override fun searchMangaSelector() = "div.result_search > dl:has(dt)"
|
||||||
|
|
||||||
override fun searchMangaFromElement(element: Element, manga: Manga) {
|
override fun searchMangaFromElement(element: Element, manga: Manga) {
|
||||||
element.select("a.manga_info").first().let {
|
mangaFromElement("a.manga_info", element, manga)
|
||||||
manga.setUrlWithoutDomain(it.attr("href"))
|
|
||||||
manga.title = it.attr("title")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun searchMangaNextPageSelector() = "div.next-page > a.next"
|
override fun searchMangaNextPageSelector() = "div.next-page > a.next"
|
||||||
@ -135,6 +136,7 @@ class Mangahere(override val id: Int) : ParsedOnlineSource() {
|
|||||||
// [...document.querySelectorAll("select[id^='genres'")].map((el,i) => `Filter("${el.getAttribute('name')}", "${el.nextSibling.nextSibling.textContent.trim()}")`).join(',\n')
|
// [...document.querySelectorAll("select[id^='genres'")].map((el,i) => `Filter("${el.getAttribute('name')}", "${el.nextSibling.nextSibling.textContent.trim()}")`).join(',\n')
|
||||||
// http://www.mangahere.co/advsearch.htm
|
// http://www.mangahere.co/advsearch.htm
|
||||||
override fun getFilterList(): List<Filter> = listOf(
|
override fun getFilterList(): List<Filter> = listOf(
|
||||||
|
Filter("is_completed", "Completed"),
|
||||||
Filter("genres[Action]", "Action"),
|
Filter("genres[Action]", "Action"),
|
||||||
Filter("genres[Adventure]", "Adventure"),
|
Filter("genres[Adventure]", "Adventure"),
|
||||||
Filter("genres[Comedy]", "Comedy"),
|
Filter("genres[Comedy]", "Comedy"),
|
||||||
|
@ -66,8 +66,16 @@ class Mangasee(override val id: Int) : ParsedOnlineSource() {
|
|||||||
// Not used, overrides parent.
|
// Not used, overrides parent.
|
||||||
override fun popularMangaNextPageSelector() = ""
|
override fun popularMangaNextPageSelector() = ""
|
||||||
|
|
||||||
override fun searchMangaInitialUrl(query: String, filters: List<Filter>) =
|
override fun searchMangaInitialUrl(query: String, filters: List<Filter>): String {
|
||||||
"$baseUrl/search/request.php?sortBy=popularity&sortOrder=descending&keyword=$query&genre=${filters.map { it.id }.joinToString(",")}"
|
var url = "$baseUrl/search/request.php?sortBy=popularity&sortOrder=descending&keyword=$query"
|
||||||
|
var genres: String? = null
|
||||||
|
for (filter in filters) {
|
||||||
|
if (filter.equals(completedFilter)) url += "&status=Complete"
|
||||||
|
else if (genres == null) genres = filter.id
|
||||||
|
else genres += "," + filter.id
|
||||||
|
}
|
||||||
|
return if (genres == null) url else url + "&genre=$genres"
|
||||||
|
}
|
||||||
|
|
||||||
override fun searchMangaSelector() = "div.searchResults > div.requested > div.row"
|
override fun searchMangaSelector() = "div.searchResults > div.requested > div.row"
|
||||||
|
|
||||||
@ -168,9 +176,11 @@ class Mangasee(override val id: Int) : ParsedOnlineSource() {
|
|||||||
|
|
||||||
override fun imageUrlParse(document: Document): String = document.select("img.CurImage").attr("src")
|
override fun imageUrlParse(document: Document): String = document.select("img.CurImage").attr("src")
|
||||||
|
|
||||||
|
private val completedFilter = Filter("Complete", "Completed")
|
||||||
// [...document.querySelectorAll("label.triStateCheckBox input")].map(el => `Filter("${el.getAttribute('name')}", "${el.nextSibling.textContent.trim()}")`).join(',\n')
|
// [...document.querySelectorAll("label.triStateCheckBox input")].map(el => `Filter("${el.getAttribute('name')}", "${el.nextSibling.textContent.trim()}")`).join(',\n')
|
||||||
// http://mangasee.co/advanced-search/
|
// http://mangasee.co/advanced-search/
|
||||||
override fun getFilterList(): List<Filter> = listOf(
|
override fun getFilterList(): List<Filter> = listOf(
|
||||||
|
completedFilter,
|
||||||
Filter("Action", "Action"),
|
Filter("Action", "Action"),
|
||||||
Filter("Adult", "Adult"),
|
Filter("Adult", "Adult"),
|
||||||
Filter("Adventure", "Adventure"),
|
Filter("Adventure", "Adventure"),
|
||||||
@ -250,4 +260,4 @@ class Mangasee(override val id: Int) : ParsedOnlineSource() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -72,10 +72,12 @@ class Readmangatoday(override val id: Int) : ParsedOnlineSource() {
|
|||||||
val builder = okhttp3.FormBody.Builder()
|
val builder = okhttp3.FormBody.Builder()
|
||||||
builder.add("manga-name", query)
|
builder.add("manga-name", query)
|
||||||
builder.add("type", "all")
|
builder.add("type", "all")
|
||||||
builder.add("status", "both")
|
var status = "both"
|
||||||
for (filter in filters) {
|
for (filter in filters) {
|
||||||
builder.add("include[]", filter.id)
|
if (filter.equals(completedFilter)) status = filter.id
|
||||||
|
else builder.add("include[]", filter.id)
|
||||||
}
|
}
|
||||||
|
builder.add("status", status)
|
||||||
|
|
||||||
return POST(page.url, headers, builder.build())
|
return POST(page.url, headers, builder.build())
|
||||||
}
|
}
|
||||||
@ -154,9 +156,11 @@ class Readmangatoday(override val id: Int) : ParsedOnlineSource() {
|
|||||||
|
|
||||||
override fun imageUrlParse(document: Document) = document.select("img.img-responsive-2").first().attr("src")
|
override fun imageUrlParse(document: Document) = document.select("img.img-responsive-2").first().attr("src")
|
||||||
|
|
||||||
|
private val completedFilter = Filter("completed", "Completed")
|
||||||
// [...document.querySelectorAll("ul.manga-cat span")].map(el => `Filter("${el.getAttribute('data-id')}", "${el.nextSibling.textContent.trim()}")`).join(',\n')
|
// [...document.querySelectorAll("ul.manga-cat span")].map(el => `Filter("${el.getAttribute('data-id')}", "${el.nextSibling.textContent.trim()}")`).join(',\n')
|
||||||
// http://www.readmanga.today/advanced-search
|
// http://www.readmanga.today/advanced-search
|
||||||
override fun getFilterList(): List<Filter> = listOf(
|
override fun getFilterList(): List<Filter> = listOf(
|
||||||
|
completedFilter,
|
||||||
Filter("2", "Action"),
|
Filter("2", "Action"),
|
||||||
Filter("4", "Adventure"),
|
Filter("4", "Adventure"),
|
||||||
Filter("5", "Comedy"),
|
Filter("5", "Comedy"),
|
||||||
|
Loading…
Reference in New Issue
Block a user