diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt index 946e01cf..e174cd43 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt @@ -230,7 +230,7 @@ internal class ComickFunParser(context: MangaLoaderContext) : url = jo.getString("hid"), scanlator = jo.optJSONArray("group_name")?.asTypedList()?.joinToString() ?.takeUnless { it.isBlank() }, - uploadDate = dateFormat.tryParse(jo.getString("created_at").substringBefore('T')), + uploadDate = dateFormat.parseSafe(jo.getString("created_at").substringBefore('T')), branch = branch, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt index 93dc3d16..6dc26891 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt @@ -202,7 +202,7 @@ internal class ExHentaiParser( val uploadDate = gd3 ?.selectFirst("tr:contains(Posted)") ?.selectFirst(".gdt2")?.ownTextOrNull() - .let { SimpleDateFormat("yyyy-MM-dd HH:mm", sourceLocale).tryParse(it) } + .let { SimpleDateFormat("yyyy-MM-dd HH:mm", sourceLocale).parseSafe(it) } val uploader = gd3 ?.getElementsByAttributeValueContaining("href", "/uploader/") ?.firstOrNull() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt index fa867578..5807f950 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HitomiLaParser.kt @@ -590,7 +590,7 @@ internal class HitomiLaParser(context: MangaLoaderContext) : AbstractMangaParser volume = 0, branch = json.getString("language_localname"), source = source, - uploadDate = dateFormat.tryParse(json.getString("date").substringBeforeLast("-")), + uploadDate = dateFormat.parseSafe(json.getString("date").substringBeforeLast("-")), ), ), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HoloEarthParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HoloEarthParser.kt index eabfcc5e..ec1fa84e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HoloEarthParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/HoloEarthParser.kt @@ -5,11 +5,10 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* -import org.koitharu.kotatsu.parsers.model.search.* import org.koitharu.kotatsu.parsers.util.generateUid import org.koitharu.kotatsu.parsers.util.parseHtml import org.koitharu.kotatsu.parsers.util.selectFirstOrThrow -import org.koitharu.kotatsu.parsers.util.tryParse +import org.koitharu.kotatsu.parsers.util.parseSafe import java.text.SimpleDateFormat import java.util.Locale @@ -99,7 +98,7 @@ internal class HoloEarthParser(context: MangaLoaderContext) : val url = li.selectFirstOrThrow(".manga-detail__list-link").attr("href") val title = li.selectFirstOrThrow(".manga-detail__list-title").text() val dateStr = li.selectFirstOrThrow(".manga-detail__list-date").text() - val uploadDate = dateFormat.tryParse(dateStr) ?: 0L + val uploadDate = dateFormat.parseSafe(dateStr) ?: 0L val scanlator = root.selectFirst(".manga-detail__person")?.text() MangaChapter( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt index 4ad7e1eb..061f5418 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt @@ -489,7 +489,7 @@ internal class MangaDexParser(context: MangaLoaderContext) : FlexibleMangaParser volume = volume, url = id, scanlator = team, - uploadDate = dateFormat.tryParse(attrs.getString("publishAt")), + uploadDate = dateFormat.parseSafe(attrs.getString("publishAt")), branch = branch, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt index 63a5c0e9..08ec4702 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaFireParser.kt @@ -295,7 +295,7 @@ internal abstract class MangaFireParser( }, url = "${branch.type}/${it.attr("data-id")}", scanlator = null, - uploadDate = dateFormat.tryParse(it.attr("upload-date")), + uploadDate = dateFormat.parseSafe(it.attr("upload-date")), branch = "${branch.langTitle} ${branch.type.toTitleCase()}", source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt index aa74ed39..ac924182 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPark.kt @@ -252,7 +252,7 @@ internal class MangaPark(context: MangaLoaderContext) : }.timeInMillis } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt index 38b619b6..ccb889fd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt @@ -233,7 +233,7 @@ internal abstract class NineMangaParser( if (dateWords.size == 3) { if (dateWords[1].contains(",")) { - SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).tryParse(date) + SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parseSafe(date) } else { val timeAgo = Integer.parseInt(dateWords[0]) return Calendar.getInstance().apply { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt index 17b3b5fa..9046ed6d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt @@ -128,7 +128,7 @@ internal class PapScan(context: MangaLoaderContext) : number = i + 1f, volume = 0, url = href, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), source = source, scanlator = null, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt index 752b0f4e..137dfc1b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt @@ -202,7 +202,7 @@ internal class FlixScans(context: MangaLoaderContext) : number = i + 1f, volume = 0, branch = null, - uploadDate = dateFormat.tryParse(date), + uploadDate = dateFormat.parseSafe(date), scanlator = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt index 2a50b512..bd57f926 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt @@ -200,7 +200,7 @@ internal class TeamXNovel(context: MangaLoaderContext) : volume = 0, url = url, scanlator = null, - uploadDate = dateFormat.tryParse(li.selectFirstOrThrow(".epl-date").text()), + uploadDate = dateFormat.parseSafe(li.selectFirstOrThrow(".epl-date").text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt index 654ac19b..07172c58 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt @@ -185,7 +185,7 @@ internal class AsuraScansParser(context: MangaLoaderContext) : url = url, scanlator = null, uploadDate = SimpleDateFormat("MMMM d yyyy", Locale.US) - .tryParse(cleanDate), + .parseSafe(cleanDate), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BatCave.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BatCave.kt index b7e56039..d63a8650 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BatCave.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BatCave.kt @@ -1,7 +1,6 @@ package org.koitharu.kotatsu.parsers.site.en import org.json.JSONObject -import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey @@ -130,7 +129,7 @@ internal class BatCave(context: MangaLoaderContext) : url = "/reader/$newsId/$chapterId", number = chapter.getFloatOrDefault("posi", 0f), title = chapter.getStringOrNull("title"), - uploadDate = dateFormat.tryParse(chapter.getStringOrNull("date")), + uploadDate = dateFormat.parseSafe(chapter.getStringOrNull("date")), source = source, scanlator = null, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt index 07a88225..79e2b07d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt @@ -125,7 +125,7 @@ internal class BeeToon(context: MangaLoaderContext) : url = url, scanlator = null, uploadDate = SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.ENGLISH) - .tryParse(a.selectFirst(".chapter-date")?.attr("title") ?: "0"), + .parseSafe(a.selectFirst(".chapter-date")?.attr("title") ?: "0"), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DemonicScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DemonicScans.kt index 47db8db3..8a9ca468 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DemonicScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DemonicScans.kt @@ -173,7 +173,7 @@ internal class DemonicScans(context: MangaLoaderContext) : volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(date), + uploadDate = dateFormat.parseSafe(date), branch = null, source = source ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt index 75c35f2e..d9cad681 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt @@ -183,7 +183,7 @@ internal class DynastyScans(context: MangaLoaderContext) : number = i + 1f, volume = 0, url = href, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), source = source, scanlator = null, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt index 1306ca23..48787c1e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlixScansOrg.kt @@ -186,7 +186,7 @@ internal class FlixScansOrg(context: MangaLoaderContext) : number = i + 1f, volume = 0, branch = null, - uploadDate = dateFormat.tryParse(date), + uploadDate = dateFormat.parseSafe(date), scanlator = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Hentalk.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Hentalk.kt index db7d924e..75223291 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Hentalk.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Hentalk.kt @@ -233,7 +233,7 @@ internal class Hentalk(context: MangaLoaderContext) : } val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US) - val parseTime = dateFormat.tryParse(createdAt) + val parseTime = dateFormat.parseSafe(createdAt) val chapter = MangaChapter( id = generateUid("/g/$mangaId/read/1"), url = "/g/$mangaId/read/1/__data.json?x-sveltekit-invalidated=011", diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt index 3472e4c4..ccaaef9f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt @@ -149,7 +149,7 @@ internal class MangaGeko(context: MangaLoaderContext) : volume = 0, url = url, scanlator = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt index e991d7bc..fd25d84d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt @@ -249,7 +249,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : date.isNullOrEmpty() -> 0L date.contains("Today") -> Calendar.getInstance().timeInMillis date.contains("Yesterday") -> Calendar.getInstance().apply { add(Calendar.DAY_OF_MONTH, -1) }.timeInMillis - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt index b7dae526..74d5f0ef 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt @@ -170,7 +170,7 @@ internal class Mangaowl(context: MangaLoaderContext) : number = i + 1f, volume = 0, url = url, - uploadDate = dateFormat.tryParse(date), + uploadDate = dateFormat.parseSafe(date), source = source, scanlator = null, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt index 5f3ebc9a..944f6712 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt @@ -149,7 +149,7 @@ internal class ManhwasMen(context: MangaLoaderContext) : val d = date?.lowercase() ?: return 0 return when { d.endsWith(" ago") -> parseRelativeDate(date) - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt index fdad0d56..ccfba1cc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt @@ -84,7 +84,7 @@ internal class Po2Scans(context: MangaLoaderContext) : volume = 0, url = url, scanlator = null, - uploadDate = dateFormat.tryParse(div.select(".detail span").last()?.text()), + uploadDate = dateFormat.parseSafe(div.select(".detail span").last()?.text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VioletScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VioletScans.kt index e6c41d86..45c1ff92 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VioletScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VioletScans.kt @@ -17,7 +17,7 @@ import org.koitharu.kotatsu.parsers.util.generateUid import org.koitharu.kotatsu.parsers.util.parseHtml import org.koitharu.kotatsu.parsers.util.selectFirstOrThrow import org.koitharu.kotatsu.parsers.util.urlEncoded -import org.koitharu.kotatsu.parsers.util.tryParse +import org.koitharu.kotatsu.parsers.util.parseSafe import java.text.SimpleDateFormat import java.util.Locale @@ -199,7 +199,7 @@ internal class VioletScans(context: MangaLoaderContext) : } val dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH) - val date = dateFormat.tryParse(dateString) ?: 0L + val date = dateFormat.parseSafe(dateString) ?: 0L val chaptersList = root.selectFirstOrThrow("#chapterlist ul") val chapters = chaptersList.select("li") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VyManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VyManga.kt index 2d4c90aa..7307997d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VyManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/VyManga.kt @@ -172,7 +172,7 @@ internal class VyManga(context: MangaLoaderContext) : val d = date?.lowercase() ?: return 0 return when { d.endsWith(" ago") -> parseRelativeDate(date) - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/WeebCentral.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/WeebCentral.kt index c783e7fc..dc48b372 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/WeebCentral.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/WeebCentral.kt @@ -318,7 +318,7 @@ internal class WeebCentral(context: MangaLoaderContext) : AbstractMangaParser(co "#d8b4fe" -> "Official" else -> null }, - uploadDate = dateFormat.tryParse( + uploadDate = dateFormat.parseSafe( element.selectFirst("time[datetime]")?.attr("datetime"), ), branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt index 18755b20..a905a5f5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt @@ -104,7 +104,7 @@ internal class TempleScanEsp(context: MangaLoaderContext) : parseRelativeDate(d) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt index 52940e29..0d5b3deb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt @@ -216,7 +216,7 @@ internal class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaPars url = href, scanlator = element.select("div.col-md-6.text-truncate").text(), branch = null, - uploadDate = chapterDateFormat.tryParse(element.select("span.badge.badge-primary.p-2").first()?.text()), + uploadDate = chapterDateFormat.parseSafe(element.select("span.badge.badge-primary.p-2").first()?.text()), source = source, ) } @@ -233,7 +233,7 @@ internal class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaPars url = href, scanlator = element.select("div.col-md-6.text-truncate").text(), branch = null, - uploadDate = chapterDateFormat.tryParse(element.select("span.badge.badge-primary.p-2").first()?.text()), + uploadDate = chapterDateFormat.parseSafe(element.select("span.badge.badge-primary.p-2").first()?.text()), source = source, ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt index 85c2a666..4fcad143 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt @@ -272,9 +272,9 @@ internal abstract class FmreaderParser( } else { it } - }.let { dateFormat.tryParse(it.joinToString(" ")) } + }.let { dateFormat.parseSafe(it.joinToString(" ")) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt index 2ef60776..54827a86 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt @@ -148,7 +148,7 @@ internal abstract class FoolSlideParser( volume = 0, url = href, uploadDate = if (div.selectFirst(selectDate)?.text()?.contains(", ") == true) { - dateFormat.tryParse(dateText) + dateFormat.parseSafe(dateText) } else { 0 }, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt index 6917305d..9296d7cc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt @@ -148,7 +148,7 @@ internal class FuryoSociety(context: MangaLoaderContext) : parseRelativeDate(d) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt index bd9c2a49..302d481a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt @@ -196,7 +196,7 @@ internal class LegacyScansParser(context: MangaLoaderContext) : volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt index 7f234320..1eb04a7a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt @@ -121,7 +121,7 @@ internal class LireScan(context: MangaLoaderContext) : PagedMangaParser(context, volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt index 3a023b1a..cab887ca 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt @@ -184,7 +184,7 @@ internal class LugnicaScans(context: MangaLoaderContext) : volume = 0, url = url, scanlator = null, - uploadDate = dateFormat.tryParse(date), + uploadDate = dateFormat.parseSafe(date), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaMana.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaMana.kt index 358fde22..43cc145d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaMana.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaMana.kt @@ -298,7 +298,7 @@ internal class MangaMana(context: MangaLoaderContext) : volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/PhenixscansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/PhenixscansParser.kt index 6e9fb101..2619daa5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/PhenixscansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/PhenixscansParser.kt @@ -221,9 +221,9 @@ internal class PhenixscansParser(context: MangaLoaderContext) : } else { it } - }.let { dateFormat.tryParse(it.joinToString(" ")) } + }.let { dateFormat.parseSafe(it.joinToString(" ")) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt index 823f795b..d7a46d2e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt @@ -160,7 +160,7 @@ internal class ScantradUnion(context: MangaLoaderContext) : volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(date), + uploadDate = dateFormat.parseSafe(date), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fuzzydoodle/FuzzyDoodleParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fuzzydoodle/FuzzyDoodleParser.kt index b7b0440e..5d085336 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fuzzydoodle/FuzzyDoodleParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fuzzydoodle/FuzzyDoodleParser.kt @@ -297,7 +297,7 @@ internal abstract class FuzzyDoodleParser( parseRelativeDate(d) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gallery/GalleryParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gallery/GalleryParser.kt index 67573a44..4481c00d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gallery/GalleryParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gallery/GalleryParser.kt @@ -96,7 +96,7 @@ internal abstract class GalleryParser( volume = 0, url = relUrl, scanlator = null, - uploadDate = df.tryParse(time), + uploadDate = df.parseSafe(time), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/en/HentaiNexus.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/en/HentaiNexus.kt index 01f13b93..9329471b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/en/HentaiNexus.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/en/HentaiNexus.kt @@ -25,7 +25,7 @@ import org.koitharu.kotatsu.parsers.util.parseHtml import org.koitharu.kotatsu.parsers.util.selectFirstOrThrow import org.koitharu.kotatsu.parsers.util.src import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl -import org.koitharu.kotatsu.parsers.util.tryParse +import org.koitharu.kotatsu.parsers.util.parseSafe import org.koitharu.kotatsu.parsers.util.urlDecode import org.koitharu.kotatsu.parsers.util.urlEncoded import java.text.SimpleDateFormat @@ -177,7 +177,7 @@ internal class HentaiNexus(context: MangaLoaderContext) : volume = 0, url = manga.url, scanlator = doc.select(selectPublisher).text().replace(Regex(" \\([\\d,]+\\)")) { "" }, - uploadDate = format.tryParse(doc.select(selectPublishedDate).text()), + uploadDate = format.parseSafe(doc.select(selectPublishedDate).text()), branch = "English", source = source, ), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/en/HentaiRead.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/en/HentaiRead.kt index fa92c2a9..0332a6dc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/en/HentaiRead.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/en/HentaiRead.kt @@ -30,7 +30,7 @@ import org.koitharu.kotatsu.parsers.util.parseJson import org.koitharu.kotatsu.parsers.util.selectFirstOrThrow import org.koitharu.kotatsu.parsers.util.src import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl -import org.koitharu.kotatsu.parsers.util.tryParse +import org.koitharu.kotatsu.parsers.util.parseSafe import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy import java.text.SimpleDateFormat import java.util.Locale @@ -250,7 +250,7 @@ internal class HentaiRead(context: MangaLoaderContext) : volume = 0, url = manga.url, scanlator = null, - uploadDate = dateFormat.tryParse(uploadDateString), + uploadDate = dateFormat.parseSafe(uploadDateString), branch = "English", source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt index eb998153..47b84883 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt @@ -164,7 +164,7 @@ internal abstract class HeanCms( volume = 0, url = chapterUrl, scanlator = null, - uploadDate = dateFormat.tryParse(it.getString("created_at").substringBefore("T")), + uploadDate = dateFormat.parseSafe(it.getString("created_at").substringBefore("T")), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt index 174034b9..3394796e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt @@ -133,7 +133,7 @@ internal abstract class HeanCmsAlt( val d = date?.lowercase() ?: return 0 return when { d.startsWith("hace ") || d.endsWith(" antes") -> parseRelativeDate(date) - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/HotComicsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/HotComicsParser.kt index a04477d9..ba9c4865 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/HotComicsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/HotComicsParser.kt @@ -155,7 +155,7 @@ internal abstract class HotComicsParser( volume = 0, url = url, scanlator = null, - uploadDate = dateFormat.tryParse(li.selectFirst("time")?.attr("datetime")), + uploadDate = dateFormat.parseSafe(li.selectFirst("time")?.attr("datetime")), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/en/DayComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/en/DayComics.kt index 0d7b5416..d3841dc3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/en/DayComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/en/DayComics.kt @@ -20,7 +20,7 @@ internal class DayComics(context: MangaLoaderContext) : val url = element.attr("onclick").substringAfter("popupLogin('").substringBefore("'") val name = element.selectFirst(".cell-num")?.text() ?: "Unknown" val dateFormat = SimpleDateFormat(datePattern, sourceLocale) - val dateUpload = dateFormat.tryParse(element.selectFirst(".cell-time")?.text()) + val dateUpload = dateFormat.parseSafe(element.selectFirst(".cell-time")?.text()) val chapterNum = element.selectFirst(".num")?.text()?.toFloat() ?: (i + 1f) MangaChapter( id = generateUid(url), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/en/HotComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/en/HotComics.kt index f223fcb0..2093ebb7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/en/HotComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/hotcomics/en/HotComics.kt @@ -20,7 +20,7 @@ internal class HotComics(context: MangaLoaderContext) : val url = element.attr("onclick").substringAfter("popupLogin('").substringBefore("'") val name = element.selectFirst(".cell-num")?.text() ?: "Unknown" val dateFormat = SimpleDateFormat(datePattern, sourceLocale) - val dateUpload = dateFormat.tryParse(element.selectFirst(".cell-time")?.text()) + val dateUpload = dateFormat.parseSafe(element.selectFirst(".cell-time")?.text()) val chapterNum = element.selectFirst(".num")?.text()?.toFloat() ?: (i + 1f) MangaChapter( id = generateUid(url), @@ -40,4 +40,4 @@ internal class HotComics(context: MangaLoaderContext) : chapters = chapters, ) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt index ba97e751..d6abf754 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt @@ -166,7 +166,7 @@ internal class DoujinDesuParser(context: MangaLoaderContext) : volume = 0, url = url, scanlator = null, - uploadDate = chapterDateFormat.tryParse(element.select(".epsleft > .date").text()), + uploadDate = chapterDateFormat.parseSafe(element.select(".epsleft > .date").text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Kumapage.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Kumapage.kt index 924a6db9..13989fbf 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Kumapage.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/Kumapage.kt @@ -151,7 +151,7 @@ internal class Kumapage(context: MangaLoaderContext) : volume = 0, url = row.select("td:nth-child(4) a").attr("href"), scanlator = null, - uploadDate = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").tryParse(row.select("td:nth-child(3)").text()), + uploadDate = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parseSafe(row.select("td:nth-child(3)").text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/iken/IkenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/iken/IkenParser.kt index 2429e153..df40146c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/iken/IkenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/iken/IkenParser.kt @@ -5,7 +5,6 @@ import org.json.JSONObject import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -156,7 +155,7 @@ internal abstract class IkenParser( volume = 0, url = chapterUrl, scanlator = null, - uploadDate = dateFormat.tryParse(it.getString("createdAt").substringBefore("T")), + uploadDate = dateFormat.parseSafe(it.getString("createdAt").substringBefore("T")), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt index 8f4a6b76..e2f1d681 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/keyoapp/KeyoappParser.kt @@ -283,9 +283,9 @@ internal abstract class KeyoappParser( } else { it } - }.let { dateFormat.tryParse(it.joinToString(" ")) } + }.let { dateFormat.parseSafe(it.joinToString(" ")) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt index 7f8618ff..dc49ed55 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt @@ -292,7 +292,7 @@ internal abstract class LikeMangaParser( set(Calendar.MILLISECOND, 0) }.timeInMillis - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt index 5d30294a..9a6f414e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt @@ -805,9 +805,9 @@ internal abstract class MadaraParser( } else { it } - }.let { dateFormat.tryParse(it.joinToString(" ")) } + }.let { dateFormat.parseSafe(it.joinToString(" ")) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt index 391cda24..7034b188 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt @@ -288,9 +288,9 @@ internal abstract class MadthemeParser( } else { it } - }.let { dateFormat.tryParse(it.joinToString(" ")) } + }.let { dateFormat.parseSafe(it.joinToString(" ")) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt index c2d2a3cd..c96f920c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt @@ -191,7 +191,7 @@ internal abstract class Manga18Parser( number = i + 1f, volume = 0, url = href, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), source = source, scanlator = null, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt index 3fd314b1..ac74ac9c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt @@ -322,9 +322,9 @@ internal abstract class MangaboxParser( } else { it } - }.let { dateFormat.tryParse(it.joinToString(" ")) } + }.let { dateFormat.parseSafe(it.joinToString(" ")) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt index 1a08faa6..1fc2a7ed 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt @@ -186,7 +186,7 @@ internal abstract class MangaReaderParser( number = index + 1f, volume = 0, scanlator = null, - uploadDate = dateFormat.tryParse(element.selectFirst(".chapterdate")?.text()), + uploadDate = dateFormat.parseSafe(element.selectFirst(".chapterdate")?.text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt index 18d0eeb2..007e429f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/Normoyun.kt @@ -86,7 +86,7 @@ internal class Normoyun(context: MangaLoaderContext) : number = index + 1f, volume = 0, scanlator = null, - uploadDate = dateFormat.tryParse(element.selectFirst(".chapter-date")?.text()), + uploadDate = dateFormat.parseSafe(element.selectFirst(".chapter-date")?.text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/VexManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/VexManga.kt index 035883b6..fa00aab2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/VexManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/ar/VexManga.kt @@ -55,7 +55,7 @@ internal class VexManga(context: MangaLoaderContext) : set(Calendar.MILLISECOND, 0) }.timeInMillis - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/HentaiReader.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/HentaiReader.kt index 0cc995bd..f4eda772 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/HentaiReader.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/HentaiReader.kt @@ -86,7 +86,7 @@ internal class HentaiReader(context: MangaLoaderContext) : number = index + 1f, volume = 0, scanlator = null, - uploadDate = dateFormat.tryParse(docs.selectFirst("time")?.text()), + uploadDate = dateFormat.parseSafe(docs.selectFirst("time")?.text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/LectorHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/LectorHentai.kt index 44e2f202..0356b6fc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/LectorHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/LectorHentai.kt @@ -85,7 +85,7 @@ internal class LectorHentai(context: MangaLoaderContext) : number = index + 1f, volume = 0, scanlator = null, - uploadDate = dateFormat.tryParse(docs.selectFirst("time")?.text()), + uploadDate = dateFormat.parseSafe(docs.selectFirst("time")?.text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt index d81bba0a..8360221b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt @@ -137,7 +137,7 @@ internal class TuManhwas(context: MangaLoaderContext) : return when { d.startsWith("hace") -> parseRelativeDate(date) - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/RevolutionScantrad.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/RevolutionScantrad.kt index 0e634bd3..268f768e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/RevolutionScantrad.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/RevolutionScantrad.kt @@ -123,7 +123,7 @@ internal class RevolutionScantrad(context: MangaLoaderContext) : number = index + 1f, volume = 0, scanlator = null, - uploadDate = dateFormat.tryParse(element.selectFirst(".chapterdate")?.text()), + uploadDate = dateFormat.parseSafe(element.selectFirst(".chapterdate")?.text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/XxxRevolutionScantrad.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/XxxRevolutionScantrad.kt index 94168f3d..587e6181 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/XxxRevolutionScantrad.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/XxxRevolutionScantrad.kt @@ -117,7 +117,7 @@ internal class XxxRevolutionScantrad(context: MangaLoaderContext) : number = index + 1f, volume = 0, scanlator = null, - uploadDate = dateFormat.tryParse(element.selectFirst(".chapterdate")?.text()), + uploadDate = dateFormat.parseSafe(element.selectFirst(".chapterdate")?.text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt index a4f60f4b..6546aca2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt @@ -197,7 +197,7 @@ internal class Komikcast(context: MangaLoaderContext) : parseRelativeDate(date) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangaworld/MangaWorldParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangaworld/MangaWorldParser.kt index cb3ef47b..06f415a0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangaworld/MangaWorldParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangaworld/MangaWorldParser.kt @@ -204,7 +204,7 @@ internal abstract class MangaWorldParser( url = "$url?style=list", scanlator = null, uploadDate = - SimpleDateFormat("dd MMMM yyyy", Locale.ITALIAN).tryParse( + SimpleDateFormat("dd MMMM yyyy", Locale.ITALIAN).parseSafe( a.selectFirst(".chap-date")?.text(), ), branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt index 5d15331e..72424b3f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt @@ -228,7 +228,7 @@ internal abstract class MmrcmsParser( number = i + 1f, volume = 0, url = href, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), source = source, scanlator = null, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt index fe804d0c..48aac05a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt @@ -236,7 +236,7 @@ internal abstract class NepnepParser( volume = 0, url = url, scanlator = null, - uploadDate = dateFormat.tryParse(date), + uploadDate = dateFormat.parseSafe(date), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt index 9ffcdfc0..0bb6ef71 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt @@ -251,7 +251,7 @@ internal abstract class OtakuSanctuaryParser( parseRelativeDate(d) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt index 4afecbb4..239bf93a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pizzareader/PizzaReaderParser.kt @@ -234,7 +234,7 @@ internal abstract class PizzaReaderParser( volume = 0, url = url, scanlator = null, - uploadDate = dateFormat.tryParse(date), + uploadDate = dateFormat.parseSafe(date), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt index 7b593424..ba0df9e3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerManga.kt @@ -144,7 +144,7 @@ internal class LerManga(context: MangaLoaderContext) : PagedMangaParser(context, volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(div.selectFirstOrThrow("small small").text()), + uploadDate = dateFormat.parseSafe(div.selectFirstOrThrow("small small").text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt index f01fe8fc..85109feb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt @@ -124,7 +124,7 @@ internal class LerMangaOnline(context: MangaLoaderContext) : volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt index 630ddcf0..81ce3582 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LuratoonScansParser.kt @@ -106,7 +106,7 @@ internal class LuratoonScansParser(context: MangaLoaderContext) : volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(span.nextElementSibling()?.text()), + uploadDate = dateFormat.parseSafe(span.nextElementSibling()?.text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt index 3f7df8ad..64abdba3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt @@ -117,7 +117,7 @@ internal class MangaOnline(context: MangaLoaderContext) : volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt index 4a28fd1d..429269e8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt @@ -141,7 +141,7 @@ internal class YugenMangas(context: MangaLoaderContext) : val d = date?.lowercase() ?: return 0 return when { d.endsWith(" atrás") -> parseRelativeDate(date) - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/ComXParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/ComXParser.kt index db5fa596..def9d250 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/ComXParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/ComXParser.kt @@ -1,7 +1,6 @@ package org.koitharu.kotatsu.parsers.site.en import org.json.JSONObject -import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey @@ -141,7 +140,7 @@ internal class ComXParser(context: MangaLoaderContext) : url = "/reader/$newsId/$chapterId", number = chapter.getFloatOrDefault("posi", 0f), title = decodeText(chapter.getStringOrNull("title")), - uploadDate = dateFormat.tryParse(chapter.getStringOrNull("date")), + uploadDate = dateFormat.parseSafe(chapter.getStringOrNull("date")), source = source, scanlator = null, branch = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt index 1015466e..f2c52484 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/MangaWtfParser.kt @@ -214,7 +214,7 @@ internal class MangaWtfParser( volume = volume, url = jo.getString("id"), scanlator = null, - uploadDate = dateFormat.tryParse(jo.getString("createdAt")), + uploadDate = dateFormat.parseSafe(jo.getString("createdAt")), branch = branches.getOrPut(branchId) { getBranchName(branchId) }, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt index 1310e8e0..a9dd5ab0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt @@ -143,7 +143,7 @@ internal class NudeMoonParser( title = manga.title, scanlator = root.getElementsByAttributeValueContaining("href", "/perevod/").firstOrNull() ?.textOrNull(), - uploadDate = dateFormat.tryParse( + uploadDate = dateFormat.parseSafe( root.getElementsByAttributeValueEnding("src", "ico/time.png").firstOrNull() ?.nextElementSibling()?.text(), ), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt index e21044ce..77f86ffc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt @@ -176,7 +176,7 @@ internal class RemangaParser( number = jo.getIntOrDefault("index", chapters.size - i).toFloat(), volume = 0, title = name.nullIfEmpty(), - uploadDate = dateFormat.tryParse(jo.getString("upload_date")), + uploadDate = dateFormat.parseSafe(jo.getString("upload_date")), scanlator = publishers?.optJSONObject(0)?.getStringOrNull("name"), source = MangaParserSource.REMANGA, branch = null, @@ -192,7 +192,7 @@ internal class RemangaParser( val pages = content.optJSONArray("pages") if (pages == null) { val pubDate = content.getStringOrNull("pub_date")?.let { - SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US).tryParse(it) + SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US).parseSafe(it) } if (pubDate != null && pubDate > System.currentTimeMillis()) { val at = SimpleDateFormat.getDateInstance(DateFormat.LONG).format(Date(pubDate)) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt index d742a584..10dfaafc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt @@ -94,7 +94,7 @@ internal class WaMangaParser( volume = it.getIntOrDefault("volume", 0), title = it.getStringOrNull("full_title"), scanlator = it.getJSONArray("teams").getJSONObject(0)?.getStringOrNull("name"), - uploadDate = dateFormat.tryParse(it.getStringOrNull("published_on")), + uploadDate = dateFormat.parseSafe(it.getStringOrNull("published_on")), branch = null, ) }, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt index b4a38a3e..f64eedb7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt @@ -179,7 +179,7 @@ internal abstract class GroupleParser( number = number, volume = volume, url = href.withQueryParam("d", userHash), - uploadDate = dateFormat.tryParse(tr.selectFirst("td.date")?.text()), + uploadDate = dateFormat.parseSafe(tr.selectFirst("td.date")?.text()), scanlator = translators, source = newSource, branch = null, @@ -196,7 +196,7 @@ internal abstract class GroupleParser( number = number, volume = volume, url = link.withQueryParam("d", userHash), - uploadDate = dateFormat.tryParse(jo.getStringOrNull("dateCreated")), + uploadDate = dateFormat.parseSafe(jo.getStringOrNull("dateCreated")), scanlator = null, source = newSource, branch = translations[personId], diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt index 4f3003dc..dbe16c35 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt @@ -99,7 +99,7 @@ internal abstract class ChanParser( url = href, scanlator = null, branch = null, - uploadDate = dateFormat.tryParse(tr.selectFirst("div.date")?.text()), + uploadDate = dateFormat.parseSafe(tr.selectFirst("div.date")?.text()), source = source, ) }, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt index 99ff846c..2d1b6b58 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt @@ -320,7 +320,7 @@ internal abstract class LibSocialParser( } }, scanlator = team, - uploadDate = dateFormat.tryParse(bjo.getStringOrNull("created_at")), + uploadDate = dateFormat.parseSafe(bjo.getStringOrNull("created_at")), branch = if (useBranching) team else null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt index 2e984f06..a3582168 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/ScanParser.kt @@ -97,7 +97,7 @@ internal abstract class ScanParser( id = generateUid(href), url = href, publicUrl = href.toAbsoluteUrl(div.host ?: domain), - coverUrl = div.selectFirst("img")?.attr("data-src")?.replace("\t", "").orEmpty(), + coverUrl = div.selectFirst("img")?.attr("data-src")?.replace("\t", ""), title = div.selectFirst(".link-series h3, .item-title")?.text().orEmpty(), altTitles = emptySet(), rating = RATING_UNKNOWN, @@ -116,10 +116,10 @@ internal abstract class ScanParser( protected suspend fun getOrCreateTagMap(): Map = mutex.withLock { tagCache?.let { return@withLock it } - val tagMap = ArrayMap() val tagElements = webClient.httpGet("https://$domain$listUrl").parseHtml() .requireElementById("filter-wrapper") .select(".form-filters div.form-check, .form-filters div.custom-control") + val tagMap = ArrayMap(tagElements.size) for (el in tagElements) { val name = el.selectFirstOrThrow("label").text() if (name.isEmpty()) continue @@ -130,7 +130,7 @@ internal abstract class ScanParser( ) } tagCache = tagMap - return@withLock tagMap + tagMap } override suspend fun getDetails(manga: Manga): Manga { @@ -162,7 +162,7 @@ internal abstract class ScanParser( volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(doc.selectFirst("h5 div")?.text()), + uploadDate = dateFormat.parseSafe(doc.selectFirst("h5 div")?.text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/fr/MangaFr.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/fr/MangaFr.kt index 6a56f672..96b2b4ea 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/fr/MangaFr.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/fr/MangaFr.kt @@ -40,7 +40,7 @@ internal class MangaFr(context: MangaLoaderContext) : volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(doc.selectFirstOrThrow("h5 div").text()), + uploadDate = dateFormat.parseSafe(doc.selectFirstOrThrow("h5 div").text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/ScanIta.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/ScanIta.kt index a132e1f7..5690677b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/ScanIta.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/scan/it/ScanIta.kt @@ -50,7 +50,7 @@ internal class ScanIta(context: MangaLoaderContext) : volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(doc.selectFirstOrThrow("h5 div").text()), + uploadDate = dateFormat.parseSafe(doc.selectFirstOrThrow("h5 div").text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt index a0d65ce1..6a514676 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt @@ -174,7 +174,7 @@ internal abstract class SinmhParser( val href = a.attrAsRelativeUrl("href") MangaChapter( id = generateUid(href), - title = a.text(), + title = a.textOrNull(), number = i + 1f, volume = 0, url = href, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/ElderManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/ElderManga.kt index fb1e8101..417dded6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/ElderManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/ElderManga.kt @@ -159,7 +159,7 @@ internal class ElderManga(context: MangaLoaderContext): volume = 0, url = href, scanlator = null, - uploadDate = el.selectFirst("span")?.text()?.let { dateFormat.tryParse(it) } ?: 0L, + uploadDate = el.selectFirst("span")?.text()?.let { dateFormat.parseSafe(it) } ?: 0L, branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/EleceedTurkiye.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/EleceedTurkiye.kt index 0047bc2c..8fe455a0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/EleceedTurkiye.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/EleceedTurkiye.kt @@ -65,7 +65,7 @@ internal class EleceedTurkiye(context: MangaLoaderContext) : title = title, number = title?.let { Regex("\\d+").find(it)?.value?.toFloatOrNull() } ?: 0f, url = href, - uploadDate = dateFormat.tryParse(div.selectFirst("span.chapterdate")?.text()), + uploadDate = dateFormat.parseSafe(div.selectFirst("span.chapterdate")?.text()), scanlator = null, branch = null, source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt index 19ace2b6..80c083db 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt @@ -90,14 +90,14 @@ internal class MangaAy(context: MangaLoaderContext) : PagedMangaParser(context, url = href, publicUrl = a.attrAsAbsoluteUrl("href"), title = div.selectLast(".item-name")?.text().orEmpty(), - coverUrl = div.selectFirst("img")?.src().orEmpty(), + coverUrl = div.selectFirst("img")?.src(), altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = null, state = null, authors = emptySet(), - contentRating = if (isNsfwSource) ContentRating.ADULT else null, + contentRating = sourceContentRating, source = source, ) } @@ -119,7 +119,7 @@ internal class MangaAy(context: MangaLoaderContext) : PagedMangaParser(context, description = null, state = null, authors = emptySet(), - contentRating = if (isNsfwSource) ContentRating.ADULT else null, + contentRating = sourceContentRating, source = source, ) } @@ -152,7 +152,8 @@ internal class MangaAy(context: MangaLoaderContext) : PagedMangaParser(context, val tags = doc.select("P.card-text .bg-success").mapNotNullToSet { tagMap[it.text()] } return manga.copy( description = doc.selectFirst("p.card-text")?.html()?.substringAfterLast("
"), - coverUrl = doc.selectFirst("div.align-items-center div.align-items-center img")?.src().orEmpty(), + coverUrl = doc.selectFirst("div.align-items-center div.align-items-center img")?.src() + ?: manga.coverUrl, tags = tags, chapters = doc.requireElementById("sonyuklemeler").select("tbody tr") .mapChapters(reversed = true) { i, tr -> @@ -165,7 +166,7 @@ internal class MangaAy(context: MangaLoaderContext) : PagedMangaParser(context, volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(tr.selectFirstOrThrow("time").attr("datetime")), + uploadDate = dateFormat.parseSafe(tr.selectFirstOrThrow("time").attr("datetime")), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt index d30ed5fa..98d4d3d0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt @@ -80,12 +80,12 @@ internal class SadScans(context: MangaLoaderContext) : val url = "/" + a.attrAsRelativeUrl("href") MangaChapter( id = generateUid(url), - title = a.text(), + title = a.textOrNull(), number = i + 1f, volume = 0, url = url, scanlator = null, - uploadDate = dateFormat.tryParse(div.select(".detail span").last()?.text()), + uploadDate = dateFormat.parseSafe(div.select(".detail span").last()?.text()), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TenshiManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TenshiManga.kt index be2fa7ed..c5224d8a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TenshiManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TenshiManga.kt @@ -7,198 +7,199 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* -import org.koitharu.kotatsu.parsers.util.json.* +import org.koitharu.kotatsu.parsers.util.json.mapJSONToSet import java.text.SimpleDateFormat import java.util.* @MangaSourceParser("TENSHIMANGA", "Tenshi Manga", "tr") -internal class TenshiManga(context: MangaLoaderContext): - PagedMangaParser(context, MangaParserSource.TENSHIMANGA, 25) { - - override val configKeyDomain = ConfigKey.Domain("tenshimanga.com") - private val cdnSuffix = "cdn1.$domain" - - override fun onCreateConfig(keys: MutableCollection>) { - super.onCreateConfig(keys) - keys.add(userAgentKey) - } - - override val availableSortOrders: Set = EnumSet.of( - SortOrder.ALPHABETICAL, - SortOrder.ALPHABETICAL_DESC, - SortOrder.NEWEST, - SortOrder.POPULARITY, - SortOrder.UPDATED, - ) - - override val filterCapabilities: MangaListFilterCapabilities - get() = MangaListFilterCapabilities( - isSearchSupported = true, - isMultipleTagsSupported = true, - isSearchWithFiltersSupported = true, - ) - - override suspend fun getFilterOptions() = MangaListFilterOptions( - availableTags = fetchTags(), - availableStates = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED), - availableContentTypes = EnumSet.of( - ContentType.MANGA, - ContentType.MANHWA, - ContentType.MANHUA, - ContentType.COMICS, - ), - ) - - override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List { - val url = buildString { - append("https://") - append(domain) - append("/search") - append("?page=") - append(page.toString()) - - if (!filter.query.isNullOrEmpty()) { - append("&search=") - append(filter.query.urlEncoded()) - } - - if (filter.tags.isNotEmpty()) { - append("&categories=") - filter.tags.joinTo(this, ",") { it.key } - } - - if (filter.states.isNotEmpty()) { - append("&publicStatus=") - filter.states.oneOrThrowIfMany()?.let { - append( - when (it) { - MangaState.ONGOING -> "1" - MangaState.FINISHED -> "2" - MangaState.ABANDONED -> "3" - MangaState.PAUSED -> "4" - else -> "" - }, - ) - } - } - - if (filter.types.isNotEmpty()) { - append("&country=") - filter.types.oneOrThrowIfMany()?.let { - append( - when (it) { - ContentType.MANHUA -> "1" - ContentType.MANHWA -> "2" - ContentType.MANGA -> "3" - ContentType.COMICS -> "4" - else -> "" - }, - ) - } - } - - append("&order=") - append( - when (order) { - SortOrder.ALPHABETICAL -> "1" - SortOrder.ALPHABETICAL_DESC -> "2" - SortOrder.NEWEST -> "3" - SortOrder.POPULARITY -> "4" - SortOrder.UPDATED, -> "5" - else -> "1" - } - ) - } - - val doc = webClient.httpGet(url).parseHtml() - return doc.select("section[aria-label='series area'] .card").map { card -> - val href = card.selectFirstOrThrow("a").attrAsRelativeUrl("href") - Manga( - id = generateUid(href), - title = card.selectFirst("h2")?.text().orEmpty(), - altTitles = emptySet(), - url = href, - publicUrl = href.toAbsoluteUrl(domain), - rating = RATING_UNKNOWN, - contentRating = null, - coverUrl = card.selectFirst("img")?.attrAsAbsoluteUrlOrNull("src"), - tags = emptySet(), - state = null, - authors = emptySet(), - source = source, - ) - } - } - - override suspend fun getDetails(manga: Manga): Manga { - val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() - val statusText = doc.selectFirst("span:contains(Durum) + span")?.text().orEmpty() - return manga.copy( - tags = doc.select("a[href^='search?categories']").mapToSet { - val key = it.attr("href").substringAfter("?categories=") - MangaTag( - key = key, - title = it.text(), - source = source, - ) - }, - description = doc.selectFirst("div.grid h2 + p")?.text(), - state = when (statusText) { - "Devam Ediyor" -> MangaState.ONGOING - "Birakildi" -> MangaState.ONGOING - "Tamamlandi" -> MangaState.FINISHED - else -> null - }, - chapters = doc.select("div.list-episode a").mapChapters(reversed = true) { i, el -> - val href = el.attrAsRelativeUrl("href") - val dateFormat = SimpleDateFormat("MMM d ,yyyy", Locale("tr")) - MangaChapter( - id = generateUid(href), - title = el.selectFirstOrThrow("h3").text(), - number = (i + 1).toFloat(), - volume = 0, - url = href, - scanlator = null, - uploadDate = el.selectFirst("span")?.text()?.let { dateFormat.tryParse(it) } ?: 0L, - branch = null, - source = source, - ) - }, - ) - } - - override suspend fun getPages(chapter: MangaChapter): List { - val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() - val pageRegex = Regex("\\\\\"path\\\\\":\\\\\"([^\"]+)\\\\\"") - val script = doc.select("script").find { it.html().contains(pageRegex) }?.html() ?: return emptyList() - return pageRegex.findAll(script).mapNotNull { result -> - result.groups[1]?.value?.let { url -> - MangaPage( - id = generateUid(url), - url = "https://$cdnSuffix/upload/series/$url", - preview = null, - source = source, - ) - } - }.toList() - } - - private suspend fun fetchTags(): Set { - val doc = webClient.httpGet("https://$domain/search").parseHtml() - val script = doc.select("script").find { it.html().contains("self.__next_f.push([1,\"10:[\\\"\\$,\\\"section") }?.html() - ?: return emptySet() - - val jsonStr = script.substringAfter("\"category\":[") - .substringBefore("],\"searchParams\":{}") - .replace("\\", "") - - val jsonArray = JSONArray("[$jsonStr]") - return jsonArray.mapJSONToSet { jo -> - MangaTag( - key = jo.getString("id"), - title = jo.getString("name"), - source = source - ) - } - } +internal class TenshiManga(context: MangaLoaderContext) : + PagedMangaParser(context, MangaParserSource.TENSHIMANGA, 25) { + + override val configKeyDomain = ConfigKey.Domain("tenshimanga.com") + private val cdnSuffix = "cdn1.$domain" + + override fun onCreateConfig(keys: MutableCollection>) { + super.onCreateConfig(keys) + keys.add(userAgentKey) + } + + override val availableSortOrders: Set = EnumSet.of( + SortOrder.ALPHABETICAL, + SortOrder.ALPHABETICAL_DESC, + SortOrder.NEWEST, + SortOrder.POPULARITY, + SortOrder.UPDATED, + ) + + override val filterCapabilities: MangaListFilterCapabilities + get() = MangaListFilterCapabilities( + isSearchSupported = true, + isMultipleTagsSupported = true, + isSearchWithFiltersSupported = true, + ) + + override suspend fun getFilterOptions() = MangaListFilterOptions( + availableTags = fetchTags(), + availableStates = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED), + availableContentTypes = EnumSet.of( + ContentType.MANGA, + ContentType.MANHWA, + ContentType.MANHUA, + ContentType.COMICS, + ), + ) + + override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List { + val url = buildString { + append("https://") + append(domain) + append("/search") + append("?page=") + append(page.toString()) + + if (!filter.query.isNullOrEmpty()) { + append("&search=") + append(filter.query.urlEncoded()) + } + + if (filter.tags.isNotEmpty()) { + append("&categories=") + filter.tags.joinTo(this, ",") { it.key } + } + + if (filter.states.isNotEmpty()) { + append("&publicStatus=") + filter.states.oneOrThrowIfMany()?.let { + append( + when (it) { + MangaState.ONGOING -> "1" + MangaState.FINISHED -> "2" + MangaState.ABANDONED -> "3" + MangaState.PAUSED -> "4" + else -> "" + }, + ) + } + } + + if (filter.types.isNotEmpty()) { + append("&country=") + filter.types.oneOrThrowIfMany()?.let { + append( + when (it) { + ContentType.MANHUA -> "1" + ContentType.MANHWA -> "2" + ContentType.MANGA -> "3" + ContentType.COMICS -> "4" + else -> "" + }, + ) + } + } + + append("&order=") + append( + when (order) { + SortOrder.ALPHABETICAL -> "1" + SortOrder.ALPHABETICAL_DESC -> "2" + SortOrder.NEWEST -> "3" + SortOrder.POPULARITY -> "4" + SortOrder.UPDATED -> "5" + else -> "1" + }, + ) + } + + val doc = webClient.httpGet(url).parseHtml() + return doc.select("section[aria-label='series area'] .card").map { card -> + val href = card.selectFirstOrThrow("a").attrAsRelativeUrl("href") + Manga( + id = generateUid(href), + title = card.selectFirst("h2")?.text().orEmpty(), + altTitles = emptySet(), + url = href, + publicUrl = href.toAbsoluteUrl(domain), + rating = RATING_UNKNOWN, + contentRating = null, + coverUrl = card.selectFirst("img")?.attrAsAbsoluteUrlOrNull("src"), + tags = emptySet(), + state = null, + authors = emptySet(), + source = source, + ) + } + } + + override suspend fun getDetails(manga: Manga): Manga { + val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() + val statusText = doc.selectFirst("span:contains(Durum) + span")?.text().orEmpty() + return manga.copy( + tags = doc.select("a[href^='search?categories']").mapToSet { + val key = it.attr("href").substringAfter("?categories=") + MangaTag( + key = key, + title = it.text(), + source = source, + ) + }, + description = doc.selectFirst("div.grid h2 + p")?.text(), + state = when (statusText) { + "Devam Ediyor" -> MangaState.ONGOING + "Birakildi" -> MangaState.ONGOING + "Tamamlandi" -> MangaState.FINISHED + else -> null + }, + chapters = doc.select("div.list-episode a").mapChapters(reversed = true) { i, el -> + val href = el.attrAsRelativeUrl("href") + val dateFormat = SimpleDateFormat("MMM d ,yyyy", Locale("tr")) + MangaChapter( + id = generateUid(href), + title = el.selectFirst("h3")?.textOrNull(), + number = (i + 1).toFloat(), + volume = 0, + url = href, + scanlator = null, + uploadDate = dateFormat.parseSafe(el.selectFirst("span")?.text()), + branch = null, + source = source, + ) + }, + ) + } + + override suspend fun getPages(chapter: MangaChapter): List { + val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() + val pageRegex = Regex("\\\\\"path\\\\\":\\\\\"([^\"]+)\\\\\"") + val script = doc.select("script").find { it.html().contains(pageRegex) }?.html() ?: return emptyList() + return pageRegex.findAll(script).mapNotNull { result -> + result.groups[1]?.value?.let { url -> + MangaPage( + id = generateUid(url), + url = "https://$cdnSuffix/upload/series/$url", + preview = null, + source = source, + ) + } + }.toList() + } + + private suspend fun fetchTags(): Set { + val doc = webClient.httpGet("https://$domain/search").parseHtml() + val script = + doc.select("script").find { it.html().contains("self.__next_f.push([1,\"10:[\\\"\\$,\\\"section") }?.html() + ?: return emptySet() + + val jsonStr = script.substringAfter("\"category\":[") + .substringBefore("],\"searchParams\":{}") + .replace("\\", "") + + val jsonArray = JSONArray("[$jsonStr]") + return jsonArray.mapJSONToSet { jo -> + MangaTag( + key = jo.getString("id"), + title = jo.getString("name"), + source = source, + ) + } + } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt index 32814e6e..bb05c682 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt @@ -104,7 +104,7 @@ internal class TrWebtoon(context: MangaLoaderContext) : id = generateUid(href), url = href, publicUrl = href.toAbsoluteUrl(domain), - coverUrl = li.selectFirst("img")?.src().orEmpty(), + coverUrl = li.selectFirst("img")?.src(), title = li.selectFirst(".table-responsive a")?.text().orEmpty(), altTitles = emptySet(), rating = li.selectFirst(".row .col-xl-4 .mt-2 .my-1 .text-muted")?.text()?.substringBefore("/") @@ -117,7 +117,7 @@ internal class TrWebtoon(context: MangaLoaderContext) : else -> null }, source = source, - contentRating = if (isNsfwSource) ContentRating.ADULT else null, + contentRating = sourceContentRating, ) } } @@ -129,7 +129,7 @@ internal class TrWebtoon(context: MangaLoaderContext) : id = generateUid(href), url = href, publicUrl = href.toAbsoluteUrl(domain), - coverUrl = li.selectFirst(".figure img")?.src().orEmpty(), + coverUrl = li.selectFirst(".figure img")?.src(), title = li.selectFirst(".title")?.text().orEmpty(), altTitles = emptySet(), rating = RATING_UNKNOWN, @@ -207,7 +207,7 @@ internal class TrWebtoon(context: MangaLoaderContext) : d.endsWith(" önce") -> parseRelativeDate(date) - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/UzayManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/UzayManga.kt index 8ab5a7d4..7413da3b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/UzayManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/UzayManga.kt @@ -7,83 +7,83 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.core.PagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* -import org.koitharu.kotatsu.parsers.util.json.* +import org.koitharu.kotatsu.parsers.util.json.mapJSONToSet import java.text.SimpleDateFormat import java.util.* @MangaSourceParser("UZAYMANGA", "Uzay Manga", "tr") -internal class UzayManga(context: MangaLoaderContext): - PagedMangaParser(context, MangaParserSource.UZAYMANGA, 25) { +internal class UzayManga(context: MangaLoaderContext) : + PagedMangaParser(context, MangaParserSource.UZAYMANGA, 25) { - override val configKeyDomain = ConfigKey.Domain("uzaymanga.com") - private val cdnSuffix = "cdn1.$domain" + override val configKeyDomain = ConfigKey.Domain("uzaymanga.com") + private val cdnSuffix = "cdn1.$domain" - override fun onCreateConfig(keys: MutableCollection>) { + override fun onCreateConfig(keys: MutableCollection>) { super.onCreateConfig(keys) keys.add(userAgentKey) } - override val availableSortOrders: Set = EnumSet.of( - SortOrder.ALPHABETICAL, - SortOrder.ALPHABETICAL_DESC, - SortOrder.NEWEST, - SortOrder.POPULARITY, + override val availableSortOrders: Set = EnumSet.of( + SortOrder.ALPHABETICAL, + SortOrder.ALPHABETICAL_DESC, + SortOrder.NEWEST, + SortOrder.POPULARITY, SortOrder.UPDATED, - ) - - override val filterCapabilities: MangaListFilterCapabilities - get() = MangaListFilterCapabilities( - isSearchSupported = true, - isMultipleTagsSupported = true, - isSearchWithFiltersSupported = true, - ) - - override suspend fun getFilterOptions() = MangaListFilterOptions( - availableTags = fetchTags(), - availableStates = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED), - availableContentTypes = EnumSet.of( - ContentType.MANGA, - ContentType.MANHWA, - ContentType.MANHUA, - ContentType.COMICS, - ), - ) - - override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List { - val url = buildString { - append("https://") + ) + + override val filterCapabilities: MangaListFilterCapabilities + get() = MangaListFilterCapabilities( + isSearchSupported = true, + isMultipleTagsSupported = true, + isSearchWithFiltersSupported = true, + ) + + override suspend fun getFilterOptions() = MangaListFilterOptions( + availableTags = fetchTags(), + availableStates = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.ABANDONED, MangaState.PAUSED), + availableContentTypes = EnumSet.of( + ContentType.MANGA, + ContentType.MANHWA, + ContentType.MANHUA, + ContentType.COMICS, + ), + ) + + override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List { + val url = buildString { + append("https://") append(domain) - append("/search") - append("?page=") + append("/search") + append("?page=") append(page.toString()) - if (!filter.query.isNullOrEmpty()) { - append("&search=") - append(filter.query.urlEncoded()) - } + if (!filter.query.isNullOrEmpty()) { + append("&search=") + append(filter.query.urlEncoded()) + } - if (filter.tags.isNotEmpty()) { - append("&categories=") + if (filter.tags.isNotEmpty()) { + append("&categories=") filter.tags.joinTo(this, ",") { it.key } } - if (filter.states.isNotEmpty()) { - append("&publicStatus=") + if (filter.states.isNotEmpty()) { + append("&publicStatus=") filter.states.oneOrThrowIfMany()?.let { append( when (it) { MangaState.ONGOING -> "1" MangaState.FINISHED -> "2" - MangaState.ABANDONED -> "3" - MangaState.PAUSED -> "4" + MangaState.ABANDONED -> "3" + MangaState.PAUSED -> "4" else -> "" }, ) } } - if (filter.types.isNotEmpty()) { - append("&country=") + if (filter.types.isNotEmpty()) { + append("&country=") filter.types.oneOrThrowIfMany()?.let { append( when (it) { @@ -97,108 +97,109 @@ internal class UzayManga(context: MangaLoaderContext): } } - append("&order=") - append( - when (order) { - SortOrder.ALPHABETICAL -> "1" - SortOrder.ALPHABETICAL_DESC -> "2" - SortOrder.NEWEST -> "3" - SortOrder.POPULARITY -> "4" + append("&order=") + append( + when (order) { + SortOrder.ALPHABETICAL -> "1" + SortOrder.ALPHABETICAL_DESC -> "2" + SortOrder.NEWEST -> "3" + SortOrder.POPULARITY -> "4" SortOrder.UPDATED -> "5" - else -> "1" - } - ) - } - - val doc = webClient.httpGet(url).parseHtml() - return doc.select("section[aria-label='series area'] .card").map { card -> - val href = card.selectFirstOrThrow("a").attrAsRelativeUrl("href") - Manga( - id = generateUid(href), - title = card.selectFirst("h2")?.text().orEmpty(), - altTitles = emptySet(), - url = href, - publicUrl = href.toAbsoluteUrl(domain), - rating = RATING_UNKNOWN, - contentRating = null, - coverUrl = card.selectFirst("img")?.attrAsAbsoluteUrlOrNull("src"), - tags = emptySet(), - state = null, - authors = emptySet(), - source = source, - ) - } - } - - override suspend fun getDetails(manga: Manga): Manga { - val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() - val statusText = doc.selectFirst("span:contains(Durum) + span")?.text().orEmpty() - return manga.copy( - tags = doc.select("a[href^='search?categories']").mapToSet { - val key = it.attr("href").substringAfter("?categories=") - MangaTag( - key = key, - title = it.text(), - source = source, - ) - }, - description = doc.selectFirst("div.grid h2 + p")?.text(), - state = when (statusText) { - "Devam Ediyor" -> MangaState.ONGOING - "Birakildi" -> MangaState.ONGOING - "Tamamlandi" -> MangaState.FINISHED - else -> null - }, - chapters = doc.select("div.list-episode a").mapChapters(reversed = true) { i, el -> - val href = el.attrAsRelativeUrl("href") - val dateFormat = SimpleDateFormat("MMM d ,yyyy", Locale("tr")) - MangaChapter( - id = generateUid(href), - title = el.selectFirstOrThrow("h3").text(), - number = (i + 1).toFloat(), - volume = 0, - url = href, - scanlator = null, - uploadDate = el.selectFirst("span")?.text()?.let { dateFormat.tryParse(it) } ?: 0L, - branch = null, - source = source, - ) - }, - ) - } - - override suspend fun getPages(chapter: MangaChapter): List { - val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() - val pageRegex = Regex("\\\\\"path\\\\\":\\\\\"([^\"]+)\\\\\"") - val script = doc.select("script").find { it.html().contains(pageRegex) }?.html() ?: return emptyList() - return pageRegex.findAll(script).mapNotNull { result -> - result.groups[1]?.value?.let { url -> - MangaPage( - id = generateUid(url), - url = "https://$cdnSuffix/upload/series/$url", - preview = null, - source = source, - ) - } - }.toList() - } - - private suspend fun fetchTags(): Set { - val doc = webClient.httpGet("https://$domain/search").parseHtml() - val script = doc.select("script").find { it.html().contains("self.__next_f.push([1,\"10:[\\\"\\$,\\\"section") }?.html() - ?: return emptySet() - - val jsonStr = script.substringAfter("\"category\":[") - .substringBefore("],\"searchParams\":{}") - .replace("\\", "") - - val jsonArray = JSONArray("[$jsonStr]") - return jsonArray.mapJSONToSet { jo -> - MangaTag( - key = jo.getString("id"), - title = jo.getString("name"), - source = source - ) - } - } + else -> "1" + }, + ) + } + + val doc = webClient.httpGet(url).parseHtml() + return doc.select("section[aria-label='series area'] .card").map { card -> + val href = card.selectFirstOrThrow("a").attrAsRelativeUrl("href") + Manga( + id = generateUid(href), + title = card.selectFirst("h2")?.text().orEmpty(), + altTitles = emptySet(), + url = href, + publicUrl = href.toAbsoluteUrl(domain), + rating = RATING_UNKNOWN, + contentRating = null, + coverUrl = card.selectFirst("img")?.attrAsAbsoluteUrlOrNull("src"), + tags = emptySet(), + state = null, + authors = emptySet(), + source = source, + ) + } + } + + override suspend fun getDetails(manga: Manga): Manga { + val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() + val statusText = doc.selectFirst("span:contains(Durum) + span")?.text().orEmpty() + return manga.copy( + tags = doc.select("a[href^='search?categories']").mapToSet { + val key = it.attr("href").substringAfter("?categories=") + MangaTag( + key = key, + title = it.text(), + source = source, + ) + }, + description = doc.selectFirst("div.grid h2 + p")?.text(), + state = when (statusText) { + "Devam Ediyor" -> MangaState.ONGOING + "Birakildi" -> MangaState.ONGOING + "Tamamlandi" -> MangaState.FINISHED + else -> null + }, + chapters = doc.select("div.list-episode a").mapChapters(reversed = true) { i, el -> + val href = el.attrAsRelativeUrl("href") + val dateFormat = SimpleDateFormat("MMM d ,yyyy", Locale("tr")) + MangaChapter( + id = generateUid(href), + title = el.selectFirst("h3")?.textOrNull(), + number = (i + 1).toFloat(), + volume = 0, + url = href, + scanlator = null, + uploadDate = dateFormat.parseSafe(el.selectFirst("span")?.text()), + branch = null, + source = source, + ) + }, + ) + } + + override suspend fun getPages(chapter: MangaChapter): List { + val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() + val pageRegex = Regex("\\\\\"path\\\\\":\\\\\"([^\"]+)\\\\\"") + val script = doc.select("script").find { it.html().contains(pageRegex) }?.html() ?: return emptyList() + return pageRegex.findAll(script).mapNotNull { result -> + result.groups[1]?.value?.let { url -> + MangaPage( + id = generateUid(url), + url = "https://$cdnSuffix/upload/series/$url", + preview = null, + source = source, + ) + } + }.toList() + } + + private suspend fun fetchTags(): Set { + val doc = webClient.httpGet("https://$domain/search").parseHtml() + val script = + doc.select("script").find { it.html().contains("self.__next_f.push([1,\"10:[\\\"\\$,\\\"section") }?.html() + ?: return emptySet() + + val jsonStr = script.substringAfter("\"category\":[") + .substringBefore("],\"searchParams\":{}") + .replace("\\", "") + + val jsonArray = JSONArray("[$jsonStr]") + return jsonArray.mapJSONToSet { jo -> + MangaTag( + key = jo.getString("id"), + title = jo.getString("name"), + source = source, + ) + } + } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt index 38e5ea9a..f06637f3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt @@ -78,7 +78,7 @@ internal class HentaiUkrParser(context: MangaLoaderContext) : AbstractMangaParse volume = 0, url = manga.url, scanlator = null, - uploadDate = date.tryParse(jsonDeferred.await().getString("add_date")), + uploadDate = date.parseSafe(jsonDeferred.await().getString("add_date")), branch = null, source = source, ), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt index 9571402e..3ee57f82 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt @@ -80,7 +80,7 @@ internal class HoneyMangaParser(context: MangaLoaderContext) : volume = volume, url = jo.optString("chapterResourcesId"), scanlator = null, - uploadDate = dateFormat.tryParse(jo.getString("lastUpdated")), + uploadDate = dateFormat.parseSafe(jo.getString("lastUpdated")), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt index fdab59f5..5a6dc66f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt @@ -145,7 +145,7 @@ internal class MangaInUaParser(context: MangaLoaderContext) : PagedMangaParser( } else { DEF_BRANCH_NAME }, - uploadDate = dateFormat.tryParse(item.selectFirst("div.ltcright")?.text()), + uploadDate = dateFormat.parseSafe(item.selectFirst("div.ltcright")?.text()), source = source, ) }, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt index 5932e1e9..2bf6723b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt @@ -150,7 +150,7 @@ internal class BlogTruyenParser(context: MangaLoaderContext) : val name = titleElement.text() val relativeUrl = titleElement.attrAsRelativeUrl("href") val id = relativeUrl.substringAfter('/').substringBefore('/') - val uploadDate = dateFormat.tryParse(element.select("span.publishedDate").text()) + val uploadDate = dateFormat.parseSafe(element.select("span.publishedDate").text()) MangaChapter( id = generateUid(id), title = name, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt index a38c0f49..89b8a775 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt @@ -202,7 +202,7 @@ internal class BlogTruyenVN(context: MangaLoaderContext) : val name = titleElement.text() val relativeUrl = titleElement.attrAsRelativeUrl("href") val id = relativeUrl.substringAfter('/').substringBefore('/') - val uploadDate = dateFormat.tryParse(element.select("span.publishedDate").text()) + val uploadDate = dateFormat.parseSafe(element.select("span.publishedDate").text()) MangaChapter( id = generateUid(id), title = name, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt index f8bef91c..4b13e0c5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt @@ -94,7 +94,7 @@ internal class CMangaParser(context: MangaLoaderContext) : number = chapterNumber, volume = 0, url = "/album/$slug/chapter-$mangaId-$chapterId", - uploadDate = df.tryParse(info.getString("last_update")), + uploadDate = df.parseSafe(info.getString("last_update")), branch = null, scanlator = null, source = source, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt index 46a06f7b..29a3028a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt @@ -197,7 +197,7 @@ internal class CuuTruyenParser(context: MangaLoaderContext) : volume = 0, url = "/api/v2/chapters/$chapterId", scanlator = team, - uploadDate = chapterDateFormat.tryParse(jo.getStringOrNull("created_at")), + uploadDate = chapterDateFormat.parseSafe(jo.getStringOrNull("created_at")), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt index 40c2a606..c3662ae6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt @@ -118,7 +118,7 @@ internal class DuaLeoTruyen(context: MangaLoaderContext) : number = i + 1f, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), branch = null, source = source, volume = 0, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HangTruyen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HangTruyen.kt index 7751360f..3ed70fec 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HangTruyen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HangTruyen.kt @@ -153,7 +153,7 @@ internal class HangTruyen(context: MangaLoaderContext) : PagedMangaParser(contex number = chapter.getDouble("index").toFloat(), url = chapterUrl, scanlator = null, - uploadDate = dateFormat.tryParse(chapter.getString("releasedAt")), + uploadDate = dateFormat.parseSafe(chapter.getString("releasedAt")), branch = null, source = source, volume = 0 diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Hentai18VN.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Hentai18VN.kt index 61ee8e34..677ddc22 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Hentai18VN.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Hentai18VN.kt @@ -216,6 +216,6 @@ internal class Hentai18VN(context: MangaLoaderContext) : } private fun parseChapterDate(date: String?): Long { - return SimpleDateFormat("dd/MM/yyyy", Locale.US).tryParse(date) + return SimpleDateFormat("dd/MM/yyyy", Locale.US).parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt index 657af36d..1b35d2a8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt @@ -251,7 +251,7 @@ internal class HentaiVNParser(context: MangaLoaderContext) : AbstractMangaParser volume = 0, url = titleEl.attrAsRelativeUrl("href"), scanlator = null, - uploadDate = chapterDateFormat.tryParse(dateStr), + uploadDate = chapterDateFormat.parseSafe(dateStr), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt index 4601ef9e..c62612f1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt @@ -186,7 +186,7 @@ internal class LxManga(context: MangaLoaderContext) : PagedMangaParser(context, volume = 0, url = href, scanlator = scanlator, - uploadDate = chapterDateFormat.tryParse(dateText), + uploadDate = chapterDateFormat.parseSafe(dateText), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NhentaiWorld.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NhentaiWorld.kt index daa8809c..6a1254c3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NhentaiWorld.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NhentaiWorld.kt @@ -1,7 +1,6 @@ package org.koitharu.kotatsu.parsers.site.vi import okhttp3.Headers -import okio.ByteString.Companion.encode import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser @@ -188,7 +187,7 @@ internal class NhentaiWorld(context: MangaLoaderContext) : val chapter = vnArray.getJSONObject(i) val name = chapter.optString("name", null) ?: continue val uploadDateStr = chapter.optString("createdAt", null) - val uploadDate = chapterDateFormat.tryParse(uploadDateStr) + val uploadDate = chapterDateFormat.parseSafe(uploadDateStr) val href = "${idManga}/${name}?lang=VI" chapters.add( MangaChapter( @@ -224,7 +223,7 @@ internal class NhentaiWorld(context: MangaLoaderContext) : val chapter = enArray.getJSONObject(i) val name = chapter.optString("name", null) ?: continue val uploadDateStr = chapter.optString("createdAt", null) - val uploadDate = chapterDateFormat.tryParse(uploadDateStr) + val uploadDate = chapterDateFormat.parseSafe(uploadDateStr) val href = "${idManga}/${name}?lang=EN" chapters.add( MangaChapter( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt index 2af87ba6..3a9dd416 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenGG.kt @@ -169,7 +169,7 @@ internal class TruyenGG(context: MangaLoaderContext) : PagedMangaParser(context, volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentaiVN.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentaiVN.kt index 6faba378..55aea6d3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentaiVN.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentaiVN.kt @@ -122,7 +122,7 @@ internal class TruyenHentaiVN(context: MangaLoaderContext) : val name = div.selectFirst("a .name")?.text() ?: "" val dateStr = div.selectFirst("a span:last-child")?.text() - val uploadDate = dateFormat.tryParse(dateStr) + val uploadDate = dateFormat.parseSafe(dateStr) MangaChapter( id = generateUid(url), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenQQ.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenQQ.kt index 3681c5c2..e412b8b8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenQQ.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenQQ.kt @@ -180,7 +180,7 @@ internal class TruyenQQ(context: MangaLoaderContext) : PagedMangaParser(context, volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt index d64864d2..f1f7352c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt @@ -113,7 +113,7 @@ internal class YurinekoParser(context: MangaLoaderContext) : volume = 0, scanlator = null, url = "/read/$mangaId/$chapterId", - uploadDate = df.tryParse(jo.getString("date")), + uploadDate = df.parseSafe(jo.getString("date")), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt index ea678031..85a367a3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt @@ -310,9 +310,9 @@ internal abstract class WpComicsParser( } else { it } - }.let { dateFormat.tryParse(it.joinToString(" ")) } + }.let { dateFormat.parseSafe(it.joinToString(" ")) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt index e27fe808..f1c204f9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt @@ -165,7 +165,7 @@ internal class XoxoComics(context: MangaLoaderContext) : volume = 0, url = href, scanlator = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/DocTruyen3Q.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/DocTruyen3Q.kt index 2e3d1ecf..96fa3110 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/DocTruyen3Q.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/DocTruyen3Q.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.parsers.site.wpcomics.vi import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.util.* @@ -206,7 +205,7 @@ internal class DocTruyen3Q(context: MangaLoaderContext) : absoluteTimePattern.matches(dateText) -> { val formatter = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()) - formatter.tryParse(dateText) + formatter.parseSafe(dateText) } else -> 0L diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyen.kt index 76de6465..922df832 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyen.kt @@ -4,7 +4,6 @@ import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.util.* @@ -61,7 +60,7 @@ internal class NetTruyen(context: MangaLoaderContext) : volume = 0, url = chapterUrl, scanlator = null, - uploadDate = df.tryParse(jo.getString("updated_at")), + uploadDate = df.parseSafe(jo.getString("updated_at")), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenVie.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenVie.kt index 7322f9c5..e326e053 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenVie.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenVie.kt @@ -58,7 +58,7 @@ internal class NetTruyenVie(context: MangaLoaderContext) : volume = 0, url = chapterUrl, scanlator = null, - uploadDate = df.tryParse(jo.getString("updated_at")), + uploadDate = df.parseSafe(jo.getString("updated_at")), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenX.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenX.kt index c4171c8f..6f7538f5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenX.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenX.kt @@ -4,7 +4,6 @@ import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.util.* @@ -68,7 +67,7 @@ internal class NetTruyenX(context: MangaLoaderContext) : volume = 0, url = chapterUrl, scanlator = null, - uploadDate = df.tryParse(jo.getString("updated_at")), + uploadDate = df.parseSafe(jo.getString("updated_at")), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NhatTruyenVN.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NhatTruyenVN.kt index 56a2e623..acc135fd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NhatTruyenVN.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NhatTruyenVN.kt @@ -2,10 +2,8 @@ package org.koitharu.kotatsu.parsers.site.wpcomics.vi import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope -import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.util.* @@ -61,7 +59,7 @@ internal class NhatTruyenVN(context: MangaLoaderContext) : volume = 0, url = chapterUrl, scanlator = null, - uploadDate = df.tryParse(jo.getString("updated_at")), + uploadDate = df.parseSafe(jo.getString("updated_at")), branch = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/TopTruyen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/TopTruyen.kt index f6e5c7f1..638cd226 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/TopTruyen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/TopTruyen.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.parsers.site.wpcomics.vi import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.util.* @@ -206,7 +205,7 @@ internal class TopTruyen(context: MangaLoaderContext) : absoluteTimePattern.matches(dateText) -> { val formatter = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()) - formatter.tryParse(dateText) + formatter.parseSafe(dateText) } else -> 0L diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt index 12fc497b..168cece5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/ZeistMangaParser.kt @@ -299,7 +299,7 @@ internal abstract class ZeistMangaParser( number = i + 1f, volume = 0, branch = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), scanlator = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/KomikGes.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/KomikGes.kt index d73f9a53..f14eb0c5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/KomikGes.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zeistmanga/id/KomikGes.kt @@ -49,7 +49,7 @@ internal class KomikGes(context: MangaLoaderContext) : number = i + 1f, volume = 0, branch = null, - uploadDate = dateFormat.tryParse(dateText), + uploadDate = dateFormat.parseSafe(dateText), scanlator = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt index c0fb016a..f6bb36b2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt @@ -311,9 +311,9 @@ internal abstract class ZMangaParser( } else { it } - }.let { dateFormat.tryParse(it.joinToString(" ")) } + }.let { dateFormat.parseSafe(it.joinToString(" ")) } - else -> dateFormat.tryParse(date) + else -> dateFormat.parseSafe(date) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt index 6b734a1a..b37b9680 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt @@ -87,8 +87,7 @@ public fun concatUrl(host: String, path: String): String { } @InternalParsersApi -public fun DateFormat.tryParse(str: String?): Long = if (str.isNullOrEmpty()) { -// assert(false) { "Date string is null or empty" } +public fun DateFormat.parseSafe(str: String?): Long = if (str.isNullOrEmpty()) { 0L } else { runCatching {