diff --git a/.run/GenkanGenerator.run.xml b/.run/GenkanGenerator.run.xml
deleted file mode 100644
index 7c1929694..000000000
--- a/.run/GenkanGenerator.run.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.run/GenkanOriginalGenerator.run.xml b/.run/GenkanOriginalGenerator.run.xml
deleted file mode 100644
index 6006407f6..000000000
--- a/.run/GenkanOriginalGenerator.run.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/multisrc/overrides/genkan/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/genkan/default/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 0a2c55aa7..000000000
Binary files a/multisrc/overrides/genkan/default/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/genkan/default/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index e6f0260ff..000000000
Binary files a/multisrc/overrides/genkan/default/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/genkan/default/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index ca210a848..000000000
Binary files a/multisrc/overrides/genkan/default/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/genkan/default/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 872736ea2..000000000
Binary files a/multisrc/overrides/genkan/default/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/genkan/default/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index e3e31f8c0..000000000
Binary files a/multisrc/overrides/genkan/default/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/default/res/web_hi_res_512.png b/multisrc/overrides/genkan/default/res/web_hi_res_512.png
deleted file mode 100644
index 3c424c17c..000000000
Binary files a/multisrc/overrides/genkan/default/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/hunlightscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/genkan/hunlightscans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index de4ec0f24..000000000
Binary files a/multisrc/overrides/genkan/hunlightscans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/hunlightscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/genkan/hunlightscans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 8ff4c6287..000000000
Binary files a/multisrc/overrides/genkan/hunlightscans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/hunlightscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/genkan/hunlightscans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 962eb5a8b..000000000
Binary files a/multisrc/overrides/genkan/hunlightscans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/hunlightscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/genkan/hunlightscans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 8b80eb80e..000000000
Binary files a/multisrc/overrides/genkan/hunlightscans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/hunlightscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/genkan/hunlightscans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 69e7a77e3..000000000
Binary files a/multisrc/overrides/genkan/hunlightscans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/hunlightscans/res/web_hi_res_512.png b/multisrc/overrides/genkan/hunlightscans/res/web_hi_res_512.png
deleted file mode 100644
index 18058bc04..000000000
Binary files a/multisrc/overrides/genkan/hunlightscans/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/genkan/lynxscans/src/LynxScans.kt b/multisrc/overrides/genkan/lynxscans/src/LynxScans.kt
deleted file mode 100644
index 944f5237d..000000000
--- a/multisrc/overrides/genkan/lynxscans/src/LynxScans.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.lynxscans
-
-import eu.kanade.tachiyomi.multisrc.genkan.Genkan
-import eu.kanade.tachiyomi.source.model.Page
-import org.jsoup.nodes.Document
-
-class LynxScans : Genkan("LynxScans", "https://lynxscans.com", "en", "/web/comics") {
- override fun pageListParse(document: Document): List {
- val pages = mutableListOf()
-
- val allImages = document.select("div#pages-container + script").first()!!.data()
- .substringAfter("[").substringBefore("];")
- .replace(Regex("""["\\]"""), "")
- .split(",/")
-
- for (i in allImages.indices) {
- pages.add(Page(i, "", if (i == 0) allImages[i] else "/" + allImages[i]))
- }
-
- return pages
- }
-}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/Genkan.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/Genkan.kt
deleted file mode 100644
index e0acc9e7c..000000000
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/Genkan.kt
+++ /dev/null
@@ -1,188 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.genkan
-
-import eu.kanade.tachiyomi.network.GET
-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.ParsedHttpSource
-import eu.kanade.tachiyomi.util.asJsoup
-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.Calendar
-import java.util.Locale
-
-open class Genkan(
- override val name: String,
- override val baseUrl: String,
- override val lang: String,
- val mangaUrlDirectory: String = "/comics",
-) : ParsedHttpSource() {
-
- override val supportsLatest = true
-
- override val client: OkHttpClient = network.cloudflareClient
-
- override fun popularMangaSelector() = "div.list-item"
-
- override fun popularMangaRequest(page: Int): Request {
- return GET("$baseUrl$mangaUrlDirectory?page=$page", headers)
- }
-
- override fun latestUpdatesSelector() = popularMangaSelector()
-
- // Track which manga titles have been added to latestUpdates's MangasPage
- private val latestUpdatesTitles = mutableSetOf()
-
- override fun latestUpdatesRequest(page: Int): Request {
- if (page == 1) latestUpdatesTitles.clear()
- return GET("$baseUrl/latest?page=$page", headers)
- }
-
- // To prevent dupes, only add manga to MangasPage if its title is not one we've added already
- override fun latestUpdatesParse(response: Response): MangasPage {
- val latestManga = mutableListOf()
- val document = response.asJsoup()
-
- document.select(latestUpdatesSelector()).forEach { element ->
- latestUpdatesFromElement(element).let { manga ->
- if (manga.title !in latestUpdatesTitles) {
- latestManga.add(manga)
- latestUpdatesTitles.add(manga.title)
- }
- }
- }
-
- return MangasPage(latestManga, document.select(latestUpdatesNextPageSelector()).hasText())
- }
-
- override fun popularMangaFromElement(element: Element): SManga {
- val manga = SManga.create()
- element.select("a.list-title").first()!!.let {
- manga.setUrlWithoutDomain(it.attr("href"))
- manga.title = it.text()
- }
- manga.thumbnail_url = styleToUrl(element.select("a.media-content").first()!!)
- return manga
- }
-
- override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element)
-
- override fun popularMangaNextPageSelector() = "[rel=next]"
-
- override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
-
- // Search
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- return GET("$baseUrl$mangaUrlDirectory?query=$query", headers)
- }
-
- override fun searchMangaSelector() = popularMangaSelector()
-
- override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
-
- override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
-
- // Details
-
- private fun styleToUrl(element: Element): String {
- return element.attr("style").substringAfter("(").substringBefore(")")
- .let { if (it.startsWith("http")) it else baseUrl + it }
- }
-
- protected var countryOfOriginSelector = ".card.mt-2 .list-item:contains(Country of Origin) .no-wrap"
- override fun mangaDetailsParse(document: Document) = SManga.create().apply {
- title = document.select("div#content h5").first()!!.text()
- description = document.select("div.col-lg-9").text().substringAfter("Description ").substringBefore(" Volume")
- thumbnail_url = styleToUrl(document.select("div.media a").first()!!)
- genre = listOfNotNull(
- document.selectFirst(countryOfOriginSelector)?.let { countryOfOriginToSeriesType(it.text()) },
- ).joinToString()
- }
-
- override fun chapterListSelector() = "div.col-lg-9 div.flex"
-
- override fun chapterFromElement(element: Element): SChapter {
- return SChapter.create().apply {
- val urlElement = element.select("a.item-author")
- val chapNum = urlElement.attr("href").split("/").last()
-
- setUrlWithoutDomain(urlElement.attr("href"))
- name = if (urlElement.text().contains("Chapter $chapNum")) {
- urlElement.text()
- } else {
- "Ch. $chapNum: ${urlElement.text()}"
- }
- date_upload = parseChapterDate(element.select("a.item-company").first()!!.text()) ?: 0
- }
- }
-
- companion object {
- val dateFormat by lazy {
- SimpleDateFormat("MMM d, yyyy", Locale.US)
- }
- }
-
- // If the date string contains the word "ago" send it off for relative date parsing otherwise use dateFormat
- private fun parseChapterDate(string: String): Long? {
- return if ("ago" in string) {
- parseRelativeDate(string) ?: 0
- } else {
- dateFormat.parse(string)?.time ?: 0
- }
- }
-
- private fun countryOfOriginToSeriesType(country: String) = when (country) {
- "South Korea" -> "Manhwa"
- "Japan" -> "Manga"
- "China" -> "Manhua"
- else -> null
- }
-
- // Subtract relative date (e.g. posted 3 days ago)
- private fun parseRelativeDate(date: String): Long? {
- val trimmedDate = date.substringBefore(" ago").removeSuffix("s").split(" ")
-
- val calendar = Calendar.getInstance()
- when (trimmedDate[1]) {
- "year" -> calendar.apply { add(Calendar.YEAR, -trimmedDate[0].toInt()) }
- "month" -> calendar.apply { add(Calendar.MONTH, -trimmedDate[0].toInt()) }
- "week" -> calendar.apply { add(Calendar.WEEK_OF_MONTH, -trimmedDate[0].toInt()) }
- "day" -> calendar.apply { add(Calendar.DAY_OF_MONTH, -trimmedDate[0].toInt()) }
- "hour" -> calendar.apply { add(Calendar.HOUR_OF_DAY, -trimmedDate[0].toInt()) }
- "minute" -> calendar.apply { add(Calendar.MINUTE, -trimmedDate[0].toInt()) }
- "second" -> calendar.apply { add(Calendar.SECOND, 0) }
- }
-
- return calendar.timeInMillis
- }
-
- override fun pageListParse(document: Document): List {
- val pages = mutableListOf()
-
- val allImages = document.select("div#pages-container + script").first()!!.data()
- .substringAfter("[").substringBefore("];")
- .replace(Regex("""["\\]"""), "")
- .split(",")
-
- for (i in allImages.indices) {
- pages.add(Page(i, "", allImages[i]))
- }
-
- return pages
- }
-
- override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used")
-
- override fun imageRequest(page: Page): Request {
- return if (page.imageUrl!!.startsWith("http")) GET(page.imageUrl!!, headers) else GET(baseUrl + page.imageUrl!!, headers)
- }
-
- override fun getFilterList() = FilterList()
-}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/GenkanGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/GenkanGenerator.kt
deleted file mode 100644
index 1a9645d91..000000000
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/GenkanGenerator.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.genkan
-
-import generator.ThemeSourceData.SingleLang
-import generator.ThemeSourceGenerator
-
-class GenkanGenerator : ThemeSourceGenerator {
-
- override val themePkg = "genkan"
-
- override val themeClass = "Genkan"
-
- override val baseVersionCode: Int = 3
-
- override val sources = listOf(
- SingleLang("Hunlight Scans", "https://hunlight-scans.info", "en"),
- SingleLang("LynxScans", "https://lynxscans.com", "en", overrideVersionCode = 3),
- )
-
- companion object {
- @JvmStatic
- fun main(args: Array) {
- GenkanGenerator().createAll()
- }
- }
-}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/GenkanOriginal.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/GenkanOriginal.kt
deleted file mode 100644
index e48b4a99f..000000000
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/GenkanOriginal.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.genkan
-
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.MangasPage
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.util.asJsoup
-import okhttp3.Request
-import okhttp3.Response
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import org.jsoup.select.Elements
-
-/**
-* For sites using the older Genkan CMS that didn't have a search function
- */
-open class GenkanOriginal(
- override val name: String,
- override val baseUrl: String,
- override val lang: String,
-) : Genkan(name, baseUrl, lang) {
-
- private var searchQuery = ""
- private var searchPage = 1
- private var nextPageSelectorElement = Elements()
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- if (page == 1) searchPage = 1
- searchQuery = query
- return popularMangaRequest(page)
- }
-
- override fun searchMangaParse(response: Response): MangasPage {
- val searchMatches = mutableListOf()
- val document = response.asJsoup()
- searchMatches.addAll(getMatchesFrom(document))
-
- /* call another function if there's more pages to search
- not doing it this way can lead to a false "no results found"
- if no matches are found on the first page but there are matches
- on subsequent pages */
- nextPageSelectorElement = document.select(searchMangaNextPageSelector())
- while (nextPageSelectorElement.hasText()) {
- searchMatches.addAll(searchMorePages())
- }
-
- return MangasPage(searchMatches, false)
- }
-
- // search the given document for matches
- private fun getMatchesFrom(document: Document): MutableList {
- val searchMatches = mutableListOf()
- document.select(searchMangaSelector()).toList()
- .filter { it.text().contains(searchQuery, ignoreCase = true) }
- .map { searchMatches.add(searchMangaFromElement(it)) }
-
- return searchMatches
- }
-
- // search additional pages if called
- private fun searchMorePages(): MutableList {
- searchPage++
- val nextPage = client.newCall(popularMangaRequest(searchPage)).execute().asJsoup()
- val searchMatches = mutableListOf()
- searchMatches.addAll(getMatchesFrom(nextPage))
- nextPageSelectorElement = nextPage.select(searchMangaNextPageSelector())
-
- return searchMatches
- }
-
- override fun searchMangaSelector() = popularMangaSelector()
-
- override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
-
- override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
-}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/GenkanOriginalGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/GenkanOriginalGenerator.kt
deleted file mode 100644
index 8fc0e82b6..000000000
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/genkan/GenkanOriginalGenerator.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.genkan
-
-import generator.ThemeSourceData
-import generator.ThemeSourceGenerator
-
-class GenkanOriginalGenerator : ThemeSourceGenerator {
-
- override val themePkg = "genkan"
-
- override val themeClass = "GenkanOriginal"
-
- override val baseVersionCode: Int = 1
-
- override val sources = emptyList()
-
- companion object {
- @JvmStatic
- fun main(args: Array) {
- GenkanOriginalGenerator().createAll()
- }
- }
-}