From b599acce0c8cc17df8275cd5f5c2799410fe1635 Mon Sep 17 00:00:00 2001 From: happywillow0 <45346080+happywillow0@users.noreply.github.com> Date: Mon, 21 Oct 2019 15:28:34 -0400 Subject: [PATCH] [Improvement] My Reading Manga - Search (#1683) [Improvement] My Reading Manga - Search --- src/all/myreadingmanga/build.gradle | 2 +- .../all/myreadingmanga/MyReadingManga.kt | 139 +++++++++++------- 2 files changed, 90 insertions(+), 51 deletions(-) diff --git a/src/all/myreadingmanga/build.gradle b/src/all/myreadingmanga/build.gradle index deb305273..c6158b833 100644 --- a/src/all/myreadingmanga/build.gradle +++ b/src/all/myreadingmanga/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: MyReadingManga' pkgNameSuffix = 'all.myreadingmanga' extClass = '.MyReadingMangaFactory' - extVersionCode = 27 + extVersionCode = 28 libVersion = '1.2' } diff --git a/src/all/myreadingmanga/src/eu/kanade/tachiyomi/extension/all/myreadingmanga/MyReadingManga.kt b/src/all/myreadingmanga/src/eu/kanade/tachiyomi/extension/all/myreadingmanga/MyReadingManga.kt index 2f34bef9d..feebc252f 100644 --- a/src/all/myreadingmanga/src/eu/kanade/tachiyomi/extension/all/myreadingmanga/MyReadingManga.kt +++ b/src/all/myreadingmanga/src/eu/kanade/tachiyomi/extension/all/myreadingmanga/MyReadingManga.kt @@ -17,63 +17,65 @@ import java.util.concurrent.TimeUnit open class MyReadingManga(override val lang: String) : ParsedHttpSource() { + //Basic Info override val name = "MyReadingManga" - override val baseUrl = "https://myreadingmanga.info" - override val client: OkHttpClient = network.cloudflareClient.newBuilder() - .connectTimeout(1, TimeUnit.MINUTES) - .readTimeout(1, TimeUnit.MINUTES) - .retryOnConnectionFailure(true) - .followRedirects(true) - .build()!! + .connectTimeout(1, TimeUnit.MINUTES) + .readTimeout(1, TimeUnit.MINUTES) + .retryOnConnectionFailure(true) + .followRedirects(true) + .build()!! + override val supportsLatest = true - override val supportsLatest = false + //GET Selectors + override fun popularMangaSelector() = searchMangaSelector() + override fun latestUpdatesSelector() = "article" + override fun searchMangaSelector() = "div.results-by-facets div[id*=res]" - override fun popularMangaSelector() = "article" - - override fun latestUpdatesSelector() = "" + //Next Page Selector + override fun popularMangaNextPageSelector() = searchMangaNextPageSelector() + override fun latestUpdatesNextPageSelector() = "li.pagination-next" + override fun searchMangaNextPageSelector() = throw Exception("Not used") + //GET and Parse for Popular and Latest override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl/page/$page/", headers) + return GET("$baseUrl/search/?wpsolr_sort=sort_by_random&wpsolr_page=$page", headers) // Random Manga as returned by search + } + override fun latestUpdatesRequest(page: Int): Request { + return GET("$baseUrl/page/$page/", headers) //Home Page - Latest Manga } - override fun latestUpdatesRequest(page: Int) = popularMangaRequest(page) - - override fun popularMangaParse(response: Response): MangasPage { + override fun popularMangaParse(response: Response) = searchMangaParse(response) + override fun latestUpdatesParse(response: Response): MangasPage { val document = response.asJsoup() - val mangas = mutableListOf() - val list = document.select(popularMangaSelector()).filter { element -> + val list = document.select(latestUpdatesSelector()).filter { element -> val select = element.select("a[rel=bookmark]") select.text().contains("[$lang", true) } for (element in list) { - mangas.add(popularMangaFromElement(element)) + mangas.add(latestUpdatesFromElement(element)) } - val hasNextPage = popularMangaNextPageSelector().let { selector -> + val hasNextPage = latestUpdatesNextPageSelector().let { selector -> document.select(selector).first() } != null return MangasPage(mangas, hasNextPage) } - override fun popularMangaFromElement(element: Element) = buildManga(element.select("a[rel]").first(), element.select("a.entry-image-link img").first()) - - override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) - - override fun popularMangaNextPageSelector() = "li.pagination-next" - - override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() + override fun popularMangaFromElement(element: Element) = searchMangaFromElement(element) + override fun latestUpdatesFromElement(element: Element) = buildManga(element.select("a[rel]").first(), element.select("a.entry-image-link img").first()) + //Search override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - - val query2 = URLEncoder.encode(query, "UTF-8") val uri = if (query.isNotBlank()) { Uri.parse("$baseUrl/search/").buildUpon() - .appendEncodedPath(query2) + .appendQueryParameter("search", query) + .appendQueryParameter("wpsolr_page", page.toString()) + } else { val uri = Uri.parse("$baseUrl/").buildUpon() //Append uri filters @@ -81,18 +83,50 @@ open class MyReadingManga(override val lang: String) : ParsedHttpSource() { if (it is UriFilter) it.addToUri(uri) } - uri + uri.appendPath("page").appendPath("$page") } - uri.appendPath("page").appendPath("$page") return GET(uri.toString(), headers) } + override fun searchMangaParse(response: Response): MangasPage { + val document = response.asJsoup() + val mangas = mutableListOf() + //Process Search Results + if (document.baseUri().contains("search", true)) { + val elements = document.select(searchMangaSelector()) + for (element in elements) { + if (element.text().contains("[$lang", true)) { + mangas.add(searchMangaFromElement(element)) + } + } + val hasNextPage = searchMangaSelector().let { selector -> + document.select(selector).first() + } != null - override fun searchMangaParse(response: Response) = popularMangaParse(response) + return MangasPage(mangas, hasNextPage) + } + //Process Filter Results / Same theme as home page + else { + //return popularMangaParse(response) + val list = document.select(latestUpdatesSelector()).filter { element -> + val select = element.select("a[rel=bookmark]") + select.text().contains("[$lang", true) + } + for (element in list) { + mangas.add(latestUpdatesFromElement(element)) - override fun searchMangaSelector() = popularMangaSelector() + } + + val hasNextPage = latestUpdatesNextPageSelector().let { selector -> + document.select(selector).first() + } != null + + return MangasPage(mangas, hasNextPage) + } + } + + override fun searchMangaFromElement(element: Element) = buildManga(element.select("a").first(), element.select("img").first()) - override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) private fun buildManga(titleElement: Element, thumbnailElement: Element): SManga { val manga = SManga.create() manga.setUrlWithoutDomain(titleElement.attr("href")) @@ -103,11 +137,11 @@ open class MyReadingManga(override val lang: String) : ParsedHttpSource() { private fun getImage(element: Element): String { var url = - when { - element.attr("data-src").endsWith(".jpg") || element.attr("data-src").endsWith(".png") || element.attr("data-src").endsWith(".jpeg") -> element.attr("data-src") - element.attr("src").endsWith(".jpg") || element.attr("src").endsWith(".png") || element.attr("src").endsWith(".jpeg") -> element.attr("src") - else -> element.attr("data-lazy-src") - } + when { + element.attr("data-src").endsWith(".jpg") || element.attr("data-src").endsWith(".png") || element.attr("data-src").endsWith(".jpeg") -> element.attr("data-src") + element.attr("src").endsWith(".jpg") || element.attr("src").endsWith(".png") || element.attr("src").endsWith(".jpeg") -> element.attr("src") + else -> element.attr("data-lazy-src") + } if (url.startsWith("//")) { url = "http:$url" } @@ -118,9 +152,11 @@ open class MyReadingManga(override val lang: String) : ParsedHttpSource() { private fun getThumbnail(thumbnailUrl: String) = thumbnailUrl.substringBeforeLast("-") + "." + thumbnailUrl.substringAfterLast(".") //cleans up the name removing author and language from the title - private fun cleanTitle(title: String) = title.substringBeforeLast("[").substringAfterLast("]").substringBeforeLast("(") - private fun cleanAuthor(title: String) = title.substringAfter("[").substringBefore("]") + private fun cleanTitle(title: String) = title.substringBeforeLast("[").substringAfterLast("]").substringBeforeLast("(").trim() + private fun cleanAuthor(author: String) = author.substringAfter("[").substringBefore("]").trim() + + //Start Manga Details override fun fetchMangaDetails(manga: SManga): Observable { val needCover = manga.thumbnail_url.isNullOrEmpty() @@ -135,7 +171,7 @@ open class MyReadingManga(override val lang: String) : ParsedHttpSource() { val manga = SManga.create() manga.author = cleanAuthor(document.select("h1").text()) manga.artist = cleanAuthor(document.select("h1").text()) - val glist = document.select(".entry-header p a[href*=genre]").map { it -> it.text() } + val glist = document.select(".entry-header p a[href*=genre]").map { it.text() } manga.genre = glist.joinToString(", ") manga.description = document.select("h1").text() + "\n" + document.select(".info-class")?.text() manga.status = when (document.select("a[href*=status]")?.first()?.text()) { @@ -154,6 +190,8 @@ open class MyReadingManga(override val lang: String) : ParsedHttpSource() { override fun mangaDetailsParse(document: Document) = throw Exception("Not used") + + //Start Chapter Get override fun chapterListSelector() = ".entry-pagination a" override fun chapterListParse(response: Response): List { @@ -194,11 +232,11 @@ open class MyReadingManga(override val lang: String) : ParsedHttpSource() { return chapter } - override fun searchMangaNextPageSelector() = throw Exception("Not used") - override fun chapterFromElement(element: Element) = throw Exception("Not used") + + //Start Page Get override fun pageListParse(response: Response): List { val body = response.asJsoup() val pages = mutableListOf() @@ -213,12 +251,13 @@ open class MyReadingManga(override val lang: String) : ParsedHttpSource() { override fun imageUrlRequest(page: Page) = throw Exception("Not used") override fun imageUrlParse(document: Document) = throw Exception("Not used") + //Filter Parsing, grabs home page as document and filters out Genres, Popular Tags, and Catagorys private val filterdoc:Document? = try { OkHttpClient().newCall(GET("$baseUrl", headers)).execute().asJsoup() } catch (e: IOException) {null} private val genresarray = filterdoc?.select(".tagcloud a[href*=/genre/]")?.map { Pair(it.attr("href").substringBeforeLast("/").substringAfterLast("/"), it.text())}?.toTypedArray() ?: arrayOf(Pair("","Error getting filters, try restarting app")) private val poptagarray = filterdoc?.select(".tagcloud a[href*=/tag/]")?.map { Pair(it.attr("href").substringBeforeLast("/").substringAfterLast("/"), it.text())}?.toTypedArray() ?: arrayOf(Pair("","Error getting filters, try restarting app")) private val cattagarray = filterdoc?.select(".level-0")?.map { Pair(it.attr("value"), it.text())}?.toTypedArray() ?: arrayOf(Pair("","Error getting filters, try restarting app")) - + //Generates the filter lists for app override fun getFilterList(): FilterList { val filterList = FilterList( @@ -243,8 +282,8 @@ open class MyReadingManga(override val lang: String) : ParsedHttpSource() { */ //vals: private open class UriSelectFilterPath(displayName: String, val uriParam: String, val vals: Array>, - val firstIsUnspecified: Boolean = true, - defaultValue: Int = 0) : + val firstIsUnspecified: Boolean = true, + defaultValue: Int = 0) : Filter.Select(displayName, vals.map { it.second }.toTypedArray(), defaultValue), UriFilter { override fun addToUri(uri: Uri.Builder) { if (state != 0 || !firstIsUnspecified) @@ -253,8 +292,8 @@ open class MyReadingManga(override val lang: String) : ParsedHttpSource() { } } private open class UriSelectFilterQuery(displayName: String, val uriParam: String, val vals: Array>, - val firstIsUnspecified: Boolean = true, - defaultValue: Int = 0) : + val firstIsUnspecified: Boolean = true, + defaultValue: Int = 0) : Filter.Select(displayName, vals.map { it.second }.toTypedArray(), defaultValue), UriFilter { override fun addToUri(uri: Uri.Builder) { if (state != 0 || !firstIsUnspecified) @@ -268,5 +307,5 @@ open class MyReadingManga(override val lang: String) : ParsedHttpSource() { private interface UriFilter { fun addToUri(uri: Uri.Builder) } - + }