From 562e7fa256d8ec509f883effa693dfeb477567f9 Mon Sep 17 00:00:00 2001 From: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> Date: Wed, 9 Aug 2023 22:55:27 +0500 Subject: [PATCH] Novelcool (#17430) * Novelcool very shit source * use better selector to filter novels * fix genre fetching in search * add parsing logic for popular/latest as well in case they break the app api --- src/all/novelcool/AndroidManifest.xml | 3 + src/all/novelcool/build.gradle | 13 + .../novelcool/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2721 bytes .../novelcool/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1521 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3317 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5881 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 8074 bytes src/all/novelcool/res/web_hi_res_512.png | Bin 0 -> 26179 bytes .../extension/all/novelcool/NovelCool.kt | 455 ++++++++++++++++++ .../extension/all/novelcool/NovelCoolDto.kt | 27 ++ .../all/novelcool/NovelCoolFactory.kt | 16 + 11 files changed, 514 insertions(+) create mode 100644 src/all/novelcool/AndroidManifest.xml create mode 100644 src/all/novelcool/build.gradle create mode 100644 src/all/novelcool/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/all/novelcool/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/all/novelcool/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/all/novelcool/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/all/novelcool/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/all/novelcool/res/web_hi_res_512.png create mode 100644 src/all/novelcool/src/eu/kanade/tachiyomi/extension/all/novelcool/NovelCool.kt create mode 100644 src/all/novelcool/src/eu/kanade/tachiyomi/extension/all/novelcool/NovelCoolDto.kt create mode 100644 src/all/novelcool/src/eu/kanade/tachiyomi/extension/all/novelcool/NovelCoolFactory.kt diff --git a/src/all/novelcool/AndroidManifest.xml b/src/all/novelcool/AndroidManifest.xml new file mode 100644 index 000000000..a7a6beb78 --- /dev/null +++ b/src/all/novelcool/AndroidManifest.xml @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/src/all/novelcool/build.gradle b/src/all/novelcool/build.gradle new file mode 100644 index 000000000..f1afc77b4 --- /dev/null +++ b/src/all/novelcool/build.gradle @@ -0,0 +1,13 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' + +ext { + extName = 'NovelCool' + pkgNameSuffix = 'all.novelcool' + extClass = '.NovelCoolFactory' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" \ No newline at end of file diff --git a/src/all/novelcool/res/mipmap-hdpi/ic_launcher.png b/src/all/novelcool/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1630e02484532999a4cfb887a604ed99db26ee72 GIT binary patch literal 2721 zcmV;S3SRYzP)|}L}VVzhM=+TlC zl}T!(9jC*?d~b?$B6aNeg1HFV+N)BEz!b(t-{1d#|LnQ{_sj16-@DFz&be&6_x_)k z&+~hGe$Vref@EqD71DOixd*Ae>xQmJ#&8qS+n+^|QVM0|NsuH#9UXuCA``=HCNOZMXqSUAb~) zZf$Mt=FH5@OQPAyM5*h@kt5qzuU>uGnl)=2CCLp?`rf^J=N1(e{f?q}YN8A(n*E?O z9cpW9`*v}0@uRHws9oJofaLwG?(XgzCrp@dGgT`+njK4&x(H~Xx3~9}i4!OOntl4n z&K@}dO68Zw5Kv8CUf%Z;Wk9j$M^8`BIs#hFx(`PJD2-pv?&|7V#fNW*xMN5AI3EY- zNF5wR3i)Sb1DQDt9Aqw(BG2^EBpmzDf3s3YCjE!h7h$0gtk2KSzlDz-vNP6B5+s0f z20BVqpR)}C`Wc%z7%`xZj*e9Y1qIi;PKwO< z!5-kn^}uU{GhnuL>YyA33rax2Il$+?2b^&pFnTQTK^IW}T^-h-cxE5<2uuNARs~$R z3K%zuf6H7um(I@4TMG*dMS@}gNZ{<-0X)n4-`Q=NZ9`gA0q~Fp8C)S}|NQR&rL*W) zsH)HZ0%-XIB~ol?s5nZMQvb(`fs1N^DYJEG4kfmLK46UX#|1zy;m8a-bzEcRBt7B6 zq17{nQH4m;`AdNhX^*zv2)xx086c_W^fF+69o3gV0|z8F=c${4SMS%GJ{dTc)sV@? zeCdY-MKwEi1i0tR!2VVjo8&M7Q|AKn?x7UfM=G(Cpzha!IySC~{*VrM&$dMaZETEq zx{H4aOs@voXp0{HCOzDLRh@Nj$FND))&nJ9w3VUQ0eX(M;V-|jY1AYZe!Y;B5zd=V zHQB_V<22y$6~G%3^qS~;*`%`xc>a9>0vb35+(%E*^P2r^T2#&=E~aFIhldhld)~LG z&YOWJe**N=cpJqFj(jh-09f&|9($QeY$QkmIZ?0w?6J;f#Bh8_gBaVTO>FO8p_gTJoG8 z7X=H*kRU^l%x=kSkJR4zv{i;g&Z8YFy9jvb8^E4t^oqhJ!UcBDcwou%K?AxhBta(w z$FJll5a!+ilwS!vvIy86ii!N#ACYiTvA6nBy@@J99=7OARvUbd&;q zBzc_$v^hmggBYcOIlNcs)!d#_Kg*^UTl(h!z1Sg%gCtN?RLn+*`~i|&k5bH@NdrW$ zWdUSbI=Fc>El^BIKngWm3A!{SL58;2#8G|#d1Vsf257%(q{GC(Di!Hm2Tf!2eJL}K zEn9%6nJ4cH8CtI}Va(~_DO9mT{gOf!Eptl3DeuPxkhT^x1F|#L%6nxO16MMCw3GRn z#+!y9dI9p1kP|gIc(lX-XZ}S$!9D-8AmL z%ApEV@okVzlH&$0E`T->(20zq2N+|}>0^M)?*z_by0(eu1)7*j^->Q%DrbRXf+zW) zrA)X5YJ)6*975?ZiQvNXGYh%v$r$M1JHTeby?@JASK6QNManAxid0?T4sX@PKG!Eh;7&a%eJwBJF+ zoKD!Pot8zYY%R}NqOY@>85?aUumhdp3s}`%pRB=-3n1Azv{NxZaEyUw@W9jbD}b5Y zF_moNyKe)3-^POqeD%H&vQ1t~7%#PCV~GJs>8N(%i)Vb)(_^-#iEqmJo$*tF3MRoO ze@=J%;^AZ=+{FV~|KjnQo;UTQForaR)#V2evjGd4bQ?b2+KHj#p@Why%P-b-Piz<6BhR}bsy${!d%b$VhJ$H=y!ql#lQVQ|vuCf*$jCS)uwDn)5HI!~Zfa^;!Q0P|uvxiK zXSv+#b|rIkWo2dI#*G{A;+@V}0roqvrrO)vo0l(Ne)ZO^Tjk)jB*rb?z|FYGjkJ$d zRaKR&UAy-7$&)8fn1x z{5%(f@eR950VFR0V!Ryx*9B?K??4SGBN>iC*MMaFbfxYW(6Fa&q*jmw)PF600000NkvXXu0mjf6)7lE literal 0 HcmV?d00001 diff --git a/src/all/novelcool/res/mipmap-mdpi/ic_launcher.png b/src/all/novelcool/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..579024f45cba0264e87d68b9edc0df1c7dca7329 GIT binary patch literal 1521 zcmVd- zw3P-mMiRgT4So^DLamxutwj_Nl8T1VqTSkUJ$Gkz_wDSP&A3i?Y2r&ZJ3I4s-Z}T4 zd*7Wq9*ptf8RPizKY?s}FqH@7nvb7sdufCihRsisy|mzJYislB>+7Ei1Of{@9?zs~ zT6tt-iVr%bOdtx`uZC4^Yib`CUEQ8{r&xG3JMDD$t zbwJKI+oc(gMZ74+m7vyoAT@#gUjmySAeep1B2hq5MCP~G50uOVDrvPmBIV1!@+LEEzLv{LmKwZg>K?cqvJcOh>B$ z&h8%mTwu{#S`z6K2oC};)4d`C>%v+vQ3EP+x&CqB(z}7RHvxyfw#dn15b?x{T}g6E zpTORafi_w{HdISny`g$vk(ZZy;?m7jZx~oN%k-9w{KQD}Uk9eoPLNXi1hzj7?4&l6 zWMToIpdt;pVtR4mMxcor@BJ>dlq&85WtDK%A0jSc}N`>0MRItP$6DWhWp(6vRM zCeOQtf%z;DItH}f2K@FzJg%(XaG$_>B?c_1a>`}El1;|R_v#p+5`5My#8Z`&&9zJj zGS=PgQR@oB_1l3WQm}=>p!zGQl4-tRCv)oFV%_9z6oOU6_EXo->NEmU(*c5zcls zlwy!r8g<}`F&D2|Z4hXls{}}jk|QM{{x9Nzm(*ZmwVrM{Eitg$B#Th2-Ks`JL^5wPwB=I@-7 zfCs+?+Ft{U!4K`+L4}=qJ%EG!^IegNXR5$7Xz}e zJVq{l8z?H_PJ26Ro=%5S(qtib39xPvX(YNp?~&kmK8&!Om|PBg*Z}N$g`FHehS~JxG^PY*u*KGxS9oE#WLXd5uo!8ql~SsA1=n59}En=@WRLS!D-zS{ai{fqQ68=>cVUq)$K|>YL{n zaHm$rE6*`QAk2Ph(^ahBzXwj84lLg>#ylXFKFGYjzRGAP&S1CT5(cQWN-{XomrxYs z!9Bn`%h?j4Cj$9KPct^u+9#5l^wg5}5gQAf&$8ULwu-uj$Z6lFMuS%#4Q-!~qkpmz zbLcW@4wo%RnC#dC!^6Y9oa}I=%uHj)9A2;2QFnUcz`($dxw*N8nSthPl~5>jEEo(< z<7|09VB207vyboU>RMe|TDrv9tur&LySux!q@-j8S4+^XPA9?Q;^N6|ZEdUgUCq}z zYNTcct+EPVcm3JZ)3d3jrlzj5v-1Ei4X7Y=1mq=$ye1I|G1Y)YPu5>^dp3vgCt5JK6CXdxhg*}jMnNy^PmfjOP$w!~~UllU^(0_GagF;Czh X;?F5wg;;}600000NkvXXu0mjfpXSU0 literal 0 HcmV?d00001 diff --git a/src/all/novelcool/res/mipmap-xhdpi/ic_launcher.png b/src/all/novelcool/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b47d8315d83b4dd5858885b685d470adebf0dfb9 GIT binary patch literal 3317 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 literal 0 HcmV?d00001 diff --git a/src/all/novelcool/res/mipmap-xxhdpi/ic_launcher.png b/src/all/novelcool/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b8e8b78a90c9c1a4c21212832981a451538ec9 GIT binary patch literal 5881 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 literal 0 HcmV?d00001 diff --git a/src/all/novelcool/res/web_hi_res_512.png b/src/all/novelcool/res/web_hi_res_512.png new file mode 100644 index 0000000000000000000000000000000000000000..84e3ff7823a1a07e4abf941386ce2a21dc0425e0 GIT binary patch literal 26179 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 J(Jjl6{{c#?FM().getSharedPreferences("source_$id", 0x0000) + } + + override fun fetchPopularManga(page: Int): Observable { + return when (preference.useAppApi) { + true -> client.newCall(commonApiRequest("$apiUrl/elite/hot/", page)) + .asObservableSuccess() + .map(::commonApiResponseParse) + else -> super.fetchPopularManga(page) + } + } + + override fun popularMangaRequest(page: Int): Request { + // popular on the site only have novels + return GET("$baseUrl/category/new_list.html", headers) + } + + override fun popularMangaParse(response: Response): MangasPage { + runCatching { fetchGenres() } + + return super.popularMangaParse(response) + } + + override fun popularMangaNextPageSelector() = searchMangaNextPageSelector() + + override fun popularMangaFromElement(element: Element) = searchMangaFromElement(element) + + override fun popularMangaSelector() = searchMangaSelector() + + override fun fetchLatestUpdates(page: Int): Observable { + return when (preference.useAppApi) { + true -> client.newCall(commonApiRequest("$apiUrl/elite/latest/", page)) + .asObservableSuccess() + .map(::commonApiResponseParse) + else -> super.fetchLatestUpdates(page) + } + } + + override fun latestUpdatesRequest(page: Int): Request { + return GET("$baseUrl/category/latest.html", headers) + } + + override fun latestUpdatesParse(response: Response): MangasPage { + runCatching { fetchGenres() } + + return super.latestUpdatesParse(response) + } + + override fun latestUpdatesFromElement(element: Element) = searchMangaFromElement(element) + + override fun latestUpdatesSelector() = searchMangaSelector() + + override fun latestUpdatesNextPageSelector() = searchMangaNextPageSelector() + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return when (preference.useAppApi) { + true -> client.newCall(commonApiRequest("$apiUrl/book/search/", page, query)) + .asObservableSuccess() + .map(::popularMangaParse) + else -> super.fetchSearchManga(page, query, filters) + } + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = "$baseUrl/search".toHttpUrl().newBuilder().apply { + addQueryParameter("name", query.trim()) + + filters.forEach { filter -> + when (filter) { + is AuthorFilter -> { + addQueryParameter("author", filter.state.trim()) + } + is GenreFilter -> { + addQueryParameter("category_id", filter.included.joinToString(",", ",")) + addQueryParameter("out_category_id", filter.excluded.joinToString(",", ",")) + } + is StatusFilter -> { + addQueryParameter("completed_series", filter.getValue()) + } + is RatingFilter -> { + addQueryParameter("rate_star", filter.getValue()) + } + else -> { } + } + } + + addQueryParameter("page", page.toString()) + }.build() + + return GET(url, headers) + } + + override fun searchMangaParse(response: Response): MangasPage { + val document = Jsoup.parse(response.peekBody(Long.MAX_VALUE).string()) + runCatching { fetchGenres(document) } + + return super.searchMangaParse(response) + } + + override fun searchMangaFromElement(element: Element) = SManga.create().apply { + title = element.select(".book-pic").attr("title") + setUrlWithoutDomain(element.select("a").attr("href")) + thumbnail_url = element.select("img").imgAttr() + } + + override fun searchMangaSelector() = ".book-list .book-item:not(:has(.book-type-novel))" + + override fun searchMangaNextPageSelector() = "div.page-nav a div.next" + + private class AuthorFilter(title: String) : Filter.Text(title) + + private class GenreFilter(title: String, genres: List>) : + Filter.Group(title, genres.map { Genre(it.first, it.second) }) { + val included: List + get() = state.filter { it.isIncluded() }.map { it.id } + + val excluded: List + get() = state.filter { it.isExcluded() }.map { it.id } + } + class Genre(name: String, val id: String) : Filter.TriState(name) + + private fun getStatusList() = listOf( + Pair("All", ""), + Pair("Completed", "YES"), + Pair("Ongoing", "NO"), + ) + + private class StatusFilter(title: String, private val status: List>) : + Filter.Select(title, status.map { it.first }.toTypedArray()) { + fun getValue() = status[state].second + } + + private fun getRatingList() = listOf( + Pair("All", ""), + Pair("5 Star", "5"), + Pair("4 Star", "4"), + Pair("3 Star", "3"), + Pair("2 Star", "2"), + ) + private class RatingFilter(title: String, private val ratings: List>) : + Filter.Select(title, ratings.map { it.first }.toTypedArray()) { + fun getValue() = ratings[state].second + } + + override fun getFilterList(): FilterList { + if (preference.useAppApi) { + return FilterList(Filter.Header("Not supported when using App API")) + } + + val filters: MutableList> = mutableListOf( + AuthorFilter("Author"), + StatusFilter("Status", getStatusList()), + RatingFilter("Rating", getRatingList()), + ) + + filters += if (genresList.isNotEmpty()) { + listOf( + GenreFilter("Genres", genresList), + ) + } else { + listOf( + Filter.Separator(), + Filter.Header("Press 'Reset' to attempt to show the genres"), + ) + } + + return FilterList(filters) + } + + private var fetchGenresAttempts = 0 + private var fetchGenresFailed = false + private var genresList: List> = emptyList() + + private fun fetchGenres(document: Document? = null) { + if (fetchGenresAttempts < 3 && (genresList.isEmpty() || fetchGenresFailed) && !preference.useAppApi) { + val genres = runCatching { + if (document == null) { + client.newCall(genresRequest()).execute() + .use { parseGenres(it.asJsoup()) } + } else { + parseGenres(document) + } + } + + fetchGenresFailed = genres.isFailure + genresList = genres.getOrNull().orEmpty() + fetchGenresAttempts++ + } + } + + private fun genresRequest(): Request { + return GET("$baseUrl/search/", headers) + } + + private fun parseGenres(document: Document): List> { + return document.selectFirst(".category-list") + ?.select(".category-id-item") + .orEmpty() + .map { div -> + Pair( + div.attr("title"), + div.attr("cate_id"), + ) + } + } + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + title = document.selectFirst("h1.bookinfo-title")!!.text() + description = document.selectFirst("div.bk-summary-txt")?.text() + genre = document.select(".bookinfo-category-list a").joinToString { it.text() } + author = document.selectFirst(".bookinfo-author > a")?.attr("title") + thumbnail_url = document.selectFirst(".bookinfo-pic-img")?.attr("abs:src") + status = document.select(".bookinfo-category-list a").first()?.text().parseStatus() + } + + private fun String?.parseStatus(): Int { + this ?: return SManga.UNKNOWN + return when { + this.lowercase() in completedStatusList -> SManga.COMPLETED + this.lowercase() in ongoingStatusList -> SManga.ONGOING + else -> SManga.UNKNOWN + } + } + + override fun chapterListSelector() = ".chapter-item-list a" + + override fun chapterFromElement(element: Element) = SChapter.create().apply { + setUrlWithoutDomain(element.attr("href")) + name = element.attr("title") + date_upload = element.select(".chapter-item-time").text().parseDate() + } + + private fun String.parseDate(): Long { + return runCatching { DATE_FORMATTER.parse(this)?.time } + .getOrNull() ?: 0L + } + + override fun fetchPageList(chapter: SChapter): Observable> { + return pageClient.newCall(pageListRequest(chapter)) + .asObservableSuccess() + .map(::pageListParse) + } + + override fun pageListRequest(chapter: SChapter): Request { + return super.pageListRequest(chapter).newBuilder() + .addHeader("Referer", baseUrl) + .build() + } + + override fun pageListParse(document: Document): List { + val script = document.select("script:containsData(all_imgs_url)").html() + + val images = imgRegex.find(script)?.groupValues?.get(1) + ?.let { json.decodeFromString>("[$it]") } + ?: return singlePageParse(document) + + return images.mapIndexed { idx, img -> + Page(idx, "", img) + } + } + + private fun singlePageParse(document: Document): List { + return document.selectFirst(".mangaread-pagenav > .sl-page")?.select("option") + ?.mapIndexed { idx, page -> + Page(idx, page.attr("value")) + } ?: emptyList() + } + + override fun imageUrlParse(document: Document): String { + return document.select(".mangaread-manga-pic").attr("src") + } + + private fun Elements.imgAttr(): String { + return when { + hasAttr("lazy_url") -> attr("abs:lazy_url") + else -> attr("abs:src") + } + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + SwitchPreferenceCompat(screen.context).apply { + key = PREF_API_SEARCH + title = "Use App API for browse" + summary = "Results may be more reliable" + setDefaultValue(true) + }.also(screen::addPreference) + } + + private val SharedPreferences.useAppApi: Boolean + get() = getBoolean(PREF_API_SEARCH, true) + + private fun jsRedirect(chain: Interceptor.Chain): Response { + val request = chain.request() + val response = chain.proceed(request) + + val document = Jsoup.parse(response.peekBody(Long.MAX_VALUE).string()) + val jsRedirect = document.selectFirst("script:containsData(window.location.href)")?.html() + ?.substringAfter("\"") + ?.substringBefore("\"") + ?: return response + + val requestUrl = response.request.url + + val url = "${requestUrl.scheme}://${requestUrl.host}$jsRedirect".toHttpUrlOrNull() + ?: return response + + response.close() + + val newHeaders = headersBuilder() + .add("Referer", requestUrl.toString()) + .build() + + return chain.proceed( + request.newBuilder() + .url(url) + .headers(newHeaders) + .build(), + ) + } + + private fun commonApiRequest(url: String, page: Int, query: String? = null): Request { + val payload = NovelCoolBrowsePayload( + appId = appId, + lang = siteLang, + query = query, + type = "manga", + page = page.toString(), + size = size.toString(), + secret = appSecret, + ) + + val body = json.encodeToString(payload) + .toRequestBody(JSON_MEDIA_TYPE) + + val apiHeaders = headersBuilder() + .add("Content-Length", body.contentLength().toString()) + .add("Content-Type", body.contentType().toString()) + .build() + + return POST(url, apiHeaders, body) + } + + private fun commonApiResponseParse(response: Response): MangasPage { + runCatching { fetchGenres() } + + val browse = json.decodeFromString(response.body.string()) + + val hasNextPage = browse.list?.size == size + + return browse.list?.map { + SManga.create().apply { + setUrlWithoutDomain(it.url) + title = it.name + thumbnail_url = it.cover + } + }.let { MangasPage(it ?: emptyList(), hasNextPage) } + } + + companion object { + private const val appId = "202201290625004" + private const val appSecret = "c73a8590641781f203660afca1d37ada" + private const val size = 20 + private val JSON_MEDIA_TYPE = "application/json; charset=utf-8".toMediaTypeOrNull() + private val DATE_FORMATTER by lazy { + SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH) + } + private val imgRegex = Regex("""all_imgs_url\s*:\s*\[\s*([^]]*)\s*,\s*]""") + + private const val PREF_API_SEARCH = "pref_use_search_api" + + // copied from Madara + private val completedStatusList: Array = arrayOf( + "completed", + "completo", + "completado", + "concluído", + "concluido", + "finalizado", + "terminé", + "hoàn thành", + ) + + private val ongoingStatusList: Array = arrayOf( + "ongoing", "Продолжается", "updating", "em lançamento", "em lançamento", "em andamento", + "em andamento", "en cours", "ativo", "lançando", "Đang Tiến Hành", "devam ediyor", + "devam ediyor", "in corso", "in arrivo", "en curso", "en curso", "emision", + "curso", "en marcha", "Publicandose", "en emision", + ) + } +} diff --git a/src/all/novelcool/src/eu/kanade/tachiyomi/extension/all/novelcool/NovelCoolDto.kt b/src/all/novelcool/src/eu/kanade/tachiyomi/extension/all/novelcool/NovelCoolDto.kt new file mode 100644 index 000000000..ab513d2e6 --- /dev/null +++ b/src/all/novelcool/src/eu/kanade/tachiyomi/extension/all/novelcool/NovelCoolDto.kt @@ -0,0 +1,27 @@ +package eu.kanade.tachiyomi.extension.all.novelcool + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class NovelCoolBrowsePayload( + val appId: String, + @SerialName("keyword") val query: String? = null, + val lang: String, + @SerialName("lc_type") val type: String, + val page: String, + @SerialName("page_size") val size: String, + val secret: String, +) + +@Serializable +data class NovelCoolBrowseResponse( + val list: List? = emptyList(), +) + +@Serializable +data class Manga( + val url: String, + val name: String, + val cover: String, +) diff --git a/src/all/novelcool/src/eu/kanade/tachiyomi/extension/all/novelcool/NovelCoolFactory.kt b/src/all/novelcool/src/eu/kanade/tachiyomi/extension/all/novelcool/NovelCoolFactory.kt new file mode 100644 index 000000000..1417808cd --- /dev/null +++ b/src/all/novelcool/src/eu/kanade/tachiyomi/extension/all/novelcool/NovelCoolFactory.kt @@ -0,0 +1,16 @@ +package eu.kanade.tachiyomi.extension.all.novelcool + +import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.source.SourceFactory + +class NovelCoolFactory : SourceFactory { + override fun createSources(): List = listOf( + NovelCool("https://www.novelcool.com", "en"), + NovelCool("https://es.novelcool.com", "es"), + NovelCool("https://de.novelcool.com", "de"), + NovelCool("https://ru.novelcool.com", "ru"), + NovelCool("https://it.novelcool.com", "it"), + NovelCool("https://br.novelcool.com", "pt-BR", "br"), + NovelCool("https://fr.novelcool.com", "fr"), + ) +}