From ddb9b13df7a4c495678b60c43a11a769ca5c34ae Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 28 Feb 2025 14:50:36 +0200 Subject: [PATCH] Some refactor and fix warnings --- docs/parser_classes.gaphor | 1111 +++++++++++++++++ docs/parser_classes.png | Bin 0 -> 54117 bytes .../koitharu/kotatsu/parsers/MangaParser.kt | 7 + .../parsers/core/AbstractMangaParser.kt | 23 +- .../kotatsu/parsers/core/LegacyMangaParser.kt | 12 +- .../parsers/core/MangaParserWrapper.kt | 8 +- .../parsers/site/mangabox/MangaboxParser.kt | 2 +- .../site/mangareader/id/ManhwaIndoParser.kt | 2 +- .../kotatsu/parsers/site/vi/Hentai18VN.kt | 2 +- .../kotatsu/parsers/site/vi/HentaiVnBuzz.kt | 4 +- .../kotatsu/parsers/site/vi/TruyenHentaiVN.kt | 2 +- .../parsers/site/wpcomics/vi/DocTruyen3Q.kt | 2 +- .../parsers/site/wpcomics/vi/NewTruyen.kt | 15 +- .../kotatsu/parsers/util/Collection.kt | 12 + 14 files changed, 1161 insertions(+), 41 deletions(-) create mode 100644 docs/parser_classes.gaphor create mode 100644 docs/parser_classes.png diff --git a/docs/parser_classes.gaphor b/docs/parser_classes.gaphor new file mode 100644 index 000000000..9762866bf --- /dev/null +++ b/docs/parser_classes.gaphor @@ -0,0 +1,1111 @@ + + + + + +Новая модель + + + + + + + + + + + + + + + + + + + + + + + + +Новая диаграмма + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + +LegacyMangaParser + + + + + + + + + + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 107.50391387939453, 388.8671875) + + +(0.0, 0.0) + + +147.0 + + +60.0 + + + + + +0 + + +0 + + + + + + + + + + + + + + + + + +1 + + +AbstractMangaParser + + + + + + + + + + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 405.16796875, 388.8671875) + + +(0.0, 0.0) + + +158.0 + + +60.0 + + + + + +0 + + +0 + + + + + + + + + + + + + + + + + +1 + + +PagedMangaParser + + + + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 476.3368367667698, 525.76953125) + + +(0.0, 0.0) + + +142.0 + + +60.0 + + + + + +0 + + +0 + + + + + + + + + + + + + + + + + +1 + + +SinglePageMangaParser + + + + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 405.16796875, 627.46875) + + +(0.0, 0.0) + + +175.0 + + +60.0 + + + + + +0 + + +0 + + + + + + + + + + +0 + + +0 + + + + + +(1.0, 0.0, 0.0, 1.0, 499.2109069824219, 463.45703125) + + +[(28.486861756586336, 62.3125), (25.111328125, -14.58984375)] + + + + + + + + + + + + + + + + + + + + + + + +MangaParser + + + + + + + + + + + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 278.00391387939453, 232.92578125) + + +(0.0, 0.0) + + +105.0 + + +80.0 + + + + + +0 + + +0 + + + + + +0 + + + + + + + +0 + + +0 + + + + + +(1.0, 0.0, 0.0, 1.0, 306.1445007324219, 270.0625) + + +[(55.866059373910275, 42.86328125), (164.5765002560883, 118.8046875)] + + + + + + + + + + + + + + + + + + + + + + + + + + +0 + + +0 + + + + + +(1.0, 0.0, 0.0, 1.0, 289.0820617675781, 276.40625) + + +[(-0.2702028783513697, 36.51953125), (-89.14763215970096, 112.4609375)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + +LegacyPagedMangaParser + + + + + + + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 159.50391387939453, 521.75390625) + + +(0.0, 0.0) + + +190.0 + + +60.0 + + + + + +0 + + +0 + + + + + + + + + + + + +LegacySinglePageMangaParser + + + + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 107.50391387939453, 627.46875) + + +(0.0, 0.0) + + +223.0 + + +60.0 + + + + + +0 + + +0 + + + + + + + + + + +0 + + +0 + + + + + +(1.0, 0.0, 0.0, 1.0, 175.87969633151002, 433.1640319824219) + + +[(20.67503694485717, 88.58987426757812), (20.67503694485717, 15.703155517578125)] + + + + + + + + + + + + + + + + + + + + + + + + + + +0 + + +0 + + + + + +(1.0, 0.0, 0.0, 1.0, 148.88671875, 427.8085632324219) + + +[(0.5527361628988388, 199.66018676757812), (0.5527361628988459, 21.058624267578125)] + + + + + + + + + + + + + + + + + + + + + + + + + + +0 + + +0 + + + + + +(1.0, 0.0, 0.0, 1.0, 436.2929382324219, 439.1913757324219) + + +[(20.37646032737257, 188.27737426757812), (18.488327026367188, 9.675811767578125)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +MangaParserWrapper + + + + + + + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 452.6727742667698, 236.1809574894652) + + +(0.0, 0.0) + + +158.0 + + +60.0 + + + + + +0 + + +0 + + + + + + + + + + +0 + + +0 + + + + + +(1.0, 0.0, 0.0, 1.0, 306.0585632324219, 249.69920349121094) + + +[(76.94535064697266, 12.615185431614634), (146.61421103434793, 16.200927328075977)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Used for providing external api. Do not use this class directly + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 445.4868312390082, 128.1331358519086) + + +(0.0, 0.0) + + +183.21868896484375 + + +91.23829650878906 + + + + + + + + + + + + + +0 + + +0 + + +(1.0, 0.0, 0.0, 1.0, 550.2876124890082, 278.05499559311954) + + +[(0.8567782509883415, -41.87403810365436), (0.5, -58.683563232421875)] + + + + + + + + + + + + + + + +Extend this class if your manga source provides standard limit-offset based lists (get manga list by offset) + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 673.0610499890082, 367.0515553989646) + + +(0.0, 0.0) + + +228.8028016098773 + + +88.0 + + + + + + + + + + + + + + + +Extend this class if your manga source provides paged-based lists (get manga list by page number) + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 666.7924311664914, 507.7539062499999) + + +(0.0, 0.0) + + +214.34368896484375 + + +88.0 + + + + + + + + + + + + + + + +Extend this class if your manga source does not provide pagination (all manga provided in one list) + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 666.7924311664914, 560.9671898788581) + + +(0.0, 58.00435704705592) + + +263.9307954323941 + + +78.01706672440287 + + + + + + + + + + + + + +0 + + +0 + + +(1.0, 0.0, 0.0, 1.0, 561.8951626340418, 549.6101338901756) + + +[(56.44167413272805, 7.038279316310902), (104.89726853244963, 8.304008355003589)] + + + + + + + + + + + + + +0 + + +0 + + +(1.0, 0.0, 0.0, 1.0, 559.3873501340418, 413.0007588901755) + + +[(3.7806186159582467, 0.0), (113.67369985496646, 1.6012844908540842)] + + + + + + + + + + + + + +0 + + +0 + + +(1.0, 0.0, 0.0, 1.0, 522.3600063840418, 652.6882588901756) + + +[(57.80796236595825, 5.29182139794003), (144.43242478244963, 5.657840086725969)] + + + + + + + + + + + + + + + +Do not use these classes for new parsers + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 59.50391387939453, 301.16000020170736) + + +(-58.93360137939453, 0.0) + + +144.78774075904175 + + +68.0 + + + + + + + + + + + + + +0 + + +0 + + +(1.0, 0.0, 0.0, 1.0, 65.93617825904175, 335.96078145170736) + + +[(40.6686968734994, 33.19921875), (64.01299389673568, 52.90640604829264)] + + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 375.05802564891326, 349.05453145170736) + + +(0.0, 3.15625) + + +590.6594026101285 + + +368.44140625 + + + + + + + +To create your own parser you have to extends one of these classes + + + + + + + + + +(1.0, 0.0, 0.0, 1.0, 756.725301794198, 225.57697659840966) + + +(0.0, 0.0) + + +208.99212646484375 + + +73.47482464883183 + + + + + + + + + + + + + +0 + + +0 + + +(1.0, 0.0, 0.0, 1.0, 943.6141683885666, 419.2772168262177) + + +[(-27.404961772030788, -67.06643537451032), (-27.404961772030788, -120.2254155789762)] + + + + + + + + + \ No newline at end of file diff --git a/docs/parser_classes.png b/docs/parser_classes.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7251c56f6ef0e6cab44011b088b36fa6656ce3 GIT binary patch literal 54117 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 z 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

c7@)XEttzz{0R_3m|bZXvmv-XF#x7j&Mf0c7c zUJG1ebK_%v9&f4%aPRAhNn3Nj?&7szun;W$-~aPAgLA)hz@q&^zy3sULuO|-mwgtQ zbwGQYfnBHCk|Wdyfdueq& zlNG#RIW6t&Gd`2aMRN*X^IW-Q!S4IQl+~iNC0R?U%@r6dXD?LTKYdZ>+Q}nZ=Y7?2 z=X^9X!{>8Z2HS^pqkG$VR2!LBSpU$Oa^UUMj!eS>$qlNz@+(!jog<9{HdPva;4ZnS z5Y-iRbiT9jZCj~rxksf=WdKLFC#YuM&f049A$W?9eT&|Xn$}CX`TcD7`t>|yCGKr@ zz0tO3?fbN8&g$n1a<1`Oecb#UIDeM)IC;CJ)>*xMY*PGtE_<+FVJZxJDapHU|D`v# z&8p_~r0xG!yQv$b5;%3WX7S#Rcab$3cPAT!7|G^728~x)-O@U6Jkb1mlzP|ZCRogr zFnw6};kxdzMTR$kE6IN8HoRY4xF2{@pT{MwxlJQ4~QR*4~#qT-PJ5x8?v+tI4B+lS^o$cABTlG zNU;CpJHOpQ|9jt`T~qcxx0FHl#p(ll!q^kTnoWU*&YW4wrhfBos^^dIdw(pszeaT0 zHme3cf&I(*GBZWezD7^l3p^6FH_dO;?$iE_PY-Yby_h2s#Wv^eD+Q|q>5X@zfrn1c zoyQ=T3t9wv?cSV}^69MyG=b|}&aCOOK0F^d8yFe>=}0=rQ9yv~F7P@cq6F`Q4`ezM zm7ATg0kl*|^dNK=K&zk0e>-rQS$4E{qja>a%Ua-KD3FP3jpQRhD{p3so`k3*+iKz+ zNiUTXHm>CZE~$&k%1x9@QF>u9( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/AbstractMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/AbstractMangaParser.kt index 28e58ba7a..4b09db57a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/AbstractMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/AbstractMangaParser.kt @@ -22,7 +22,7 @@ import java.util.* @InternalParsersApi public abstract class AbstractMangaParser @InternalParsersApi constructor( @property:InternalParsersApi public val context: MangaLoaderContext, - public override val source: MangaParserSource, + public final override val source: MangaParserSource, ) : MangaParser { public override val config: MangaSourceConfig by lazy { context.getConfig(source) } @@ -30,16 +30,18 @@ public abstract class AbstractMangaParser @InternalParsersApi constructor( public open val sourceLocale: Locale get() = if (source.locale.isEmpty()) Locale.ROOT else Locale(source.locale) - /** - * Provide default domain and available alternatives, if any. - * - * Never hardcode domain in requests, use [domain] instead. - */ - @InternalParsersApi - public abstract val configKeyDomain: ConfigKey.Domain - protected open val userAgentKey: ConfigKey.UserAgent = ConfigKey.UserAgent(context.getDefaultUserAgent()) + protected val sourceContentRating: ContentRating? + get() = if (source.contentType == ContentType.HENTAI) { + ContentRating.ADULT + } else { + null + } + + final override val domain: String + get() = config[configKeyDomain] + @Deprecated("Override intercept() instead") override fun getRequestHeaders(): Headers = Headers.Builder() .add("User-Agent", config[userAgentKey]) @@ -54,9 +56,6 @@ public abstract class AbstractMangaParser @InternalParsersApi constructor( return SortOrder.entries.first { it in supported } } - override val domain: String - get() = config[configKeyDomain] - @JvmField protected val webClient: WebClient = OkHttpWebClient(context.httpClient, source) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacyMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacyMangaParser.kt index 18895d2f7..440a27fba 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacyMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/LegacyMangaParser.kt @@ -22,7 +22,7 @@ import java.util.* @InternalParsersApi public abstract class LegacyMangaParser @InternalParsersApi constructor( @property:InternalParsersApi public val context: MangaLoaderContext, - public override val source: MangaParserSource, + public final override val source: MangaParserSource, ) : MangaParser { public final override val searchQueryCapabilities: MangaSearchQueryCapabilities @@ -37,14 +37,6 @@ public abstract class LegacyMangaParser @InternalParsersApi constructor( protected val isNsfwSource: Boolean = source.contentType == ContentType.HENTAI - /** - * Provide default domain and available alternatives, if any. - * - * Never hardcode domain in requests, use [domain] instead. - */ - @InternalParsersApi - public abstract val configKeyDomain: ConfigKey.Domain - protected open val userAgentKey: ConfigKey.UserAgent = ConfigKey.UserAgent(context.getDefaultUserAgent()) override fun getRequestHeaders(): Headers = Headers.Builder() @@ -60,7 +52,7 @@ public abstract class LegacyMangaParser @InternalParsersApi constructor( return SortOrder.entries.first { it in supported } } - override val domain: String + final override val domain: String get() = config[configKeyDomain] @JvmField diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/MangaParserWrapper.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/MangaParserWrapper.kt index 4c13da50d..54eb442b8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/core/MangaParserWrapper.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/core/MangaParserWrapper.kt @@ -14,11 +14,11 @@ internal class MangaParserWrapper( private val delegate: MangaParser, ) : MangaParser by delegate { - override suspend fun getList(searchQuery: MangaSearchQuery): List = withContext(Dispatchers.Default) { - if (!searchQuery.skipValidation) { - searchQueryCapabilities.validate(searchQuery) + override suspend fun getList(query: MangaSearchQuery): List = withContext(Dispatchers.Default) { + if (!query.skipValidation) { + searchQueryCapabilities.validate(query) } - delegate.getList(searchQuery) + delegate.getList(query) } override suspend fun getDetails(manga: Manga): Manga = withContext(Dispatchers.Default) { 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 ca6b0bd14..ac8dc3d2f 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 @@ -180,7 +180,7 @@ internal abstract class MangaboxParser( authors = emptySet(), state = null, source = source, - contentRating = if (source.contentType == ContentType.HENTAI) ContentRating.ADULT else ContentRating.SAFE, + contentRating = sourceContentRating, ) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/ManhwaIndoParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/ManhwaIndoParser.kt index fb9e350a5..f204d7275 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/ManhwaIndoParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/ManhwaIndoParser.kt @@ -29,7 +29,7 @@ internal class ManhwaIndoParser(context: MangaLoaderContext) : } private suspend fun fetchPage(img: Element): MangaPage? = runCatchingCancellable { - val url = img.requireSrc().toAbsoluteUrl(domain) ?: return@runCatchingCancellable null + val url = img.requireSrc().toAbsoluteUrl(domain) webClient.httpHead(url).use { response -> if (response.mimeType?.startsWith("image/") == true) { MangaPage( 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 71bd55533..a2f0d022a 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 @@ -50,7 +50,7 @@ internal class Hentai18VN(context: MangaLoaderContext) : parseMangaSearch(response) } - !filter.tags.isNullOrEmpty() -> { + filter.tags.isNotEmpty() -> { val tag = filter.tags.first() val url = buildString { append("https://") 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 a49094959..f1a3f2535 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 @@ -52,7 +52,7 @@ internal class HentaiVnBuzz(context: MangaLoaderContext) : } } - !filter.tags.isNullOrEmpty() -> { + filter.tags.isNotEmpty() -> { val tag = filter.tags.first() buildString { append("/the-loai/") @@ -110,7 +110,7 @@ internal class HentaiVnBuzz(context: MangaLoaderContext) : val doc = webClient.httpGet(fullUrl).parseHtml() return when { !filter.query.isNullOrEmpty() -> parseSearchManga(doc) - !filter.tags.isNullOrEmpty() -> parseSearchManga(doc) + filter.tags.isNotEmpty() -> parseSearchManga(doc) else -> parseListManga(doc) } } 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 b11fa12de..e611f350b 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 @@ -39,7 +39,7 @@ internal class TruyenHentaiVN(context: MangaLoaderContext) : append(domain) when { - !filter.tags.isNullOrEmpty() -> { + filter.tags.isNotEmpty() -> { val tag = filter.tags.first() append(tag.key) if (page > 1) { 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 1db3e26df..ac9f3fc79 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 @@ -222,7 +222,7 @@ internal class DocTruyen3Q(context: MangaLoaderContext) : val fullUrl = chapter.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() return doc.select("div.page-chapter img").mapNotNull { img -> - val url = img.attr("src")?.toAbsoluteUrl(domain) ?: return@mapNotNull null + val url = img.attrAsAbsoluteUrlOrNull("src") ?: return@mapNotNull null MangaPage( id = generateUid(url), url = url, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NewTruyen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NewTruyen.kt index ac5338452..e1b2a6516 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NewTruyen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NewTruyen.kt @@ -3,19 +3,18 @@ package org.koitharu.kotatsu.parsers.site.wpcomics.vi import androidx.collection.ArraySet import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope -import org.jsoup.nodes.Document -import org.koitharu.kotatsu.parsers.model.* -import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser -import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.exception.ParseException +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.* @MangaSourceParser("NEWTRUYEN", "NewTruyen", "vi") internal class NewTruyen(context: MangaLoaderContext) : - WpComicsParser(context, MangaParserSource.NEWTRUYEN, "newtruyen2.com", 36) { + WpComicsParser(context, MangaParserSource.NEWTRUYEN, "newtruyen2.com", 36) { override suspend fun getFilterOptions() = MangaListFilterOptions( availableTags = getAvailableTags(), @@ -26,14 +25,14 @@ internal class NewTruyen(context: MangaLoaderContext) : val fullUrl = manga.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() val storyID = doc.selectFirst("input#storyID")?.attr("value") - ?: throw ParseException("Story ID not found", fullUrl) + ?: throw ParseException("Story ID not found", fullUrl) val chaptersDeferred = async { getChapterList(storyID) } val tagsElement = doc.select("p.col-xs-12 a.tr-theloai") val mangaTags = tagsElement.map { MangaTag( title = it.text(), key = it.attr("href").substringAfterLast('/'), - source = source + source = source, ) }.toSet() val author = doc.body().select(selectAut).textOrNull() @@ -54,7 +53,7 @@ internal class NewTruyen(context: MangaLoaderContext) : } private suspend fun getChapterList(storyID: String): List { - val url = "/Story/ListChapterByStoryID?storyID=" + storyID + val url = "/Story/ListChapterByStoryID?storyID=$storyID" val fullUrl = url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() return doc.select("div.col-xs-5.chapter").mapChapters(reversed = true) { i, li -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Collection.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Collection.kt index 68bd660e7..38d0dfa7b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Collection.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Collection.kt @@ -87,3 +87,15 @@ public inline fun Collection.mapToArray(transform: (T) -> R): forEachIndexed { index, t -> result[index] = transform(t) } return result as Array } + +public fun Array.toArraySet(): Set = when (size) { + 0 -> emptySet() + 1 -> setOf(first()) + else -> ArraySet(this) +} + +public fun Collection.toArraySet(): Set = when (size) { + 0 -> emptySet() + 1 -> setOf(first()) + else -> ArraySet(this) +}