diff --git a/src/en/rdscans/build.gradle b/src/en/rdscans/build.gradle new file mode 100644 index 000000000..11bba03fc --- /dev/null +++ b/src/en/rdscans/build.gradle @@ -0,0 +1,10 @@ +ext { + extName = 'RD Scans' + extClass = '.RDScans' + themePkg = 'madara' + baseUrl = 'https://rdscans.com' + overrideVersionCode = 0 + isNsfw = false +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/rdscans/res/mipmap-hdpi/ic_launcher.png b/src/en/rdscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..a304fa6d2 Binary files /dev/null and b/src/en/rdscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/en/rdscans/res/mipmap-mdpi/ic_launcher.png b/src/en/rdscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..034854c54 Binary files /dev/null and b/src/en/rdscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/en/rdscans/res/mipmap-xhdpi/ic_launcher.png b/src/en/rdscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..694557414 Binary files /dev/null and b/src/en/rdscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/en/rdscans/res/mipmap-xxhdpi/ic_launcher.png b/src/en/rdscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..5816faf9f Binary files /dev/null and b/src/en/rdscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/en/rdscans/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/rdscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..836372752 Binary files /dev/null and b/src/en/rdscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/en/rdscans/src/eu/kanade/tachiyomi/extension/en/rdscans/RDScans.kt b/src/en/rdscans/src/eu/kanade/tachiyomi/extension/en/rdscans/RDScans.kt new file mode 100644 index 000000000..cd131b0f2 --- /dev/null +++ b/src/en/rdscans/src/eu/kanade/tachiyomi/extension/en/rdscans/RDScans.kt @@ -0,0 +1,52 @@ +package eu.kanade.tachiyomi.extension.en.rdscans + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.Page +import okhttp3.Response +import org.jsoup.nodes.Document + +class RDScans : Madara( + "RD Scans", + "https://rdscans.com", + "en", +) { + override val mangaSubString = "new" + override val mangaEntrySelector = "" + override val useNewChapterEndpoint = true + + private fun parseBrowsePage(mangasPage: MangasPage): MangasPage { + // Normally returns a 200 OK with a challenge page which leads to a "No results found" error for the user. + // This check throws an exception instead, prompting the user to view in WebView first. + if (mangasPage.mangas.isEmpty()) { + throw Exception("Failed to bypass Cloudflare") + } + return filterWebNovels(mangasPage) + } + + private fun filterWebNovels(mangasPage: MangasPage): MangasPage { + val filteredMangas = mangasPage.mangas.filterNot { + it.title.contains("(WN)", ignoreCase = true) + } + return MangasPage(filteredMangas, mangasPage.hasNextPage) + } + + override fun popularMangaParse(response: Response): MangasPage { + return parseBrowsePage(super.popularMangaParse(response)) + } + + override fun latestUpdatesParse(response: Response): MangasPage { + return parseBrowsePage(super.latestUpdatesParse(response)) + } + + override fun searchMangaParse(response: Response): MangasPage { + return filterWebNovels(super.searchMangaParse(response)) + } + + override fun pageListParse(document: Document): List { + launchIO { countViews(document) } + return document.select("div.reading-content .separator img").mapIndexed { i, img -> + Page(i, document.location(), imageFromElement(img)) + } + } +}