From 6b2685998314bd11bc488a2ba05338f6623a5309 Mon Sep 17 00:00:00 2001 From: Taumer Date: Wed, 12 Sep 2018 18:08:53 +0300 Subject: [PATCH] Add categories for readmanga/mintmanga (#1607) * Add categories for readmanga/mintmanga * Fix pages with site static resources --- .../source/online/russian/Mintmanga.kt | 56 +++++++++++++++++-- .../source/online/russian/Readmanga.kt | 50 +++++++++++++++-- 2 files changed, 96 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Mintmanga.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Mintmanga.kt index 2aea6f57f2..e4a370ffff 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Mintmanga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Mintmanga.kt @@ -4,6 +4,7 @@ import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.* import eu.kanade.tachiyomi.source.online.ParsedHttpSource import okhttp3.Headers +import okhttp3.HttpUrl import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document @@ -52,8 +53,25 @@ class Mintmanga : ParsedHttpSource() { override fun latestUpdatesNextPageSelector() = "a.nextLink" override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val genres = filters.filterIsInstance().joinToString("&") { it.id + arrayOf("=", "=in", "=ex")[it.state] } - return GET("$baseUrl/search/advanced?q=$query&$genres", headers) + val url = HttpUrl.parse("$baseUrl/search/advanced")!!.newBuilder() + (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> + when (filter) { + is GenreList -> filter.state.forEach { genre -> + if (genre.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(genre.id, arrayOf("=", "=in", "=ex")[genre.state]) + } + } + is Category -> filter.state.forEach { category -> + if (category.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(category.id, arrayOf("=", "=in", "=ex")[category.state]) + } + } + } + } + if (!query.isEmpty()) { + url.addQueryParameter("q", query) + } + return GET(url.toString().replace("=%3D", "="), headers) } override fun searchMangaSelector() = popularMangaSelector() @@ -61,7 +79,7 @@ class Mintmanga : ParsedHttpSource() { override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) // max 200 results - override fun searchMangaNextPageSelector() = null + override fun searchMangaNextPageSelector(): Nothing? = null override fun mangaDetailsParse(document: Document): SManga { val infoElement = document.select("div.leftContent").first() @@ -133,7 +151,12 @@ class Mintmanga : ParsedHttpSource() { var i = 0 while (m.find()) { val urlParts = m.group().replace("[\"\']+".toRegex(), "").split(',') - pages.add(Page(i++, "", urlParts[1] + urlParts[0] + urlParts[2])) + val url = if (urlParts[1].isEmpty() && urlParts[2].startsWith("/static/")) { + baseUrl + urlParts[2] + } else { + urlParts[1] + urlParts[0] + urlParts[2] + } + pages.add(Page(i++, "", url)) } return pages } @@ -153,13 +176,34 @@ class Mintmanga : ParsedHttpSource() { } private class Genre(name: String, val id: String) : Filter.TriState(name) + private class GenreList(genres: List) : Filter.Group("Genres", genres) + private class Category(categories: List) : Filter.Group("Category", categories) - /* [...document.querySelectorAll("tr.advanced_option:nth-child(1) > td:nth-child(3) span.js-link")] - * .map(el => `Genre("${el.textContent.trim()}", $"{el.getAttribute('onclick') + /* [...document.querySelectorAll("tr.advanced_option:nth-child(1) > td:nth-child(3) span.js-link")] + * .map(el => `Genre("${el.textContent.trim()}", "${el.getAttribute('onclick') * .substr(31,el.getAttribute('onclick').length-33)"})`).join(',\n') * on http://mintmanga.com/search/advanced */ override fun getFilterList() = FilterList( + Category(getCategoryList()), + GenreList(getGenreList()) + ) + + private fun getCategoryList() = listOf( + Genre("В цвете", "el_4614"), + Genre("Веб", "el_1355"), + Genre("Выпуск приостановлен", "el_5232"), + Genre("Ёнкома", "el_2741"), + Genre("Комикс западный", "el_1903"), + Genre("Комикс русский", "el_2173"), + Genre("Манхва", "el_1873"), + Genre("Маньхуа", "el_1875"), + Genre("Не Яой", "el_1874"), + Genre("Ранобэ", "el_5688"), + Genre("Сборник", "el_1348") + ) + + private fun getGenreList() = listOf( Genre("арт", "el_2220"), Genre("бара", "el_1353"), Genre("боевик", "el_1346"), diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Readmanga.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Readmanga.kt index 0a489be812..a49817edd1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Readmanga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/russian/Readmanga.kt @@ -4,6 +4,7 @@ import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.* import eu.kanade.tachiyomi.source.online.ParsedHttpSource import okhttp3.Headers +import okhttp3.HttpUrl import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document @@ -52,8 +53,25 @@ class Readmanga : ParsedHttpSource() { override fun latestUpdatesNextPageSelector() = "a.nextLink" override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val genres = filters.filterIsInstance().joinToString("&") { it.id + arrayOf("=", "=in", "=ex")[it.state] } - return GET("$baseUrl/search/advanced?q=$query&$genres", headers) + val url = HttpUrl.parse("$baseUrl/search/advanced")!!.newBuilder() + (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> + when (filter) { + is GenreList -> filter.state.forEach { genre -> + if (genre.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(genre.id, arrayOf("=", "=in", "=ex")[genre.state]) + } + } + is Category -> filter.state.forEach { category -> + if (category.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(category.id, arrayOf("=", "=in", "=ex")[category.state]) + } + } + } + } + if (!query.isEmpty()) { + url.addQueryParameter("q", query) + } + return GET(url.toString().replace("=%3D", "="), headers) } override fun searchMangaSelector() = popularMangaSelector() @@ -61,7 +79,7 @@ class Readmanga : ParsedHttpSource() { override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) // max 200 results - override fun searchMangaNextPageSelector() = null + override fun searchMangaNextPageSelector(): Nothing? = null override fun mangaDetailsParse(document: Document): SManga { val infoElement = document.select("div.leftContent").first() @@ -133,7 +151,12 @@ class Readmanga : ParsedHttpSource() { var i = 0 while (m.find()) { val urlParts = m.group().replace("[\"\']+".toRegex(), "").split(',') - pages.add(Page(i++, "", urlParts[1] + urlParts[0] + urlParts[2])) + val url = if (urlParts[1].isEmpty() && urlParts[2].startsWith("/static/")) { + baseUrl + urlParts[2] + } else { + urlParts[1] + urlParts[0] + urlParts[2] + } + pages.add(Page(i++, "", url)) } return pages } @@ -153,6 +176,8 @@ class Readmanga : ParsedHttpSource() { } private class Genre(name: String, val id: String) : Filter.TriState(name) + private class GenreList(genres: List) : Filter.Group("Genres", genres) + private class Category(categories: List) : Filter.Group("Category", categories) /* [...document.querySelectorAll("tr.advanced_option:nth-child(1) > td:nth-child(3) span.js-link")] * .map(el => `Genre("${el.textContent.trim()}", $"{el.getAttribute('onclick') @@ -160,6 +185,23 @@ class Readmanga : ParsedHttpSource() { * on http://readmanga.me/search/advanced */ override fun getFilterList() = FilterList( + Category(getCategoryList()), + GenreList(getGenreList()) + ) + + private fun getCategoryList() = listOf( + Genre("В цвете", "el_7290"), + Genre("Веб", "el_2160"), + Genre("Выпуск приостановлен", "el_8033"), + Genre("Ёнкома", "el_2161"), + Genre("Комикс западный", "el_3515"), + Genre("Манхва", "el_3001"), + Genre("Маньхуа", "el_3002"), + Genre("Ранобэ", "el_8575"), + Genre("Сборник", "el_2157") + ) + + private fun getGenreList() = listOf( Genre("арт", "el_5685"), Genre("боевик", "el_2155"), Genre("боевые искусства", "el_2143"),