diff --git a/src/ja/rawdevart/AndroidManifest.xml b/src/ja/rawdevart/AndroidManifest.xml
deleted file mode 100644
index 8072ee00d..000000000
--- a/src/ja/rawdevart/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/src/ja/rawdevart/build.gradle b/src/ja/rawdevart/build.gradle
deleted file mode 100644
index abd7ba678..000000000
--- a/src/ja/rawdevart/build.gradle
+++ /dev/null
@@ -1,7 +0,0 @@
-ext {
- extName = 'Rawdevart'
- extClass = '.Rawdevart'
- extVersionCode = 4
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/ja/rawdevart/src/eu/kanade/tachiyomi/extension/ja/rawdevart/Rawdevart.kt b/src/ja/rawdevart/src/eu/kanade/tachiyomi/extension/ja/rawdevart/Rawdevart.kt
deleted file mode 100644
index 110297dc5..000000000
--- a/src/ja/rawdevart/src/eu/kanade/tachiyomi/extension/ja/rawdevart/Rawdevart.kt
+++ /dev/null
@@ -1,355 +0,0 @@
-package eu.kanade.tachiyomi.extension.ja.rawdevart
-
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.source.model.Filter
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.source.online.ParsedHttpSource
-import eu.kanade.tachiyomi.util.asJsoup
-import okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import okhttp3.Response
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import java.text.SimpleDateFormat
-import java.util.Date
-import java.util.Locale
-
-class Rawdevart : ParsedHttpSource() {
-
- override val name = "Rawdevart"
-
- override val baseUrl = "https://rawdevart.com"
-
- override val lang = "ja"
-
- override val supportsLatest = true
-
- override val client: OkHttpClient = network.cloudflareClient
-
- override fun latestUpdatesRequest(page: Int) =
- GET("$baseUrl/comic/?page=$page&lister=0")
-
- override fun latestUpdatesSelector() = "div.row div.hovereffect"
-
- override fun latestUpdatesFromElement(element: Element): SManga {
- val manga = SManga.create()
- val item = element.select("a.head")
- manga.setUrlWithoutDomain(item.attr("href"))
- manga.title = item.text()
- manga.thumbnail_url = element.select("img").attr("abs:src")
-
- return manga
- }
-
- override fun latestUpdatesNextPageSelector() = "li.page-item:not(.disabled) a[aria-label=next]"
-
- override fun popularMangaRequest(page: Int) =
- GET("$baseUrl/comic/?page=$page&lister=5")
-
- override fun popularMangaFromElement(element: Element) = latestUpdatesFromElement(element)
-
- override fun popularMangaSelector() = latestUpdatesSelector()
-
- override fun popularMangaNextPageSelector() = latestUpdatesNextPageSelector()
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val url = "$baseUrl/search/".toHttpUrl().newBuilder()
- url.addQueryParameter("page", page.toString())
- url.addQueryParameter("title", query)
- filters.forEach { filter ->
- when (filter) {
- is AuthorFilter -> {
- url.addQueryParameter("author", filter.state)
- }
- is ArtistFilter -> {
- url.addQueryParameter("artist", filter.state)
- }
- is SortFilter -> {
- url.addQueryParameter("lister", filter.toUriPart())
- }
- is TypeFilter -> {
- val typeToExclude = mutableListOf()
- val typeToInclude = mutableListOf()
- filter.state.forEach { content ->
- if (content.isExcluded()) {
- typeToExclude.add(content.id)
- } else if (content.isIncluded()) {
- typeToInclude.add(content.id)
- }
- }
- if (typeToExclude.isNotEmpty()) {
- url.addQueryParameter(
- "ctype_exc",
- typeToExclude
- .joinToString(","),
- )
- }
- if (typeToInclude.isNotEmpty()) {
- url.addQueryParameter(
- "ctype_inc",
- typeToInclude
- .joinToString(","),
- )
- }
- }
- is StatusFilter -> {
- val statusToExclude = mutableListOf()
- val statusToInclude = mutableListOf()
- filter.state.forEach { content ->
- if (content.isExcluded()) {
- statusToExclude.add(content.id)
- } else if (content.isIncluded()) {
- statusToInclude.add(content.id)
- }
- }
- if (statusToExclude.isNotEmpty()) {
- url.addQueryParameter(
- "status_exc",
- statusToExclude
- .joinToString(","),
- )
- }
- if (statusToInclude.isNotEmpty()) {
- url.addQueryParameter(
- "status_inc",
- statusToInclude
- .joinToString(","),
- )
- }
- }
- is GenreFilter -> {
- val genreToExclude = mutableListOf()
- val genreToInclude = mutableListOf()
- filter.state.forEach { content ->
- if (content.isExcluded()) {
- genreToExclude.add(content.id)
- } else if (content.isIncluded()) {
- genreToInclude.add(content.id)
- }
- }
- if (genreToExclude.isNotEmpty()) {
- url.addQueryParameter(
- "genre_exc",
- genreToExclude
- .joinToString(","),
- )
- }
- if (genreToInclude.isNotEmpty()) {
- url.addQueryParameter(
- "genre_inc",
- genreToInclude
- .joinToString(","),
- )
- }
- }
- else -> {}
- }
- }
-
- return GET(url.build(), headers)
- }
-
- override fun searchMangaSelector() = latestUpdatesSelector()
-
- override fun searchMangaFromElement(element: Element) = latestUpdatesFromElement(element)
-
- override fun searchMangaNextPageSelector() = latestUpdatesNextPageSelector()
-
- override fun mangaDetailsRequest(manga: SManga): Request {
- if (manga.url.startsWith("http")) {
- return GET(manga.url, headers)
- }
- return super.mangaDetailsRequest(manga)
- }
-
- override fun mangaDetailsParse(document: Document): SManga {
- val infoElement = document.select("div.manga-main")
- val manga = SManga.create()
- val status = infoElement.select("th:contains(Status) + td").text()
- val genres = mutableListOf()
- infoElement.select("div.genres a").forEach { element ->
- val genre = element.text()
- genres.add(genre)
- }
- manga.title = infoElement.select("h1").text()
- manga.author = infoElement.select("th:contains(Author) + td").text()
- manga.artist = infoElement.select("th:contains(Artist) + td").text()
- manga.status = parseStatus(status)
- manga.genre = genres.joinToString(", ")
- manga.description = infoElement.select("div.description").text()
- .substringAfter("Description ")
- manga.thumbnail_url = infoElement.select("img.img-fluid.not-lazy").attr("abs:src")
-
- return manga
- }
-
- private fun parseStatus(status: String?) = when {
- status == null -> SManga.UNKNOWN
- status.contains("Ongoing") -> SManga.ONGOING
- status.contains("Finished") -> SManga.COMPLETED
- else -> SManga.UNKNOWN
- }
-
- override fun chapterListRequest(manga: SManga) = chapterListRequest(manga.url, 1)
-
- private fun chapterListRequest(mangaUrl: String, page: Int): Request {
- return GET("$baseUrl$mangaUrl?page=$page", headers)
- }
-
- override fun chapterListSelector() = "div.list-group-item"
-
- override fun chapterListParse(response: Response): List {
- var document = response.asJsoup()
- val chapters = mutableListOf()
- var nextPage = 2
- document.select(chapterListSelector()).map { chapters.add(chapterFromElement(it)) }
- while (document.select(paginationNextPageSelector).isNotEmpty()) {
- val currentPage = document.select("form#filter_form").attr("action")
- document = client.newCall(chapterListRequest(currentPage, nextPage)).execute().asJsoup()
- document.select(chapterListSelector()).map { chapters.add(chapterFromElement(it)) }
- nextPage++
- }
-
- return chapters
- }
-
- private val paginationNextPageSelector = latestUpdatesNextPageSelector()
-
- override fun chapterFromElement(element: Element): SChapter {
- val chapter = SChapter.create()
- chapter.setUrlWithoutDomain(element.select("a").attr("href"))
- chapter.name = element.select("div.rounded-0 span.text-truncate").text()
- chapter.date_upload = element.select("span.mr-2").text().let {
- try {
- when {
- it.contains("ago") -> Date(System.currentTimeMillis() - it.split("\\s".toRegex())[0].toLong() * 60 * 60 * 1000).time
- it.contains("Yesterday") -> Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000).time
- it.contains(".") -> SimpleDateFormat("MMM. dd, yyyy", Locale.US).parse(it)?.time ?: 0L
- else -> SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(it)?.time ?: 0L
- }
- } catch (e: Exception) {
- Date(System.currentTimeMillis()).time
- }
- }
-
- return chapter
- }
-
- override fun pageListParse(document: Document): List {
- val pages = mutableListOf()
- document.select("img.not-lazy[data-src]").forEachIndexed { i, img ->
- pages.add(Page(i, "", img.attr("data-src")))
- }
- return pages
- }
-
- override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException()
-
- private class AuthorFilter : Filter.Text("Author")
-
- private class ArtistFilter : Filter.Text("Artist")
-
- private class SortFilter : UriPartFilter(
- "Sort By",
- arrayOf(
- Pair("