diff --git a/src/zh/hanhankuman/AndroidManifest.xml b/src/zh/hanhankuman/AndroidManifest.xml
deleted file mode 100644
index 30deb7f79..000000000
--- a/src/zh/hanhankuman/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/src/zh/hanhankuman/build.gradle b/src/zh/hanhankuman/build.gradle
deleted file mode 100644
index 696ec5e70..000000000
--- a/src/zh/hanhankuman/build.gradle
+++ /dev/null
@@ -1,11 +0,0 @@
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-
-ext {
- extName = 'Hanhankuman'
- pkgNameSuffix = 'zh.hanhankuman'
- extClass = '.HanhanKuman'
- extVersionCode = 4
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/zh/hanhankuman/res/mipmap-hdpi/ic_launcher.png b/src/zh/hanhankuman/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 2a71088a9..000000000
Binary files a/src/zh/hanhankuman/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/zh/hanhankuman/res/mipmap-mdpi/ic_launcher.png b/src/zh/hanhankuman/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 2ee17eedb..000000000
Binary files a/src/zh/hanhankuman/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/zh/hanhankuman/res/mipmap-xhdpi/ic_launcher.png b/src/zh/hanhankuman/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index c5e971560..000000000
Binary files a/src/zh/hanhankuman/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/zh/hanhankuman/res/mipmap-xxhdpi/ic_launcher.png b/src/zh/hanhankuman/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 27ded8e71..000000000
Binary files a/src/zh/hanhankuman/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/zh/hanhankuman/res/mipmap-xxxhdpi/ic_launcher.png b/src/zh/hanhankuman/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index d2c4ea147..000000000
Binary files a/src/zh/hanhankuman/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/zh/hanhankuman/res/web_hi_res_512.png b/src/zh/hanhankuman/res/web_hi_res_512.png
deleted file mode 100644
index 581d1a22c..000000000
Binary files a/src/zh/hanhankuman/res/web_hi_res_512.png and /dev/null differ
diff --git a/src/zh/hanhankuman/src/eu/kanade/tachiyomi/extension/zh/hanhankuman/HanhanKuman.kt b/src/zh/hanhankuman/src/eu/kanade/tachiyomi/extension/zh/hanhankuman/HanhanKuman.kt
deleted file mode 100644
index cf653dcea..000000000
--- a/src/zh/hanhankuman/src/eu/kanade/tachiyomi/extension/zh/hanhankuman/HanhanKuman.kt
+++ /dev/null
@@ -1,183 +0,0 @@
-package eu.kanade.tachiyomi.extension.zh.hanhankuman
-
-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.toHttpUrlOrNull
-import okhttp3.Request
-import okhttp3.Response
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-
-class HanhanKuman : ParsedHttpSource() {
-
- override val name = "汗汗酷漫"
- override val baseUrl = "http://www.hhimm.com"
- override val lang = "zh"
- override val supportsLatest = true
-
- override fun popularMangaSelector() = ".cTopComicList > div.cComicItem"
- override fun searchMangaSelector() = ".cComicList > li"
- override fun latestUpdatesSelector() = popularMangaSelector()
- override fun chapterListSelector() = "ul.cVolUl > li"
-
- override fun searchMangaNextPageSelector() = "li.next"
- override fun popularMangaNextPageSelector() = searchMangaNextPageSelector()
- override fun latestUpdatesNextPageSelector() = searchMangaNextPageSelector()
-
- override fun headersBuilder() = super.headersBuilder()
- .add("Referer", baseUrl)
-
- override fun popularMangaRequest(page: Int) = GET("$baseUrl/top/hotrating.aspx", headers)
- override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/top/newrating.aspx", headers)
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val url = "$baseUrl/comic/?act=search&st=$query".toHttpUrlOrNull()?.newBuilder()
- return GET(url.toString(), headers)
- }
-
- override fun mangaDetailsRequest(manga: SManga) = GET(baseUrl + manga.url, headers)
- override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga)
-
- override fun pageListRequest(chapter: SChapter) = GET(baseUrl + chapter.url, headers)
-
- override fun popularMangaFromElement(element: Element) = mangaFromElement(element)
- override fun latestUpdatesFromElement(element: Element) = mangaFromElement(element)
- private fun mangaFromElement(element: Element): SManga {
- val manga = SManga.create()
-
- manga.url = element.select("a").first()!!.attr("href")
- manga.title = element.select("span.cComicTitle").text().trim()
- manga.author = element.select("span.cComicAuthor").first()?.text()?.trim()
- manga.thumbnail_url = element.select("div.cListSlt > a > img").attr("abs:src")
- manga.description = element.select(".cComicMemo").text().trim()
-
- return manga
- }
-
- override fun searchMangaFromElement(element: Element): SManga {
- val manga = SManga.create()
- element.select("a").first().let {
- manga.setUrlWithoutDomain(it.attr("href"))
- manga.title = it.attr("title").trim()
- manga.thumbnail_url = it.select("img").attr("abs:src").trim()
- }
- return manga
- }
-
- override fun chapterFromElement(element: Element): SChapter {
- val chapter = SChapter.create()
-
- element.select("a").let {
- chapter.setUrlWithoutDomain(it.attr("href"))
- chapter.name = it.attr("title").trim()
- }
-
- return chapter
- }
-
- override fun mangaDetailsParse(document: Document): SManga {
- val manga = SManga.create()
- manga.author = document.select("li:contains(作者)").text()?.substringAfterLast(":")?.trim()
- manga.artist = document.select("li:contains(作者)").text()?.substringAfterLast(":")?.trim()
- manga.description = document.select("li:contains(简介)").text().substringAfterLast(":").trim()
- manga.thumbnail_url = document.select("img[src*=comicui]").attr("src")
- manga.status = when (document.select("li:contains(状态)").text()?.substringAfterLast(":")?.trim()) {
- "连载" -> SManga.ONGOING
- "完结" -> SManga.COMPLETED
- // "" -> SManga.LICENSED
- else -> SManga.UNKNOWN
- }
- return manga
- }
-
- override fun pageListParse(response: Response): List {
- val url = response.request.url.toString()
-
- val re = Regex(""".*\/(.*?)\/\d+\.html\?s=(\d+)""")
-
- val matches = re.find(url)?.groups!!
- val pathId = matches[1]!!.value
- val pathS = matches[2]!!.value
-
- return pageListParse(response.asJsoup(), pathId, pathS)
- }
-
- override fun pageListParse(document: Document): List = listOf()
-
- fun pageListParse(document: Document, id: String, s: String): List {
- return document.select("#iPageHtm > a").mapIndexed { i, _ ->
- Page(i, String.format("http://www.hhimm.com/%s/%d.html?s=%s&d=0", id, i + 1, s), "")
- }
- }
-
- override fun imageUrlParse(document: Document): String {
- // get img key
- val imgEleIds = arrayOf("img1021", "img2391", "img7652", "imgCurr")
- var imgKey: String? = null
- for (i in imgEleIds.indices) {
- imgKey = document.select("#" + imgEleIds[i]).attr("name")
- if (imgKey != "") break
- }
-
- val servers = document.select("#hdDomain").attr("value").split("|")
-
- // img key decode
- return if (imgKey != "") {
- servers[0] + unsuan(imgKey!!)
- } else ""
- }
-
- // https://stackoverflow.com/questions/2946067/what-is-the-java-equivalent-to-javascripts-string-fromcharcode
- fun fromCharCode(vararg codePoints: Int): String {
- return String(codePoints, 0, codePoints.size)
- }
-
- private fun unsuan(s: String): String {
- var s = s
- val sw = "44123.com|hhcool.com|hhimm.com"
- val su = "www.hhimm.com"
- var b = false
-
- for (i in 0 until sw.split("|".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray().size) {
- if (su.indexOf(sw.split("|".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[i]) > -1) {
- b = true
- break
- }
- }
- if (!b)
- return ""
-
- val x = s.substring(s.length - 1)
- val w = "abcdefghijklmnopqrstuvwxyz"
- val xi = w.indexOf(x) + 1
- val sk = s.substring(s.length - xi - 12, s.length - xi - 1)
- s = s.substring(0, s.length - xi - 12)
- val k = sk.substring(0, sk.length - 1)
- val f = sk.substring(sk.length - 1)
-
- for (i in k.indices) {
- s = s.replace(k.substring(i, i + 1), i.toString())
- }
- val ss = s.split(f.toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
- s = ""
- for (i in ss.indices) {
- s += fromCharCode(Integer.parseInt(ss[i]))
- }
- return s
- }
-
- private class GenreFilter(genres: Array) : Filter.Select("Genre", genres)
-
- override fun getFilterList() = FilterList(
- GenreFilter(getGenreList())
- )
-
- private fun getGenreList() = arrayOf(
- "All"
- )
-}