diff --git a/.github/workflows/issue_moderator.yml b/.github/workflows/issue_moderator.yml
index 9fd1b3786..10d0ca2c3 100644
--- a/.github/workflows/issue_moderator.yml
+++ b/.github/workflows/issue_moderator.yml
@@ -43,7 +43,7 @@ jobs:
},
{
"type": "both",
- "regex": ".*(hq\\s*dragon|manga\\s*host|supermangas|superhentais|union\\s*mangas|yes\\s*mangas|manhuascan|manhwahot|leitor\\.?net|manga\\s*livre|tsuki\\s*mangas|manga\\s*yabu|mangas\\.in|mangas\\.pw|hentaikai|toptoon\\+?|colamanhua|mangadig|hitomi\\.la|copymanga|neox|1manga\\.co|mangafox\\.fun|mangahere\\.onl|mangakakalot\\.fun|manganel(?!o)|mangaonline\\.fun|mangatoday|manga\\.town|onemanga\\.info|koushoku|ksk\\.moe|comikey|leercapitulo|c[uứ]u\\s*truy[eệ]n|day\\s*comics?|reaper\\s*scans|constellar\\s*scans|mode\\s*scanlator|bakai|japscan).*",
+ "regex": ".*(hq\\s*dragon|manga\\s*host|supermangas|superhentais|union\\s*mangas|yes\\s*mangas|manhuascan|manhwahot|leitor\\.?net|manga\\s*livre|tsuki\\s*mangas|manga\\s*yabu|mangas\\.in|mangas\\.pw|hentaikai|toptoon\\+?|colamanhua|mangadig|hitomi\\.la|copymanga|neox|1manga\\.co|mangafox\\.fun|mangahere\\.onl|mangakakalot\\.fun|manganel(?!o)|mangaonline\\.fun|mangatoday|manga\\.town|onemanga\\.info|koushoku|ksk\\.moe|comikey|leercapitulo|c[uứ]u\\s*truy[eệ]n|day\\s*comics?|reaper\\s*scans|constellar\\s*scans|mode\\s*scanlator|bakai|japscan|izakaya|blackout\\s*comics).*",
"ignoreCase": true,
"labels": ["invalid"],
"message": "{match} will not be added back as it is too difficult to maintain. Read [this](https://github.com/tachiyomiorg/tachiyomi-extensions/blob/master/REMOVED_SOURCES.md) for more information."
diff --git a/REMOVED_SOURCES.md b/REMOVED_SOURCES.md
index 731995e63..c282856a8 100644
--- a/REMOVED_SOURCES.md
+++ b/REMOVED_SOURCES.md
@@ -11,6 +11,7 @@ Here is a list of known sources that were removed.
### Too difficult to maintain
- Bakai https://github.com/tachiyomiorg/tachiyomi-extensions/pull/17890
+- Blackout Comics and Izakaya https://github.com/tachiyomiorg/tachiyomi-extensions/pull/18500
- ColaManhua (COLA漫画) https://github.com/tachiyomiorg/tachiyomi-extensions/pull/11445
- Comikey https://github.com/tachiyomiorg/tachiyomi-extensions/pull/11971
- Constellar Scans https://github.com/tachiyomiorg/tachiyomi-extensions/pull/17277
diff --git a/multisrc/overrides/madara/izakaya/src/Izakaya.kt b/multisrc/overrides/madara/izakaya/src/Izakaya.kt
deleted file mode 100644
index dcde6d952..000000000
--- a/multisrc/overrides/madara/izakaya/src/Izakaya.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.izakaya
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SChapter
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-class Izakaya : Madara(
- "Izakaya",
- "https://leitorizakaya.net",
- "pt-BR",
- SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 3, TimeUnit.SECONDS)
- .build()
-
- override val useNewChapterEndpoint = true
-
- override val chapterUrlSuffix = ""
-
- override fun pageListRequest(chapter: SChapter): Request {
- val fixedUrl = chapter.url.substringBeforeLast("?style=")
-
- if (fixedUrl.startsWith("http")) {
- return GET(fixedUrl, headers)
- }
-
- return GET(baseUrl + fixedUrl, headers)
- }
-
- override fun imageRequest(page: Page): Request {
- val newHeaders = headersBuilder()
- .set("Referer", page.url)
- .set("Accept", "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8")
- .build()
-
- return GET(page.imageUrl!!, newHeaders)
- }
-}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt
index 019be45b9..385cf93b5 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt
@@ -166,7 +166,6 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("IsekaiScan.top (unoriginal)", "https://isekaiscan.top", "en", pkgName = "isekaiscantop", className = "IsekaiScanTop", overrideVersionCode = 1),
SingleLang("IsekaiScanManga (unoriginal)", "https://isekaiscanmanga.com", "en", className = "IsekaiScanManga", overrideVersionCode = 1),
SingleLang("Its Your Right Manhua", "https://itsyourightmanhua.com", "en", className = "ItsYourRightManhua", overrideVersionCode = 2),
- SingleLang("Izakaya", "https://leitorizakaya.net", "pt-BR", isNsfw = true, overrideVersionCode = 2),
SingleLang("Jiangzaitoon", "https://jiangzaitoon.co", "tr", isNsfw = true, overrideVersionCode = 2),
SingleLang("Jimanga", "https://jimanga.com", "en", isNsfw = false),
SingleLang("Kakusei Project", "https://kakuseiproject.com.br", "pt-BR"),
diff --git a/src/pt/blackoutcomics/AndroidManifest.xml b/src/pt/blackoutcomics/AndroidManifest.xml
deleted file mode 100644
index 8072ee00d..000000000
--- a/src/pt/blackoutcomics/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/src/pt/blackoutcomics/build.gradle b/src/pt/blackoutcomics/build.gradle
deleted file mode 100644
index 994fff687..000000000
--- a/src/pt/blackoutcomics/build.gradle
+++ /dev/null
@@ -1,12 +0,0 @@
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-
-ext {
- extName = 'Blackout Comics'
- pkgNameSuffix = 'pt.blackoutcomics'
- extClass = '.BlackoutComics'
- extVersionCode = 2
- isNsfw = true
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/pt/blackoutcomics/res/mipmap-hdpi/ic_launcher.png b/src/pt/blackoutcomics/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index d8959010e..000000000
Binary files a/src/pt/blackoutcomics/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/blackoutcomics/res/mipmap-mdpi/ic_launcher.png b/src/pt/blackoutcomics/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 9d68b4471..000000000
Binary files a/src/pt/blackoutcomics/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/blackoutcomics/res/mipmap-xhdpi/ic_launcher.png b/src/pt/blackoutcomics/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index c8f29da85..000000000
Binary files a/src/pt/blackoutcomics/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/blackoutcomics/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/blackoutcomics/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 9f813633a..000000000
Binary files a/src/pt/blackoutcomics/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/blackoutcomics/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/blackoutcomics/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 6bb118a5a..000000000
Binary files a/src/pt/blackoutcomics/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/blackoutcomics/res/web_hi_res_512.png b/src/pt/blackoutcomics/res/web_hi_res_512.png
deleted file mode 100644
index a6a7a82a3..000000000
Binary files a/src/pt/blackoutcomics/res/web_hi_res_512.png and /dev/null differ
diff --git a/src/pt/blackoutcomics/src/eu/kanade/tachiyomi/extension/pt/blackoutcomics/BlackoutComics.kt b/src/pt/blackoutcomics/src/eu/kanade/tachiyomi/extension/pt/blackoutcomics/BlackoutComics.kt
deleted file mode 100644
index bba89513c..000000000
--- a/src/pt/blackoutcomics/src/eu/kanade/tachiyomi/extension/pt/blackoutcomics/BlackoutComics.kt
+++ /dev/null
@@ -1,154 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.blackoutcomics
-
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-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 okhttp3.Headers
-import okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-class BlackoutComics : ParsedHttpSource() {
-
- override val name = "Blackout Comics"
-
- override val baseUrl = "https://blackoutcomics.com"
-
- override val lang = "pt-BR"
-
- override val supportsLatest = true
-
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .rateLimit(1, 3, TimeUnit.SECONDS)
- .build()
-
- override fun headersBuilder(): Headers.Builder = Headers.Builder()
- .add("Accept", ACCEPT)
- .add("Accept-Language", ACCEPT_LANGUAGE)
- .add("Referer", "$baseUrl/")
-
- override fun popularMangaRequest(page: Int): Request = GET(baseUrl, headers)
-
- override fun popularMangaSelector(): String = "h3:contains(Mais Lidos) ~ div.anime-box a"
-
- override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply {
- title = element.selectFirst("div.anime-blog p")!!.text()
- thumbnail_url = element.selectFirst("img")!!.absUrl("src")
- url = element.attr("href")
- }
-
- override fun popularMangaNextPageSelector(): String? = null
-
- override fun latestUpdatesRequest(page: Int) = popularMangaRequest(page)
-
- override fun latestUpdatesSelector() = "div:contains(Atualizados Recentemente) + div.row div.anime-blog"
-
- override fun latestUpdatesFromElement(element: Element): SManga = SManga.create().apply {
- title = element.selectFirst("a p")!!.text()
- thumbnail_url = element.selectFirst("img")!!.absUrl("src")
- url = element.selectFirst("a")!!.attr("href")
- }
-
- override fun latestUpdatesNextPageSelector(): String? = null
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val url = "$baseUrl/comics".toHttpUrl().newBuilder()
- .addQueryParameter("search", query)
- .build()
-
- return GET(url, headers)
- }
-
- override fun searchMangaSelector() = "section.anime div.anime-box"
-
- override fun searchMangaFromElement(element: Element): SManga = SManga.create().apply {
- title = element.selectFirst("p")!!.text()
- thumbnail_url = element.selectFirst("img")!!.absUrl("src")
- url = element.selectFirst("[onclick]")!!.attr("onclick")
- .substringAfter("'")
- .substringBeforeLast("'")
- }
-
- override fun searchMangaNextPageSelector(): String? = null
-
- override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
- val infoElement = document.selectFirst("section.video")!!
-
- title = infoElement.selectFirst("h2")!!.text()
- author = infoElement.selectFirst("div.trailer-content p:contains(Autor:) b")!!.text()
- artist = infoElement.selectFirst("div.trailer-content p:contains(Artista:) b")!!.text()
- genre = infoElement.selectFirst("div.trailer-content p:contains(Genêros:)")!!.ownText()
- status = infoElement.selectFirst("div.trailer-content p:contains(Status:) b")!!.text().toStatus()
- description = infoElement.selectFirst("h3:contains(Descrição) + p")!!.text()
- thumbnail_url = infoElement.selectFirst("img")!!.absUrl("src")
- }
-
- override fun chapterListSelector() = "section.relese h5:not(:has(img.vip))"
-
- override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
- name = element.selectFirst("a")!!.ownText()
- date_upload = element.select("span:last-of-type").text().toDate()
- url = element.selectFirst("a")!!.attr("href")
- }
-
- override fun pageListRequest(chapter: SChapter): Request {
- val newHeaders = headersBuilder()
- .set("Referer", baseUrl + chapter.url.substringBeforeLast("/ler"))
- .add("Sec-Fetch-Dest", "document")
- .add("Sec-Fetch-Mode", "navigate")
- .add("Sec-Fetch-Site", "same-origin")
- .add("Sec-Fetch-User", "?1")
- .build()
-
- return GET(baseUrl + chapter.url, newHeaders)
- }
-
- override fun pageListParse(document: Document): List {
- return document.select("div.chapter-image canvas")
- .mapIndexed { index, element ->
- Page(index, document.location(), element.absUrl("data-src"))
- }
- }
-
- override fun imageUrlParse(document: Document) = ""
-
- override fun imageRequest(page: Page): Request {
- val newHeaders = headersBuilder()
- .set("Referer", page.url)
- .set("Accept", "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8")
- .build()
-
- return GET(page.imageUrl!!, newHeaders)
- }
-
- private fun String.toDate(): Long {
- return runCatching { DATE_FORMATTER.parse(trim())?.time }
- .getOrNull() ?: 0L
- }
-
- private fun String.toStatus() = when (this) {
- "Em Lançamento" -> SManga.ONGOING
- "Completo" -> SManga.COMPLETED
- "Cancelado" -> SManga.CANCELLED
- "Em Espera" -> SManga.ON_HIATUS
- else -> SManga.UNKNOWN
- }
-
- companion object {
- private const val ACCEPT = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
- private const val ACCEPT_LANGUAGE = "pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3"
-
- private val DATE_FORMATTER by lazy {
- SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR"))
- }
- }
-}