Fixed chapter dates (#8829)

This commit is contained in:
Arraiment 2021-08-25 18:19:04 +08:00 committed by GitHub
parent 10ba7dfbe5
commit f2d745d540
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 44 deletions

View File

@ -5,7 +5,7 @@ ext {
extName = 'MangaJar' extName = 'MangaJar'
pkgNameSuffix = 'en.mangajar' pkgNameSuffix = 'en.mangajar'
extClass = '.MangaJar' extClass = '.MangaJar'
extVersionCode = 6 extVersionCode = 7
libVersion = '1.2' libVersion = '1.2'
} }

View File

@ -32,18 +32,12 @@ class MangaJar : ParsedHttpSource() {
override val client: OkHttpClient = network.cloudflareClient override val client: OkHttpClient = network.cloudflareClient
// Popular
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga?sortBy=popular&page=$page")
override fun popularMangaSelector() = "article[class*=flex-item]" override fun popularMangaSelector() = "article[class*=flex-item]"
override fun popularMangaRequest(page: Int): Request {
return GET("$baseUrl/manga?sortBy=popular&page=$page")
}
override fun latestUpdatesSelector() = popularMangaSelector()
override fun latestUpdatesRequest(page: Int): Request {
return GET("$baseUrl/manga?sortBy=last_chapter_at&page=$page")
}
override fun popularMangaFromElement(element: Element) = SManga.create().apply { override fun popularMangaFromElement(element: Element) = SManga.create().apply {
setUrlWithoutDomain(element.select("a").attr("href")) setUrlWithoutDomain(element.select("a").attr("href"))
title = element.select("img").attr("title") title = element.select("img").attr("title")
@ -53,15 +47,23 @@ class MangaJar : ParsedHttpSource() {
} }
} }
override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element) override fun popularMangaNextPageSelector() = "a.page-link[rel=next]"
override fun popularMangaNextPageSelector() = "[rel=next]" // Latest
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga?sortBy=last_chapter_at&page=$page")
override fun latestUpdatesSelector() = popularMangaSelector()
override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element)
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
// Search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val filters = if (filters.isEmpty()) getFilterList() else filters val filterList = if (filters.isEmpty()) getFilterList() else filters
val genreFilter = filters.findInstance<GenreList>() val genreFilter = filterList.findInstance<GenreList>()
val genre = genreFilter?.let { f -> f.values[f.state] } val genre = genreFilter?.let { f -> f.values[f.state] }
val url = (if (genre!!.isEmpty()) "$baseUrl/search" else "$baseUrl/genre/$genre").toHttpUrlOrNull()!!.newBuilder() val url = (if (genre!!.isEmpty()) "$baseUrl/search" else "$baseUrl/genre/$genre").toHttpUrlOrNull()!!.newBuilder()
@ -69,19 +71,16 @@ class MangaJar : ParsedHttpSource() {
url.addQueryParameter("q", query) url.addQueryParameter("q", query)
url.addQueryParameter("page", page.toString()) url.addQueryParameter("page", page.toString())
( for (filter in filterList) {
filters.forEach { filter -> when (filter) {
when (filter) { is OrderBy -> {
is OrderBy -> { url.addQueryParameter("sortBy", filter.toUriPart())
url.addQueryParameter("sortBy", filter.toUriPart()) }
} is SortBy -> {
is SortBy -> { url.addQueryParameter("sortAscending", filter.toUriPart())
url.addQueryParameter("sortAscending", filter.toUriPart())
}
} }
} }
) }
return GET(url.toString(), headers) return GET(url.toString(), headers)
} }
@ -91,6 +90,8 @@ class MangaJar : ParsedHttpSource() {
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
// Details
override fun mangaDetailsParse(document: Document) = SManga.create().apply { override fun mangaDetailsParse(document: Document) = SManga.create().apply {
description = document.select("div.manga-description.entry").text() description = document.select("div.manga-description.entry").text()
thumbnail_url = document.select("div.row > div > img").attr("src") thumbnail_url = document.select("div.row > div > img").attr("src")
@ -104,6 +105,11 @@ class MangaJar : ParsedHttpSource() {
else -> SManga.UNKNOWN else -> SManga.UNKNOWN
} }
// Chapters
/** For the first page. Pagination is done in [findChapters] */
override fun chapterListRequest(manga: SManga) = GET(baseUrl + manga.url + "/chaptersList")
override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> { override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> {
return findChapters(chapterListRequest(manga)).toObservable() return findChapters(chapterListRequest(manga)).toObservable()
} }
@ -117,6 +123,7 @@ class MangaJar : ParsedHttpSource() {
url = link.attr("href") url = link.attr("href")
name = link.text() name = link.text()
chapter_number = 0f chapter_number = 0f
date_upload = parseChapterDate(chapter.select("span.chapter-date").text().trim())
} }
} }
val nextPageLink = document.select("a.page-link[rel=\"next\"]").firstOrNull() val nextPageLink = document.select("a.page-link[rel=\"next\"]").firstOrNull()
@ -130,33 +137,19 @@ class MangaJar : ParsedHttpSource() {
} }
} }
/** For the first page. Pagination is done in [findChapters] */
override fun chapterListRequest(manga: SManga) = GET(baseUrl + manga.url + "/chaptersList")
override fun chapterListSelector() = "li.list-group-item.chapter-item" override fun chapterListSelector() = "li.list-group-item.chapter-item"
override fun chapterFromElement(element: Element) = SChapter.create().apply { override fun chapterFromElement(element: Element) = throw Exception("Not Used")
setUrlWithoutDomain(element.select("a").attr("href"))
name = element.select("span.chapter-title").text().trim()
date_upload = parseChapterDate(element.select("span.chapter-date").text().trim()) ?: 0
}
// The following date related code is taken directly from Genkan.kt private fun parseChapterDate(string: String): Long {
companion object {
val dateFormat by lazy {
SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH)
}
}
private fun parseChapterDate(string: String): Long? {
return if ("ago" in string) { return if ("ago" in string) {
parseRelativeDate(string) ?: 0 parseRelativeDate(string)
} else { } else {
dateFormat.parse(string)?.time ?: 0L dateFormat.parse(string)?.time ?: 0L
} }
} }
private fun parseRelativeDate(date: String): Long? { private fun parseRelativeDate(date: String): Long {
val trimmedDate = date.substringBefore(" ago").removeSuffix("s").split(" ") val trimmedDate = date.substringBefore(" ago").removeSuffix("s").split(" ")
val calendar = Calendar.getInstance() val calendar = Calendar.getInstance()
@ -172,6 +165,8 @@ class MangaJar : ParsedHttpSource() {
return calendar.timeInMillis return calendar.timeInMillis
} }
// Page List
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> {
return document.select("img[data-page]").mapIndexed { i, element -> return document.select("img[data-page]").mapIndexed { i, element ->
Page(i, "", if (element.hasAttr("data-src")) element.attr("abs:data-src") else element.attr("abs:src")) Page(i, "", if (element.hasAttr("data-src")) element.attr("abs:data-src") else element.attr("abs:src"))
@ -180,6 +175,8 @@ class MangaJar : ParsedHttpSource() {
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used") override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used")
// Filters
override fun getFilterList() = FilterList( override fun getFilterList() = FilterList(
OrderBy(), OrderBy(),
SortBy(), SortBy(),
@ -265,4 +262,11 @@ class MangaJar : ParsedHttpSource() {
Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) {
fun toUriPart() = vals[state].second fun toUriPart() = vals[state].second
} }
// The following date related code is taken directly from Genkan.kt
companion object {
val dateFormat by lazy {
SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH)
}
}
} }