From 08c73abe63be2634433c1cb3c4504efa218e068e Mon Sep 17 00:00:00 2001 From: bapeey <90949336+bapeey@users.noreply.github.com> Date: Sat, 8 Mar 2025 19:35:10 -0500 Subject: [PATCH] FMReader: Fallback to absolute date if relative date fails (#7980) * use parseAbsoluteDate as fallback * bump * long --- lib-multisrc/fmreader/build.gradle.kts | 2 +- .../tachiyomi/multisrc/fmreader/FMReader.kt | 103 ++++++++++-------- .../extension/en/holymanga/HolyManga.kt | 8 -- 3 files changed, 60 insertions(+), 53 deletions(-) diff --git a/lib-multisrc/fmreader/build.gradle.kts b/lib-multisrc/fmreader/build.gradle.kts index d1d9afd6e..8047e9e33 100644 --- a/lib-multisrc/fmreader/build.gradle.kts +++ b/lib-multisrc/fmreader/build.gradle.kts @@ -2,4 +2,4 @@ plugins { id("lib-multisrc") } -baseVersionCode = 9 +baseVersionCode = 10 diff --git a/lib-multisrc/fmreader/src/eu/kanade/tachiyomi/multisrc/fmreader/FMReader.kt b/lib-multisrc/fmreader/src/eu/kanade/tachiyomi/multisrc/fmreader/FMReader.kt index 7ce035fc4..8d802d868 100644 --- a/lib-multisrc/fmreader/src/eu/kanade/tachiyomi/multisrc/fmreader/FMReader.kt +++ b/lib-multisrc/fmreader/src/eu/kanade/tachiyomi/multisrc/fmreader/FMReader.kt @@ -19,6 +19,7 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.jsoup.select.Elements import java.nio.charset.Charset +import java.text.ParseException import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale @@ -246,7 +247,13 @@ abstract class FMReader( 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 fun parseRelativeDate(date: String): Long { - val value = date.split(' ')[dateValueIndex].toInt() - val dateWord = date.split(' ')[dateWordIndex].let { - if (it.contains("(")) { - it.substringBefore("(") - } else { - it.substringBefore("s") + try { + val value = date.split(' ')[dateValueIndex].toInt() + val dateWord = date.split(' ')[dateWordIndex].let { + if (it.contains("(")) { + it.substringBefore("(") + } else { + it.substringBefore("s") + } } - } - // languages: en, vi, es, tr - return when (dateWord) { - "min", "minute", "phút", "minuto", "dakika" -> Calendar.getInstance().apply { - add(Calendar.MINUTE, -value) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - "hour", "giờ", "hora", "saat" -> Calendar.getInstance().apply { - add(Calendar.HOUR_OF_DAY, -value) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - "day", "ngày", "día", "gün" -> Calendar.getInstance().apply { - add(Calendar.DATE, -value) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - "week", "tuần", "semana", "hafta" -> Calendar.getInstance().apply { - add(Calendar.DATE, -value * 7) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - "month", "tháng", "mes", "ay" -> Calendar.getInstance().apply { - add(Calendar.MONTH, -value) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - "year", "năm", "año", "yıl" -> Calendar.getInstance().apply { - add(Calendar.YEAR, -value) - set(Calendar.SECOND, 0) - set(Calendar.MILLISECOND, 0) - }.timeInMillis - else -> { - return 0 + // languages: en, vi, es, tr + return when (dateWord) { + "min", "minute", "phút", "minuto", "dakika" -> Calendar.getInstance().apply { + add(Calendar.MINUTE, -value) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + }.timeInMillis + "hour", "giờ", "hora", "saat" -> Calendar.getInstance().apply { + add(Calendar.HOUR_OF_DAY, -value) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + }.timeInMillis + "day", "ngày", "día", "gün" -> Calendar.getInstance().apply { + add(Calendar.DATE, -value) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + }.timeInMillis + "week", "tuần", "semana", "hafta" -> Calendar.getInstance().apply { + add(Calendar.DATE, -value * 7) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + }.timeInMillis + "month", "tháng", "mes", "ay" -> Calendar.getInstance().apply { + add(Calendar.MONTH, -value) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + }.timeInMillis + "year", "năm", "año", "yıl" -> Calendar.getInstance().apply { + add(Calendar.YEAR, -value) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + }.timeInMillis + else -> { + return 0L + } } + } catch (_: Exception) { + return 0L } } + open fun parseAbsoluteDate(dateStr: String): Long { - return runCatching { dateFormat.parse(dateStr)?.time } - .getOrNull() ?: 0L + return try { + dateFormat.parse(dateStr)?.time ?: 0L + } catch (_: ParseException) { + 0L + } } open val pageListImageSelector = "img.chapter-img" diff --git a/src/en/holymanga/src/eu/kanade/tachiyomi/extension/en/holymanga/HolyManga.kt b/src/en/holymanga/src/eu/kanade/tachiyomi/extension/en/holymanga/HolyManga.kt index 1fff3d7d0..471dc41e3 100644 --- a/src/en/holymanga/src/eu/kanade/tachiyomi/extension/en/holymanga/HolyManga.kt +++ b/src/en/holymanga/src/eu/kanade/tachiyomi/extension/en/holymanga/HolyManga.kt @@ -1,8 +1,6 @@ package eu.kanade.tachiyomi.extension.en.holymanga 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.util.Locale @@ -15,10 +13,4 @@ class HolyManga : FMReader( override val versionId = 2 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) } - } - } }