From ed578e5bffc9f7329c1a92e4095ac1f29578085a Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 27 Feb 2025 19:08:38 +0200 Subject: [PATCH] Migrate altTitle to Set --- build.gradle | 8 ++-- buildSrc/build.gradle | 2 +- .../koitharu/kotatsu/parsers/model/Manga.kt | 13 +++-- .../kotatsu/parsers/site/all/BatoToParser.kt | 4 +- .../parsers/site/all/ComickFunParser.kt | 10 ++-- .../parsers/site/all/ExHentaiParser.kt | 6 +-- .../parsers/site/all/HitomiLaParser.kt | 4 +- .../kotatsu/parsers/site/all/ImHentai.kt | 6 +-- .../parsers/site/all/LineWebtoonsParser.kt | 8 ++-- .../parsers/site/all/MangaDexParser.kt | 4 +- .../parsers/site/all/MangaFireParser.kt | 10 ++-- .../kotatsu/parsers/site/all/MangaPark.kt | 6 +-- .../parsers/site/all/MangaPlusParser.kt | 4 +- .../parsers/site/all/MangaReaderToParser.kt | 8 ++-- .../parsers/site/all/NineMangaParser.kt | 4 +- .../site/all/NineNineNineHentaiParser.kt | 6 +-- .../parsers/site/all/WebtoonsParser.kt | 8 ++-- .../animebootstrap/AnimeBootstrapParser.kt | 4 +- .../parsers/site/animebootstrap/fr/PapScan.kt | 2 +- .../kotatsu/parsers/site/ar/FlixScans.kt | 4 +- .../kotatsu/parsers/site/ar/MangaStorm.kt | 4 +- .../kotatsu/parsers/site/ar/TeamXNovel.kt | 4 +- .../kotatsu/parsers/site/be/AnibelParser.kt | 8 ++-- .../parsers/site/cupfox/CupFoxParser.kt | 10 ++-- .../parsers/site/en/AsuraScansParser.kt | 4 +- .../kotatsu/parsers/site/en/BeeToon.kt | 4 +- .../parsers/site/en/CloneMangaParser.kt | 4 +- .../kotatsu/parsers/site/en/ComicExtra.kt | 6 +-- .../kotatsu/parsers/site/en/DynastyScans.kt | 6 +-- .../kotatsu/parsers/site/en/FlameComics.kt | 8 ++-- .../kotatsu/parsers/site/en/FlixScansOrg.kt | 7 ++- .../kotatsu/parsers/site/en/MangaGeko.kt | 6 +-- .../kotatsu/parsers/site/en/MangaKawaiiEn.kt | 8 ++-- .../parsers/site/en/MangaTownParser.kt | 4 +- .../kotatsu/parsers/site/en/Mangaowl.kt | 4 +- .../kotatsu/parsers/site/en/Manhwa18Com.kt | 10 ++-- .../kotatsu/parsers/site/en/Manhwa18Parser.kt | 10 ++-- .../kotatsu/parsers/site/en/ManhwasMen.kt | 4 +- .../kotatsu/parsers/site/en/MyComicList.kt | 4 +- .../kotatsu/parsers/site/en/Po2Scans.kt | 4 +- .../kotatsu/parsers/site/en/Pururin.kt | 6 +-- .../kotatsu/parsers/site/en/VyManga.kt | 4 +- .../kotatsu/parsers/site/en/WeebCentral.kt | 7 ++- .../kotatsu/parsers/site/es/TempleScanEsp.kt | 4 +- .../parsers/site/es/TuMangaOnlineParser.kt | 4 +- .../parsers/site/fmreader/FmreaderParser.kt | 8 ++-- .../kotatsu/parsers/site/fmreader/ja/Klz9.kt | 2 +- .../parsers/site/foolslide/FoolSlideParser.kt | 4 +- .../parsers/site/fr/BentomangaParser.kt | 6 +-- .../kotatsu/parsers/site/fr/FuryoSociety.kt | 4 +- .../parsers/site/fr/LegacyScansParser.kt | 6 +-- .../kotatsu/parsers/site/fr/LireScan.kt | 10 ++-- .../kotatsu/parsers/site/fr/LugnicaScans.kt | 6 +-- .../kotatsu/parsers/site/fr/MangaKawaii.kt | 13 +++-- .../kotatsu/parsers/site/fr/MangaMana.kt | 12 +++-- .../kotatsu/parsers/site/fr/ScansMangasMe.kt | 8 ++-- .../kotatsu/parsers/site/fr/ScantradUnion.kt | 8 ++-- .../site/fuzzydoodle/FuzzyDoodleParser.kt | 6 +-- .../site/galleryadults/GalleryAdultsParser.kt | 4 +- .../site/galleryadults/all/DoujinDesuUk.kt | 2 +- .../site/galleryadults/all/NHentaiParser.kt | 2 +- .../site/galleryadults/all/NHentaiToParser.kt | 2 +- .../galleryadults/all/NHentaiXxxParser.kt | 2 +- .../parsers/site/gattsu/GattsuParser.kt | 4 +- .../site/gattsu/pt/MundoHentaiOficial.kt | 7 ++- .../kotatsu/parsers/site/guya/GuyaParser.kt | 9 ++-- .../kotatsu/parsers/site/heancms/HeanCms.kt | 4 +- .../parsers/site/heancmsalt/HeanCmsAlt.kt | 6 +-- .../parsers/site/heancmsalt/es/Brakeout.kt | 2 +- .../parsers/site/hotcomics/HotComicsParser.kt | 4 +- .../parsers/site/id/DoujinDesuParser.kt | 4 +- .../kotatsu/parsers/site/id/HentaiCrot.kt | 8 ++-- .../kotatsu/parsers/site/id/PixHentai.kt | 8 ++-- .../kotatsu/parsers/site/iken/IkenParser.kt | 4 +- .../parsers/site/ja/NicovideoSeigaParser.kt | 6 +-- .../parsers/site/keyoapp/KeyoappParser.kt | 4 +- .../parsers/site/likemanga/LikeMangaParser.kt | 6 +-- .../parsers/site/liliana/LilianaParser.kt | 4 +- .../parsers/site/madara/MadaraParser.kt | 8 ++-- .../parsers/site/madara/all/Manga18Fx.kt | 2 +- .../parsers/site/madara/all/Manhwa18Cc.kt | 2 +- .../parsers/site/madara/en/AdultWebtoon.kt | 2 +- .../parsers/site/madara/en/FireScans.kt | 2 +- .../parsers/site/madara/en/Hentai4Free.kt | 2 +- .../parsers/site/madara/en/HentaiManga.kt | 2 +- .../parsers/site/madara/en/HentaiWebtoon.kt | 2 +- .../parsers/site/madara/en/IsekaiScan.kt | 2 +- .../site/madara/en/IsekaiScanEuParser.kt | 2 +- .../parsers/site/madara/en/MangaDass.kt | 4 +- .../parsers/site/madara/en/MangaDna.kt | 4 +- .../parsers/site/madara/en/MangaPure.kt | 2 +- .../parsers/site/madara/en/ManhwaHentai.kt | 2 +- .../kotatsu/parsers/site/madara/en/Manhwaz.kt | 2 +- .../parsers/site/madara/en/ManyToon.kt | 2 +- .../parsers/site/madara/en/ShibaManga.kt | 2 +- .../site/madara/es/DragonTranslationParser.kt | 2 +- .../parsers/site/madara/es/MangasNoSekai.kt | 6 ++- .../parsers/site/madara/es/TmoManga.kt | 2 +- .../parsers/site/madara/id/ManhwaHub.kt | 2 +- .../parsers/site/madara/ja/MangaFenxi.kt | 2 +- .../parsers/site/madara/vi/Saytruyenhay.kt | 4 +- .../parsers/site/madtheme/MadthemeParser.kt | 6 +-- .../parsers/site/manga18/Manga18Parser.kt | 8 ++-- .../parsers/site/manga18/en/Hentai3zCc.kt | 2 +- .../parsers/site/mangabox/MangaboxParser.kt | 4 +- .../parsers/site/mangabox/en/Mangairo.kt | 6 +-- .../parsers/site/mangabox/en/Mangakakalot.kt | 10 ++-- .../site/mangabox/en/MangakakalotTv.kt | 14 ++++-- .../site/mangadventure/MangAdventureParser.kt | 6 +-- .../site/mangareader/MangaReaderParser.kt | 4 +- .../parsers/site/mangareader/en/RizzComic.kt | 2 +- .../site/mangareader/fr/RevolutionScantrad.kt | 2 +- .../mangareader/fr/XxxRevolutionScantrad.kt | 2 +- .../parsers/site/mangareader/id/Komikcast.kt | 2 +- .../site/mangaworld/MangaWorldParser.kt | 7 +-- .../parsers/site/mmrcms/MmrcmsParser.kt | 10 ++-- .../kotatsu/parsers/site/mmrcms/ar/Onma.kt | 4 +- .../parsers/site/nepnep/NepnepParser.kt | 4 +- .../parsers/site/onemanga/OneMangaParser.kt | 8 ++-- .../otakusanctuary/OtakuSanctuaryParser.kt | 6 +-- .../site/pizzareader/PizzaReaderParser.kt | 7 +-- .../kotatsu/parsers/site/pt/BrMangas.kt | 4 +- .../kotatsu/parsers/site/pt/LerManga.kt | 7 ++- .../kotatsu/parsers/site/pt/LerMangaOnline.kt | 4 +- .../parsers/site/pt/LuratoonScansParser.kt | 13 +++-- .../kotatsu/parsers/site/pt/MangaOnline.kt | 6 +-- .../kotatsu/parsers/site/pt/MuitoHentai.kt | 4 +- .../kotatsu/parsers/site/pt/OnePieceEx.kt | 6 +-- .../kotatsu/parsers/site/pt/YugenMangas.kt | 6 +-- .../kotatsu/parsers/site/ru/AComics.kt | 4 +- .../kotatsu/parsers/site/ru/DesuMeParser.kt | 4 +- .../kotatsu/parsers/site/ru/MangaWtfParser.kt | 6 +-- .../kotatsu/parsers/site/ru/NudeMoonParser.kt | 4 +- .../kotatsu/parsers/site/ru/RemangaParser.kt | 4 +- .../kotatsu/parsers/site/ru/WaMangaParser.kt | 4 +- .../parsers/site/ru/grouple/GroupleParser.kt | 10 ++-- .../parsers/site/ru/multichan/ChanParser.kt | 8 ++-- .../parsers/site/ru/rulib/LibSocialParser.kt | 6 +-- .../kotatsu/parsers/site/scan/ScanParser.kt | 11 +++-- .../kotatsu/parsers/site/scan/fr/MangaFr.kt | 7 +-- .../kotatsu/parsers/site/scan/it/ScanIta.kt | 2 +- .../kotatsu/parsers/site/sinmh/SinmhParser.kt | 4 +- .../kotatsu/parsers/site/tr/MangaAy.kt | 8 ++-- .../kotatsu/parsers/site/tr/SadScans.kt | 4 +- .../kotatsu/parsers/site/tr/TrWebtoon.kt | 6 +-- .../parsers/site/uk/HentaiUkrParser.kt | 4 +- .../parsers/site/uk/HoneyMangaParser.kt | 4 +- .../parsers/site/uk/MangaInUaParser.kt | 4 +- .../parsers/site/vi/BlogTruyenParser.kt | 6 +-- .../kotatsu/parsers/site/vi/BlogTruyenVN.kt | 6 +-- .../kotatsu/parsers/site/vi/BuonDuaParser.kt | 2 +- .../kotatsu/parsers/site/vi/CMangaParser.kt | 37 +++----------- .../parsers/site/vi/CuuTruyenParser.kt | 5 +- .../kotatsu/parsers/site/vi/DuaLeoTruyen.kt | 6 +-- .../kotatsu/parsers/site/vi/GocTruyenTranh.kt | 6 +-- .../kotatsu/parsers/site/vi/Hentai18VN.kt | 14 +++--- .../kotatsu/parsers/site/vi/HentaiVNParser.kt | 12 ++--- .../kotatsu/parsers/site/vi/HentaiVnBuzz.kt | 7 ++- .../kotatsu/parsers/site/vi/KuroNeko.kt | 6 +-- .../kotatsu/parsers/site/vi/LxManga.kt | 6 +-- .../kotatsu/parsers/site/vi/SayHentai.kt | 6 +-- .../kotatsu/parsers/site/vi/TruyenGG.kt | 6 +-- .../kotatsu/parsers/site/vi/TruyenHentaiVN.kt | 8 ++-- .../kotatsu/parsers/site/vi/TruyenQQ.kt | 6 +-- .../kotatsu/parsers/site/vi/TruyenTranh3Q.kt | 6 +-- .../kotatsu/parsers/site/vi/VcomycsParser.kt | 48 +++++-------------- .../kotatsu/parsers/site/vi/YurinekoParser.kt | 4 +- .../kotatsu/parsers/site/vmp/VmpParser.kt | 4 +- .../parsers/site/wpcomics/WpComicsParser.kt | 6 +-- .../parsers/site/wpcomics/en/XoxoComics.kt | 2 +- .../parsers/site/wpcomics/vi/DocTruyen3Q.kt | 4 +- .../parsers/site/wpcomics/vi/HamTruyen.kt | 10 ++-- .../parsers/site/wpcomics/vi/MeHentaiVN.kt | 2 +- .../parsers/site/wpcomics/vi/NetTruyen.kt | 10 ++-- .../parsers/site/wpcomics/vi/NetTruyenVie.kt | 8 +--- .../parsers/site/wpcomics/vi/NhatTruyenVN.kt | 8 ++-- .../parsers/site/wpcomics/vi/TopTruyen.kt | 4 +- .../site/zeistmanga/ZeistMangaParser.kt | 4 +- .../kotatsu/parsers/site/zh/Baozimh.kt | 6 +-- .../parsers/site/zmanga/ZMangaParser.kt | 6 +-- .../kotatsu/parsers/util/LinkResolver.kt | 6 +-- .../kotatsu/parsers/util/json/JsonExt.kt | 11 +++++ .../org/koitharu/kotatsu/test_util/Util.kt | 2 +- 183 files changed, 541 insertions(+), 529 deletions(-) diff --git a/build.gradle b/build.gradle index 4dc7f0021..50a82aa8b 100644 --- a/build.gradle +++ b/build.gradle @@ -58,10 +58,10 @@ afterEvaluate { } dependencies { - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1' implementation 'com.squareup.okhttp3:okhttp:4.12.0' - implementation 'com.squareup.okio:okio:3.9.0' - api 'org.jsoup:jsoup:1.18.1' + implementation 'com.squareup.okio:okio:3.10.2' + api 'org.jsoup:jsoup:1.18.3' implementation 'org.json:json:20240303' implementation 'androidx.collection:collection:1.4.5' @@ -70,7 +70,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.1' testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.1' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.1' - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.1' testImplementation 'io.webfolder:quickjs:1.1.0' } diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 422038ba0..577528ddd 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -14,5 +14,5 @@ dependencies { implementation gradleApi() implementation 'org.simpleframework:simple-xml:2.7.1' implementation 'com.soywiz.korlibs.korte:korte-jvm:4.0.10' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1' } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/Manga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/Manga.kt index 17c9c80c9..86c1be8e5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/Manga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/Manga.kt @@ -14,9 +14,9 @@ public data class Manga( */ @JvmField public val title: String, /** - * Alternative title (for example on other language), may be null + * Alternative titles (for example on other language), may be empty */ - @JvmField public val altTitle: String?, + @JvmField public val altTitles: Set, /** * Relative url to manga (**without** a domain) or any other uri. * Used principally in parsers @@ -140,7 +140,7 @@ public data class Manga( ) : this( id = id, title = title, - altTitle = altTitle?.nullIfEmpty(), + altTitles = setOfNotNull(altTitle?.nullIfEmpty()), url = url, publicUrl = publicUrl, rating = rating, @@ -162,6 +162,13 @@ public data class Manga( public val author: String? get() = authors.firstOrNull() + /** + * Alternative title (for example on other language), may be null + */ + @Deprecated("Please use altTitles") + public val altTitle: String? + get() = altTitles.firstOrNull() + /** * Return if manga has a specified rating * @see rating diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt index d06cbd8cf..f8d146234 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt @@ -7,8 +7,8 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -334,7 +334,7 @@ internal class BatoToParser(context: MangaLoaderContext) : LegacyPagedMangaParse Manga( id = generateUid(href), title = title, - altTitle = div.selectFirst(".item-alias")?.text()?.takeUnless { it == title }, + altTitles = setOfNotNull(div.selectFirst(".item-alias")?.textOrNull()?.takeUnless { it == title }), url = href, publicUrl = a.absUrl("href"), rating = RATING_UNKNOWN, 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 2da65279a..99573e139 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 @@ -7,8 +7,8 @@ import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -152,7 +152,7 @@ internal class ComickFunParser(context: MangaLoaderContext) : Manga( id = generateUid(slug), title = jo.getString("title"), - altTitle = null, + altTitles = emptySet(), url = slug, publicUrl = "https://$domain/comic/$slug", rating = jo.getDoubleOrDefault("rating", -10.0).toFloat() / 10f, @@ -179,12 +179,12 @@ internal class ComickFunParser(context: MangaLoaderContext) : val url = "https://api.$domain/comic/${manga.url}?tachiyomi=true" val jo = webClient.httpGet(url).parseJson() val comic = jo.getJSONObject("comic") - val alt = comic.getJSONArray("md_titles").asTypedList().joinToString("\n") { - it.getStringOrNull("title").orEmpty() + val alt = comic.getJSONArray("md_titles").asTypedList().mapNotNullToSet { + it.getStringOrNull("title") } val author = jo.getJSONArray("artists").optJSONObject(0)?.getStringOrNull("name") return manga.copy( - altTitle = alt.nullIfEmpty(), + altTitles = alt, contentRating = if (jo.getBooleanOrDefault("matureContent", false) || comic.getBooleanOrDefault("hentai", false) ) { 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 d37a9ac64..c4d04d82a 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 @@ -13,8 +13,8 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.exception.TooManyRequestExceptions import org.koitharu.kotatsu.parsers.model.* @@ -173,7 +173,7 @@ internal class ExHentaiParser( Manga( id = generateUid(href), title = rawTitle.cleanupTitle(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = a.absUrl("href"), rating = td2.selectFirst("div.ir")?.parseRating() ?: RATING_UNKNOWN, @@ -213,7 +213,7 @@ internal class ExHentaiParser( return manga.copy( title = title?.getElementById("gn")?.text()?.cleanupTitle() ?: manga.title, - altTitle = (title?.getElementById("gj")?.text()?.cleanupTitle() ?: manga.altTitle)?.nullIfEmpty(), + altTitles = setOfNotNull(title?.getElementById("gj")?.text()?.cleanupTitle()?.nullIfEmpty()), publicUrl = doc.baseUri().ifEmpty { manga.publicUrl }, rating = root.getElementById("rating_label")?.text() ?.substringAfterLast(' ') 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 b8c7c1086..2d2607bcd 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 @@ -11,9 +11,9 @@ import org.json.JSONArray import org.json.JSONObject import org.jsoup.Jsoup import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getStringOrNull @@ -528,7 +528,7 @@ internal class HitomiLaParser(context: MangaLoaderContext) : LegacyMangaParser(c tags = emptySet(), contentRating = ContentRating.ADULT, rating = RATING_UNKNOWN, - altTitle = null, + altTitles = emptySet(), state = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt index 9a4c8149f..31404ebdf 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt @@ -7,8 +7,8 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -122,7 +122,7 @@ internal class ImHentai(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(domain), coverUrl = a.selectFirst("img")?.src(), title = div.selectFirst(".caption")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -200,7 +200,7 @@ internal class ImHentai(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(domain), coverUrl = a.selectFirst("img")?.src(), title = div.selectFirst(".caption")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt index ac577ebe5..27a99cdbf 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt @@ -6,9 +6,9 @@ import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.exception.NotFoundException import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* @@ -126,7 +126,7 @@ internal abstract class LineWebtoonsParser( Manga( id = generateUid(titleNo), title = jo.getString("title"), - altTitle = null, + altTitles = emptySet(), url = "$titleNo", publicUrl = "https://$domain/$languageCode/canvas/a/list?title_no=${titleNo}", rating = jo.getFloatOrDefault("starScoreAverage", -10f) / 10f, @@ -157,7 +157,7 @@ internal abstract class LineWebtoonsParser( Manga( id = generateUid(titleNo), title = jo.getString("title"), - altTitle = null, + altTitles = emptySet(), url = titleNo.toString(), publicUrl = "https://$domain/$languageCode/canvas/a/list?title_no=$titleNo", rating = RATING_UNKNOWN, @@ -203,7 +203,7 @@ internal abstract class LineWebtoonsParser( Manga( id = generateUid(titleNo), title = jo.getString("title"), - altTitle = null, + altTitles = emptySet(), url = titleNo.toString(), publicUrl = "https://$domain/$languageCode/canvas/a/list?title_no=$titleNo", rating = jo.getFloatOrDefault("starScoreAverage", -10f) / 10f, 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 89d42b509..d92d157b2 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 @@ -7,10 +7,10 @@ import kotlinx.coroutines.coroutineScope import okhttp3.HttpUrl import org.json.JSONArray import org.json.JSONObject -import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.AbstractMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery @@ -353,7 +353,7 @@ internal class MangaDexParser(context: MangaLoaderContext) : AbstractMangaParser title = requireNotNull(attrs.getJSONObject("title").selectByLocale()) { "Title should not be null" }, - altTitle = attrs.optJSONArray("altTitles")?.flatten()?.selectByLocale(), + altTitles = setOfNotNull(attrs.optJSONArray("altTitles")?.flatten()?.selectByLocale()), // TODO url = id, publicUrl = "https://$domain/title/$id", rating = RATING_UNKNOWN, 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 402b36ed4..0a13f85d5 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 @@ -11,9 +11,9 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.bitmap.Rect import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -163,7 +163,7 @@ internal abstract class MangaFireParser( title = a.ownText(), coverUrl = it.selectFirstOrThrow("img").attrAsAbsoluteUrl("src"), source = source, - altTitle = null, + altTitles = emptySet(), largeCoverUrl = null, authors = emptySet(), contentRating = null, @@ -184,7 +184,7 @@ internal abstract class MangaFireParser( return manga.copy( title = document.selectFirstOrThrow(".info > h1").ownText(), - altTitle = document.selectFirst(".info > h6")?.ownTextOrNull(), + altTitles = setOfNotNull(document.selectFirst(".info > h6")?.ownTextOrNull()), rating = document.selectFirst("div.rating-box")?.attr("data-score") ?.toFloatOrNull()?.div(10) ?: RATING_UNKNOWN, coverUrl = document.selectFirstOrThrow("div.manga-detail div.poster img") @@ -331,7 +331,7 @@ internal abstract class MangaFireParser( coverUrl = mangaDocument.selectFirstOrThrow("div.manga-detail div.poster img") .attrAsAbsoluteUrl("src"), source = source, - altTitle = null, + altTitles = emptySet(), largeCoverUrl = null, authors = emptySet(), contentRating = null, @@ -354,7 +354,7 @@ internal abstract class MangaFireParser( title = it.selectFirstOrThrow(".info h6").ownText(), coverUrl = it.selectFirstOrThrow(".poster img").attrAsAbsoluteUrl("src"), source = source, - altTitle = null, + altTitles = emptySet(), largeCoverUrl = null, authors = emptySet(), contentRating = null, 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 3c67d6544..b9b4efc70 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 @@ -4,8 +4,8 @@ import androidx.collection.ArrayMap import kotlinx.coroutines.coroutineScope import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -157,7 +157,7 @@ internal class MangaPark(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirst("h3")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.text-yellow-500")?.text()?.toFloatOrNull()?.div(10F) ?: RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -195,7 +195,7 @@ internal class MangaPark(context: MangaLoaderContext) : val dateFormat = SimpleDateFormat("dd/MM/yyyy", sourceLocale) val author = doc.selectFirst("div[q:key=tz_4]")?.textOrNull() manga.copy( - altTitle = doc.selectFirst("div[q:key=tz_2]")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst("div[q:key=tz_2]")?.textOrNull()), authors = author?.let { setOf(it) } ?: emptySet(), description = doc.selectFirst("react-island[q:key=0a_9]")?.html(), state = when (doc.selectFirst("span[q:key=Yn_5]")?.text()?.lowercase()) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt index 958568ffc..80c704f15 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaPlusParser.kt @@ -10,8 +10,8 @@ import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -121,7 +121,7 @@ internal abstract class MangaPlusParser( publicUrl = "/titles/$titleId".toAbsoluteUrl(domain), title = name, coverUrl = it.getString("portraitImageUrl"), - altTitle = null, + altTitles = emptySet(), authors = setOf(author), contentRating = null, rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt index a2ef623db..50198ca10 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaReaderToParser.kt @@ -9,10 +9,10 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.bitmap.Bitmap import org.koitharu.kotatsu.parsers.bitmap.Rect import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -131,7 +131,7 @@ internal class MangaReaderToParser(context: MangaLoaderContext) : title = thumb.attr("alt"), coverUrl = thumb.attr("src"), source = source, - altTitle = null, + altTitles = emptySet(), authors = emptySet(), contentRating = null, rating = RATING_UNKNOWN, @@ -154,7 +154,7 @@ internal class MangaReaderToParser(context: MangaLoaderContext) : title = thumb.attr("alt"), coverUrl = thumb.attrAsAbsoluteUrlOrNull("src"), source = source, - altTitle = null, + altTitles = emptySet(), authors = emptySet(), contentRating = null, rating = RATING_UNKNOWN, @@ -174,7 +174,7 @@ internal class MangaReaderToParser(context: MangaLoaderContext) : return manga.copy( title = document.selectFirst("h2.manga-name")!!.ownText(), - altTitle = document.selectFirst("div.manga-name-or")?.ownTextOrNull(), + altTitles = setOfNotNull(document.selectFirst("div.manga-name-or")?.ownTextOrNull()), rating = document.selectFirst("div.anisc-info .item:contains(score:) > .name") ?.text()?.toFloatOrNull()?.div(10) ?: RATING_UNKNOWN, coverUrl = document.selectFirst(".manga-poster > img")?.attrAsAbsoluteUrlOrNull("src"), 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 200404c08..12695333f 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 @@ -8,8 +8,8 @@ import okhttp3.Interceptor import okhttp3.Response import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -113,7 +113,7 @@ internal abstract class NineMangaParser( url = relUrl, publicUrl = href, title = dd?.selectFirst("a.bookname")?.text()?.toCamelCase().orEmpty(), - altTitle = null, + altTitles = emptySet(), coverUrl = node.selectFirst("img")?.src(), rating = RATING_UNKNOWN, authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineNineNineHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineNineNineHentaiParser.kt index c69d1757c..43e01f0e5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineNineNineHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineNineNineHentaiParser.kt @@ -8,8 +8,8 @@ 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.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -200,7 +200,7 @@ internal class NineNineNineHentaiParser(context: MangaLoaderContext) : Manga( id = generateUid(id), title = name.replace(shortenTitleRegex, "").trim(), - altTitle = name, + altTitles = setOf(name), coverUrl = when { cover?.startsWith("http") == true -> cover cover == null -> null @@ -267,7 +267,7 @@ internal class NineNineNineHentaiParser(context: MangaLoaderContext) : val author = tags?.filter { it.type == "artist" }?.joinToString { it.name.toCamelCase() }?.nullIfEmpty() return manga.copy( title = name.replace(shortenTitleRegex, "").trim(), - altTitle = name, + altTitles = setOf(name), coverUrl = cover.first, largeCoverUrl = cover.second, authors = author?.let { setOf(it) } ?: emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt index 559c1a7ab..9e3f9a988 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/WebtoonsParser.kt @@ -8,9 +8,9 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.exception.NotFoundException import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* @@ -129,7 +129,7 @@ internal abstract class WebtoonsParser( Manga( id = generateUid(titleNo), title = jo.getString("title"), - altTitle = null, + altTitles = emptySet(), url = "$titleNo", publicUrl = "https://$domain/$languageCode/originals/a/list?title_no=${titleNo}", rating = jo.getFloatOrDefault("starScoreAverage", -10f) / 10f, @@ -169,7 +169,7 @@ internal abstract class WebtoonsParser( publicUrl = "https://$domain/$languageCode/originals/a/list?title_no=$titleNo", title = jo.getString("title"), coverUrl = jo.getString("thumbnail").toAbsoluteUrl(staticDomain), - altTitle = null, + altTitles = emptySet(), authors = author?.let { setOf(it) } ?: emptySet(), contentRating = if (isNsfwSource) ContentRating.ADULT else null, rating = jo.getFloatOrDefault("starScoreAverage", -10f) / 10f, @@ -205,7 +205,7 @@ internal abstract class WebtoonsParser( Manga( id = generateUid(titleNo), title = jo.getString("title"), - altTitle = null, + altTitles = emptySet(), url = titleNo.toString(), publicUrl = "https://$domain/$languageCode/originals/a/list?title_no=$titleNo", rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt index 796cef938..8609103b1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt @@ -5,8 +5,8 @@ import kotlinx.coroutines.coroutineScope import org.json.JSONArray import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -107,7 +107,7 @@ internal abstract class AnimeBootstrapParser( coverUrl = div.selectFirstOrThrow("div.product__item__pic") .attrAsAbsoluteUrlOrNull("data-setbg"), title = div.selectFirstOrThrow("div.product__item__text").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 524c47ed6..109cd706e 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 @@ -69,7 +69,7 @@ internal class PapScan(context: MangaLoaderContext) : coverUrl = div.selectFirstOrThrow("div.product__item__pic") .attrAsAbsoluteUrlOrNull("data-setbg"), title = div.selectFirstOrThrow("div.product__item__text h5").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 95e10c80d..3537b6c11 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 @@ -7,8 +7,8 @@ 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.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.mapJSON @@ -109,7 +109,7 @@ internal class FlixScans(context: MangaLoaderContext) : Manga( id = generateUid(href), title = j.getString("title"), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt index 68f1fd061..929e9d690 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.ar import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -71,7 +71,7 @@ internal class MangaStorm(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.select(".manga-ct-title").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, 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 3d20f19bc..8810e03a7 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 @@ -6,8 +6,8 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -105,7 +105,7 @@ internal class TeamXNovel(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.select(".tt, h3").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt index d576190dc..4b90d247d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt @@ -4,10 +4,10 @@ import androidx.collection.ArraySet import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.Broken -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.generateUid import org.koitharu.kotatsu.parsers.util.getDomain @@ -92,7 +92,7 @@ internal class AnibelParser(context: MangaLoaderContext) : LegacyMangaParser(con title = title.getString("be"), coverUrl = jo.getString("poster").removePrefix("/cdn") .toAbsoluteUrl(getDomain("cdn")) + "?width=200&height=280", - altTitle = title.optJSONArray("alt")?.optString(0)?.nullIfEmpty(), + altTitles = setOfNotNull(title.optJSONArray("alt")?.optString(0)?.nullIfEmpty()), authors = emptySet(), contentRating = null, rating = jo.getDouble("rating").toFloat() / 10f, @@ -144,7 +144,7 @@ internal class AnibelParser(context: MangaLoaderContext) : LegacyMangaParser(con ).getJSONObject("chapters").getJSONArray("docs") return manga.copy( title = title.getString("be"), - altTitle = title.optJSONArray("alt")?.optString(0)?.nullIfEmpty(), + altTitles = setOfNotNull(title.optJSONArray("alt")?.optString(0)?.nullIfEmpty()), coverUrl = "$poster?width=200&height=280", largeCoverUrl = poster, description = details.getJSONObject("description").getString("be"), @@ -239,7 +239,7 @@ internal class AnibelParser(context: MangaLoaderContext) : LegacyMangaParser(con title = title.getString("be"), coverUrl = jo.getString("poster").removePrefix("/cdn") .toAbsoluteUrl(getDomain("cdn")) + "?width=200&height=280", - altTitle = title.getString("en").nullIfEmpty(), + altTitles = setOfNotNull(title.getString("en").nullIfEmpty()), authors = emptySet(), contentRating = null, rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/CupFoxParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/CupFoxParser.kt index 144c630da..e213e57d8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/CupFoxParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/cupfox/CupFoxParser.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.cupfox import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -95,7 +95,7 @@ internal abstract class CupFoxParser( Manga( id = generateUid(href), title = li.selectFirst("h3, h4, p.dm-bn")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -124,7 +124,9 @@ internal abstract class CupFoxParser( val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() val author = doc.selectFirst(selectMangaDetailsAuthor)?.text()?.substringAfter(":")?.nullIfEmpty() return manga.copy( - altTitle = doc.selectFirst(selectMangaDetailsAltTitle)?.text()?.substringAfter(":")?.nullIfEmpty(), + altTitles = setOfNotNull( + doc.selectFirst(selectMangaDetailsAltTitle)?.text()?.substringAfter(":")?.nullIfEmpty(), + ), tags = doc.select(selectMangaDetailsTags).mapToSet { a -> MangaTag( key = a.attr("href").removeSuffix('/').substringAfterLast('/'), @@ -161,7 +163,7 @@ internal abstract class CupFoxParser( Manga( id = generateUid(href), title = li.selectFirst("h3, h4, p.dm-bn")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, 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 7957c05fe..88b7ac051 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 @@ -6,8 +6,8 @@ import kotlinx.coroutines.sync.withLock import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -113,7 +113,7 @@ internal class AsuraScansParser(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(domain), coverUrl = a.selectFirst("img")?.src(), title = a.selectFirst("div.block > span.block")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = a.selectFirst("div.block label.ml-1")?.text()?.toFloatOrNull()?.div(10f) ?: RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 24e97249a..45c04e00c 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -75,7 +75,7 @@ internal class BeeToon(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirst(".name")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst(".counter")?.text()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt index dc66235a6..de54b3d40 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -38,7 +38,7 @@ internal class CloneMangaParser(context: MangaLoaderContext) : id = generateUid(href), title = item.selectFirst("h3")?.text() ?: return@mapNotNull null, coverUrl = "https://$domain/$cover", - altTitle = null, + altTitles = emptySet(), authors = setOf("Dan Kim"), rating = RATING_UNKNOWN, url = href, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt index 4cc39799e..4d1e0ad34 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -71,7 +71,7 @@ internal class ComicExtra(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.selectFirstOrThrow("a.egb-serie").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -106,7 +106,7 @@ internal class ComicExtra(context: MangaLoaderContext) : val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() val author = doc.selectFirst("table.full-table tr:contains(Author:) td:nth-child(2)")?.textOrNull() return manga.copy( - altTitle = doc.selectFirstOrThrow("div.anime-top h1.title").textOrNull(), + altTitles = setOfNotNull(doc.selectFirstOrThrow("div.anime-top h1.title").textOrNull()), state = when (doc.selectFirstOrThrow("ul.anime-genres li.status a").text()) { "Ongoing" -> MangaState.ONGOING "Completed" -> MangaState.FINISHED 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 60d52facc..6b1829803 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 @@ -9,8 +9,8 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -86,7 +86,7 @@ internal class DynastyScans(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.selectFirstOrThrow("div.caption").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -107,7 +107,7 @@ internal class DynastyScans(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.selectFirstOrThrow("a").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt index 916a40548..6e6331291 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt @@ -6,8 +6,8 @@ import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -132,9 +132,9 @@ internal class FlameComics(context: MangaLoaderContext) : return Manga( id = generateUid(seriesId), title = jo.getString("title"), - altTitle = jo.getStringOrNull("altTitles")?.let { - JSONArray(it).optString(0) - }, + altTitles = jo.getStringOrNull("altTitles")?.let { + JSONArray(it).toStringSet() + }.orEmpty(), url = seriesId.toString(), publicUrl = "https://${domain}/series/$seriesId", rating = RATING_UNKNOWN, 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 61272beca..07e9b9119 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 @@ -4,7 +4,10 @@ import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import org.json.JSONArray import org.json.JSONObject -import org.koitharu.kotatsu.parsers.* +import org.koitharu.kotatsu.parsers.Broken +import org.koitharu.kotatsu.parsers.ErrorMessages +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* @@ -88,7 +91,7 @@ internal class FlixScansOrg(context: MangaLoaderContext) : Manga( id = generateUid(href), title = j.getString("title"), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, 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 294213141..c40828a92 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 @@ -4,8 +4,8 @@ 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.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -82,7 +82,7 @@ internal class MangaGeko(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.selectFirstOrThrow("h4").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -112,7 +112,7 @@ internal class MangaGeko(context: MangaLoaderContext) : val chaptersDeferred = async { loadChapters(manga.url) } val author = doc.selectFirstOrThrow(".author").textOrNull() manga.copy( - altTitle = doc.selectFirstOrThrow(".alternative-title").textOrNull(), + altTitles = setOfNotNull(doc.selectFirstOrThrow(".alternative-title").textOrNull()), state = when (doc.selectFirstOrThrow(".header-stats span:contains(Status) strong").text()) { "Ongoing" -> MangaState.ONGOING "Completed" -> MangaState.FINISHED diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaKawaiiEn.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaKawaiiEn.kt index 94b6625d1..9a58f8520 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaKawaiiEn.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaKawaiiEn.kt @@ -5,8 +5,8 @@ import kotlinx.coroutines.coroutineScope import okhttp3.Headers import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -83,7 +83,7 @@ internal class MangaKawaiiEn(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src() ?: a.attrAsAbsoluteUrlOrNull("data-bg"), title = div.selectFirstOrThrow("h4, .media-thumbnail__name").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -102,7 +102,9 @@ internal class MangaKawaiiEn(context: MangaLoaderContext) : val author = doc.select("a[href*=author]").textOrNull() manga.copy( description = doc.selectFirst("dd.text-justify.text-break")?.html(), - altTitle = doc.select("span[itemprop*=alternativeHeadline]").joinToString { ", " }.nullIfEmpty(), + altTitles = doc.select("span[itemprop*=alternativeHeadline]").mapNotNullToSet { + it.textOrNull() + }, authors = author?.let { setOf(it) } ?: emptySet(), state = when (doc.selectFirst("span.badge.bg-success.text-uppercase")?.text()) { "Ongoing" -> MangaState.ONGOING 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 dd3da9d8b..eccbee5e5 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -118,7 +118,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : title = a.attr("title"), coverUrl = a.selectFirst("img")?.attrAsAbsoluteUrlOrNull("src"), source = MangaParserSource.MANGATOWN, - altTitle = null, + altTitles = emptySet(), rating = li.selectFirst("p.score")?.selectFirst("b") ?.ownText()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, authors = author?.let { setOf(it) } ?: emptySet(), 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 3063f7cbf..fd05e5ef8 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 @@ -5,8 +5,8 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -106,7 +106,7 @@ internal class Mangaowl(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirst("a.one-line")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.select("span").last()?.text()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Com.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Com.kt index 0f847ab9f..5418dff2d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Com.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Com.kt @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.en import androidx.collection.ArrayMap import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -125,7 +125,7 @@ internal class Manhwa18Com(context: MangaLoaderContext) : Manga( id = generateUid(absUrl.toRelativeUrl(domain)), title = titleElement.text(), - altTitle = null, + altTitles = emptySet(), url = absUrl.toRelativeUrl(domain), publicUrl = absUrl, rating = RATING_UNKNOWN, @@ -164,8 +164,10 @@ internal class Manhwa18Com(context: MangaLoaderContext) : } return manga.copy( - altTitle = cardInfoElement?.selectFirst("b:contains(Other names)")?.parent()?.ownTextOrNull() - ?.removePrefix(": "), + altTitles = setOfNotNull( + cardInfoElement?.selectFirst("b:contains(Other names)")?.parent()?.ownTextOrNull() + ?.removePrefix(": "), + ), authors = author?.let { setOf(it) } ?: emptySet(), description = docs.selectFirst(".series-summary .summary-content")?.html(), tags = tags.orEmpty(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt index ef38c20a8..2f9e3a9cd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.en import androidx.collection.ArrayMap import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -125,7 +125,7 @@ internal class Manhwa18Parser(context: MangaLoaderContext) : Manga( id = generateUid(absUrl.toRelativeUrl(domain)), title = titleElement.text(), - altTitle = null, + altTitles = emptySet(), url = absUrl.toRelativeUrl(domain), publicUrl = absUrl, rating = RATING_UNKNOWN, @@ -164,8 +164,10 @@ internal class Manhwa18Parser(context: MangaLoaderContext) : } return manga.copy( - altTitle = cardInfoElement?.selectFirst("b:contains(Other names)")?.parent()?.ownTextOrNull() - ?.removePrefix(": "), + altTitles = setOfNotNull( + cardInfoElement?.selectFirst("b:contains(Other names)")?.parent()?.ownTextOrNull() + ?.removePrefix(": "), + ), authors = author?.let { setOf(it) } ?: emptySet(), description = docs.selectFirst(".series-summary .summary-content")?.html(), tags = tags.orEmpty(), 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 bca53ed67..522f9092c 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -85,7 +85,7 @@ internal class ManhwasMen(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(domain), coverUrl = li.selectFirst("img")?.src(), title = li.selectFirst(".title")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MyComicList.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MyComicList.kt index aa7d4b8bc..61013b19d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MyComicList.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MyComicList.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -74,7 +74,7 @@ internal class MyComicList(context: MangaLoaderContext) : url = href, publicUrl = href.toAbsoluteUrl(domain), title = div.selectFirst("h3 a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), authors = emptySet(), tags = emptySet(), rating = RATING_UNKNOWN, 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 30d598137..f7cd5a85b 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -46,7 +46,7 @@ internal class Po2Scans(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.selectFirstOrThrow("h2").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt index 33442e5d0..8618e2a31 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt @@ -8,8 +8,8 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -96,7 +96,7 @@ internal class Pururin(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(domain), coverUrl = a.selectFirst("img.card-img-top")?.src(), title = a.selectFirst(".title")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -173,7 +173,7 @@ internal class Pururin(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(domain), coverUrl = a.selectFirst("img.card-img-top")?.src(), title = a.selectFirst(".title")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 f00bb9a87..b1d8ec48d 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.en import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -107,7 +107,7 @@ internal class VyManga(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(domain), coverUrl = div.selectFirst(".comic-image img")?.src(), title = div.selectFirst(".comic-title")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 eab7d1f7c..59d70e2e2 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 @@ -7,7 +7,6 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.MangaParser import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey @@ -186,7 +185,7 @@ internal class WeebCentral(context: MangaLoaderContext) : LegacyMangaParser(cont url = mangaId, publicUrl = "https://$domain/series/$mangaId", title = element.selectFirstOrThrow("abbr[title] > a").text(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, contentRating = if (element.selectFirst("svg:has(style:containsData(ff0000))") == null) { SAFE @@ -233,8 +232,8 @@ internal class WeebCentral(context: MangaLoaderContext) : LegacyMangaParser(cont manga.copy( title = sectionRight.selectFirstOrThrow("h1").text(), - altTitle = sectionRight.select("li:has(strong:contains(Associated Name)) li") - .eachText().joinToString(), + altTitles = sectionRight.select("li:has(strong:contains(Associated Name)) li") + .eachText().toSet(), publicUrl = "https://$domain/series/${manga.url}", rating = RATING_UNKNOWN, contentRating = if (sectionLeft.selectFirst("ul > li > strong:contains(Official Translation) + a:contains(Yes)") != 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 59696bc04..e90bd6737 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.es import kotlinx.coroutines.coroutineScope import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -44,7 +44,7 @@ internal class TempleScanEsp(context: MangaLoaderContext) : publicUrl = href, coverUrl = it.getString("urlImg"), title = it.getString("name").orEmpty(), - altTitle = it.getStringOrNull("alternativeName"), + altTitles = setOfNotNull(it.getStringOrNull("alternativeName")), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 6a6191317..375491933 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 @@ -6,8 +6,8 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -158,7 +158,7 @@ internal class TuMangaOnlineParser(context: MangaLoaderContext) : LegacyPagedMan id = generateUid(href), title = item.selectFirst("h4.text-truncate")?.text() ?: return@mapNotNull null, coverUrl = item.select("style").toString().substringAfter("('").substringBeforeLast("')"), - altTitle = null, + altTitles = emptySet(), authors = emptySet(), rating = item.selectFirst("span.score")?.text()?.toFloatOrNull()?.div(10F) ?: RATING_UNKNOWN, url = href, 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 035acf6b2..94040eac0 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 @@ -4,8 +4,8 @@ import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -144,7 +144,7 @@ internal abstract class FmreaderParser( ?: div.selectFirst("div.img-in-ratio")?.attr("style")?.substringAfter("(") ?.substringBefore(")"))?.toAbsoluteUrl(domain), title = div.selectFirst("div.series-title")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -200,8 +200,8 @@ internal abstract class FmreaderParser( ) }, description = desc, - altTitle = alt, - authors = author?.let { setOf(it) } ?: emptySet(), + altTitles = setOfNotNull(alt), + authors = setOfNotNull(author), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/Klz9.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/Klz9.kt index aa48819af..64ab29133 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/Klz9.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/ja/Klz9.kt @@ -32,7 +32,7 @@ internal class Klz9(context: MangaLoaderContext) : coverUrl = div.selectFirstOrThrow("div.img-in-ratio").attr("style").substringAfter("('") .substringBeforeLast("')"), title = div.selectFirstOrThrow("div.series-title").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 392f4d157..fb7e80ef3 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 @@ -4,8 +4,8 @@ import kotlinx.coroutines.coroutineScope import org.json.JSONArray import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -90,7 +90,7 @@ internal abstract class FoolSlideParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(),// in search no img title = div.selectFirst(".title a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt index b619f8961..eddb755d0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt @@ -8,8 +8,8 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -115,7 +115,7 @@ internal class BentomangaParser(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.selectFirst("h1")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = div.getElementsByAttributeValue("data-icon", "avg_rate") @@ -150,7 +150,7 @@ internal class BentomangaParser(context: MangaLoaderContext) : .requireElementById("container_manga_show") val author = root.selectFirst(".datas_more-authors-people")?.textOrNull() return manga.copy( - altTitle = root.selectFirst(".component-manga-title_alt")?.textOrNull(), + altTitles = setOfNotNull(root.selectFirst(".component-manga-title_alt")?.textOrNull()), description = root.selectFirst(".datas_synopsis")?.html().assertNotNull("description") ?: manga.description, state = when (root.selectFirst(".datas_more-status-data")?.textOrNull().assertNotNull("status")) { 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 5760d36dd..70e3ace1e 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 @@ -5,8 +5,8 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -71,7 +71,7 @@ internal class FuryoSociety(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = (div.selectFirst("div.media-body") ?: div.selectFirst("a"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 8e6be1a87..51aa13233 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 @@ -4,8 +4,8 @@ import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.mapJSON @@ -132,7 +132,7 @@ internal class LegacyScansParser(context: MangaLoaderContext) : Manga( id = generateUid(urlManga), title = j.getString("title"), - altTitle = null, + altTitles = emptySet(), url = urlManga, publicUrl = urlManga, rating = RATING_UNKNOWN, @@ -153,7 +153,7 @@ internal class LegacyScansParser(context: MangaLoaderContext) : Manga( id = generateUid(urlManga), title = j.getString("title"), - altTitle = null, + altTitles = emptySet(), url = urlManga, publicUrl = urlManga, rating = RATING_UNKNOWN, 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 a896db7c1..e2d6553b1 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.fr import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -68,7 +68,7 @@ internal class LireScan(context: MangaLoaderContext) : LegacyPagedMangaParser(co Manga( id = generateUid(href), title = div.select(".item-poster__title").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = div.selectFirstOrThrow(".item__rating").ownText().toFloatOrNull()?.div(10f) ?: RATING_UNKNOWN, @@ -89,8 +89,10 @@ internal class LireScan(context: MangaLoaderContext) : LegacyPagedMangaParser(co .replace("Artist(s):", "") .nullIfEmpty() return manga.copy( - altTitle = root.select("ul.pmovie__list li:contains(Nom Alternatif:)").text() - .replace("Nom Alternatif:", "").nullIfEmpty(), + altTitles = setOfNotNull( + root.select("ul.pmovie__list li:contains(Nom Alternatif:)").text() + .replace("Nom Alternatif:", "").nullIfEmpty(), + ), state = when (root.select("ul.pmovie__list li:contains(Status:)").text()) { "Status: OnGoing", "Status: En cours" -> MangaState.ONGOING "Status: Fini" -> MangaState.FINISHED 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 576429dc9..88ed93957 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 @@ -4,8 +4,8 @@ import org.json.JSONArray import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -107,7 +107,7 @@ internal class LugnicaScans(context: MangaLoaderContext) : Manga( id = generateUid(urlManga), title = j.getString("manga_title"), - altTitle = null, + altTitles = emptySet(), url = urlManga.toRelativeUrl(domain), publicUrl = urlManga.toAbsoluteUrl(domain), rating = j.getFloatOrDefault("manga_rate", RATING_UNKNOWN).div(5f), @@ -128,7 +128,7 @@ internal class LugnicaScans(context: MangaLoaderContext) : Manga( id = generateUid(urlManga), title = j.getString("title"), - altTitle = null, + altTitles = emptySet(), url = urlManga.toRelativeUrl(domain), publicUrl = urlManga.toAbsoluteUrl(domain), rating = j.getString("rate").toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaKawaii.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaKawaii.kt index 412d7e1f4..48711a265 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaKawaii.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/MangaKawaii.kt @@ -5,8 +5,8 @@ import kotlinx.coroutines.coroutineScope import okhttp3.Headers import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -83,7 +83,7 @@ internal class MangaKawaii(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src() ?: a.attrAsAbsoluteUrlOrNull("data-bg"), title = div.selectFirst("h4, .media-thumbnail__name")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -99,11 +99,14 @@ internal class MangaKawaii(context: MangaLoaderContext) : val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() val firstChapter = doc.selectFirst("tr[class*='volume-'] a")?.attr("href") val chaptersDeferred = async { loadChapters(firstChapter) } - val author = doc.select("a[href*=author]").text() + val author = doc.select("a[href*=author]").textOrNull() manga.copy( description = doc.selectFirst("dd.text-justify.text-break")?.html(), - altTitle = doc.select("span[itemprop*=alternativeHeadline]").joinToString { ", " }.nullIfEmpty(), - authors = author?.let { setOf(it) } ?: emptySet(), + altTitles = setOfNotNull( + doc.select("span[itemprop*=alternativeHeadline]").joinToString { ", " } + .nullIfEmpty(), + ), + authors = setOfNotNull(author), state = when (doc.selectFirst("span.badge.bg-success.text-uppercase")?.text()) { "En Cours" -> MangaState.ONGOING "Terminé" -> MangaState.FINISHED 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 a13520fbf..a719e280d 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 @@ -11,12 +11,13 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault +import org.koitharu.kotatsu.parsers.util.json.getStringOrNull import org.koitharu.kotatsu.parsers.util.json.mapJSON import java.text.SimpleDateFormat import java.util.* @@ -78,7 +79,7 @@ internal class MangaMana(context: MangaLoaderContext) : id = generateUid(url), title = jo.getString("name").orEmpty(), coverUrl = img, - altTitle = jo.getString("otherNames").orEmpty(), + altTitles = setOfNotNull(jo.getStringOrNull("otherNames")), authors = emptySet(), contentRating = if (isNsfwSource) ContentRating.ADULT else null, rating = RATING_UNKNOWN, @@ -109,7 +110,8 @@ internal class MangaMana(context: MangaLoaderContext) : val doc = webClient.httpGet("https://$domain/?page=$page").parseHtml() return doc.select("div.row div.col_home").map { div -> val href = div.selectFirstOrThrow("h4 a").attrAsRelativeUrl("href") - val isNsfwSource = div.selectFirst("img[data-adult]")?.attr("data-adult")?.isNotEmpty() == true + val isNsfwSource = + div.selectFirst("img[data-adult]")?.attr("data-adult")?.isNotEmpty() == true val img = if (isNsfwSource) { div.selectFirst("img")?.attr("data-adult") } else { @@ -118,7 +120,7 @@ internal class MangaMana(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.select("h4").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -181,7 +183,7 @@ internal class MangaMana(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.select("h2.fs-6").text(), - altTitle = doc.selectFirst(".mangalist_item_othernames")?.text().orEmpty(), + altTitles = setOfNotNull(doc.selectFirst(".mangalist_item_othernames")?.textOrNull()), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = div.getElementById("avgrating")?.ownText()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt index accedc8b9..e62170278 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt @@ -6,8 +6,8 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -83,7 +83,7 @@ internal class ScansMangasMe(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirstOrThrow("div.bigor div.tt").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirstOrThrow("div.rating i").ownText().toFloatOrNull()?.div(10f) ?: RATING_UNKNOWN, tags = emptySet(), @@ -124,8 +124,8 @@ internal class ScansMangasMe(context: MangaLoaderContext) : ) }, description = desc, - altTitle = alt, - authors = author?.let { setOf(it) } ?: emptySet(), + altTitles = setOfNotNull(alt), + authors = setOfNotNull(author), state = when (doc.selectFirstOrThrow("div.spe span:contains(Statut:)").textOrNull() ?.substringAfterLast(':')) { " En cours" -> MangaState.ONGOING 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 d6bd75014..08be99689 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.fr import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents @@ -84,7 +84,7 @@ internal class ScantradUnion(context: MangaLoaderContext) : Manga( id = generateUid(href), title = article.select(".carteinfos a").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -104,7 +104,7 @@ internal class ScantradUnion(context: MangaLoaderContext) : Manga( id = generateUid(href), title = article.select(".index-post-header a").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -125,7 +125,7 @@ internal class ScantradUnion(context: MangaLoaderContext) : val author = root.select("div.project-details a[href*=auteur]").textOrNull() return manga.copy( - altTitle = root.select(".divider2:contains(Noms associés :)").firstOrNull()?.textOrNull(), + altTitles = setOfNotNull(root.select(".divider2:contains(Noms associés :)").firstOrNull()?.textOrNull()), state = when (root.select(".label.label-primary")[2].text()) { "En cours" -> MangaState.ONGOING "Terminé", "Abondonné", "One Shot" -> MangaState.FINISHED 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 a57cb2961..175d2cb36 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 @@ -7,8 +7,8 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -149,7 +149,7 @@ internal abstract class FuzzyDoodleParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirst("h2")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -184,7 +184,7 @@ internal abstract class FuzzyDoodleParser( val author = doc.selectFirst(selectAuthor)?.textOrNull() manga.copy( - altTitle = doc.selectLast(selectAltTitle)?.textOrNull(), + altTitles = setOfNotNull(doc.selectLast(selectAltTitle)?.textOrNull()), state = when (doc.selectFirst(selectState)?.text()?.lowercase().orEmpty()) { in ongoing -> MangaState.ONGOING in finished -> MangaState.FINISHED diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt index c4c943453..0e76a9ff9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt @@ -8,8 +8,8 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -109,7 +109,7 @@ internal abstract class GalleryAdultsParser( Manga( id = generateUid(href), title = div.select(selectGalleryTitle).text().cleanupTitle(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/DoujinDesuUk.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/DoujinDesuUk.kt index 42c8011d4..9d2bc63ad 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/DoujinDesuUk.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/DoujinDesuUk.kt @@ -39,7 +39,7 @@ internal class DoujinDesuUk(context: MangaLoaderContext) : title = div.select(selectGalleryTitle).text().replace(regexBrackets, "") .replace(regexSpaces, " ") .trim(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt index e554a00e8..726b8d39e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiParser.kt @@ -90,7 +90,7 @@ internal class NHentaiParser(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.select(selectGalleryTitle).text().cleanupTitle(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiToParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiToParser.kt index 096539f9e..ae1ec1b09 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiToParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiToParser.kt @@ -80,7 +80,7 @@ internal class NHentaiToParser(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.select(selectGalleryTitle).text().cleanupTitle(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiXxxParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiXxxParser.kt index d27c816ad..fa10be685 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiXxxParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/all/NHentaiXxxParser.kt @@ -93,7 +93,7 @@ internal class NHentaiXxxParser(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.select(selectGalleryTitle).text().cleanupTitle(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt index 644e5ab94..6886be3fb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/GattsuParser.kt @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.gattsu import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -79,7 +79,7 @@ internal abstract class GattsuParser( publicUrl = href, title = li.selectLast(".thumb-titulo, .video-titulo")?.text().orEmpty(), coverUrl = li.selectFirst("img")?.src(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/MundoHentaiOficial.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/MundoHentaiOficial.kt index 9303b5062..28b0cf1dc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/MundoHentaiOficial.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/gattsu/pt/MundoHentaiOficial.kt @@ -5,7 +5,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.gattsu.GattsuParser -import org.koitharu.kotatsu.parsers.util.* +import org.koitharu.kotatsu.parsers.util.attrAsAbsoluteUrl +import org.koitharu.kotatsu.parsers.util.generateUid +import org.koitharu.kotatsu.parsers.util.selectLastOrThrow +import org.koitharu.kotatsu.parsers.util.src @MangaSourceParser("MUNDOHENTAIOFICIAL", "MundoHentaiOficial", "pt", ContentType.HENTAI) internal class MundoHentaiOficial(context: MangaLoaderContext) : @@ -27,7 +30,7 @@ internal class MundoHentaiOficial(context: MangaLoaderContext) : publicUrl = href, title = li.selectLastOrThrow(".thumb-titulo, .video-titulo").text(), coverUrl = li.selectFirst("img")?.src(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt index b19fb2885..5d2115865 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/guya/GuyaParser.kt @@ -2,10 +2,13 @@ package org.koitharu.kotatsu.parsers.site.guya import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* -import org.koitharu.kotatsu.parsers.util.* +import org.koitharu.kotatsu.parsers.util.generateUid +import org.koitharu.kotatsu.parsers.util.parseJson +import org.koitharu.kotatsu.parsers.util.removeSuffix +import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl import java.util.* internal abstract class GuyaParser( @@ -67,7 +70,7 @@ internal abstract class GuyaParser( publicUrl = url, title = name, coverUrl = j.getString("cover").toAbsoluteUrl(domain), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = j.getString("description"), 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 6a3a7e4a4..ffb6472ab 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.heancms import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -125,7 +125,7 @@ internal abstract class HeanCms( id = id, url = url, title = title, - altTitle = it.getString("alternative_names").takeIf { it.isNotBlank() }, + altTitles = setOfNotNull(it.getString("alternative_names").takeIf { it.isNotBlank() }), publicUrl = publicUrl.toAbsoluteUrl(domain), description = it.getString("description"), rating = it.getFloatOrDefault("rating", RATING_UNKNOWN) / 5f, 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 35f1f62ba..172ca3b64 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.heancmsalt import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -67,7 +67,7 @@ internal abstract class HeanCmsAlt( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirst(selectMangaTitle)?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -89,7 +89,7 @@ internal abstract class HeanCmsAlt( val doc = webClient.httpGet(fullUrl).parseHtml() val dateFormat = SimpleDateFormat(datePattern, sourceLocale) return manga.copy( - altTitle = doc.selectFirst(selectAlt)?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst(selectAlt)?.textOrNull()), description = doc.selectFirst(selectDesc)?.html(), chapters = doc.select(selectChapter) .mapChapters(reversed = true) { i, a -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/es/Brakeout.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/es/Brakeout.kt index 91016f794..6d8809a35 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/es/Brakeout.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/es/Brakeout.kt @@ -25,7 +25,7 @@ internal class Brakeout(context: MangaLoaderContext) : val doc = webClient.httpGet(fullUrl).parseHtml() val dateFormat = SimpleDateFormat(datePattern, sourceLocale) return manga.copy( - altTitle = doc.selectFirst(selectAlt)?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst(selectAlt)?.textOrNull()), description = doc.selectFirstOrThrow(selectDesc).html(), chapters = doc.select(selectChapter) .mapChapters(reversed = true) { i, div -> 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 88b85cd97..1304c7682 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 @@ -7,8 +7,8 @@ import kotlinx.coroutines.sync.withLock import okhttp3.Headers import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -109,7 +109,7 @@ internal abstract class HotComicsParser( publicUrl = url.toAbsoluteUrl(domain), coverUrl = li.selectFirst("img")?.src(), title = li.selectFirst(".title")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, description = li.selectFirst("p[itemprop*=description]")?.text().orEmpty(), tags = tags, 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 7911cc366..ff922a5b4 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.id import okhttp3.Headers import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -116,7 +116,7 @@ internal class DoujinDesuParser(context: MangaLoaderContext) : Manga( id = generateUid(href), title = it.selectFirst(".metadata > a")?.attr("title").orEmpty(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/HentaiCrot.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/HentaiCrot.kt index 771555ba4..79ae0a1ea 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/HentaiCrot.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/HentaiCrot.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.id import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -68,7 +68,7 @@ internal class HentaiCrot(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src()?.replace("-200x285", ""), title = div.selectFirst("h2")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -98,7 +98,9 @@ internal class HentaiCrot(context: MangaLoaderContext) : val author = doc.selectFirst("div.entry-content ul li:contains(Artists :) em")?.textOrNull() return manga.copy( description = doc.selectFirst("div.entry-content p")?.html(), - altTitle = doc.selectFirst("div.entry-content ul li:contains(Alternative Name(s) :) em")?.textOrNull(), + altTitles = setOfNotNull( + doc.selectFirst("div.entry-content ul li:contains(Alternative Name(s) :) em")?.textOrNull(), + ), authors = author?.let { setOf(it) } ?: emptySet(), state = null, chapters = listOf( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/PixHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/PixHentai.kt index 266fc66b9..bac6a4573 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/PixHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/PixHentai.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.id import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -68,7 +68,7 @@ internal class PixHentai(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src()?.replace("-200x285", ""), title = div.selectFirst("h2")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -98,7 +98,9 @@ internal class PixHentai(context: MangaLoaderContext) : val author = doc.selectFirst("div.entry-content ul li:contains(Artists :) em")?.textOrNull() return manga.copy( description = doc.selectFirst("div.entry-content p")?.html(), - altTitle = doc.selectFirst("div.entry-content ul li:contains(Alternative Name(s) :) em")?.textOrNull(), + altTitles = setOfNotNull( + doc.selectFirst("div.entry-content ul li:contains(Alternative Name(s) :) em")?.textOrNull(), + ), authors = author?.let { setOf(it) } ?: emptySet(), state = null, chapters = listOf( 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 5c79be35c..ed5de57d6 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.iken import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -109,7 +109,7 @@ internal abstract class IkenParser( publicUrl = url.toAbsoluteUrl(domain), coverUrl = it.getString("featuredImage"), title = it.getString("postTitle"), - altTitle = it.getString("alternativeTitles"), + altTitles = setOfNotNull(it.getStringOrNull("alternativeTitles")), description = it.getString("postContent"), rating = RATING_UNKNOWN, tags = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt index 88f5d0f11..60dd0e9b6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt @@ -1,10 +1,10 @@ package org.koitharu.kotatsu.parsers.site.ja import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents @@ -89,7 +89,7 @@ internal class NicovideoSeigaParser(context: MangaLoaderContext) : id = generateUid(href), title = item.selectFirst(".mg_body > .title > a")?.text() ?: return@mapNotNull null, coverUrl = item.selectFirst(".comic_icon > div > a > img")?.attrAsAbsoluteUrl("src"), - altTitle = null, + altTitles = emptySet(), authors = author?.let { setOf(it) } ?: emptySet(), rating = RATING_UNKNOWN, url = href, @@ -193,7 +193,7 @@ internal class NicovideoSeigaParser(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(item.host ?: domain), title = item.selectFirst(".search_result__item__info > .search_result__item__info--title > a") ?.textOrNull() ?: return@mapNotNull null, - altTitle = null, + altTitles = emptySet(), authors = emptySet(), tags = emptySet(), rating = RATING_UNKNOWN, 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 bd2329ffd..d9cd8e458 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 @@ -5,8 +5,8 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -129,7 +129,7 @@ internal abstract class KeyoappParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = cover?.styleValueOrNull("background-image")?.cssUrl(), title = div.selectFirstOrThrow("h3").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = div.select("div.gap-1 a").mapToSet { a -> MangaTag( 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 e6225af7c..1fab92f2d 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 @@ -7,8 +7,8 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import org.json.JSONObject import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -111,7 +111,7 @@ internal abstract class LikeMangaParser( Manga( id = generateUid(href), title = div.selectFirstOrThrow("p.title-manga").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -151,7 +151,7 @@ internal abstract class LikeMangaParser( } val author = doc.selectLast("li.author p")?.textOrNull() return manga.copy( - altTitle = doc.selectFirst(".list-info li.othername h2")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst(".list-info li.othername h2")?.textOrNull()), tags = doc.select("li.kind a").mapToSet { a -> MangaTag( key = a.attr("href").removeSuffix('/').substringAfterLast('/'), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/LilianaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/LilianaParser.kt index 8e5cc1c10..ff1eb9b76 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/LilianaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/LilianaParser.kt @@ -5,8 +5,8 @@ import kotlinx.coroutines.coroutineScope import org.jsoup.Jsoup import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getBooleanOrDefault @@ -116,7 +116,7 @@ internal abstract class LilianaParser( publicUrl = href.toAbsoluteUrl(domain), coverUrl = element.selectFirst("img")?.src(), title = element.selectFirst(".text-center a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 1991d1c60..9129b5702 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 @@ -8,8 +8,8 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* @@ -468,7 +468,7 @@ internal abstract class MadaraParser( coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3, h4") ?: div.selectFirst(".manga-name, .post-title"))?.text() .orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( @@ -575,7 +575,7 @@ internal abstract class MadaraParser( ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), state = state, chapters = chaptersDeferred.await(), contentRating = if (doc.selectFirst(".adult-confirm") != null) { @@ -659,7 +659,7 @@ internal abstract class MadaraParser( id = generateUid(href), url = href, publicUrl = href.toAbsoluteUrl(a.host ?: domain), - altTitle = null, + altTitles = emptySet(), title = div.selectFirstOrThrow(".widget-title").text(), authors = emptySet(), coverUrl = div.selectFirst("img")?.src(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manga18Fx.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manga18Fx.kt index 7b12756b6..9bca29160 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manga18Fx.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manga18Fx.kt @@ -71,7 +71,7 @@ internal class Manga18Fx(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirstOrThrow("h3").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("div.item-rate span")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = emptySet(), authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manhwa18Cc.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manhwa18Cc.kt index 1d43f1dea..a1a084563 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manhwa18Cc.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manhwa18Cc.kt @@ -77,7 +77,7 @@ internal class Manhwa18Cc(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirstOrThrow("h3").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst(".item-rate span")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = emptySet(), authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/AdultWebtoon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/AdultWebtoon.kt index 600cefc6a..1831d94e8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/AdultWebtoon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/AdultWebtoon.kt @@ -118,7 +118,7 @@ internal class AdultWebtoon(context: MangaLoaderContext) : ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/FireScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/FireScans.kt index 8cbcb61d5..f3b55cde3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/FireScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/FireScans.kt @@ -25,7 +25,7 @@ internal class FireScans(context: MangaLoaderContext) : coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4") ?: div.selectFirst(".manga-name"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentai4Free.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentai4Free.kt index 3ff3a9e79..70c3fb431 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentai4Free.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Hentai4Free.kt @@ -110,7 +110,7 @@ internal class Hentai4Free(context: MangaLoaderContext) : coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4") ?: div.selectFirst(".manga-name"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/HentaiManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/HentaiManga.kt index 40b1d2f67..a95ca4865 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/HentaiManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/HentaiManga.kt @@ -112,7 +112,7 @@ internal class HentaiManga(context: MangaLoaderContext) : ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/HentaiWebtoon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/HentaiWebtoon.kt index a32c5ef75..b34540790 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/HentaiWebtoon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/HentaiWebtoon.kt @@ -112,7 +112,7 @@ internal class HentaiWebtoon(context: MangaLoaderContext) : ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt index 201e90205..d03798537 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt @@ -84,7 +84,7 @@ internal class IsekaiScan(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScanEuParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScanEuParser.kt index 6300746ef..e9ef3c4fe 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScanEuParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScanEuParser.kt @@ -107,7 +107,7 @@ internal class IsekaiScanEuParser(context: MangaLoaderContext) : coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4") ?: summary?.selectFirst("div.post-title p.juduldepan"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDass.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDass.kt index e35d49fcd..f165c0b97 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDass.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDass.kt @@ -82,7 +82,7 @@ internal class MangaDass(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( @@ -138,7 +138,7 @@ internal class MangaDass(context: MangaLoaderContext) : ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDna.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDna.kt index 4774fe72a..d0f8fd5d2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDna.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaDna.kt @@ -75,7 +75,7 @@ internal class MangaDna(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("div.hitem-rate span")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( @@ -131,7 +131,7 @@ internal class MangaDna(context: MangaLoaderContext) : ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt index 86a754a55..b50b23ad9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt @@ -89,7 +89,7 @@ internal class MangaPure(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManhwaHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManhwaHentai.kt index c4e019283..313a068e3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManhwaHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManhwaHentai.kt @@ -68,7 +68,7 @@ internal class ManhwaHentai(context: MangaLoaderContext) : ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Manhwaz.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Manhwaz.kt index 226592b5f..c7bb9c26f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Manhwaz.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/Manhwaz.kt @@ -78,7 +78,7 @@ internal class Manhwaz(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManyToon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManyToon.kt index b2baebd44..48e94a04f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManyToon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ManyToon.kt @@ -115,7 +115,7 @@ internal class ManyToon(context: MangaLoaderContext) : ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ShibaManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ShibaManga.kt index b69585a4f..2adaef705 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ShibaManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/ShibaManga.kt @@ -26,7 +26,7 @@ internal class ShibaManga(context: MangaLoaderContext) : coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4") ?: div.selectFirst("div.post-title a"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/DragonTranslationParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/DragonTranslationParser.kt index 660ccf6d2..d6e735f4c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/DragonTranslationParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/DragonTranslationParser.kt @@ -61,7 +61,7 @@ internal class DragonTranslationParser(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img.thumb-img")?.src(), title = div.selectFirst("div.series-box h5")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = emptySet(), authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/MangasNoSekai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/MangasNoSekai.kt index 58e11f709..2f724c71e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/MangasNoSekai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/MangasNoSekai.kt @@ -31,8 +31,10 @@ internal class MangasNoSekai(context: MangaLoaderContext) : }, authors = author?.let { setOf(it) } ?: emptySet(), description = body.selectFirst("#section-sinopsis p")?.text().orEmpty(), - altTitle = doc.selectFirst("section#section-sinopsis div.d-flex:has(div:contains(Otros nombres)) p") - ?.textOrNull(), + altTitles = setOfNotNull( + doc.selectFirst("section#section-sinopsis div.d-flex:has(div:contains(Otros nombres)) p") + ?.textOrNull(), + ), state = body.selectFirst("section#section-sinopsis div.d-flex:has(div:contains(Estado)) p") ?.let { when (it.text()) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt index f7d94d383..45e486d8b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt @@ -72,7 +72,7 @@ internal class TmoManga(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirstOrThrow("h3").text(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = emptySet(), authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/ManhwaHub.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/ManhwaHub.kt index 89ffbf8f7..2ed35df0b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/ManhwaHub.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/ManhwaHub.kt @@ -74,7 +74,7 @@ internal class ManhwaHub(context: MangaLoaderContext) : coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4") ?: div.selectFirst("h5.series-title"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ja/MangaFenxi.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ja/MangaFenxi.kt index 7fdd383f5..2b0496505 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ja/MangaFenxi.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/ja/MangaFenxi.kt @@ -30,7 +30,7 @@ internal class MangaFenxi(context: MangaLoaderContext) : coverUrl = div.selectFirst("img")?.attr("src")?.replace("-193x278", ""), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4") ?: div.selectFirst(".manga-name") ?: div.selectFirst(".post-title"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Saytruyenhay.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Saytruyenhay.kt index 508c2ba7e..78caf15ad 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Saytruyenhay.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Saytruyenhay.kt @@ -79,7 +79,7 @@ internal class Saytruyenhay(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4"))?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f, tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a -> MangaTag( @@ -154,7 +154,7 @@ internal class Saytruyenhay(context: MangaLoaderContext) : ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), state = state, chapters = chaptersDeferred.await(), ) 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 2a6d75b2f..7118e7d8b 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 @@ -4,8 +4,8 @@ import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -121,7 +121,7 @@ internal abstract class MadthemeParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirst("div.meta")?.selectFirst("div.title")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("div.meta span.score")?.ownText()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = doc.body().select("div.meta div.genres span").mapToSet { span -> MangaTag( @@ -187,7 +187,7 @@ internal abstract class MadthemeParser( ) }, description = desc?.nullIfEmpty(), - altTitle = alt.nullIfEmpty(), + altTitles = setOfNotNull(alt.nullIfEmpty()), state = state, chapters = chaptersDeferred.await(), contentRating = if (nsfw || manga.isNsfw) { 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 98f8b52f5..2ea4ff1de 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 @@ -4,8 +4,8 @@ import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -109,7 +109,7 @@ internal abstract class Manga18Parser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirst("div.mg_info")?.selectFirst("div.mg_name a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -165,8 +165,8 @@ internal abstract class Manga18Parser( ) }, description = desc?.nullIfEmpty(), - altTitle = alt, - authors = author?.let { setOf(it) } ?: emptySet(), + altTitles = setOfNotNull(alt), + authors = setOfNotNull(author), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/en/Hentai3zCc.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/en/Hentai3zCc.kt index 1723b8e44..f47bc0b77 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/en/Hentai3zCc.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/en/Hentai3zCc.kt @@ -22,7 +22,7 @@ internal class Hentai3zCc(context: MangaLoaderContext) : ?.replace("cover_thumb_2.webp", "cover_250x350.jpg") ?.replace("admin.manga18.us", "bk.18porncomic.com"), title = div.selectFirst("div.mg_info")?.selectFirst("div.mg_name a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 77ca0b15e..ca6b0bd14 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 @@ -174,7 +174,7 @@ internal abstract class MangaboxParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirst("h3")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -232,7 +232,7 @@ internal abstract class MangaboxParser( ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), authors = authors, state = state, chapters = chaptersDeferred.await(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangairo.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangairo.kt index 94d3105bc..7301f2f54 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangairo.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangairo.kt @@ -127,7 +127,7 @@ internal class Mangairo(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = (div.selectFirst("h2")?.text() ?: div.selectFirst("h3")?.text()).orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -177,8 +177,8 @@ internal class Mangairo(context: MangaLoaderContext) : ) }, description = desc, - altTitle = alt, - authors = author?.let { setOf(it) } ?: emptySet(), + altTitles = setOfNotNull(alt), + authors = setOfNotNull(author), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt index 216cef027..6b18ea57d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangakakalot.kt @@ -5,8 +5,12 @@ 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.model.search.* -import org.koitharu.kotatsu.parsers.model.search.QueryCriteria.* +import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery +import org.koitharu.kotatsu.parsers.model.search.MangaSearchQueryCapabilities +import org.koitharu.kotatsu.parsers.model.search.QueryCriteria.Include +import org.koitharu.kotatsu.parsers.model.search.QueryCriteria.Match +import org.koitharu.kotatsu.parsers.model.search.SearchCapability +import org.koitharu.kotatsu.parsers.model.search.SearchableField import org.koitharu.kotatsu.parsers.model.search.SearchableField.* import org.koitharu.kotatsu.parsers.site.mangabox.MangaboxParser import org.koitharu.kotatsu.parsers.util.* @@ -136,7 +140,7 @@ internal class Mangakakalot(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirst("h3")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/MangakakalotTv.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/MangakakalotTv.kt index 156994589..b4fc155aa 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/MangakakalotTv.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/MangakakalotTv.kt @@ -6,8 +6,12 @@ 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.model.search.* -import org.koitharu.kotatsu.parsers.model.search.QueryCriteria.* +import org.koitharu.kotatsu.parsers.model.search.MangaSearchQuery +import org.koitharu.kotatsu.parsers.model.search.MangaSearchQueryCapabilities +import org.koitharu.kotatsu.parsers.model.search.QueryCriteria.Include +import org.koitharu.kotatsu.parsers.model.search.QueryCriteria.Match +import org.koitharu.kotatsu.parsers.model.search.SearchCapability +import org.koitharu.kotatsu.parsers.model.search.SearchableField import org.koitharu.kotatsu.parsers.model.search.SearchableField.* import org.koitharu.kotatsu.parsers.site.mangabox.MangaboxParser import org.koitharu.kotatsu.parsers.util.* @@ -127,7 +131,7 @@ internal class MangakakalotTv(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirstOrThrow("h3").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -162,8 +166,8 @@ internal class MangakakalotTv(context: MangaLoaderContext) : ) }, description = desc, - altTitle = alt, - authors = author?.let { setOf(it) } ?: emptySet(), + altTitles = setOfNotNull(alt), + authors = setOfNotNull(author), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt index cc9e0cd0d..bf82556e0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.mangadventure import okhttp3.HttpUrl import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.NotFoundException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents @@ -119,7 +119,7 @@ internal abstract class MangAdventureParser( } return manga.copy( description = details.getStringOrNull("description"), - altTitle = details.getJSONArray("aliases").joinToString().nullIfEmpty(), + altTitles = details.getJSONArray("aliases").toStringSet(), authors = setOf(author), tags = details.getJSONArray("categories").mapTo(HashSet()) { val name = it as String @@ -188,7 +188,7 @@ internal abstract class MangAdventureParser( Manga( id = generateUid(it.getString("slug")), title = it.getString("title"), - altTitle = null, + altTitles = emptySet(), url = path, publicUrl = publicUrl, rating = RATING_UNKNOWN, 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 6852be480..016a19f51 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 @@ -12,8 +12,8 @@ import okhttp3.internal.closeQuietly import org.json.JSONObject import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -160,7 +160,7 @@ internal abstract class MangaReaderParser( id = generateUid(relativeUrl), url = relativeUrl, title = it.selectFirst(selectMangaListTitle)?.text() ?: a.attr("title"), - altTitle = null, + altTitles = emptySet(), publicUrl = a.attrAsAbsoluteUrl("href"), rating = rating, contentRating = if (isNsfwSource) ContentRating.ADULT else null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt index 25597cda1..9e1cb9561 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt @@ -120,7 +120,7 @@ internal class RizzComic(context: MangaLoaderContext) : val manga = Manga( id = j.getLong("id"), title = title, - altTitle = j.getString("description"), + altTitles = emptySet(), //j.getString("description"), TODO check url = urlManga.toRelativeUrl(domain), publicUrl = urlManga, rating = j.getFloatOrDefault("rating", RATING_UNKNOWN) / 10f, 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 b88018ef9..8c4c9adfb 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 @@ -97,7 +97,7 @@ internal class RevolutionScantrad(context: MangaLoaderContext) : id = generateUid(relativeUrl), url = relativeUrl, title = it.selectFirst(selectMangaListTitle)?.text() ?: a.attr("title"), - altTitle = null, + altTitles = emptySet(), publicUrl = a.attrAsAbsoluteUrl("href"), rating = rating, contentRating = if (isNsfwSource) ContentRating.ADULT else null, 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 21aa7acd6..b93293038 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 @@ -91,7 +91,7 @@ internal class XxxRevolutionScantrad(context: MangaLoaderContext) : id = generateUid(relativeUrl), url = relativeUrl, title = it.selectFirst(selectMangaListTitle)?.text() ?: a.attr("title"), - altTitle = null, + altTitles = emptySet(), publicUrl = a.attrAsAbsoluteUrl("href"), rating = rating, contentRating = if (isNsfwSource) ContentRating.ADULT else null, 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 4bdd6a64f..1bf42080b 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 @@ -144,7 +144,7 @@ internal class Komikcast(context: MangaLoaderContext) : id = generateUid(relativeUrl), url = relativeUrl, title = name, - altTitle = null, + altTitles = emptySet(), publicUrl = a.attrAsAbsoluteUrl("href"), rating = rating, contentRating = if (isNsfwSource) ContentRating.ADULT else null, 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 616189b20..2192573a0 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.mangaworld import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -151,7 +151,7 @@ internal abstract class MangaWorldParser( publicUrl = href.toAbsoluteUrl(domain), coverUrl = div.selectFirst(".thumb img")?.attr("src"), title = div.selectFirst(".name a.manga-title")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = tags, authors = author?.let { setOf(it) } ?: emptySet(), @@ -184,13 +184,14 @@ internal abstract class MangaWorldParser( override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() return manga.copy( - altTitle = + altTitles = setOfNotNull( doc.selectFirst(".meta-data .font-weight-bold:contains(Titoli alternativi:)") ?.parent() ?.ownText() ?.substringAfter(": ") ?.trim() ?.nullIfEmpty(), + ), description = doc.getElementById("noidungm")?.text().orEmpty(), chapters = doc.select(".chapters-wrapper .chapter a").mapChapters(reversed = true) { i, a -> 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 19e845cd0..db67bb93a 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 @@ -4,8 +4,8 @@ import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -128,7 +128,7 @@ internal abstract class MmrcmsParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirst("div.media-body h5")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span")?.ownText()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -149,7 +149,7 @@ internal abstract class MmrcmsParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = "https://$domain/uploads/manga/$deeplink$imgUpdated", title = div.selectFirst("h3 a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -204,9 +204,9 @@ internal abstract class MmrcmsParser( source = source, ) }, - authors = author?.let { setOf(it) } ?: emptySet(), + authors = setOfNotNull(author), description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), state = state, chapters = chaptersDeferred.await(), ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/ar/Onma.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/ar/Onma.kt index 5b48ee7c6..6bf8a980e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/ar/Onma.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/ar/Onma.kt @@ -32,7 +32,7 @@ internal class Onma(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirstOrThrow("h5.media-heading").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirstOrThrow("span").ownText().toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -70,7 +70,7 @@ internal class Onma(context: MangaLoaderContext) : }, authors = author?.let { setOf(it) } ?: emptySet(), description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), state = state, chapters = chaptersDeferred.await(), ) 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 046335dd7..cfb0ca72d 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.nepnep import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -139,7 +139,7 @@ internal abstract class NepnepParser( return Manga( id = generateUid(href), title = m.getString("i").replace('-', ' '), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/OneMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/OneMangaParser.kt index 2ce07b75d..c80eab1d5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/OneMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/onemanga/OneMangaParser.kt @@ -1,8 +1,8 @@ package org.koitharu.kotatsu.parsers.site.onemanga import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -40,8 +40,10 @@ internal abstract class OneMangaParser( publicUrl = url, coverUrl = doc.selectFirst("div.elementor-widget-container img")?.src(), title = doc.selectFirst("ul.elementor-nav-menu li a")?.text().orEmpty(), - altTitle = doc.selectFirst("div.elementor-widget-text-editor ul li:contains(Nom(s) Alternatif(s))") - ?.text()?.replace("Nom(s) Alternatif(s) :", "").orEmpty(), + altTitles = setOfNotNull( + doc.selectFirst("div.elementor-widget-text-editor ul li:contains(Nom(s) Alternatif(s))") + ?.text()?.replace("Nom(s) Alternatif(s) :", "")?.nullIfEmpty(), + ), rating = RATING_UNKNOWN, tags = emptySet(), authors = setOf(author), 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 9de0b85af..41053e4b2 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.otakusanctuary import kotlinx.coroutines.coroutineScope import okhttp3.HttpUrl.Companion.toHttpUrl import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -112,7 +112,7 @@ internal abstract class OtakuSanctuaryParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src(), title = div.selectFirst("h4")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst(".rating")?.ownText()?.toFloatOrNull()?.div(10f) ?: RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -174,7 +174,7 @@ internal abstract class OtakuSanctuaryParser( ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), authors = author?.let { setOf(it) } ?: emptySet(), state = state, chapters = doc.body().requireElementById("chapter").select("tr.chapter") 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 766746fcf..38a949001 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 @@ -4,8 +4,8 @@ import kotlinx.coroutines.coroutineScope import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -188,10 +188,11 @@ internal abstract class PizzaReaderParser( coverUrl = j.getString("thumbnail"), title = j.getString("title"), description = j.getString("description"), - altTitle = j.getJSONArray("alt_titles").toString() + altTitles = j.getJSONArray("alt_titles").toString() .replace("[\"", "") .replace("\"]", "") - .replace("\",\"", " , "), + .split("\",\"") + .toSet(), rating = j.getString("rating").toFloatOrNull()?.div(10f) ?: RATING_UNKNOWN, tags = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt index 80bb87ba8..511e27d4c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.pt import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -94,7 +94,7 @@ internal class BrMangas(context: MangaLoaderContext) : LegacyPagedMangaParser(co Manga( id = generateUid(href), title = div.selectFirstOrThrow("h2").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, 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 351c63647..f9e25a6dd 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 @@ -1,6 +1,9 @@ package org.koitharu.kotatsu.parsers.site.pt -import org.koitharu.kotatsu.parsers.* +import org.koitharu.kotatsu.parsers.Broken +import org.koitharu.kotatsu.parsers.ErrorMessages +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* @@ -91,7 +94,7 @@ internal class LerManga(context: MangaLoaderContext) : LegacyPagedMangaParser(co publicUrl = href, title = div.selectLastOrThrow("h3.film-name").text(), coverUrl = div.selectFirst("img.film-poster-img")?.src(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst(".item__rating")?.ownText()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = emptySet(), description = null, 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 48d40d7c9..edb2a6593 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 @@ -4,8 +4,8 @@ import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -78,7 +78,7 @@ internal class LerMangaOnline(context: MangaLoaderContext) : publicUrl = a.attrAsAbsoluteUrl("href"), title = div.selectLastOrThrow("section h3").text(), coverUrl = div.selectFirst("img")?.src().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = null, 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 3e164c9ba..60e647a14 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 @@ -6,7 +6,10 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.Response import okhttp3.ResponseBody.Companion.toResponseBody import org.json.JSONArray -import org.koitharu.kotatsu.parsers.* +import org.koitharu.kotatsu.parsers.Broken +import org.koitharu.kotatsu.parsers.ErrorMessages +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* @@ -50,7 +53,7 @@ internal class LuratoonScansParser(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src().orEmpty(), title = div.text(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -70,8 +73,10 @@ internal class LuratoonScansParser(context: MangaLoaderContext) : ?.nextElementSibling()?.textOrNull() return manga.copy( title = doc.selectFirst("h1.desc__titulo__comic")?.textOrNull() ?: manga.title, - altTitle = summaryContainer.getElementsContainingOwnText("Alternativo").firstOrNull() - ?.nextElementSibling()?.textOrNull(), + altTitles = setOfNotNull( + summaryContainer.getElementsContainingOwnText("Alternativo").firstOrNull() + ?.nextElementSibling()?.textOrNull(), + ), tags = summaryContainer.getElementsByAttributeValueContaining("href", "?category=").mapToSet { MangaTag( title = it.text().toTitleCase(sourceLocale), 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 06ed7bfa9..e1fb15dfb 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.pt import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -71,7 +71,7 @@ internal class MangaOnline(context: MangaLoaderContext) : publicUrl = a.attrAsAbsoluteUrl("href"), title = div.selectLast(".data h3")?.text().orEmpty(), coverUrl = div.selectFirst("img")?.src().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst(".rating")?.ownText()?.toFloatOrNull()?.div(10f) ?: RATING_UNKNOWN, tags = emptySet(), description = null, @@ -137,7 +137,7 @@ internal class MangaOnline(context: MangaLoaderContext) : publicUrl = a.attrAsAbsoluteUrl("href"), title = div.selectLast(".reltitle h3")?.text().orEmpty(), coverUrl = div.selectFirst("img")?.src().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt index 94714540c..aff4d7196 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MuitoHentai.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.pt import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -66,7 +66,7 @@ internal class MuitoHentai(context: MangaLoaderContext) : publicUrl = href, title = div.selectLastOrThrow("h3").text(), coverUrl = div.selectFirst("img")?.src().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt index a67f03951..37511f56e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/OnePieceEx.kt @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.pt import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -36,7 +36,7 @@ internal class OnePieceEx(context: MangaLoaderContext) : publicUrl = "https://$domain/mangas/leitor/", title = "One Piece", coverUrl = "https://$domain/mangareader/sbs/capa/preview/Volume_1.jpg", - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = "Um romance marítimo pelo \"One Piece\"!!! Estamos na Grande " + @@ -56,7 +56,7 @@ internal class OnePieceEx(context: MangaLoaderContext) : publicUrl = "https://$domain/sbs/", title = "One Piece", coverUrl = "https://$domain/mangareader/sbs/capa/preview/nao.jpg", - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = "O SBS é uma coluna especial encontrada na maioria dos " + 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 d0c74d3de..e55f4af07 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.pt import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getStringOrNull @@ -82,7 +82,7 @@ internal class YugenMangas(context: MangaLoaderContext) : publicUrl = slug, title = j.getString("name"), coverUrl = cover, - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = null, @@ -107,7 +107,7 @@ internal class YugenMangas(context: MangaLoaderContext) : return manga.copy( description = detailManga.getString("synopsis"), coverUrl = detailManga.getString("cover"), - altTitle = detailManga.getStringOrNull("alternative_names"), + altTitles = setOfNotNull(detailManga.getStringOrNull("alternative_names")), authors = author?.let { setOf(it) } ?: emptySet(), state = detailManga.getStringOrNull("status")?.let { when (it) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt index 2b42e6299..d74bba1b8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/AComics.kt @@ -6,8 +6,8 @@ import kotlinx.coroutines.sync.withLock import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -103,7 +103,7 @@ internal class AComics(context: MangaLoaderContext) : id = generateUid(url), url = url, title = it.selectFirstOrThrow(".title").text(), - altTitle = null, + altTitles = emptySet(), publicUrl = url, rating = RATING_UNKNOWN, contentRating = if (isNsfwSource) ContentRating.ADULT else null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt index 81f397e71..6de91ec19 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt @@ -5,8 +5,8 @@ import okhttp3.Headers import okhttp3.HttpUrl import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents @@ -82,7 +82,7 @@ internal class DesuMeParser(context: MangaLoaderContext) : publicUrl = jo.getString("url"), source = MangaParserSource.DESUME, title = jo.getString("russian"), - altTitle = jo.getString("name"), + altTitles = setOf(jo.getString("name")), coverUrl = cover.getString("preview"), largeCoverUrl = cover.getString("original"), state = when (jo.getString("status")) { 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 9aa363db8..6bbca02f8 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 @@ -7,8 +7,8 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.InternalParsersApi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -129,7 +129,7 @@ internal class MangaWtfParser( Manga( id = generateUid(jo.getString("id")), title = jo.getJSONObject("name").getString("ru"), - altTitle = jo.getJSONObject("name").getStringOrNull("en"), + altTitles = setOfNotNull(jo.getJSONObject("name").getStringOrNull("en")), url = jo.getString("id"), publicUrl = "https://$domain/manga/${jo.getString("slug")}", rating = jo.getFloatOrDefault("averageRating", -10f) / 10f, @@ -261,7 +261,7 @@ internal class MangaWtfParser( return Manga( id = generateUid(getString("id")), title = getJSONObject("name").getString("ru"), - altTitle = getJSONObject("name").getStringOrNull("en"), + altTitles = setOfNotNull(getJSONObject("name").getStringOrNull("en")), url = getString("id"), publicUrl = "https://$domain/manga/${getString("slug")}", rating = getFloatOrDefault("averageRating", -10f) / 10f, 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 72b264526..7b9861b7c 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 @@ -1,10 +1,10 @@ package org.koitharu.kotatsu.parsers.site.ru import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -98,7 +98,7 @@ internal class NudeMoonParser( id = generateUid(href), url = href, title = title.substringAfter(" / "), - altTitle = title.substringBefore(" / ", "").takeUnless { it.isBlank() }, + altTitles = setOfNotNull(title.substringBefore(" / ", "").takeUnless { it.isBlank() }), authors = author?.let { setOf(it) } ?: emptySet(), coverUrl = row.selectFirst("img")?.absUrl("src").orEmpty(), tags = row.selectFirst(".tag-links")?.select("a")?.mapToSet { 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 5a52faab9..42ed6fc66 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 @@ -10,8 +10,8 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.ContentUnavailableException import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* @@ -111,7 +111,7 @@ internal class RemangaParser( url = url, publicUrl = "https://$domain$url", title = jo.getString("rus_name"), - altTitle = jo.getString("en_name"), + altTitles = setOfNotNull(jo.getStringOrNull("en_name")), rating = jo.getString("avg_rating").toFloatOrNull()?.div(10f) ?: RATING_UNKNOWN, coverUrl = "https://api.$domain${img.getString("mid")}", largeCoverUrl = "https://api.$domain${img.getString("high")}", 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 b5468f22d..7d1411b50 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.ru import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -51,7 +51,7 @@ internal class WaMangaParser( id = generateUid(url), url = url, title = doc.getString("title"), - altTitle = null, + altTitles = emptySet(), publicUrl = url.toAbsoluteUrl(domain), rating = doc.getFloatOrDefault("rating", 0f), coverUrl = doc.getString("thumbnail_small"), 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 77a3560b0..1ad6f1ef6 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 @@ -17,9 +17,9 @@ import okio.IOException import org.json.JSONArray import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* @@ -141,9 +141,9 @@ internal abstract class GroupleParser( return manga.copy( source = newSource, title = doc.metaValue("name") ?: manga.title, - altTitle = root.selectFirst(".all-names-popover")?.select(".name")?.joinToString { it.text() } - ?.nullIfEmpty() - ?: manga.altTitle, + altTitles = root.selectFirst(".all-names-popover")?.select(".name")?.mapNotNullToSet { + it.textOrNull() + } ?: manga.altTitles, publicUrl = response.request.url.toString(), description = root.selectFirst("div.manga-description")?.html(), largeCoverUrl = coverImg?.attrAsAbsoluteUrlOrNull("data-full"), @@ -422,7 +422,7 @@ internal abstract class GroupleParser( url = relUrl, publicUrl = href, title = title, - altTitle = descDiv.selectFirst("h5")?.textOrNull(), + altTitles = setOfNotNull(descDiv.selectFirst("h5")?.textOrNull()), coverUrl = imgDiv.selectFirst("img.lazy")?.attr("data-original")?.replace("_p.", ".").orEmpty(), rating = runCatching { node.selectFirst(".compact-rate")?.attr("title")?.toFloatOrNull()?.div(5f) 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 03cc4ddd8..3be544c06 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.ru.multichan import okhttp3.HttpUrl import org.jsoup.internal.StringUtil import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.MangaParserAuthProvider +import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -58,7 +58,7 @@ internal abstract class ChanParser( id = generateUid(href), url = href, publicUrl = href.toAbsoluteUrl(a.host ?: domain), - altTitle = title.second, + altTitles = setOfNotNull(title.second), title = title.first, authors = author?.let { setOf(it) } ?: emptySet(), coverUrl = row.selectFirst("div.manga_images")?.selectFirst("img") @@ -174,7 +174,7 @@ internal abstract class ChanParser( id = generateUid(href), url = href, publicUrl = href.toAbsoluteUrl(a.host ?: domain), - altTitle = title.second, + altTitles = setOfNotNull(title.second), title = title.first, authors = author?.let { setOf(it) } ?: emptySet(), coverUrl = div.selectFirst("img")?.absUrl("src").orEmpty(), @@ -249,7 +249,7 @@ internal abstract class ChanParser( if (c == '(') { depth-- if (depth == 0 && (i + 2) < lastIndex && i > 0) { - return substring(i + 1, lastIndex).trim() to substring(0, i).trim() + return substring(i + 1, lastIndex).trim() to substring(0, i).trim().nullIfEmpty() } } else if (c == ')') { depth++ 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 ac30dad1a..29c082b34 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 @@ -7,8 +7,8 @@ import okhttp3.HttpUrl import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* @@ -146,7 +146,7 @@ internal abstract class LibSocialParser( val author = json.getJSONArray("authors").optJSONObject(0)?.getStringOrNull("name") manga.copy( title = json.getStringOrNull("rus_name") ?: manga.title, - altTitle = json.getStringOrNull("name"), + altTitles = setOfNotNull(json.getStringOrNull("name")), tags = tagsSetOf(tags, genres), authors = author?.let { setOf(it) } ?: emptySet(), description = json.getString("summary").nl2br(), @@ -209,7 +209,7 @@ internal abstract class LibSocialParser( return Manga( id = generateUid(jo.getLong("id")), title = jo.getString("rus_name").ifEmpty { jo.getString("name") }, - altTitle = jo.getString("name"), + altTitles = setOfNotNull(jo.getString("name")), url = jo.getString("slug_url"), publicUrl = "https://$siteDomain/ru/manga/" + jo.getString("slug_url"), rating = jo.optJSONObject("rating") 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 2b007ab4b..d12402b6f 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 @@ -5,8 +5,8 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import org.jsoup.Jsoup import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.unescapeJson @@ -99,7 +99,7 @@ internal abstract class ScanParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.attr("data-src")?.replace("\t", "").orEmpty(), title = div.selectFirst(".link-series h3, .item-title")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -140,15 +140,16 @@ internal abstract class ScanParser( val selectTag = doc.select(".card-series-detail .col-6:contains(Categorie) div, .card-series-about .mb-3:contains(Categorie) a, .card-series-about .mb-3:contains(Categorias) a") val tags = selectTag.mapNotNullToSet { tagMap[it.text()] } - val author = doc.selectFirst(".card-series-detail .col-6:contains(Autore) div, .card-series-about .mb-3:contains(Autore) a") - ?.textOrNull() + val author = + doc.selectFirst(".card-series-detail .col-6:contains(Autore) div, .card-series-about .mb-3:contains(Autore) a") + ?.textOrNull() return manga.copy( rating = doc.selectFirst(".card-series-detail .rate-value span, .card-series-about .rate-value span") ?.ownText()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = tags, authors = author?.let { setOf(it) } ?: emptySet(), - altTitle = doc.selectFirst(".card div.col-12.mb-4 h2, .card-series-about .h6")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst(".card div.col-12.mb-4 h2, .card-series-about .h6")?.textOrNull()), description = doc.selectFirst(".card div.col-12.mb-4 p, .card-series-desc .mb-4 p")?.html(), chapters = doc.select(".chapters-list .col-chapter, .card-list-chapter .col-chapter") .mapChapters(reversed = true) { i, div -> 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 f7ae55e4e..c3322ea89 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 @@ -19,15 +19,16 @@ internal class MangaFr(context: MangaLoaderContext) : override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() val dateFormat = SimpleDateFormat("MM-dd-yyyy", sourceLocale) - val author = doc.selectFirst(".card-series-detail .col-6:contains(Autore) div, .card-series-about .mb-3:contains(Autore) a") - ?.textOrNull() + val author = + doc.selectFirst(".card-series-detail .col-6:contains(Autore) div, .card-series-about .mb-3:contains(Autore) a") + ?.textOrNull() return manga.copy( rating = doc.selectFirst(".card-series-detail .rate-value span, .card-series-about .rate-value span") ?.ownText()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = emptySet(), authors = author?.let { setOf(it) } ?: emptySet(), - altTitle = doc.selectFirst(".card div.col-12.mb-4 h2, .card-series-about .h6")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst(".card div.col-12.mb-4 h2, .card-series-about .h6")?.textOrNull()), description = doc.selectFirst(".card div.col-12.mb-4 p, .card-series-desc .mb-4 p")?.html(), chapters = doc.select(".chapters-list .col-chapter, .card-list-chapter .col-chapter") .mapChapters(reversed = true) { i, div -> 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 8e022ea5b..675330f7f 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 @@ -29,7 +29,7 @@ internal class ScanIta(context: MangaLoaderContext) : ?: RATING_UNKNOWN, tags = tags, authors = author?.let { setOf(it) } ?: emptySet(), - altTitle = doc.selectFirst(".card div.col-12.mb-4 h2")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst(".card div.col-12.mb-4 h2")?.textOrNull()), description = doc.selectFirst(".card div.col-12.mb-4 p")?.html(), chapters = chaptersDeferred.await(), ) 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 4e275b93b..d7393ee68 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.sinmh import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -112,7 +112,7 @@ internal abstract class SinmhParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src().orEmpty(), title = div.selectFirst("p > a, h3 > a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 d1493d77f..b087351f5 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 @@ -6,8 +6,8 @@ import kotlinx.coroutines.sync.withLock import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -91,7 +91,7 @@ internal class MangaAy(context: MangaLoaderContext) : LegacyPagedMangaParser(con publicUrl = a.attrAsAbsoluteUrl("href"), title = div.selectLast(".item-name")?.text().orEmpty(), coverUrl = div.selectFirst("img")?.src().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = null, @@ -112,8 +112,8 @@ internal class MangaAy(context: MangaLoaderContext) : LegacyPagedMangaParser(con url = href, publicUrl = a.attrAsAbsoluteUrl("href"), title = a.text(), - coverUrl = "", - altTitle = null, + coverUrl = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), description = null, 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 9ddc2632b..ade39c014 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.tr import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacySinglePageMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -47,7 +47,7 @@ internal class SadScans(context: MangaLoaderContext) : Manga( id = generateUid(href), title = div.selectFirstOrThrow("h2").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, 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 f9e1bec1f..43b869f50 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.tr import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -106,7 +106,7 @@ internal class TrWebtoon(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(domain), coverUrl = li.selectFirst("img")?.src().orEmpty(), title = li.selectFirst(".table-responsive a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = li.selectFirst(".row .col-xl-4 .mt-2 .my-1 .text-muted")?.text()?.substringBefore("/") ?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, tags = emptySet(), @@ -131,7 +131,7 @@ internal class TrWebtoon(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(domain), coverUrl = li.selectFirst(".figure img")?.src().orEmpty(), title = li.selectFirst(".title")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 7e250aeb0..818fd5f71 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 @@ -8,9 +8,9 @@ import okhttp3.Response import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -114,7 +114,7 @@ internal class HentaiUkrParser(context: MangaLoaderContext) : LegacyMangaParser( Manga( id = generateUid(id), title = jo.getString("name"), - altTitle = jo.getStringOrNull("eng_name"), + altTitles = setOfNotNull(jo.getStringOrNull("eng_name")), url = jo.getString("url"), publicUrl = jo.getString("url").toAbsoluteUrl(domain), rating = RATING_UNKNOWN, 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 5d9ad1b31..88d9ac7eb 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 @@ -7,8 +7,8 @@ import org.json.JSONArray import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getFloatOrDefault @@ -153,7 +153,7 @@ internal class HoneyMangaParser(context: MangaLoaderContext) : Manga( id = generateUid(id), title = jo.getString("title"), - altTitle = jo.getStringOrNull("alternativeTitle"), + altTitles = setOfNotNull(jo.getStringOrNull("alternativeTitle")), url = id, publicUrl = "https://$domain/book/$id", rating = RATING_UNKNOWN, 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 7e968ca11..4bb085ce7 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.uk import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -76,7 +76,7 @@ internal class MangaInUaParser(context: MangaLoaderContext) : LegacyPagedMangaPa coverUrl = item.selectFirst("header.card__cover")?.selectFirst("img")?.run { attrAsAbsoluteUrlOrNull("data-src") ?: attrAsAbsoluteUrlOrNull("src") }.orEmpty(), - altTitle = null, + altTitles = emptySet(), authors = emptySet(), rating = item.selectFirst("div.card__short-rate--num")?.text()?.toFloatOrNull()?.div(10F) ?: RATING_UNKNOWN, 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 de40c714e..affcaa3e8 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 @@ -3,16 +3,16 @@ package org.koitharu.kotatsu.parsers.site.vi import org.json.JSONArray import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* -import org.koitharu.kotatsu.parsers.Broken @Broken @MangaSourceParser("BLOGTRUYEN", "Blog Truyện", "vi") @@ -79,7 +79,7 @@ internal class BlogTruyenParser(context: MangaLoaderContext) : Manga( id = generateUid(relativeUrl), title = a.text(), - altTitle = null, + altTitles = emptySet(), description = mangaInfo.select("div.al-j.fs-12").text(), url = relativeUrl, publicUrl = relativeUrl.toAbsoluteUrl(domain), 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 8f28c111e..62ebbf7a0 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 @@ -7,8 +7,8 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -90,7 +90,7 @@ internal class BlogTruyenVN(context: MangaLoaderContext) : Manga( id = generateUid(relativeUrl), title = linkTag.attr("title"), - altTitle = null, + altTitles = emptySet(), description = el.selectFirst("p.al-j.break.line-height-15")?.text(), url = relativeUrl, publicUrl = relativeUrl.toAbsoluteUrl(domain), @@ -115,7 +115,7 @@ internal class BlogTruyenVN(context: MangaLoaderContext) : Manga( id = generateUid(relativeUrl), title = a.text(), - altTitle = null, + altTitles = emptySet(), description = mangaInfo.select("div.al-j.fs-12").text(), url = relativeUrl, publicUrl = relativeUrl.toAbsoluteUrl(domain), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BuonDuaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BuonDuaParser.kt index ccdffb17e..14f79bfd7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BuonDuaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BuonDuaParser.kt @@ -76,7 +76,7 @@ internal class BuonDuaParser(context: MangaLoaderContext) : LegacyMangaParser(co id = generateUid(relUrl), url = relUrl, title = titleEl.text(), - altTitle = null, + altTitles = emptySet(), publicUrl = relUrl.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, contentRating = ContentRating.ADULT, 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 28f1ac4fc..cbcc928dc 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 @@ -6,40 +6,15 @@ import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException -import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.parsers.model.MangaChapter -import org.koitharu.kotatsu.parsers.model.MangaListFilter -import org.koitharu.kotatsu.parsers.model.MangaListFilterCapabilities -import org.koitharu.kotatsu.parsers.model.MangaListFilterOptions -import org.koitharu.kotatsu.parsers.model.MangaPage -import org.koitharu.kotatsu.parsers.model.MangaParserSource -import org.koitharu.kotatsu.parsers.model.MangaState -import org.koitharu.kotatsu.parsers.model.MangaTag -import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN -import org.koitharu.kotatsu.parsers.model.SortOrder -import org.koitharu.kotatsu.parsers.util.generateUid -import org.koitharu.kotatsu.parsers.util.getCookies -import org.koitharu.kotatsu.parsers.util.json.asTypedList -import org.koitharu.kotatsu.parsers.util.json.getStringOrNull -import org.koitharu.kotatsu.parsers.util.json.mapJSON -import org.koitharu.kotatsu.parsers.util.json.mapJSONNotNull -import org.koitharu.kotatsu.parsers.util.mapNotNullToSet -import org.koitharu.kotatsu.parsers.util.nullIfEmpty -import org.koitharu.kotatsu.parsers.util.oneOrThrowIfMany -import org.koitharu.kotatsu.parsers.util.parseJson -import org.koitharu.kotatsu.parsers.util.parseJsonArray -import org.koitharu.kotatsu.parsers.util.parseRaw +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.suspendlazy.suspendLazy -import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl -import org.koitharu.kotatsu.parsers.util.toTitleCase -import org.koitharu.kotatsu.parsers.util.tryParse -import org.koitharu.kotatsu.parsers.util.urlBuilder import java.text.SimpleDateFormat -import java.util.EnumSet -import java.util.Locale +import java.util.* private const val PAGE_SIZE = 20 @@ -179,7 +154,7 @@ internal class CMangaParser(context: MangaLoaderContext) : Manga( id = generateUid(id), title = info.optString("name").toTitleCase(), - altTitle = info.optJSONArray("name_other")?.asTypedList()?.joinToString()?.nullIfEmpty(), + altTitles = info.optJSONArray("name_other")?.toStringSet().orEmpty(), url = relativeUrl, publicUrl = relativeUrl.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, 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 fb83459f6..06dde7a2e 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 @@ -10,10 +10,10 @@ import okio.IOException import org.jsoup.HttpStatusException import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.bitmap.Bitmap import org.koitharu.kotatsu.parsers.bitmap.Rect import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -21,7 +21,6 @@ import org.koitharu.kotatsu.parsers.util.json.* import java.net.HttpURLConnection import java.text.SimpleDateFormat import java.util.* -import java.util.TimeZone @MangaSourceParser("CUUTRUYEN", "Cứu Truyện", "vi") internal class CuuTruyenParser(context: MangaLoaderContext) : @@ -113,7 +112,7 @@ internal class CuuTruyenParser(context: MangaLoaderContext) : url = "/api/v2/mangas/${jo.getLong("id")}", publicUrl = "https://$domain/manga/${jo.getLong("id")}", title = jo.getString("name"), - altTitle = null, + altTitles = emptySet(), coverUrl = jo.getString("cover_mobile_url"), largeCoverUrl = jo.getString("cover_url"), authors = author?.let { setOf(it) } ?: emptySet(), 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 559e8693f..f5d1e9e47 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -72,7 +72,7 @@ internal class DuaLeoTruyen(context: MangaLoaderContext) : Manga( id = generateUid(href), title = li.selectFirst(".name")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -92,7 +92,7 @@ internal class DuaLeoTruyen(context: MangaLoaderContext) : val author = doc.selectFirst(".info-item:has(.fa-user)")?.textOrNull()?.removePrefix("Tác giả: ") return manga.copy( - altTitle = doc.selectFirst(".box_info_right h2")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst(".box_info_right h2")?.textOrNull()), tags = doc.select("ul.list-tag-story li a").mapToSet { MangaTag( key = it.attr("href").substringAfterLast('/').substringBefore('.'), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/GocTruyenTranh.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/GocTruyenTranh.kt index 5f47c1f5d..c5fead17e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/GocTruyenTranh.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/GocTruyenTranh.kt @@ -3,10 +3,10 @@ package org.koitharu.kotatsu.parsers.site.vi import androidx.collection.arraySetOf import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.network.UserAgents +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -150,7 +150,7 @@ internal class GocTruyenTranh(context: MangaLoaderContext) : url = "/$slug", publicUrl = mangaUrl, title = item.getString("name"), - altTitle = item.optString("origin_name")?.takeUnless { it == "null" || it.isEmpty() }, + altTitles = setOfNotNull(item.optString("origin_name")?.takeUnless { it == "null" || it.isEmpty() }), description = item.optString("content"), rating = RATING_UNKNOWN, contentRating = if (checkNsfw || isNsfwSource) ContentRating.ADULT else null, 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 792faad50..71bd55533 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 @@ -5,8 +5,8 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -100,7 +100,7 @@ internal class Hentai18VN(context: MangaLoaderContext) : url = href, publicUrl = href.toAbsoluteUrl(domain), title = mangaInfo.attr("alt"), - altTitle = null, + altTitles = emptySet(), authors = emptySet(), tags = emptySet(), rating = RATING_UNKNOWN, @@ -122,7 +122,7 @@ internal class Hentai18VN(context: MangaLoaderContext) : publicUrl = mangaUrl, url = mangaUrl.removePrefix("https://$domain"), title = a.text(), - altTitle = null, + altTitles = emptySet(), authors = emptySet(), description = null, tags = emptySet(), @@ -161,8 +161,8 @@ internal class Hentai18VN(context: MangaLoaderContext) : ) } - val altTitle = doc.selectFirst("h2.alternative")?.text() - val author = doc.selectFirst("div.hentai-info .line:contains(Tác giả) .line-content")?.text() + val altTitle = doc.selectFirst("h2.alternative")?.textOrNull() + val author = doc.selectFirst("div.hentai-info .line:contains(Tác giả) .line-content")?.textOrNull() val state = when (doc.selectFirst("div.hentai-info .line:contains(Tình trạng) .line-content")?.text()) { "Đang cập nhật" -> MangaState.ONGOING "Hoàn thành" -> MangaState.FINISHED @@ -171,8 +171,8 @@ internal class Hentai18VN(context: MangaLoaderContext) : return manga.copy( tags = tags, - authors = author?.let { setOf(it) } ?: emptySet(), - altTitle = altTitle, + authors = setOfNotNull(author), + altTitles = setOfNotNull(altTitle), state = state, chapters = chapters, description = doc.select("div.about").text(), 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 8471d4994..6a8b41b18 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 @@ -8,9 +8,9 @@ import kotlinx.coroutines.sync.withLock import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -112,9 +112,9 @@ internal class HentaiVNParser(context: MangaLoaderContext) : LegacyMangaParser(c val stateDoc = stateDocDeferred.await() val author = infoEl.select("p:contains(Tác giả:) a").textOrNull() manga.copy( - altTitle = infoEl.selectFirst("span.info:contains(Tên Khác:)")?.parent()?.select("span:not(.info) > a") - ?.joinToString { it.text() } - ?.nullIfEmpty(), + altTitles = infoEl.selectFirst("span.info:contains(Tên Khác:)")?.parent()?.select("span:not(.info) > a") + ?.mapNotNullToSet { it.textOrNull() } + .orEmpty(), authors = author?.let { setOf(it) } ?: emptySet(), description = infoEl.select("p:contains(Nội dung:) + p").html(), tags = tags, @@ -195,7 +195,7 @@ internal class HentaiVNParser(context: MangaLoaderContext) : LegacyMangaParser(c Manga( id = generateUid(relativeUrl), title = descriptionsEl.selectFirst("a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), url = relativeUrl, publicUrl = relativeUrl.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -222,7 +222,7 @@ internal class HentaiVNParser(context: MangaLoaderContext) : LegacyMangaParser(c Manga( id = generateUid(relativeUrl), title = titleEl.text(), - altTitle = null, + altTitles = emptySet(), url = relativeUrl, publicUrl = relativeUrl.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVnBuzz.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVnBuzz.kt index a230a9bbd..a49094959 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVnBuzz.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVnBuzz.kt @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.vi import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* @@ -123,7 +123,7 @@ internal class HentaiVnBuzz(context: MangaLoaderContext) : Manga( id = generateUid(href), title = title, - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -145,7 +145,7 @@ internal class HentaiVnBuzz(context: MangaLoaderContext) : Manga( id = generateUid(href), title = title, - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -163,7 +163,6 @@ internal class HentaiVnBuzz(context: MangaLoaderContext) : val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() val author = doc.select("p:contains(Tác giả:) a").text().nullIfEmpty() return manga.copy( - altTitle = null, authors = author?.let { setOf(it) } ?: emptySet(), tags = doc.select("div.mb-1 span a").mapToSet { element -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/KuroNeko.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/KuroNeko.kt index ae66fc7d9..376f45f13 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/KuroNeko.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/KuroNeko.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -130,7 +130,7 @@ internal class KuroNeko(context: MangaLoaderContext) : LegacyPagedMangaParser(co Manga( id = generateUid(href), title = div.select("div.p-2 a.text-ellipsis").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -149,7 +149,7 @@ internal class KuroNeko(context: MangaLoaderContext) : LegacyPagedMangaParser(co val author = root.selectFirst("div.mt-2:contains(Tác giả) span a")?.textOrNull() return manga.copy( - altTitle = root.selectLast("div.grow div:contains(Tên khác) span")?.textOrNull(), + altTitles = setOfNotNull(root.selectLast("div.grow div:contains(Tên khác) span")?.textOrNull()), state = when (root.selectFirst("div.mt-2:contains(Tình trạng) span.text-blue-500")?.text()) { "Đang tiến hành" -> MangaState.ONGOING "Đã hoàn thành" -> MangaState.FINISHED 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 e8de25517..317079b4f 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -131,7 +131,7 @@ internal class LxManga(context: MangaLoaderContext) : LegacyPagedMangaParser(con Manga( id = generateUid(href), title = div.select("div.p-2 a.text-ellipsis").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -150,7 +150,7 @@ internal class LxManga(context: MangaLoaderContext) : LegacyPagedMangaParser(con val author = root.selectFirst("div.mt-2:contains(Tác giả) span a")?.textOrNull() return manga.copy( - altTitle = root.selectLast("div.grow div:contains(Tên khác) span")?.textOrNull(), + altTitles = setOfNotNull(root.selectLast("div.grow div:contains(Tên khác) span")?.textOrNull()), state = when (root.selectFirst("div.mt-2:contains(Tình trạng) span.text-blue-500")?.text()) { "Đang tiến hành" -> MangaState.ONGOING "Đã hoàn thành" -> MangaState.FINISHED diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt index 04d64d5c0..2dbbf09c0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -74,7 +74,7 @@ internal class SayHentai(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(domain), title = element.selectFirst(".item-summary a")?.text().orEmpty(), coverUrl = element.selectFirst(".item-thumb img")?.src().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), @@ -89,7 +89,7 @@ internal class SayHentai(context: MangaLoaderContext) : val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() val author = doc.selectFirst("div.summary-heading:contains(Tác giả) + div.summary-content")?.textOrNull() return manga.copy( - altTitle = doc.selectFirst("h2.other-name")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst("h2.other-name")?.textOrNull()), authors = author?.let { setOf(it) } ?: emptySet(), tags = doc.select("div.genres-content a[rel=tag]").mapToSet { a -> MangaTag( 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 08ae6705a..4b637f2bb 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -122,7 +122,7 @@ internal class TruyenGG(context: MangaLoaderContext) : LegacyPagedMangaParser(co Manga( id = generateUid(href), title = div.select("a.book_name").text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -142,7 +142,7 @@ internal class TruyenGG(context: MangaLoaderContext) : LegacyPagedMangaParser(co val author = doc.select("p:contains(Tác Giả) + p").joinToString { it.text() }.nullIfEmpty() return manga.copy( - altTitle = doc.selectFirst("h2.other-name")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst("h2.other-name")?.textOrNull()), authors = author?.let { setOf(it) } ?: emptySet(), tags = doc.select("a.clblue").mapToSet { MangaTag( 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 73c114f7b..b11fa12de 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 @@ -3,13 +3,13 @@ package org.koitharu.kotatsu.parsers.site.vi import androidx.collection.ArrayMap import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy -import java.util.* import java.text.SimpleDateFormat +import java.util.* @MangaSourceParser("TRUYENHENTAIVN", "TruyenHentaiVN", "vi", type = ContentType.HENTAI) internal class TruyenHentaiVN(context: MangaLoaderContext) : @@ -73,14 +73,14 @@ internal class TruyenHentaiVN(context: MangaLoaderContext) : val href = element.selectFirst("a")?.attrAsRelativeUrl("href") ?: "" val title = element.selectFirst("a.name")?.text() ?: "" val cover = element.selectFirst("img")?.src() - val dateText = element.selectFirst("span.date-time")?.text() + element.selectFirst("span.date-time")?.text() Manga( id = generateUid(href), url = href, publicUrl = href.toAbsoluteUrl(domain), title = title, - altTitle = null, + altTitles = emptySet(), authors = emptySet(), tags = emptySet(), rating = RATING_UNKNOWN, 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 081f82fd4..7acf2dc1f 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 @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -122,7 +122,7 @@ internal class TruyenQQ(context: MangaLoaderContext) : LegacyPagedMangaParser(co Manga( id = generateUid(href), title = li.selectFirst(".book_name")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = href.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -152,7 +152,7 @@ internal class TruyenQQ(context: MangaLoaderContext) : LegacyPagedMangaParser(co val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH) val author = doc.selectFirst("li.author a")?.text() return manga.copy( - altTitle = doc.selectFirst("h2.other-name")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst("h2.other-name")?.textOrNull()), tags = doc.select("ul.list01 li").mapToSet { val key = it.attr("href").substringAfterLast("-").substringBeforeLast(".") MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenTranh3Q.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenTranh3Q.kt index 238040163..3af443825 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenTranh3Q.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenTranh3Q.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.vi import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -120,7 +120,7 @@ internal class TruyenTranh3Q(context: MangaLoaderContext) : Manga( id = generateUid(href), title = aTag.text(), - altTitle = null, + altTitles = emptySet(), url = href, publicUrl = aTag.attrAsAbsoluteUrl("href"), rating = RATING_UNKNOWN, @@ -146,7 +146,7 @@ internal class TruyenTranh3Q(context: MangaLoaderContext) : val author = doc.selectFirst("li.author a")?.textOrNull() return manga.copy( - altTitle = doc.selectFirst("h2.other-name")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst("h2.other-name")?.textOrNull()), authors = author?.let { setOf(it) } ?: emptySet(), tags = tags, description = doc.selectFirst("div.story-detail-info")?.html(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/VcomycsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/VcomycsParser.kt index 828d5beb0..9547e3553 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/VcomycsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/VcomycsParser.kt @@ -6,39 +6,12 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.model.ContentRating -import org.koitharu.kotatsu.parsers.model.ContentType -import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.parsers.model.MangaChapter -import org.koitharu.kotatsu.parsers.model.MangaListFilter -import org.koitharu.kotatsu.parsers.model.MangaListFilterCapabilities -import org.koitharu.kotatsu.parsers.model.MangaListFilterOptions -import org.koitharu.kotatsu.parsers.model.MangaPage -import org.koitharu.kotatsu.parsers.model.MangaParserSource -import org.koitharu.kotatsu.parsers.model.MangaState -import org.koitharu.kotatsu.parsers.model.MangaTag -import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN -import org.koitharu.kotatsu.parsers.model.SortOrder -import org.koitharu.kotatsu.parsers.util.attrAsRelativeUrl -import org.koitharu.kotatsu.parsers.util.attrOrNull -import org.koitharu.kotatsu.parsers.util.attrOrThrow -import org.koitharu.kotatsu.parsers.util.generateUid +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser +import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.mapJSONNotNull -import org.koitharu.kotatsu.parsers.util.mapChapters -import org.koitharu.kotatsu.parsers.util.mapToSet -import org.koitharu.kotatsu.parsers.util.oneOrThrowIfMany -import org.koitharu.kotatsu.parsers.util.parseHtml -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.textOrNull -import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl -import org.koitharu.kotatsu.parsers.util.toRelativeUrl -import org.koitharu.kotatsu.parsers.util.toTitleCase -import org.koitharu.kotatsu.parsers.util.urlEncoded -import java.util.EnumSet +import java.util.* import javax.crypto.Cipher import javax.crypto.SecretKeyFactory import javax.crypto.spec.IvParameterSpec @@ -94,7 +67,7 @@ internal class VcomycsParser(context: MangaLoaderContext) : Manga( id = generateUid(relativeUrl), title = jo.getString("title"), - altTitle = null, + altTitles = emptySet(), url = relativeUrl, publicUrl = relativeUrl.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -128,7 +101,7 @@ internal class VcomycsParser(context: MangaLoaderContext) : Manga( id = generateUid(relativeUrl), title = linkEl.attrOrThrow("title"), - altTitle = null, + altTitles = emptySet(), url = relativeUrl, publicUrl = relativeUrl.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, @@ -148,7 +121,8 @@ internal class VcomycsParser(context: MangaLoaderContext) : override suspend fun getDetails(manga: Manga): Manga { val content = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() val info = content.selectFirstOrThrow(".comic-info") - val author = info.selectFirst(".comic-intro-text > strong:contains(Tác giả:)")?.nextElementSibling()?.textOrNull() + val author = + info.selectFirst(".comic-intro-text > strong:contains(Tác giả:)")?.nextElementSibling()?.textOrNull() return manga.copy( rating = info.getElementById("cate-rating")?.let { val score = it.attrOrNull("data-score")?.toIntOrNull() @@ -156,8 +130,10 @@ internal class VcomycsParser(context: MangaLoaderContext) : if (score == null || vote == null || vote == 0) return@let null score / (vote * 10f) } ?: RATING_UNKNOWN, - altTitle = info.selectFirst(".comic-intro-text > strong:contains(Tên khác:)")?.nextElementSibling() - ?.textOrNull(), + altTitles = setOfNotNull( + info.selectFirst(".comic-intro-text > strong:contains(Tên khác:)")?.nextElementSibling() + ?.textOrNull(), + ), authors = author?.let { setOf(it) } ?: emptySet(), state = when (info.selectFirst(".comic-stt")?.text()) { "Đang tiến hành" -> MangaState.ONGOING 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 03cd9439a..cd6618a19 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 @@ -3,8 +3,8 @@ package org.koitharu.kotatsu.parsers.site.vi import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -70,7 +70,7 @@ internal class YurinekoParser(context: MangaLoaderContext) : Manga( id = generateUid(id), title = jo.getString("originalName"), - altTitle = jo.getStringOrNull("otherName"), + altTitles = setOfNotNull(jo.getStringOrNull("otherName")), url = relativeUrl, publicUrl = relativeUrl.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt index 9d2e45cf0..775daaa4a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.parsers.site.vmp import kotlinx.coroutines.coroutineScope import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* @@ -84,7 +84,7 @@ internal abstract class VmpParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src().orEmpty(), title = div.selectFirst("h2")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 c3f1f79ca..39305bd30 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 @@ -10,8 +10,8 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.NotFoundException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -159,7 +159,7 @@ internal abstract class WpComicsParser( Manga( id = generateUid(slug), title = item.selectFirst("div.box_tootip div.title, h3 a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), url = absUrl.toRelativeUrl(domain), publicUrl = absUrl, rating = RATING_UNKNOWN, @@ -219,7 +219,7 @@ internal abstract class WpComicsParser( val author = doc.body().select(selectAut).textOrNull() manga.copy( description = doc.selectFirst(selectDesc)?.html(), - altTitle = doc.selectFirst("h2.other-name")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst("h2.other-name")?.textOrNull()), authors = author?.let { setOf(it) } ?: emptySet(), state = doc.selectFirst(selectState)?.let { when (it.text()) { 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 7ee808876..fe5aa6271 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 @@ -87,7 +87,7 @@ internal class XoxoComics(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src().orEmpty(), title = div.selectFirstOrThrow("h3").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 c8aaac78c..1db3e26df 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 @@ -101,7 +101,7 @@ internal class DocTruyen3Q(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("div.image-item img")?.findImageUrl().orEmpty(), title = div.selectFirst("h3 a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = mangaTags, authors = emptySet(), @@ -152,7 +152,7 @@ internal class DocTruyen3Q(context: MangaLoaderContext) : state = state, tags = tags, chapters = getChapters(doc), - altTitle = altTitle, + altTitles = setOfNotNull(altTitle), ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/HamTruyen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/HamTruyen.kt index 94da740f7..f011f4248 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/HamTruyen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/HamTruyen.kt @@ -4,17 +4,19 @@ 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.Manga import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaState import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser -import org.koitharu.kotatsu.parsers.util.* +import org.koitharu.kotatsu.parsers.util.mapNotNullToSet +import org.koitharu.kotatsu.parsers.util.parseHtml +import org.koitharu.kotatsu.parsers.util.textOrNull +import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl @MangaSourceParser("HAMTRUYEN", "Ham Truyện", "vi") internal class HamTruyen(context: MangaLoaderContext) : - WpComicsParser(context, MangaParserSource.HAMTRUYEN, "hamtruyen.vn", 44) { + WpComicsParser(context, MangaParserSource.HAMTRUYEN, "hamtruyen.vn", 44) { override suspend fun getDetails(manga: Manga): Manga = coroutineScope { val fullUrl = manga.url.toAbsoluteUrl(domain) @@ -26,7 +28,7 @@ internal class HamTruyen(context: MangaLoaderContext) : val author = doc.body().select(selectAut).textOrNull() manga.copy( description = doc.selectFirst(selectDesc)?.html(), - altTitle = doc.selectFirst("h2.other-name")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst("h2.other-name")?.textOrNull()), authors = author?.let { setOf(it) } ?: emptySet(), state = doc.selectFirst(selectState)?.let { when (it.text()) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/MeHentaiVN.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/MeHentaiVN.kt index eb41ab10a..0d15fc8c5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/MeHentaiVN.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/MeHentaiVN.kt @@ -41,7 +41,7 @@ internal class MeHentaiVN(context: MangaLoaderContext) : manga.copy( description = doc.selectFirst(selectDesc)?.html(), - altTitle = doc.selectFirst("h2.other-name")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst("h2.other-name")?.textOrNull()), authors = author?.let { setOf(it) } ?: emptySet(), state = doc.selectFirst(selectState)?.let { when (it.text()) { 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 82a375034..5e5215d0c 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 @@ -5,11 +5,7 @@ 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.Manga -import org.koitharu.kotatsu.parsers.model.MangaChapter -import org.koitharu.kotatsu.parsers.model.MangaParserSource -import org.koitharu.kotatsu.parsers.model.MangaState -import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN +import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -20,7 +16,7 @@ internal class NetTruyen(context: MangaLoaderContext) : override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain( "nettruyenrr.com", - "nettruyenx.com" + "nettruyenx.com", ) override suspend fun getDetails(manga: Manga): Manga = coroutineScope { @@ -34,7 +30,7 @@ internal class NetTruyen(context: MangaLoaderContext) : val author = doc.body().select(selectAut).textOrNull() manga.copy( description = doc.selectFirst(selectDesc)?.html(), - altTitle = doc.selectFirst("h2.other-name")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst("h2.other-name")?.textOrNull()), authors = author?.let { setOf(it) } ?: emptySet(), state = doc.selectFirst(selectState)?.let { when (it.text()) { 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 1afb055bc..0c8a9e087 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 @@ -4,11 +4,7 @@ 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.model.Manga -import org.koitharu.kotatsu.parsers.model.MangaChapter -import org.koitharu.kotatsu.parsers.model.MangaParserSource -import org.koitharu.kotatsu.parsers.model.MangaState -import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN +import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat @@ -28,7 +24,7 @@ internal class NetTruyenVie(context: MangaLoaderContext) : val author = doc.body().select(selectAut).textOrNull() manga.copy( description = doc.selectFirst("div.detail-content > div")?.html(), - altTitle = doc.selectFirst("h2.other-name")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst("h2.other-name")?.textOrNull()), authors = author?.let { setOf(it) } ?: emptySet(), state = doc.selectFirst(selectState)?.let { when (it.text()) { 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 62ab029bd..f500811d3 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 @@ -1,14 +1,14 @@ package org.koitharu.kotatsu.parsers.site.wpcomics.vi -import org.jsoup.nodes.Document import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope -import org.koitharu.kotatsu.parsers.model.* -import org.koitharu.kotatsu.parsers.util.* +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.* import java.text.SimpleDateFormat import java.util.* @@ -50,7 +50,7 @@ internal class NhatTruyenVN(context: MangaLoaderContext) : val author = doc.body().selectFirst(selectAut)?.textOrNull() manga.copy( description = doc.selectFirst(selectDesc)?.html(), - altTitle = doc.selectFirst("h2.other-name")?.textOrNull(), + altTitles = setOfNotNull(doc.selectFirst("h2.other-name")?.textOrNull()), authors = author?.let { setOf(it) } ?: emptySet(), state = doc.selectFirst(selectState)?.let { when (it.text()) { 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 b14cd0f6d..045d43187 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 @@ -103,7 +103,7 @@ internal class TopTruyen(context: MangaLoaderContext) : publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("div.image-item img")?.findImageUrl().orEmpty(), title = div.selectFirst("h3 a")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = mangaTags, authors = emptySet(), @@ -154,7 +154,7 @@ internal class TopTruyen(context: MangaLoaderContext) : state = state, tags = tags, chapters = getChapters(doc), - altTitle = altTitle, + altTitles = setOfNotNull(altTitle), ) } 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 786ae437b..9905f12ce 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 @@ -8,8 +8,8 @@ import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.ErrorMessages import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList @@ -172,7 +172,7 @@ internal abstract class ZeistMangaParser( publicUrl = href, coverUrl = urlImg.orEmpty(), title = name, - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt index 35a408f71..fa9b2fa39 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zh/Baozimh.kt @@ -5,8 +5,8 @@ import org.json.JSONArray import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* @@ -118,7 +118,7 @@ internal class Baozimh(context: MangaLoaderContext) : publicUrl = href, coverUrl = "https://static-tw${domain.removePrefix("www")}/cover/" + j.getString("topic_img"), title = j.getString("name"), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = author?.let { setOf(it) } ?: emptySet(), @@ -138,7 +138,7 @@ internal class Baozimh(context: MangaLoaderContext) : publicUrl = href, coverUrl = div.selectFirst("amp-img")?.src().orEmpty(), title = div.selectFirst(".comics-card__title h3")?.text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = RATING_UNKNOWN, tags = emptySet(), authors = emptySet(), 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 364959bf9..62ad9f81d 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 @@ -4,8 +4,8 @@ import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import org.jsoup.nodes.Document import org.koitharu.kotatsu.parsers.MangaLoaderContext -import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.DateFormat @@ -165,7 +165,7 @@ internal abstract class ZMangaParser( publicUrl = href.toAbsoluteUrl(div.host ?: domain), coverUrl = div.selectFirst("img")?.src().orEmpty(), title = div.selectFirstOrThrow("div.flexbox2-title span:not(.studio)").text().orEmpty(), - altTitle = null, + altTitles = emptySet(), rating = div.selectFirstOrThrow("div.info div.score").ownText().toFloatOrNull()?.div(10f) ?: RATING_UNKNOWN, tags = doc.body().select("div.genres a").mapToSet { span -> @@ -233,7 +233,7 @@ internal abstract class ZMangaParser( ) }, description = desc, - altTitle = alt, + altTitles = setOfNotNull(alt), authors = author?.let { setOf(it) } ?: emptySet(), state = state, chapters = chaptersDeferred.await(), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt index bd90acd02..2a3fbcdea 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt @@ -47,7 +47,7 @@ public class LinkResolver internal constructor( Manga( id = id, title = title, - altTitle = null, + altTitles = emptySet(), url = url, publicUrl = link.toString(), rating = RATING_UNKNOWN, @@ -70,7 +70,7 @@ public class LinkResolver internal constructor( } val query = when { seed.title != STUB_TITLE && seed.title.isNotEmpty() -> seed.title - !seed.altTitle.isNullOrEmpty() -> seed.altTitle + seed.altTitles.isNotEmpty() -> seed.altTitles.first() seed.authors.isNotEmpty() -> seed.authors.first() else -> return seed // unfortunately we do not know a real manga title so unable to find it } @@ -97,7 +97,7 @@ public class LinkResolver internal constructor( state = seed.state ?: resolved.state, coverUrl = seed.coverUrl ?: resolved.coverUrl, largeCoverUrl = seed.largeCoverUrl ?: resolved.largeCoverUrl, - altTitle = seed.altTitle ?: resolved.altTitle, + altTitles = seed.altTitles + resolved.altTitles, ) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt index ba416fea1..690925b5a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt @@ -150,3 +150,14 @@ public fun JSONObject.entries(typeClass: Class): Iterable JSONObject.entries(): Iterable> = entries(T::class.java) + +public fun JSONArray.toStringSet(): Set { + val set = ArraySet(length()) + repeat(length()) { i -> + val str = optString(i) + if (!str.isNullOrEmpty()) { + set.add(str) + } + } + return set +} diff --git a/src/test/kotlin/org/koitharu/kotatsu/test_util/Util.kt b/src/test/kotlin/org/koitharu/kotatsu/test_util/Util.kt index f7bf470cc..5a631d8a0 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/test_util/Util.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/test_util/Util.kt @@ -62,7 +62,7 @@ fun mangaOf(source: MangaParserSource, url: String): Manga { return Manga( id = id, title = httpUrl?.pathSegments?.last() ?: url, - altTitle = null, + altTitles = emptySet(), url = httpUrl?.let { url.toRelativeUrl(it.host) } ?: url, publicUrl = url, rating = RATING_UNKNOWN,