[Improvement] My Reading Manga - Search (#1683)
[Improvement] My Reading Manga - Search
This commit is contained in:
parent
78f274e27d
commit
b599acce0c
@ -5,7 +5,7 @@ ext {
|
||||
appName = 'Tachiyomi: MyReadingManga'
|
||||
pkgNameSuffix = 'all.myreadingmanga'
|
||||
extClass = '.MyReadingMangaFactory'
|
||||
extVersionCode = 27
|
||||
extVersionCode = 28
|
||||
libVersion = '1.2'
|
||||
}
|
||||
|
||||
|
@ -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<SManga>()
|
||||
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<SManga>()
|
||||
//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<SManga> {
|
||||
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<SChapter> {
|
||||
@ -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<Page> {
|
||||
val body = response.asJsoup()
|
||||
val pages = mutableListOf<Page>()
|
||||
@ -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: <name, display>
|
||||
private open class UriSelectFilterPath(displayName: String, val uriParam: String, val vals: Array<Pair<String, String>>,
|
||||
val firstIsUnspecified: Boolean = true,
|
||||
defaultValue: Int = 0) :
|
||||
val firstIsUnspecified: Boolean = true,
|
||||
defaultValue: Int = 0) :
|
||||
Filter.Select<String>(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<Pair<String, String>>,
|
||||
val firstIsUnspecified: Boolean = true,
|
||||
defaultValue: Int = 0) :
|
||||
val firstIsUnspecified: Boolean = true,
|
||||
defaultValue: Int = 0) :
|
||||
Filter.Select<String>(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)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user