From af055bc1cd4859e1a822e07645a816cd1599aec1 Mon Sep 17 00:00:00 2001 From: Corner Date: Sun, 21 Jul 2024 18:38:01 +0800 Subject: [PATCH] feat: ng --- jar/spider.jar | Bin 400825 -> 429033 bytes json/config.json | 11 +- json/configAll.json | 2 +- .../java/com/github/catvod/net/OkRequest.java | 2 + src/main/java/com/github/catvod/spider/NG.kt | 291 ++++++++++++++++++ src/test/java/NgTest.kt | 43 +++ src/test/java/PanSearchTest.java | 1 + src/test/java/PansouTest.java | 1 + src/test/java/PttTest.kt | 4 + src/test/java/common/TestInterface.kt | 2 + 10 files changed, 355 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/github/catvod/spider/NG.kt create mode 100644 src/test/java/NgTest.kt diff --git a/jar/spider.jar b/jar/spider.jar index 276d611bb794d07fca75d38c475d7dbdcd8f2fab..addce6e1cea5325d9ae6e127db8ad77489d2bc57 100644 GIT binary patch delta 37266 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 + private val filters = LinkedHashMap>() + + + private fun getParams(): Map { + val hashMap: HashMap = java.util.HashMap() + hashMap["devices"] = "android" + hashMap["deviceModel"] = "ASUS_I003DD" + hashMap["deviceBrand"] = "ASUS" + hashMap["deviceVersion"] = "9" + hashMap["deviceScreen"] = "2340*1080" + hashMap["appVersionCode"] = "9" + hashMap["appVersionName"] = "1.0.9" + hashMap["time"] = (System.currentTimeMillis() / 1000).toString() + hashMap["imei"] = "" + hashMap["app"] = "ylys" + return hashMap + } + + fun getHeaders(): Map { + val headers = HashMap() + val currentTimeMillis = System.currentTimeMillis() + headers.put("timeMillis", currentTimeMillis.toString()) + headers.put( + "sign", + DigestUtil.md5Hex("#uBFszdEM0oL0JRn@$currentTimeMillis") + ) + return headers + } + + override fun homeContent(filter: Boolean): String { + if(classList.isEmpty()){ + val string = OkHttp.string("$COMMON_URL$FIND_CLASSIFICATION", getParams(), getHeaders()) + val filterList = JsonParser.parseString(string).asJsonArray + for ((index, jsonElement) in filterList.withIndex()) { + if(index == 0) continue + val obj = jsonElement.asJsonObject + val id = obj.get("id").asInt + val name = obj.get("name").asString + val clazz = Class(id.toString(), name) + classList.add(clazz) + val msgs = obj.get("msg").asJsonArray + if(msgs.isEmpty){ + continue + } + for (msg in msgs) { + val msgObj = msg.asJsonObject + val dataArray = msgObj.get("data").asJsonArray + val list = mutableListOf() + for ((index, jsonElement1) in dataArray.withIndex()) { + if(index == 0) continue + list.add(Filter.Value(jsonElement1.asString, jsonElement1.asString)) + } + + filters[name] = listOf(Filter(msgObj.get("name").asString, dataArray.get(0).asString, list)) + } + } + } + return Result.string(classList, filters) + } + + override fun categoryContent( + tid: String, + pg: String, + filter: Boolean, + extend: java.util.HashMap + ): String { + val params = getParams().toMutableMap() + params.putAll(extend) + params["page"] = pg + params["id"] = tid + val string = OkHttp.string("$COMMON_URL$FIND_VIDEO_VOD_LIST", params, getHeaders()) + val type = object : TypeToken>() {}.type + val resp = Json.parseSafe>(string, type) + var vodList = listOf() + if(resp.isSuccess()){ + vodList = resp.list.toVodList() + }else{ + SpiderDebug.log("ng cate error: $string") + } + return Result.string(classList, vodList, filters) + } + + override fun detailContent(ids: MutableList): String { + val map = getParams().toMutableMap() + map["id"] = ids[0] + val string = OkHttp.string("$COMMON_URL$VIDEO_DETAIL", map, getHeaders()) + val type = object : TypeToken>() {}.type + val dt = Json.parseSafe>(string, type) + if(!dt.isSuccess()){ + SpiderDebug.log("ng detail err: ${dt.msg}") + return Result.error(dt.msg) + } + return Result.string(dt.data.toVod()) + } + + override fun playerContent(flag: String, id: String, vipFlags: MutableList): String { + val string = OkHttp.string(id) + val type = object : TypeToken>() {}.type + val rst = Json.parseSafe>(string, type) + if(!rst.isSuccess()){ + SpiderDebug.log("play err: ${rst.msg}") + return Result.error(rst.msg) + } + val filter = rst.data.header.filter { it.key.equals(HttpHeaders.USER_AGENT, true) } + return Result.get().url(ProxyVideo.buildCommonProxyUrl(rst.data.url, filter)).string() + } + + override fun searchContent(key: String, quick: Boolean): String { + val params = getParams().toMutableMap() + params["video_name"] = URLEncodeUtil.encode(key) + val string = OkHttp.string("$COMMON_URL$SEARCH_SEARCH", params, getHeaders()) + val type = object : TypeToken>>() {}.type + val rst = Json.parseSafe>>(string, type) + if(!rst.isSuccess()){ + SpiderDebug.log("ng search error:${rst.msg}") + return Result.error(rst.msg) + } + return Result.string(rst.data[0].toVodList()) + } + + + data class Rst( + val code:Int, + val msg:String, + val limit:String, + val pagecount:Int, + val total:Int, + val list:List, + val data:T + ){ + fun isSuccess(): Boolean { + return code == 1 + } + } + + + data class It( + val id:Int, + val img:String, + val name:String, + val score:String, + val msg:String, + ){ + fun toVod(): Vod { + val vod = Vod() + vod.setVodId(id.toString()) + vod.setVodName(name) + vod.setVodRemarks(score) + vod.setVodPic(img) + return vod + } + } + + data class Dt( + val name:String, + val year:String, + val score: String, + val hits:Int, + val type:String, + val img:String, + val info:String, + @SerializedName("total_count") + val totalCount:Int, + @SerializedName("player_info") + val playerInfo:List + ){ + fun toVod(): Vod { + val vod = Vod() + vod.setVodId(name+score) + vod.setVodName(name) + vod.setVodPic(img) + vod.setVodTag(type) + vod.setVodRemarks(year) + vod.vodContent = info + val vodPlayBuilder = Vod.VodPlayBuilder() + for (info in playerInfo) { + val playUrlList = mutableListOf() + for (vtInfo in info.videoInfo) { + val playUrl = PlayUrl() + playUrl.url = vtInfo.url[0] + playUrl.name = vtInfo.name + playUrl.flag = info.show + playUrlList.add(playUrl) + } + vodPlayBuilder.append(info.show, playUrlList) + } + val build = vodPlayBuilder.build() + vod.setVodPlayFrom(build.vodPlayFrom) + vod.vodPlayUrl = build.vodPlayUrl + return vod + } + } + + data class DtIt( + val id:Int, + val from:String, + val show:String, + @SerializedName("url_count") + val urlCount:Int, + @SerializedName("video_info") + val videoInfo: List + ) + + data class VtInfo( + val id:Int, + val name:String, + val pic:String, + val url:List + ) + + private fun List.toVodList(): MutableList { + val list = mutableListOf() + for (it in this) { + list.add(it.toVod()) + } + return list + } + + data class PlayRst( + val url:String, + val header: Map + ) + + data class SearchRst( + val id: Int, + val name:String, + val data:List + ){ + fun toVodList(): MutableList { + val list = mutableListOf() + for (datum in data) { + list.add(datum.toVOd()) + } + return list + } + } + + data class SearchRstItem( + val id:Int, + val type:Int, + @SerializedName("video_name") + val videoName:String, + val qingxidu:String, + val img:String, + val director:String, + @SerializedName("main_actor") + val mainActor:String, + val category: String + ){ + fun toVOd():Vod{ + val vod = Vod() + vod.setVodId(id.toString()) + vod.setVodTag(qingxidu) + vod.setVodPic(img) + vod.setVodRemarks(category) + vod.setVodName(videoName) + vod.setVodActor(mainActor) + return vod + } + } + +} \ No newline at end of file diff --git a/src/test/java/NgTest.kt b/src/test/java/NgTest.kt new file mode 100644 index 0000000..347f1d1 --- /dev/null +++ b/src/test/java/NgTest.kt @@ -0,0 +1,43 @@ +import com.github.catvod.spider.NG +import common.AssertUtil +import common.TestInterface +import org.junit.jupiter.api.Test + +class NgTest:TestInterface { + override var t: NG + get() = NG() + set(value) {} + + @Test + override fun homeTest() { + val homeContent = t.homeContent(false) + println(homeContent) + AssertUtil.assertResult(homeContent) + } + + @Test + override fun cateTest() { + val categoryContent = t.categoryContent("2", "1", false, hashMapOf()) + println(categoryContent) + AssertUtil.assertResult(categoryContent) + } + + @Test + override fun detailTest() { + val detailContent = t.detailContent(mutableListOf("253915")) + println(detailContent) + } + + @Test + override fun playTest() { + val playerContent = t.playerContent("", "http://43.248.129.14:20240/?url=https://svipsvip.ffzyread1.com/20240627/28803_0fc1e40f/index.m3u8", mutableListOf()) + println(playerContent) + } + + @Test + override fun searchTest() { + val searchContent = t.searchContent("阿凡达", false) + println(searchContent) + AssertUtil.assertResult(searchContent) + } +} \ No newline at end of file diff --git a/src/test/java/PanSearchTest.java b/src/test/java/PanSearchTest.java index 730260c..1ba2577 100644 --- a/src/test/java/PanSearchTest.java +++ b/src/test/java/PanSearchTest.java @@ -1,4 +1,5 @@ import com.github.catvod.spider.PanSearch; +import common.AssertUtil; import org.junit.jupiter.api.Test; public class PanSearchTest { diff --git a/src/test/java/PansouTest.java b/src/test/java/PansouTest.java index 78866b1..d182486 100644 --- a/src/test/java/PansouTest.java +++ b/src/test/java/PansouTest.java @@ -1,4 +1,5 @@ import com.github.catvod.spider.PanSou; +import common.AssertUtil; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/src/test/java/PttTest.kt b/src/test/java/PttTest.kt index 6ca61b1..79bd072 100644 --- a/src/test/java/PttTest.kt +++ b/src/test/java/PttTest.kt @@ -14,6 +14,10 @@ class PttTest : TestInterface { override fun homeTest() { } + override fun searchTest() { + + } + @Test override fun cateTest() { val categoryContent = t.categoryContent("1", "1", false, hashMapOf()) diff --git a/src/test/java/common/TestInterface.kt b/src/test/java/common/TestInterface.kt index 6e1dde9..abc543c 100644 --- a/src/test/java/common/TestInterface.kt +++ b/src/test/java/common/TestInterface.kt @@ -17,6 +17,8 @@ interface TestInterface { fun playTest() + fun searchTest() + fun assert(s:String){ println(s) AssertUtil.assertResult(s)