parent
6a7b9b00b3
commit
05a30b5a68
|
@ -0,0 +1,13 @@
|
|||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
|
||||
ext {
|
||||
appName = 'Tachiyomi: Gufeng Manhua'
|
||||
pkgNameSuffix = 'zh.gufengmh'
|
||||
extClass = '.Gufengmh'
|
||||
extVersionCode = 1
|
||||
libVersion = '1.2'
|
||||
}
|
||||
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
After Width: | Height: | Size: 4.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 7.7 KiB |
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
|
@ -0,0 +1,408 @@
|
|||
package eu.kanade.tachiyomi.extension.zh.gufengmh
|
||||
|
||||
import android.net.Uri
|
||||
import android.util.Log
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.source.model.*
|
||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import org.jsoup.nodes.Document
|
||||
import org.jsoup.nodes.Element
|
||||
|
||||
|
||||
class Gufengmh : ParsedHttpSource() {
|
||||
override val name: String = "古风漫画网"
|
||||
override val lang: String = "zh"
|
||||
override val supportsLatest: Boolean = true
|
||||
override val baseUrl: String = "https://m.gufengmh8.com"
|
||||
|
||||
//Popular
|
||||
|
||||
|
||||
override fun popularMangaRequest(page: Int): Request {
|
||||
return GET("$baseUrl/list/click/?page=$page", headers)
|
||||
}
|
||||
override fun popularMangaNextPageSelector(): String? = "li.next"
|
||||
override fun popularMangaSelector(): String = "li.list-comic"
|
||||
override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply {
|
||||
title = element.select("a.txtA").text()
|
||||
setUrlWithoutDomain(element.select("a.txtA").attr("abs:href"))
|
||||
thumbnail_url = element.select("mip-img").attr("abs:src")
|
||||
}
|
||||
|
||||
//Latest
|
||||
|
||||
override fun latestUpdatesRequest(page: Int): Request {
|
||||
return GET("$baseUrl/list/update/?page=$page", headers)
|
||||
}
|
||||
override fun latestUpdatesNextPageSelector(): String? = popularMangaNextPageSelector()
|
||||
override fun latestUpdatesSelector(): String = popularMangaSelector()
|
||||
override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element)
|
||||
|
||||
//Search
|
||||
|
||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||
val uri = Uri.parse(baseUrl).buildUpon()
|
||||
if (query.isNotBlank()) {
|
||||
uri.appendPath("search")
|
||||
.appendQueryParameter("keywords", query)
|
||||
.appendQueryParameter("page", page.toString())
|
||||
} else {
|
||||
uri.appendPath("list")
|
||||
val pathBuilder = Uri.Builder()
|
||||
filters.forEach {
|
||||
if (it is UriFilter)
|
||||
it.addToUri(pathBuilder)
|
||||
}
|
||||
val filterPath = pathBuilder.toString().replace("/","-").removePrefix("-")
|
||||
uri.appendEncodedPath(filterPath)
|
||||
.appendEncodedPath("")
|
||||
}
|
||||
|
||||
return GET(uri.toString(), headers)
|
||||
}
|
||||
|
||||
override fun searchMangaNextPageSelector(): String? = popularMangaNextPageSelector()
|
||||
override fun searchMangaSelector(): String = "div.itemBox, li.list-comic"
|
||||
override fun searchMangaFromElement(element: Element): SManga = SManga.create().apply {
|
||||
title = element.select("a.title, a.txtA").text()
|
||||
setUrlWithoutDomain(element.select("a.title, a.txtA").attr("abs:href"))
|
||||
thumbnail_url = element.select("mip-img").attr("abs:src")
|
||||
}
|
||||
|
||||
//Details
|
||||
|
||||
override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
|
||||
title = document.select("h1.title").text()
|
||||
thumbnail_url = document.select("div#Cover mip-img").attr("abs:src")
|
||||
author = document.select("dt:contains(作者) + dd").text()
|
||||
artist = author
|
||||
genre = document.select("dt:contains(类别) + dd").text()
|
||||
description = document.select("p.txtDesc").text()
|
||||
}
|
||||
|
||||
//Chapters
|
||||
|
||||
override fun chapterListSelector(): String = "div.list li"
|
||||
override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
|
||||
url = element.select("a").attr("href")
|
||||
name = element.select("span").text()
|
||||
}
|
||||
override fun chapterListParse(response: Response): List<SChapter> {
|
||||
return super.chapterListParse(response).reversed()
|
||||
}
|
||||
|
||||
//Pages
|
||||
|
||||
override fun pageListParse(document: Document): List<Page> = mutableListOf<Page>().apply {
|
||||
val script = document.select("script:containsData(chapterImages )").html()
|
||||
val images = script.substringAfter("chapterImages = [\"").substringBefore("\"]").split("\",\"")
|
||||
val path = script.substringAfter("chapterPath = \"").substringBefore("\";")
|
||||
val server = script.substringAfter("pageImage = \"").substringBefore("/images/cover")
|
||||
images.forEach {
|
||||
add(Page(size,"","$server/$path/$it"))
|
||||
}
|
||||
}
|
||||
override fun imageUrlParse(document: Document): String = throw Exception("Not Used")
|
||||
|
||||
//Filters
|
||||
|
||||
override fun getFilterList(): FilterList {
|
||||
val filterList = FilterList(
|
||||
Filter.Header("如果使用文本搜索"),
|
||||
Filter.Header("过滤器将被忽略"),
|
||||
typefilter(),
|
||||
regionfilter(),
|
||||
genrefilter(),
|
||||
letterfilter(),
|
||||
statusfilter()
|
||||
)
|
||||
return filterList
|
||||
}
|
||||
|
||||
private class typefilter: UriSelectFilterPath("按类型","filtertype", arrayOf(
|
||||
Pair("","全部"),
|
||||
Pair("shaonian","少年漫画"),
|
||||
Pair("shaonv","少女漫画"),
|
||||
Pair("qingnian","青年漫画"),
|
||||
Pair("zhenrenmanhua","真人漫画")
|
||||
))
|
||||
|
||||
private class regionfilter: UriSelectFilterPath("按地区","filterregion", arrayOf(
|
||||
Pair("","全部"),
|
||||
Pair("ribenmanhua","日本漫画"),
|
||||
Pair("guochanmanhua","国产漫画"),
|
||||
Pair("gangtaimanhua","港台漫画"),
|
||||
Pair("oumeimanhua","欧美漫画"),
|
||||
Pair("hanguomanhua","韩国漫画")
|
||||
))
|
||||
|
||||
private class genrefilter: UriSelectFilterPath("按剧情","filtergenre", arrayOf(
|
||||
Pair("","全部"),
|
||||
Pair("maoxian","冒险"),
|
||||
Pair("mofa","魔法"),
|
||||
Pair("kehuan","科幻"),
|
||||
Pair("kongbu","恐怖"),
|
||||
Pair("lishi","历史"),
|
||||
Pair("jingji","竞技"),
|
||||
Pair("huanlexiang","欢乐向"),
|
||||
Pair("xifangmohuan","西方魔幻"),
|
||||
Pair("aiqing","爱情"),
|
||||
Pair("xuanyi","悬疑"),
|
||||
Pair("qihuan","奇幻"),
|
||||
Pair("qingxiaoshuo","轻小说"),
|
||||
Pair("sige","四格"),
|
||||
Pair("shengui","神鬼"),
|
||||
Pair("zhiyu","治愈"),
|
||||
Pair("xiaoyuan","校园"),
|
||||
Pair("weiniang","伪娘"),
|
||||
Pair("danmei","耽美"),
|
||||
Pair("hougong","后宫"),
|
||||
Pair("mohuan","魔幻"),
|
||||
Pair("wuxia","武侠"),
|
||||
Pair("zhichang","职场"),
|
||||
Pair("zhentan","侦探"),
|
||||
Pair("meishi","美食"),
|
||||
Pair("gedou","格斗"),
|
||||
Pair("lizhi","励志"),
|
||||
Pair("yinyuewudao","音乐舞蹈"),
|
||||
Pair("rexue","热血"),
|
||||
Pair("zhanzheng","战争"),
|
||||
Pair("gaoxiao","搞笑"),
|
||||
Pair("shenghuo","生活"),
|
||||
Pair("baihe","百合"),
|
||||
Pair("mengji","萌系"),
|
||||
Pair("jiecao","节操"),
|
||||
Pair("xingzhuanhuan","性转换"),
|
||||
Pair("yanyi","颜艺"),
|
||||
Pair("gufeng","古风"),
|
||||
Pair("xianxia","仙侠"),
|
||||
Pair("zhaiji","宅系"),
|
||||
Pair("juqing","剧情"),
|
||||
Pair("shenmo","神魔"),
|
||||
Pair("xuanhuan","玄幻"),
|
||||
Pair("chuanyue","穿越"),
|
||||
Pair("qita","其他"),
|
||||
Pair("huanxiang","幻想"),
|
||||
Pair("motong","墨瞳"),
|
||||
Pair("maimeng","麦萌"),
|
||||
Pair("manman","漫漫"),
|
||||
Pair("manhuadao","漫画岛"),
|
||||
Pair("tuili","推理"),
|
||||
Pair("dongfang","东方"),
|
||||
Pair("kuaikan","快看"),
|
||||
Pair("jizhan","机战"),
|
||||
Pair("gaoqingdanxing","高清单行"),
|
||||
Pair("xinzuo","新作"),
|
||||
Pair("tougao","投稿"),
|
||||
Pair("richang","日常"),
|
||||
Pair("shougong","手工"),
|
||||
Pair("yundong","运动"),
|
||||
Pair("weimei","唯美"),
|
||||
Pair("dushi","都市"),
|
||||
Pair("jingxian","惊险"),
|
||||
Pair("jiangshi","僵尸"),
|
||||
Pair("lianai","恋爱"),
|
||||
Pair("nuexin","虐心"),
|
||||
Pair("chunai","纯爱"),
|
||||
Pair("fuchou","复仇"),
|
||||
Pair("dongzuo","动作"),
|
||||
Pair("qita2","其它"),
|
||||
Pair("egao","恶搞"),
|
||||
Pair("mingxing","明星"),
|
||||
Pair("zhenhan","震撼"),
|
||||
Pair("anhei","暗黑"),
|
||||
Pair("naodong","脑洞"),
|
||||
Pair("xuexing","血腥"),
|
||||
Pair("youyaoqi","有妖气"),
|
||||
Pair("jijia","机甲"),
|
||||
Pair("qingchun","青春"),
|
||||
Pair("lingyi","灵异"),
|
||||
Pair("tongren","同人"),
|
||||
Pair("langman","浪漫"),
|
||||
Pair("quanmou","权谋"),
|
||||
Pair("shehui","社会"),
|
||||
Pair("gongdou","宫斗"),
|
||||
Pair("baoxiao","爆笑"),
|
||||
Pair("tiyu","体育"),
|
||||
Pair("lanmu","栏目"),
|
||||
Pair("caihong","彩虹"),
|
||||
Pair("zhentantuili","侦探推理"),
|
||||
Pair("shaonuaiqing","少女爱情"),
|
||||
Pair("gaoxiaoxiju","搞笑喜剧"),
|
||||
Pair("kongbulingyi","恐怖灵异"),
|
||||
Pair("kehuanmohuan","科幻魔幻"),
|
||||
Pair("jingjitiyu","竞技体育"),
|
||||
Pair("wuxiagedou","武侠格斗"),
|
||||
Pair("jianniang","舰娘"),
|
||||
Pair("danmeiBL","耽美BL"),
|
||||
Pair("xiee","邪恶"),
|
||||
Pair("zongheqita","综合其它"),
|
||||
Pair("qingnian","青年"),
|
||||
Pair("zhainan","宅男"),
|
||||
Pair("zazhi","杂志"),
|
||||
Pair("yinyue","音乐"),
|
||||
Pair("quancai","全彩"),
|
||||
Pair("heidao","黑道"),
|
||||
Pair("lianaidanmei","恋爱耽美"),
|
||||
Pair("rexuemaoxian","热血冒险"),
|
||||
Pair("funv","腐女"),
|
||||
Pair("gushi","故事"),
|
||||
Pair("shaonv","少女"),
|
||||
Pair("zongcai","总裁"),
|
||||
Pair("baoxiaoxiju","爆笑喜剧"),
|
||||
Pair("qitamanhua","其他漫画"),
|
||||
Pair("lianaishenghuo","恋爱生活"),
|
||||
Pair("kongbuxuanyi","恐怖悬疑"),
|
||||
Pair("danmeirensheng","耽美人生"),
|
||||
Pair("chongwu","宠物"),
|
||||
Pair("zhandou","战斗"),
|
||||
Pair("zhaohuanshou","召唤兽"),
|
||||
Pair("yineng","异能"),
|
||||
Pair("zhuangbi","装逼"),
|
||||
Pair("yishijie","异世界"),
|
||||
Pair("zhengju","正剧"),
|
||||
Pair("wenxin","温馨"),
|
||||
Pair("jingqi","惊奇"),
|
||||
Pair("jiakong","架空"),
|
||||
Pair("qingsong","轻松"),
|
||||
Pair("weilai","未来"),
|
||||
Pair("keji","科技"),
|
||||
Pair("shaonao","烧脑"),
|
||||
Pair("gaoxiaoegao","搞笑恶搞"),
|
||||
Pair("mhuaquan","mhuaquan"),
|
||||
Pair("shaonian","少年"),
|
||||
Pair("sigeduoge","四格多格"),
|
||||
Pair("bazong","霸总"),
|
||||
Pair("xiuzhen","修真"),
|
||||
Pair("gushimanhua","故事漫画"),
|
||||
Pair("huiben","绘本"),
|
||||
Pair("youxi","游戏"),
|
||||
Pair("zhenren","真人"),
|
||||
Pair("jingsong","惊悚"),
|
||||
Pair("manhua","漫画"),
|
||||
Pair("weizhongquan","微众圈"),
|
||||
Pair("yujie","御姐"),
|
||||
Pair("xiaoshuogaibian","小说改编"),
|
||||
Pair("luoli","萝莉"),
|
||||
Pair("1024manhua","1024manhua"),
|
||||
Pair("jiating","家庭"),
|
||||
Pair("shenhua","神话"),
|
||||
Pair("shishi","史诗"),
|
||||
Pair("moshi","末世"),
|
||||
Pair("yulequan","娱乐圈"),
|
||||
Pair("gandong","感动"),
|
||||
Pair("lunli","伦理"),
|
||||
Pair("zazhiquanben","杂志全本"),
|
||||
Pair("zhiyu2","致郁"),
|
||||
Pair("shangzhan","商战"),
|
||||
Pair("zhupu","主仆"),
|
||||
Pair("manhuaquan","漫画圈"),
|
||||
Pair("lianaijuqingmanhua","恋爱、剧情漫画"),
|
||||
Pair("hunai","婚爱"),
|
||||
Pair("haomen","豪门"),
|
||||
Pair("neihan","内涵"),
|
||||
Pair("xingzhuan","性转"),
|
||||
Pair("xiangcun","乡村"),
|
||||
Pair("gongting","宫廷"),
|
||||
Pair("duanzi","段子"),
|
||||
Pair("chunaimanhua","纯爱漫画"),
|
||||
Pair("nixi","逆袭"),
|
||||
Pair("hunyin","婚姻"),
|
||||
Pair("baihenvxing","百合女性"),
|
||||
Pair("shenghuomanhua","生活漫画"),
|
||||
Pair("ertong","儿童"),
|
||||
Pair("wudao","舞蹈"),
|
||||
Pair("tianchong","甜宠"),
|
||||
Pair("wengai","文改"),
|
||||
Pair("dujia","独家"),
|
||||
Pair("biaoqian","标签"),
|
||||
Pair("zhaifumanhua","宅腐漫画"),
|
||||
Pair("qinggan","情感"),
|
||||
Pair("mingkatong","茗卡通"),
|
||||
Pair("jiujie","纠结"),
|
||||
Pair("lianaimaoxiangaoxiao","恋爱冒险搞笑"),
|
||||
Pair("xiuzhenlianaijiakong","修真恋爱架空"),
|
||||
Pair("lianaigaoxiaohougong","恋爱搞笑后宫"),
|
||||
Pair("xuanyikongbu","悬疑恐怖"),
|
||||
Pair("lianaixiaoyuanshenghuo","恋爱校园生活"),
|
||||
Pair("xiuzhenlianaigufeng","修真恋爱古风"),
|
||||
Pair("shenghuoxuanyilingyi","生活悬疑灵异"),
|
||||
Pair("qingnianmanhua","青年漫画"),
|
||||
Pair("lishimanhua","历史漫画"),
|
||||
Pair("meishaonv","美少女"),
|
||||
Pair("shuangliu","爽流"),
|
||||
Pair("qiangwei","蔷薇"),
|
||||
Pair("gaozhishang","高智商"),
|
||||
Pair("xuanyituili","悬疑推理"),
|
||||
Pair("jizhi","机智"),
|
||||
Pair("donghua","动画"),
|
||||
Pair("rexuedongzuo","热血动作"),
|
||||
Pair("xiuji","秀吉"),
|
||||
Pair("AA","AA"),
|
||||
Pair("gaibian","改编"),
|
||||
Pair("juwei","橘味")
|
||||
))
|
||||
|
||||
private class letterfilter: UriSelectFilterPath("按字母","filterletter", arrayOf(
|
||||
Pair("","全部"),
|
||||
Pair("a","A"),
|
||||
Pair("b","B"),
|
||||
Pair("c","C"),
|
||||
Pair("d","D"),
|
||||
Pair("e","E"),
|
||||
Pair("f","F"),
|
||||
Pair("g","G"),
|
||||
Pair("h","H"),
|
||||
Pair("i","I"),
|
||||
Pair("j","J"),
|
||||
Pair("k","K"),
|
||||
Pair("l","L"),
|
||||
Pair("m","M"),
|
||||
Pair("n","N"),
|
||||
Pair("o","O"),
|
||||
Pair("p","P"),
|
||||
Pair("q","Q"),
|
||||
Pair("r","R"),
|
||||
Pair("s","S"),
|
||||
Pair("t","T"),
|
||||
Pair("u","U"),
|
||||
Pair("v","V"),
|
||||
Pair("w","W"),
|
||||
Pair("x","X"),
|
||||
Pair("y","Y"),
|
||||
Pair("z","Z"),
|
||||
Pair("1","其他")
|
||||
))
|
||||
|
||||
private class statusfilter: UriSelectFilterPath("按进度","filterstatus",arrayOf(
|
||||
Pair("","全部"),
|
||||
Pair("wanjie","已完结"),
|
||||
Pair("lianzai","连载中")
|
||||
))
|
||||
|
||||
/**
|
||||
* Class that creates a select filter. Each entry in the dropdown has a name and a display name.
|
||||
* If an entry is selected it is appended as a query parameter onto the end of the URI.
|
||||
* If `firstIsUnspecified` is set to true, if the first entry is selected, nothing will be appended on the the URI.
|
||||
*/
|
||||
//vals: <name, display>
|
||||
private open class UriSelectFilterPath(displayName: String, val uriParam: String, val vals: Array<Pair<String, String>>,
|
||||
val firstIsUnspecified: Boolean = true,
|
||||
defaultValue: Int = 0) :
|
||||
Filter.Select<String>(displayName, vals.map { it.second }.toTypedArray(), defaultValue), UriFilter {
|
||||
override fun addToUri(uri: Uri.Builder) {
|
||||
if (state != 0 || !firstIsUnspecified)
|
||||
uri.appendPath(vals[state].first)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a filter that is able to modify a URI.
|
||||
*/
|
||||
private interface UriFilter {
|
||||
fun addToUri(uri: Uri.Builder)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue