diff --git a/src/pt/vaposcans/AndroidManifest.xml b/src/pt/vaposcans/AndroidManifest.xml
deleted file mode 100644
index 1ddafe173..000000000
--- a/src/pt/vaposcans/AndroidManifest.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pt/vaposcans/build.gradle b/src/pt/vaposcans/build.gradle
deleted file mode 100644
index 5f7a55b5f..000000000
--- a/src/pt/vaposcans/build.gradle
+++ /dev/null
@@ -1,7 +0,0 @@
-ext {
- extName = 'Vapo Scans'
- extClass = '.VapoScans'
- extVersionCode = 1
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/pt/vaposcans/res/mipmap-hdpi/ic_launcher.png b/src/pt/vaposcans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cb1188756..000000000
Binary files a/src/pt/vaposcans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/vaposcans/res/mipmap-mdpi/ic_launcher.png b/src/pt/vaposcans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 290e08c40..000000000
Binary files a/src/pt/vaposcans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/vaposcans/res/mipmap-xhdpi/ic_launcher.png b/src/pt/vaposcans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 8a2d15ce6..000000000
Binary files a/src/pt/vaposcans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/vaposcans/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/vaposcans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index cf3315e3e..000000000
Binary files a/src/pt/vaposcans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/vaposcans/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/vaposcans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 57aa781b2..000000000
Binary files a/src/pt/vaposcans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/vaposcans/src/eu/kanade/tachiyomi/extension/pt/vaposcans/VapoScans.kt b/src/pt/vaposcans/src/eu/kanade/tachiyomi/extension/pt/vaposcans/VapoScans.kt
deleted file mode 100644
index d6561254a..000000000
--- a/src/pt/vaposcans/src/eu/kanade/tachiyomi/extension/pt/vaposcans/VapoScans.kt
+++ /dev/null
@@ -1,198 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.vaposcans
-
-import eu.kanade.tachiyomi.network.POST
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.MangasPage
-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.HttpSource
-import kotlinx.serialization.decodeFromString
-import kotlinx.serialization.encodeToString
-import kotlinx.serialization.json.Json
-import okhttp3.MediaType.Companion.toMediaTypeOrNull
-import okhttp3.Request
-import okhttp3.RequestBody
-import okhttp3.RequestBody.Companion.toRequestBody
-import okhttp3.Response
-import rx.Observable
-import uy.kohesive.injekt.injectLazy
-import java.text.SimpleDateFormat
-import java.util.Calendar
-import java.util.Locale
-
-class VapoScans : HttpSource() {
- override val name = "Vapo Scans"
-
- override val baseUrl = "https://vaposcans.site"
-
- override val lang = "pt-BR"
-
- override val supportsLatest = true
-
- override val client = network.cloudflareClient.newBuilder()
- .rateLimit(2)
- .build()
-
- private val json: Json by injectLazy()
-
- // Keeps the behavior of the web page
- private val emptyPayload = "{}".toRequestBody()
-
- private var popularMangaCache: List = mutableListOf()
-
- override fun headersBuilder() = super.headersBuilder()
- .set("Origin", baseUrl)
- .set("Referer", "$baseUrl/")
-
- override fun popularMangaRequest(page: Int) =
- POST("$apiUrl/api/series/", headers, emptyPayload)
-
- override fun popularMangaParse(response: Response) =
- MangasPage(
- response.parseAs>()
- .map(::sMangaParse)
- .also {
- popularMangaCache = it
- },
- false,
- )
-
- override fun latestUpdatesRequest(page: Int) =
- POST("$apiUrl/api/recent-chapters/", headers, emptyPayload)
-
- override fun latestUpdatesParse(response: Response) =
- MangasPage(
- response.parseAs>()
- .map { sMangaParse(it.mangaDto) },
- false,
- )
-
- override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable {
- if (query.startsWith(URL_SEARCH_PREFIX)) {
- val manga = SManga.create().apply {
- url = query.substringAfter(URL_SEARCH_PREFIX)
- }
-
- return fetchMangaDetails(manga).map {
- MangasPage(listOf(it), false)
- }
- }
-
- if (popularMangaCache.isNotEmpty()) {
- return Observable.just(findMangaByTitle(query))
- }
-
- return super.fetchSearchManga(page, query, filters)
- }
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList) =
- POST("$apiUrl/api/series/#$query", headers, emptyPayload)
-
- override fun searchMangaParse(response: Response): MangasPage {
- val mangas = popularMangaParse(response).mangas
- val query = response.request.url.toString().substringAfter("#")
- return findMangaByTitle(query, mangas)
- }
-
- override fun getMangaUrl(manga: SManga): String = "$baseUrl/series/${manga.url}"
-
- override fun mangaDetailsRequest(manga: SManga): Request {
- val payload = MangaCode(manga.url).toRequestBody()
- return POST("$apiUrl/api/serie/", headers, payload)
- }
-
- override fun mangaDetailsParse(response: Response) = SManga.create().apply {
- response.parseAs().let {
- title = it.title
- description = it.synopsis
- url = it.code
- genre = it.genres.joinToString()
- artist = it.artist
- author = it.author
- thumbnail_url = it.cover
- status = when (it.status) {
- "completed" -> SManga.COMPLETED
- "ongoing" -> SManga.ONGOING
- else -> SManga.UNKNOWN
- }
- }
- }
-
- override fun getChapterUrl(chapter: SChapter) = "$baseUrl/reader/${chapter.url}"
-
- override fun chapterListRequest(manga: SManga): Request {
- val payload = MangaCode(manga.url).toRequestBody()
- return POST("$apiUrl/api/serie/chapters/", headers, payload)
- }
-
- override fun chapterListParse(response: Response): List {
- return response.parseAs>().map {
- SChapter.create().apply {
- name = it.number
- url = it.code
- date_upload = parseDate(it.upload_date)
- chapter_number = it.number.toFloat()
- }
- }.sortedBy { it.chapter_number }.reversed()
- }
-
- override fun pageListRequest(chapter: SChapter): Request {
- val payload = MangaCode(chapter.url).toRequestBody()
- return POST("$apiUrl/api/chapter_details/", headers, payload)
- }
-
- override fun pageListParse(response: Response): List {
- val dto = response.parseAs()
- val chapterUrl = "$baseUrl/reader/${dto.chapter_code}"
- return dto.images.mapIndexed { index, image ->
- Page(index, chapterUrl, "$apiUrl/$image")
- }
- }
-
- override fun imageUrlParse(response: Response) = ""
-
- private fun findMangaByTitle(query: String, collection: List = popularMangaCache): MangasPage {
- val mangas = collection
- .filter { it.title.contains(query, ignoreCase = true) }
-
- return MangasPage(mangas, false)
- }
-
- private inline fun Response.parseAs(): T =
- json.decodeFromString(body.string())
-
- private inline fun T.toRequestBody(): RequestBody =
- json.encodeToString(this)
- .toRequestBody(JSON_MEDIA_TYPE)
-
- private fun sMangaParse(dto: MangaDto) = SManga.create().apply {
- title = dto.title
- thumbnail_url = "$apiUrl/${dto.cover}"
- url = dto.code
- }
-
- private fun parseDate(date: String): Long =
- try { dateFormat.parse(date)!!.time } catch (_: Exception) { parseRelativeDate(date) }
-
- private fun parseRelativeDate(date: String): Long {
- val number = RELATIVE_DATE_REGEX.find(date)?.value?.toIntOrNull() ?: return 0
- val cal = Calendar.getInstance()
- return when {
- date.contains("dia", ignoreCase = true) -> cal.apply { add(Calendar.DATE, -number) }.timeInMillis
- date.contains("mes", ignoreCase = true) -> cal.apply { add(Calendar.MONTH, -number) }.timeInMillis
- date.contains("ano", ignoreCase = true) -> cal.apply { add(Calendar.YEAR, -number) }.timeInMillis
- else -> 0
- }
- }
-
- companion object {
- const val apiUrl = "https://api.vaposcans.site"
- const val URL_SEARCH_PREFIX = "slug:"
- val JSON_MEDIA_TYPE = "application/json".toMediaTypeOrNull()
- val RELATIVE_DATE_REGEX = """(\d+)""".toRegex()
-
- val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
- }
-}
diff --git a/src/pt/vaposcans/src/eu/kanade/tachiyomi/extension/pt/vaposcans/VapoScansDto.kt b/src/pt/vaposcans/src/eu/kanade/tachiyomi/extension/pt/vaposcans/VapoScansDto.kt
deleted file mode 100644
index fc14621c0..000000000
--- a/src/pt/vaposcans/src/eu/kanade/tachiyomi/extension/pt/vaposcans/VapoScansDto.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.vaposcans
-
-import kotlinx.serialization.Serializable
-
-@Serializable
-class MangaDto(
- val code: String,
- val cover: String,
- val title: String,
-)
-
-@Serializable
-class LatestMangaDto(
- val serie_code: String,
- val serie_cover: String,
- val serie_title: String,
-) {
- val mangaDto get() = MangaDto(serie_code, serie_cover, serie_title)
-}
-
-@Serializable
-class MangaCode(val code: String)
-
-@Serializable
-class MangaDetailsDto(
- val artist: String,
- val author: String,
- val code: String,
- val cover: String,
- val genres: List,
- val status: String,
- val synopsis: String,
- val title: String,
-)
-
-@Serializable
-class ChapterDto(
- val number: String,
- val code: String,
- val upload_date: String,
-)
-
-@Serializable
-class PagesDto(
- val chapter_code: String,
- val images: List,
-)
diff --git a/src/pt/vaposcans/src/eu/kanade/tachiyomi/extension/pt/vaposcans/VapoScansUrlActivity.kt b/src/pt/vaposcans/src/eu/kanade/tachiyomi/extension/pt/vaposcans/VapoScansUrlActivity.kt
deleted file mode 100644
index f1754bbd6..000000000
--- a/src/pt/vaposcans/src/eu/kanade/tachiyomi/extension/pt/vaposcans/VapoScansUrlActivity.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.vaposcans
-
-import android.app.Activity
-import android.content.ActivityNotFoundException
-import android.content.Intent
-import android.os.Bundle
-import android.util.Log
-import kotlin.system.exitProcess
-
-class VapoScansUrlActivity : Activity() {
-
- private val tag = javaClass.simpleName
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- val pathSegments = intent?.data?.pathSegments
- if (pathSegments != null && pathSegments.size > 1) {
- val item = pathSegments[1]
- val mainIntent = Intent().apply {
- action = "eu.kanade.tachiyomi.SEARCH"
- putExtra("query", "${VapoScans.URL_SEARCH_PREFIX}$item")
- putExtra("filter", packageName)
- }
-
- try {
- startActivity(mainIntent)
- } catch (e: ActivityNotFoundException) {
- Log.e(tag, e.toString())
- }
- } else {
- Log.e(tag, "could not parse uri from intent $intent")
- }
-
- finish()
- exitProcess(0)
- }
-}