FMReader: Fallback to absolute date if relative date fails (#7980)

* use parseAbsoluteDate as fallback

* bump

* long
This commit is contained in:
bapeey 2025-03-08 19:35:10 -05:00 committed by Draff
parent 0f1cbebf96
commit 08c73abe63
No known key found for this signature in database
GPG Key ID: E8A89F3211677653
3 changed files with 60 additions and 53 deletions

View File

@ -2,4 +2,4 @@ plugins {
id("lib-multisrc") id("lib-multisrc")
} }
baseVersionCode = 9 baseVersionCode = 10

View File

@ -19,6 +19,7 @@ import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import org.jsoup.select.Elements import org.jsoup.select.Elements
import java.nio.charset.Charset import java.nio.charset.Charset
import java.text.ParseException
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Calendar import java.util.Calendar
import java.util.Locale import java.util.Locale
@ -246,7 +247,13 @@ abstract class FMReader(
name = element.attr(chapterNameAttrSelector).substringAfter("$mangaTitle ") name = element.attr(chapterNameAttrSelector).substringAfter("$mangaTitle ")
} }
} }
date_upload = element.select(chapterTimeSelector).let { if (it.hasText()) parseRelativeDate(it.text()) else 0 } date_upload = element.select(chapterTimeSelector).let { dateElement ->
if (dateElement.hasText()) {
parseRelativeDate(dateElement.text()).takeIf { it != 0L } ?: parseAbsoluteDate(dateElement.text())
} else {
0L
}
}
} }
} }
@ -257,55 +264,63 @@ abstract class FMReader(
open val dateWordIndex = 1 open val dateWordIndex = 1
open fun parseRelativeDate(date: String): Long { open fun parseRelativeDate(date: String): Long {
val value = date.split(' ')[dateValueIndex].toInt() try {
val dateWord = date.split(' ')[dateWordIndex].let { val value = date.split(' ')[dateValueIndex].toInt()
if (it.contains("(")) { val dateWord = date.split(' ')[dateWordIndex].let {
it.substringBefore("(") if (it.contains("(")) {
} else { it.substringBefore("(")
it.substringBefore("s") } else {
it.substringBefore("s")
}
} }
}
// languages: en, vi, es, tr // languages: en, vi, es, tr
return when (dateWord) { return when (dateWord) {
"min", "minute", "phút", "minuto", "dakika" -> Calendar.getInstance().apply { "min", "minute", "phút", "minuto", "dakika" -> Calendar.getInstance().apply {
add(Calendar.MINUTE, -value) add(Calendar.MINUTE, -value)
set(Calendar.SECOND, 0) set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0) set(Calendar.MILLISECOND, 0)
}.timeInMillis }.timeInMillis
"hour", "giờ", "hora", "saat" -> Calendar.getInstance().apply { "hour", "giờ", "hora", "saat" -> Calendar.getInstance().apply {
add(Calendar.HOUR_OF_DAY, -value) add(Calendar.HOUR_OF_DAY, -value)
set(Calendar.SECOND, 0) set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0) set(Calendar.MILLISECOND, 0)
}.timeInMillis }.timeInMillis
"day", "ngày", "día", "gün" -> Calendar.getInstance().apply { "day", "ngày", "día", "gün" -> Calendar.getInstance().apply {
add(Calendar.DATE, -value) add(Calendar.DATE, -value)
set(Calendar.SECOND, 0) set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0) set(Calendar.MILLISECOND, 0)
}.timeInMillis }.timeInMillis
"week", "tuần", "semana", "hafta" -> Calendar.getInstance().apply { "week", "tuần", "semana", "hafta" -> Calendar.getInstance().apply {
add(Calendar.DATE, -value * 7) add(Calendar.DATE, -value * 7)
set(Calendar.SECOND, 0) set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0) set(Calendar.MILLISECOND, 0)
}.timeInMillis }.timeInMillis
"month", "tháng", "mes", "ay" -> Calendar.getInstance().apply { "month", "tháng", "mes", "ay" -> Calendar.getInstance().apply {
add(Calendar.MONTH, -value) add(Calendar.MONTH, -value)
set(Calendar.SECOND, 0) set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0) set(Calendar.MILLISECOND, 0)
}.timeInMillis }.timeInMillis
"year", "năm", "año", "yıl" -> Calendar.getInstance().apply { "year", "năm", "año", "yıl" -> Calendar.getInstance().apply {
add(Calendar.YEAR, -value) add(Calendar.YEAR, -value)
set(Calendar.SECOND, 0) set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0) set(Calendar.MILLISECOND, 0)
}.timeInMillis }.timeInMillis
else -> { else -> {
return 0 return 0L
}
} }
} catch (_: Exception) {
return 0L
} }
} }
open fun parseAbsoluteDate(dateStr: String): Long { open fun parseAbsoluteDate(dateStr: String): Long {
return runCatching { dateFormat.parse(dateStr)?.time } return try {
.getOrNull() ?: 0L dateFormat.parse(dateStr)?.time ?: 0L
} catch (_: ParseException) {
0L
}
} }
open val pageListImageSelector = "img.chapter-img" open val pageListImageSelector = "img.chapter-img"

View File

@ -1,8 +1,6 @@
package eu.kanade.tachiyomi.extension.en.holymanga package eu.kanade.tachiyomi.extension.en.holymanga
import eu.kanade.tachiyomi.multisrc.fmreader.FMReader import eu.kanade.tachiyomi.multisrc.fmreader.FMReader
import eu.kanade.tachiyomi.source.model.SChapter
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
@ -15,10 +13,4 @@ class HolyManga : FMReader(
override val versionId = 2 override val versionId = 2
override val chapterUrlSelector = "" override val chapterUrlSelector = ""
override fun chapterFromElement(element: Element, mangaTitle: String): SChapter {
return super.chapterFromElement(element, mangaTitle).apply {
date_upload = element.select(chapterTimeSelector).text().let { parseAbsoluteDate(it) }
}
}
} }