fix(tr/mangatr): Fix page list (#19490)

* fix: Fix page list

* refactor: Minor "refactoration" for fun

* chore: Bump version
This commit is contained in:
Claudemirovsky 2023-12-30 18:55:16 -03:00 committed by GitHub
parent ff89737d57
commit ffec0fa53d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 54 deletions

View File

@ -10,92 +10,95 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.Headers
import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import rx.Observable import rx.Observable
class MangaTR : FMReader("Manga-TR", "https://manga-tr.com", "tr") { class MangaTR : FMReader("Manga-TR", "https://manga-tr.com", "tr") {
override fun headersBuilder() = Headers.Builder().apply { override fun headersBuilder() = super.headersBuilder()
add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64)") .add("Accept-Language", "en-US,en;q=0.5")
}
override fun popularMangaNextPageSelector() = "div.btn-group:not(div.btn-block) button.btn-info" override fun popularMangaNextPageSelector() = "div.btn-group:not(div.btn-block) button.btn-info"
// =============================== Search ===============================
// TODO: genre search possible but a bit of a pain // TODO: genre search possible but a bit of a pain
override fun getFilterList() = FilterList() override fun getFilterList() = FilterList()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/arama.html?icerik=$query", headers) override fun searchMangaRequest(page: Int, query: String, filters: FilterList) =
override fun searchMangaParse(response: Response): MangasPage { GET("$baseUrl/arama.html?icerik=$query", headers)
val mangas = mutableListOf<SManga>()
response.asJsoup().select("div.row a[data-toggle]") override fun searchMangaParse(response: Response): MangasPage {
val mangas = response.use { it.asJsoup() }
.select("div.row a[data-toggle]")
.filterNot { it.siblingElements().text().contains("Novel") } .filterNot { it.siblingElements().text().contains("Novel") }
.map { mangas.add(searchMangaFromElement(it)) } .map(::searchMangaFromElement)
return MangasPage(mangas, false) return MangasPage(mangas, false)
} }
override fun searchMangaFromElement(element: Element): SManga { override fun searchMangaFromElement(element: Element) = SManga.create().apply {
val manga = SManga.create() setUrlWithoutDomain(element.absUrl("href"))
title = element.text()
manga.setUrlWithoutDomain(element.attr("abs:href"))
manga.title = element.text()
return manga
} }
override fun mangaDetailsParse(document: Document): SManga { // =========================== Manga Details ============================
val manga = SManga.create() override fun mangaDetailsParse(document: Document) = SManga.create().apply {
val infoElement: Element = document.select("div#tab1").first()!! val infoElement = document.selectFirst("div#tab1")!!
infoElement.selectFirst("table + table tr + tr")?.run {
manga.author = infoElement.select("table + table tr + tr td a").first()?.text() author = selectFirst("td:nth-child(1) a")?.text()
manga.artist = infoElement.select("table + table tr + tr td + td a").first()?.text() artist = selectFirst("td:nth-child(2) a")?.text()
manga.genre = infoElement.select("div#tab1 table + table tr + tr td + td + td").text() genre = selectFirst("td:nth-child(3)")?.text()
manga.description = infoElement.select("div.well").text().trim()
manga.thumbnail_url = document.select("img.thumbnail").attr("abs:src")
manga.status = document.select("table.table:nth-child(2) > tbody:nth-child(1) > tr:nth-child(2) td").let {
val translationStatus = it[it.size - 2].text()
parseStatus(translationStatus)
} }
return manga description = infoElement.selectFirst("div.well")?.ownText()?.trim()
thumbnail_url = document.selectFirst("img.thumbnail")?.absUrl("src")
status = infoElement.selectFirst("tr:contains(Çeviri Durumu) + tr > td:nth-child(2)")
.let { parseStatus(it?.text()) }
} }
// ============================== Chapters ==============================
override fun chapterListSelector() = "tr.table-bordered" override fun chapterListSelector() = "tr.table-bordered"
override val chapterUrlSelector = "td[align=left] > a" override val chapterUrlSelector = "td[align=left] > a"
override val chapterTimeSelector = "td[align=right]" override val chapterTimeSelector = "td[align=right]"
private val chapterListHeaders = headers.newBuilder().add("X-Requested-With", "XMLHttpRequest").build()
private val chapterListHeaders by lazy {
headersBuilder().add("X-Requested-With", "XMLHttpRequest").build()
}
override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> { override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> {
val requestUrl = "$baseUrl/cek/fetch_pages_manga.php?manga_cek=${manga.url.substringAfter("manga-").substringBefore(".")}" val id = manga.url.substringAfter("manga-").substringBefore(".")
val requestUrl = "$baseUrl/cek/fetch_pages_manga.php?manga_cek=$id"
return client.newCall(GET(requestUrl, chapterListHeaders)) return client.newCall(GET(requestUrl, chapterListHeaders))
.asObservableSuccess() .asObservableSuccess()
.map { response -> .map(::chapterListParse)
chapterListParse(response, requestUrl)
}
} }
private fun chapterListParse(response: Response, requestUrl: String): List<SChapter> { override fun chapterListParse(response: Response): List<SChapter> {
val chapters = mutableListOf<SChapter>()
var document = response.asJsoup()
var moreChapters = true
var nextPage = 2
// chapters are paginated // chapters are paginated
while (moreChapters) { val chapters = buildList {
document.select(chapterListSelector()).map { chapters.add(chapterFromElement(it)) } val requestUrl = response.request.url.toString()
if (document.select("a[data-page=$nextPage]").isNotEmpty()) { var nextPage = 2
val body = FormBody.Builder() do {
.add("page", nextPage.toString()) val doc = when {
.build() isEmpty() -> response
document = client.newCall(POST(requestUrl, chapterListHeaders, body)).execute().asJsoup() else -> {
nextPage++ val body = FormBody.Builder()
} else { .add("page", nextPage.toString())
moreChapters = false .build()
} nextPage++
client.newCall(POST(requestUrl, chapterListHeaders, body)).execute()
}
}.use { it.asJsoup() }
addAll(doc.select(chapterListSelector()).map(::chapterFromElement))
} while (doc.selectFirst("a[data-page=$nextPage]") != null)
} }
return chapters return chapters
} }
override fun pageListRequest(chapter: SChapter): Request = GET("$baseUrl/${chapter.url.substringAfter("cek/")}", headers) override fun pageListRequest(chapter: SChapter) =
GET("$baseUrl/${chapter.url.substringAfter("cek/")}", headers)
} }

View File

@ -16,7 +16,7 @@ class FMReaderGenerator : ThemeSourceGenerator {
MultiLang("Manhwa18.net", "https://manhwa18.net", listOf("en", "ko"), className = "Manhwa18NetFactory", isNsfw = true, overrideVersionCode = 1), MultiLang("Manhwa18.net", "https://manhwa18.net", listOf("en", "ko"), className = "Manhwa18NetFactory", isNsfw = true, overrideVersionCode = 1),
SingleLang("Epik Manga", "https://www.epikmanga.com", "tr"), SingleLang("Epik Manga", "https://www.epikmanga.com", "tr"),
SingleLang("KissLove", "https://klz9.com", "ja", isNsfw = true, overrideVersionCode = 4), SingleLang("KissLove", "https://klz9.com", "ja", isNsfw = true, overrideVersionCode = 4),
SingleLang("Manga-TR", "https://manga-tr.com", "tr", className = "MangaTR", overrideVersionCode = 1), SingleLang("Manga-TR", "https://manga-tr.com", "tr", className = "MangaTR", overrideVersionCode = 2),
SingleLang("ManhuaRock", "https://manhuarock.net", "vi", overrideVersionCode = 1), SingleLang("ManhuaRock", "https://manhuarock.net", "vi", overrideVersionCode = 1),
SingleLang("Manhwa18", "https://manhwa18.com", "en", isNsfw = true, overrideVersionCode = 2), SingleLang("Manhwa18", "https://manhwa18.com", "en", isNsfw = true, overrideVersionCode = 2),
SingleLang("Say Truyen", "https://saytruyenvip.com", "vi", overrideVersionCode = 3), SingleLang("Say Truyen", "https://saytruyenvip.com", "vi", overrideVersionCode = 3),