diff --git a/multisrc/overrides/madara/cerisescans/src/CeriseScan.kt b/multisrc/overrides/madara/cerisescans/src/CeriseScan.kt index 5c99fcdce..1189c730c 100644 --- a/multisrc/overrides/madara/cerisescans/src/CeriseScan.kt +++ b/multisrc/overrides/madara/cerisescans/src/CeriseScan.kt @@ -13,7 +13,7 @@ import java.util.concurrent.TimeUnit class CeriseScan : Madara( "Cerise Scan", - "https://cerisescan.com", + "https://cerisescan.net", "pt-BR", SimpleDateFormat("dd 'de' MMMMM 'de' yyyy", Locale("pt", "BR")), ) { diff --git a/multisrc/overrides/madara/hipercool/src/Hipercool.kt b/multisrc/overrides/madara/hipercool/src/Hipercool.kt index 1c0b3d7ef..2f5d2b8ca 100644 --- a/multisrc/overrides/madara/hipercool/src/Hipercool.kt +++ b/multisrc/overrides/madara/hipercool/src/Hipercool.kt @@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.network.interceptor.rateLimit import okhttp3.OkHttpClient import java.util.concurrent.TimeUnit -class Hipercool : Madara("HipercooL", "https://hipercool.xyz", "pt-BR") { +class Hipercool : Madara("HipercooL", "https://hiper.cool", "pt-BR") { // Migrated from a custom CMS to Madara. override val versionId = 2 diff --git a/multisrc/overrides/mangathemesia/arkhamscan/src/ArkhamScan.kt b/multisrc/overrides/mangathemesia/arkhamscan/src/ArkhamScan.kt deleted file mode 100644 index 3cb503891..000000000 --- a/multisrc/overrides/mangathemesia/arkhamscan/src/ArkhamScan.kt +++ /dev/null @@ -1,22 +0,0 @@ -package eu.kanade.tachiyomi.extension.pt.arkhamscan - -import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia -import eu.kanade.tachiyomi.network.interceptor.rateLimit -import okhttp3.OkHttpClient -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit - -class ArkhamScan : MangaThemesia( - "Arkham Scan", - "https://arkhamscan.com", - "pt-BR", - dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")), -) { - - override val client: OkHttpClient = super.client.newBuilder() - .rateLimit(1, 2, TimeUnit.SECONDS) - .build() - - override val altNamePrefix = "Nomes alternativos: " -} diff --git a/multisrc/overrides/mangathemesia/ssshentais/src/SssHentais.kt b/multisrc/overrides/mangathemesia/ssshentais/src/SssHentais.kt deleted file mode 100644 index 24fb3476b..000000000 --- a/multisrc/overrides/mangathemesia/ssshentais/src/SssHentais.kt +++ /dev/null @@ -1,36 +0,0 @@ -package eu.kanade.tachiyomi.extension.pt.ssshentais - -import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.interceptor.rateLimit -import eu.kanade.tachiyomi.source.model.Page -import okhttp3.OkHttpClient -import okhttp3.Request -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit - -class SssHentais : MangaThemesia( - "SSS Hentais", - "https://hentais.sssscanlator.com", - "pt-BR", - dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")), -) { - - override val client: OkHttpClient = super.client.newBuilder() - .rateLimit(1, 2, TimeUnit.SECONDS) - .build() - - override fun imageRequest(page: Page): Request { - val newHeaders = headersBuilder() - .set("Referer", page.url) - .set("Accept", "image/avif,image/webp,*/*") - .set("Accept-Language", "pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3") - .set("Sec-Fetch-Dest", "image") - .set("Sec-Fetch-Mode", "no-cors") - .set("Sec-Fetch-Site", "same-origin") - .build() - - return GET(page.imageUrl!!, newHeaders) - } -} diff --git a/multisrc/overrides/mmrcms/animaregia/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mmrcms/animaregia/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index dcdea0a5a..000000000 Binary files a/multisrc/overrides/mmrcms/animaregia/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/multisrc/overrides/mmrcms/animaregia/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mmrcms/animaregia/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 3df4aeed7..000000000 Binary files a/multisrc/overrides/mmrcms/animaregia/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/multisrc/overrides/mmrcms/animaregia/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/animaregia/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 2b6b758f5..000000000 Binary files a/multisrc/overrides/mmrcms/animaregia/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/multisrc/overrides/mmrcms/animaregia/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/animaregia/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 32ac4e786..000000000 Binary files a/multisrc/overrides/mmrcms/animaregia/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/multisrc/overrides/mmrcms/animaregia/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/animaregia/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 8494f23d8..000000000 Binary files a/multisrc/overrides/mmrcms/animaregia/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/multisrc/overrides/mmrcms/animaregia/src/AnimaRegia.kt b/multisrc/overrides/mmrcms/animaregia/src/AnimaRegia.kt deleted file mode 100644 index bb778dcf8..000000000 --- a/multisrc/overrides/mmrcms/animaregia/src/AnimaRegia.kt +++ /dev/null @@ -1,115 +0,0 @@ -package eu.kanade.tachiyomi.extension.pt.animaregia - -import eu.kanade.tachiyomi.multisrc.mmrcms.MMRCMS -import eu.kanade.tachiyomi.network.interceptor.rateLimit -import eu.kanade.tachiyomi.source.model.MangasPage -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.OkHttpClient -import okhttp3.Response -import org.jsoup.nodes.Element -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit - -class AnimaRegia : MMRCMS("AnimaRegia", "https://animaregia.net", "pt-BR") { - - override val id: Long = 4378659695320121364 - - override val client: OkHttpClient = super.client.newBuilder() - .rateLimit(1, 2, TimeUnit.SECONDS) - .build() - - // Remove the language tag from the title name. - override fun internalMangaParse(response: Response): MangasPage { - return super.internalMangaParse(response).let { - it.copy( - mangas = it.mangas.map { manga -> - manga.apply { title = title.removeSuffix(LANGUAGE_SUFFIX) } - }, - ) - } - } - - override fun latestUpdatesFromElement(element: Element, urlSelector: String): SManga? { - return super.latestUpdatesFromElement(element, urlSelector) - ?.apply { title = title.removeSuffix(LANGUAGE_SUFFIX) } - } - - override fun gridLatestUpdatesFromElement(element: Element): SManga { - return super.gridLatestUpdatesFromElement(element) - .apply { title = title.removeSuffix(LANGUAGE_SUFFIX) } - } - - // Override searchMangaParse with same body from internalMangaParse since - // it can use the other endpoint instead. - override fun searchMangaParse(response: Response): MangasPage { - return super.searchMangaParse(response).let { - it.copy( - mangas = it.mangas.map { manga -> - manga.apply { title = title.removeSuffix(LANGUAGE_SUFFIX) } - }, - ) - } - } - - // The website modified the information panel. - override fun mangaDetailsParse(response: Response): SManga = SManga.create().apply { - val document = response.asJsoup() - - title = document.selectFirst("h1.widget-title")!!.text() - thumbnail_url = coverGuess( - document.select("div.col-sm-5 img.img-thumbnail").firstOrNull()?.attr("abs:src"), - document.location(), - ) - description = document.select("div.row div.well p")!!.text().trim() - - for (element in document.select("div.col-sm-5 ul.list-group li.list-group-item")) { - when (element.text().trim().lowercase(BRAZILIAN_LOCALE).substringBefore(":")) { - "autor(es)" -> author = element.select("a") - .joinToString(", ") { it.text().trim() } - "artist(s)" -> artist = element.select("a") - .joinToString(", ") { it.text().trim() } - "categorias" -> genre = element.select("a") - .joinToString(", ") { it.text().trim() } - "status" -> status = when (element.select("span.label").text()) { - "Completo", "Concluído" -> SManga.COMPLETED - "Ativo" -> SManga.ONGOING - else -> SManga.UNKNOWN - } - } - } - } - - override fun chapterListSelector(): String = "div.row ul.chapters > li" - - override fun chapterListParse(response: Response): List<SChapter> { - return response.asJsoup() - .select(chapterListSelector()) - .map { el -> - SChapter.create().apply { - name = el.select("h5.chapter-title-rtl").text() - scanlator = el.select("div.col-md-3 ul li") - .joinToString(" & ") { it.text().trim() } - date_upload = el.select("div.col-md-4").firstOrNull() - ?.text()?.removeSuffix("Download")?.toDate() ?: 0L - setUrlWithoutDomain(el.select("h5.chapter-title-rtl a").first()!!.attr("href")) - } - } - } - - private fun String.toDate(): Long { - return runCatching { DATE_FORMAT.parse(trim())?.time } - .getOrNull() ?: 0L - } - - companion object { - private const val LANGUAGE_SUFFIX = " (pt-br)" - private val BRAZILIAN_LOCALE = Locale("pt", "BR") - - private val DATE_FORMAT by lazy { - SimpleDateFormat("dd MMM. yyyy", Locale.ENGLISH) - } - } -} 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 35f32f311..bb11acc41 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 @@ -66,7 +66,7 @@ class MadaraGenerator : ThemeSourceGenerator { SingleLang("Cat300", "https://cat300.com", "th", isNsfw = true, className = "Cat300", overrideVersionCode = 1), SingleLang("CatOnHeadTranslations", "https://catonhead.com", "en", overrideVersionCode = 2), SingleLang("CBHentai", "https://cbhentai.net", "vi", isNsfw = true, overrideVersionCode = 7, pkgName = "hentaicube", className = "HentaiCB"), - SingleLang("Cerise Scan", "https://cerisescan.com", "pt-BR", pkgName = "cerisescans", isNsfw = true, overrideVersionCode = 7), + SingleLang("Cerise Scan", "https://cerisescan.net", "pt-BR", pkgName = "cerisescans", isNsfw = true, overrideVersionCode = 8), SingleLang("Clover Manga", "https://clover-manga.com", "tr", overrideVersionCode = 2), SingleLang("Coco Rip", "https://cocorip.net", "es"), SingleLang("Coffee Manga", "https://coffeemanga.io", "en", isNsfw = false, overrideVersionCode = 2), @@ -144,7 +144,7 @@ class MadaraGenerator : ThemeSourceGenerator { SingleLang("HentaiZM", "https://manga.hentaizm.fun", "tr", isNsfw = true), SingleLang("HentaiZone", "https://hentaizone.xyz", "fr", isNsfw = true, overrideVersionCode = 1), SingleLang("HerenScan", "https://herenscan.com", "es"), - SingleLang("HipercooL", "https://hipercool.xyz", "pt-BR", isNsfw = true, className = "Hipercool"), + SingleLang("HipercooL", "https://hiper.cool", "pt-BR", isNsfw = true, className = "Hipercool", overrideVersionCode = 1), SingleLang("Hiperdex", "https://hiperdex.com", "en", isNsfw = true, overrideVersionCode = 11), SingleLang("HistoireDHentai", "https://hhentai.fr", "fr", isNsfw = true), SingleLang("Hizomanga", "https://hizomanga.com", "ar", overrideVersionCode = 1), diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt index da1028512..43eec3259 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt @@ -20,7 +20,6 @@ class MangaThemesiaGenerator : ThemeSourceGenerator { SingleLang("Alceascan", "https://alceascan.my.id", "id"), SingleLang("Animated Glitched Comics", "https://agscomics.com", "en"), SingleLang("Animated Glitched Scans", "https://anigliscans.xyz", "en", overrideVersionCode = 1), - SingleLang("Arkham Scan", "https://arkhamscan.com", "pt-BR"), SingleLang("Arven Scans", "https://arvenscans.com", "en"), SingleLang("AscalonScans", "https://ascalonscans.com", "en"), SingleLang("Asura Scans", "https://asuratoon.com", "en"), @@ -143,7 +142,6 @@ class MangaThemesiaGenerator : ThemeSourceGenerator { SingleLang("SkyMangas", "https://skymangas.com", "es", overrideVersionCode = 1), SingleLang("Snudae Scans", "https://snudaescans.com", "en", isNsfw = true, className = "BatotoScans", overrideVersionCode = 1), SingleLang("Soul Scans", "https://soulscans.my.id", "id", overrideVersionCode = 1), - SingleLang("SSS Hentais", "https://hentais.sssscanlator.com", "pt-BR", isNsfw = true, className = "SssHentais", overrideVersionCode = 1), SingleLang("SSSScanlator", "https://sssscanlator.com.br", "pt-BR", overrideVersionCode = 2), SingleLang("Starlight Scan", "https://starligthscan.com", "pt-BR", isNsfw = true), SingleLang("Summer Fansub", "https://smmr.in", "pt-BR", isNsfw = true), diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mmrcms/SourceData.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mmrcms/SourceData.kt index 5fe4c6e7f..5e78f2a12 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mmrcms/SourceData.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mmrcms/SourceData.kt @@ -18,7 +18,6 @@ object SourceData { "https://manga.utsukushii-bg.com" -> """{"name":"Utsukushii","base_url":"https://manga.utsukushii-bg.com","supports_latest":true,"item_url":"https://manga.utsukushii-bg.com/manga/","categories":[{"id":"1","name":"Екшън"},{"id":"2","name":"Приключенски"},{"id":"3","name":"Комедия"},{"id":"4","name":"Драма"},{"id":"5","name":"Фентъзи"},{"id":"6","name":"Исторически"},{"id":"7","name":"Ужаси"},{"id":"8","name":"Джосей"},{"id":"9","name":"Бойни изкуства"},{"id":"10","name":"Меха"},{"id":"11","name":"Мистерия"},{"id":"12","name":"Самостоятелна/Пилотна глава"},{"id":"13","name":"Психологически"},{"id":"14","name":"Романтика"},{"id":"15","name":"Училищни"},{"id":"16","name":"Научна фантастика"},{"id":"17","name":"Сейнен"},{"id":"18","name":"Шоджо"},{"id":"19","name":"Реализъм"},{"id":"20","name":"Спорт"},{"id":"21","name":"Свръхестествено"},{"id":"22","name":"Трагедия"},{"id":"23","name":"Йокаи"},{"id":"24","name":"Паралелна вселена"},{"id":"25","name":"Супер сили"},{"id":"26","name":"Пародия"},{"id":"27","name":"Шонен"}]}""" "https://phoenix-scans.pl" -> """{"name":"Phoenix-Scans","base_url":"https://phoenix-scans.pl","supports_latest":true,"item_url":"https://phoenix-scans.pl/manga/","categories":[{"id":"1","name":"Shounen"},{"id":"2","name":"Tragedia"},{"id":"3","name":"Szkolne życie"},{"id":"4","name":"Romans"},{"id":"5","name":"Zagadka"},{"id":"6","name":"Horror"},{"id":"7","name":"Dojrzałe"},{"id":"8","name":"Psychologiczne"},{"id":"9","name":"Przygodowe"},{"id":"10","name":"Akcja"},{"id":"11","name":"Komedia"},{"id":"12","name":"Zboczone"},{"id":"13","name":"Fantasy"},{"id":"14","name":"Harem"},{"id":"15","name":"Historyczne"},{"id":"16","name":"Manhua"},{"id":"17","name":"Manhwa"},{"id":"18","name":"Sztuki walki"},{"id":"19","name":"One shot"},{"id":"20","name":"Sci fi"},{"id":"21","name":"Seinen"},{"id":"22","name":"Shounen ai"},{"id":"23","name":"Spokojne życie"},{"id":"24","name":"Sport"},{"id":"25","name":"Nadprzyrodzone"},{"id":"26","name":"Webtoons"},{"id":"27","name":"Dramat"},{"id":"28","name":"Hentai"},{"id":"29","name":"Mecha"},{"id":"30","name":"Gender Bender"},{"id":"31","name":"Gry"},{"id":"32","name":"Yaoi"}],"tags":[{"id":"aktywne","name":"aktywne"},{"id":"zakonczone","name":"zakończone"},{"id":"porzucone","name":"porzucone"},{"id":"zawieszone","name":"zawieszone"},{"id":"zlicencjonowane","name":"zlicencjonowane"},{"id":"hentai","name":"Hentai"}]}""" "https://lelscanvf.cc" -> """{"name":"Lelscan-VF","base_url":"https://lelscanvf.cc","supports_latest":true,"item_url":"https://lelscanvf.cc/manga/","categories":[{"id":"1","name":"Action"},{"id":"2","name":"Adventure"},{"id":"3","name":"Comedy"},{"id":"4","name":"Doujinshi"},{"id":"5","name":"Drama"},{"id":"6","name":"Ecchi"},{"id":"7","name":"Fantasy"},{"id":"8","name":"Gender Bender"},{"id":"9","name":"Harem"},{"id":"10","name":"Historical"},{"id":"11","name":"Horror"},{"id":"12","name":"Josei"},{"id":"13","name":"Martial Arts"},{"id":"14","name":"Mature"},{"id":"15","name":"Mecha"},{"id":"16","name":"Mystery"},{"id":"17","name":"One Shot"},{"id":"18","name":"Psychological"},{"id":"19","name":"Romance"},{"id":"20","name":"School Life"},{"id":"21","name":"Sci-fi"},{"id":"22","name":"Seinen"},{"id":"23","name":"Shoujo"},{"id":"24","name":"Shoujo Ai"},{"id":"25","name":"Shounen"},{"id":"26","name":"Shounen Ai"},{"id":"27","name":"Slice of Life"},{"id":"28","name":"Sports"},{"id":"29","name":"Supernatural"},{"id":"30","name":"Tragedy"},{"id":"31","name":"Yaoi"},{"id":"32","name":"Yuri"}]}""" - "https://animaregia.net" -> """{"name":"AnimaRegia","base_url":"https://animaregia.net","supports_latest":true,"item_url":"http://animaregia.net/manga/","categories":[{"id":"1","name":"Action"},{"id":"2","name":"Adventure"},{"id":"3","name":"Comedy"},{"id":"4","name":"Doujinshi"},{"id":"5","name":"Drama"},{"id":"6","name":"Ecchi"},{"id":"7","name":"Fantasy"},{"id":"8","name":"Gender Bender"},{"id":"9","name":"Harem"},{"id":"10","name":"Historical"},{"id":"11","name":"Horror"},{"id":"12","name":"Josei"},{"id":"13","name":"Martial Arts"},{"id":"14","name":"Mature"},{"id":"15","name":"Mecha"},{"id":"16","name":"Mystery"},{"id":"17","name":"One Shot"},{"id":"18","name":"Psychological"},{"id":"19","name":"Romance"},{"id":"20","name":"School Life"},{"id":"21","name":"Sci-fi"},{"id":"22","name":"Seinen"},{"id":"23","name":"Shoujo"},{"id":"24","name":"Shoujo Ai"},{"id":"25","name":"Shounen"},{"id":"26","name":"Shounen Ai"},{"id":"27","name":"Slice of Life"},{"id":"28","name":"Sports"},{"id":"29","name":"Supernatural"},{"id":"30","name":"Tragedy"},{"id":"31","name":"Yaoi"},{"id":"32","name":"Yuri"}]}""" "https://mangaid.click" -> """{"name":"MangaID","base_url":"https://mangaid.click","supports_latest":true,"item_url":"https://mangaid.click/manga/","categories":[{"id":"1","name":"Action"},{"id":"2","name":"Adventure"},{"id":"3","name":"Comedy"},{"id":"4","name":"Doujinshi"},{"id":"5","name":"Drama"},{"id":"6","name":"Ecchi"},{"id":"7","name":"Fantasy"},{"id":"8","name":"Gender Bender"},{"id":"9","name":"Harem"},{"id":"10","name":"Historical"},{"id":"11","name":"Horror"},{"id":"12","name":"Josei"},{"id":"13","name":"Martial Arts"},{"id":"14","name":"Mature"},{"id":"15","name":"Mecha"},{"id":"16","name":"Mystery"},{"id":"17","name":"Psychological"},{"id":"18","name":"Romance"},{"id":"19","name":"School Life"},{"id":"20","name":"Sci-fi"},{"id":"21","name":"Seinen"},{"id":"22","name":"Shoujo"},{"id":"23","name":"Shoujo Ai"},{"id":"24","name":"Shounen"},{"id":"25","name":"Shounen Ai"},{"id":"26","name":"Slice of Life"},{"id":"27","name":"Sports"},{"id":"28","name":"Supernatural"},{"id":"29","name":"Tragedy"},{"id":"30","name":"Yaoi"},{"id":"31","name":"Yuri"},{"id":"32","name":"School"},{"id":"33","name":"Isekai"},{"id":"34","name":"Military"}]}""" "https://jpmangas.xyz" -> """{"name":"Jpmangas","base_url":"https://jpmangas.xyz","supports_latest":true,"item_url":"https://jpmangas.xyz/manga/","categories":[{"id":"1","name":"Action"},{"id":"2","name":"Adventure"},{"id":"3","name":"Comedy"},{"id":"4","name":"Doujinshi"},{"id":"5","name":"Drama"},{"id":"6","name":"Ecchi"},{"id":"7","name":"Fantasy"},{"id":"8","name":"Gender Bender"},{"id":"9","name":"Harem"},{"id":"10","name":"Historical"},{"id":"11","name":"Horror"},{"id":"12","name":"Josei"},{"id":"13","name":"Martial Arts"},{"id":"14","name":"Mature"},{"id":"15","name":"Mecha"},{"id":"16","name":"Mystery"},{"id":"17","name":"One Shot"},{"id":"18","name":"Psychological"},{"id":"19","name":"Romance"},{"id":"20","name":"School Life"},{"id":"21","name":"Sci-fi"},{"id":"22","name":"Seinen"},{"id":"23","name":"Shoujo"},{"id":"24","name":"Shoujo Ai"},{"id":"25","name":"Shounen"},{"id":"26","name":"Shounen Ai"},{"id":"27","name":"Slice of Life"},{"id":"28","name":"Sports"},{"id":"29","name":"Supernatural"},{"id":"30","name":"Tragedy"},{"id":"31","name":"Yaoi"},{"id":"32","name":"Yuri"}]}""" "https://www.hentaishark.com" -> """{"name":"HentaiShark","base_url":"https://www.hentaishark.com","supports_latest":true,"item_url":"https://www.hentaishark.com/manga/","categories":[{"id":"1","name":"Doujinshi"},{"id":"2","name":"Manga"},{"id":"3","name":"Western"},{"id":"4","name":"non-h"},{"id":"5","name":"imageset"},{"id":"6","name":"artistcg"},{"id":"7","name":"misc"}]}"""