合并流返回代码

This commit is contained in:
lushunming 2025-09-23 15:53:55 +08:00
parent a578aaf6c3
commit d54be2ad8e
7 changed files with 188 additions and 55 deletions

View File

@ -6,13 +6,16 @@ import com.github.catvod.bean.Vod;
import com.github.catvod.utils.Util;
import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Data {
@SerializedName(value = "jump_id", alternate = "id")
@SerializedName("jump_id")
private String jumpId;
@SerializedName("id")
private String id;
@SerializedName(value = "thumbnail", alternate = "path")
private String thumbnail;
@SerializedName("title")
@ -24,24 +27,30 @@ public class Data {
@SerializedName("playlist")
private Value playlist;
@SerializedName("year")
private Value year;
private String year;
@SerializedName("area")
private Value area;
private String area;
@SerializedName("types")
private List<Value> types;
@SerializedName("actors")
private List<Value> actors;
@SerializedName("directors")
private List<Value> directors;
@SerializedName("btbo_downlist")
private List<BtboDown> btboDownlist;
@SerializedName("source_list_source")
private List<SourceListSource> source;
@SerializedName("dataList")
private List<Data> dataList;
public String getJumpId() {
return TextUtils.isEmpty(jumpId) ? "" : jumpId;
}
public String getThumbnail() {
return TextUtils.isEmpty(thumbnail) ? "" : thumbnail + "@Referer=www.jianpianapp.com@User-Agent=jianpian-version362";
public String getId() {
return TextUtils.isEmpty(id) ? "" : id;
}
public String getThumbnail(String imgDomain) {
return TextUtils.isEmpty(thumbnail) ? "" : "http://" + imgDomain + thumbnail;
}
public String getTitle() {
@ -61,11 +70,11 @@ public class Data {
}
public String getYear() {
return year == null ? "" : year.getTitle();
return year == null ? "" : year;
}
public String getArea() {
return area == null ? "" : area.getTitle();
return area == null ? "" : area;
}
public String getTypes() {
@ -80,12 +89,20 @@ public class Data {
return directors == null ? "" : getValues(directors, true);
}
public List<BtboDown> getBtboDownlist() {
return btboDownlist == null ? Collections.emptyList() : btboDownlist;
public List<SourceListSource> getSource() {
return source == null ? Collections.emptyList() : source;
}
public Vod vod() {
return new Vod(getJumpId(), getTitle(), getThumbnail(), getMask());
public List<Data> getDataList() {
return dataList == null ? Collections.emptyList() : dataList;
}
public Vod homeVod(String imgDomain) {
return new Vod(getJumpId(), getTitle(), getThumbnail(imgDomain));
}
public Vod vod(String imgDomain) {
return new Vod(getId(), getTitle(), getThumbnail(imgDomain), getMask());
}
public String getValues(List<Value> items, boolean link) {
@ -94,12 +111,6 @@ public class Data {
return Util.substring(sb.toString());
}
public String getPlayUrl() {
StringBuilder sb = new StringBuilder();
for (BtboDown value : getBtboDownlist()) sb.append(value.getVal()).append("#");
return Util.substring(sb.toString());
}
public static class Value {
@SerializedName(value = "title", alternate = "name")
@ -118,13 +129,51 @@ public class Data {
}
}
public static class BtboDown {
public static class SourceListSource {
@SerializedName("val")
private String val;
@SerializedName("name")
private String name;
@SerializedName("source_list")
private List<SourceList> list;
public String getVal() {
return TextUtils.isEmpty(val) ? "" : val.replaceAll("ftp", "tvbox-xg:ftp");
public String getName() {
return TextUtils.isEmpty(name) ? "" : name;
}
public List<SourceList> getList() {
return list == null ? Collections.emptyList() : list;
}
}
public static class SourceList {
@SerializedName("source_name")
private String name;
@SerializedName("url")
private String url;
public String getName() {
return TextUtils.isEmpty(name) ? "" : name;
}
public String getUrl() {
return TextUtils.isEmpty(url) ? "" : url.replaceAll("ftp", "tvbox-xg:ftp");
}
}
public String getVodFrom() {
List<String> items = new ArrayList<>();
for (SourceListSource source : getSource()) items.add(source.getName());
return TextUtils.join("$$$", items);
}
public String getVodUrl() {
List<String> items = new ArrayList<>();
for (SourceListSource source : getSource()) {
List<String> urls = new ArrayList<>();
for (SourceList item : source.getList()) urls.add(item.getName() + "$" + item.getUrl());
items.add(TextUtils.join("#", urls));
}
return TextUtils.join("$$$", items);
}
}

View File

@ -0,0 +1,52 @@
package com.github.catvod.bean.jianpian;
import android.text.TextUtils;
import com.github.catvod.bean.Vod;
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import java.util.Collections;
import java.util.List;
public class Search {
@SerializedName("data")
private List<Search> data;
@SerializedName("id")
private String id;
@SerializedName(value = "thumbnail", alternate = "path")
private String thumbnail;
@SerializedName("title")
private String title;
@SerializedName("mask")
private String mask;
public static Search objectFrom(String str) {
return new Gson().fromJson(str, Search.class);
}
public String getId() {
return TextUtils.isEmpty(id) ? "" : id;
}
public String getThumbnail(String imgDomain) {
return TextUtils.isEmpty(thumbnail) ? "" : "http://" + imgDomain + thumbnail;
}
public String getTitle() {
return TextUtils.isEmpty(title) ? "" : title;
}
public String getMask() {
return TextUtils.isEmpty(mask) ? "" : mask;
}
public Vod vod(String imgDomain) {
return new Vod(getId(), getTitle(), getThumbnail(imgDomain), getMask());
}
public List<Search> getData() {
return data == null ? Collections.emptyList() : data;
}
}

View File

@ -1,84 +1,114 @@
package com.github.catvod.spider;
import android.content.Context;
import com.github.catvod.bean.Class;
import com.github.catvod.bean.Result;
import com.github.catvod.bean.Vod;
import com.github.catvod.bean.jianpian.Data;
import com.github.catvod.bean.jianpian.Detail;
import com.github.catvod.bean.jianpian.Resp;
import com.github.catvod.bean.jianpian.Search;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Json;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.net.URLEncoder;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Qile
*/
public class Jianpian extends Spider {
private final String siteUrl = "http://api2.rinhome.com";
private String siteUrl = "https://ev5356.970xw.com";
private String imgDomain;
private String extend;
private Map<String, String> getHeader() {
Map<String, String> headers = new HashMap<>();
headers.put("User-Agent", "jianpian-android/360");
headers.put("JPAUTH", "y261ow7kF2dtzlxh1GS9EB8nbTxNmaK/QQIAjctlKiEv");
headers.put("User-Agent", "Mozilla/5.0 (Linux; Android 9; V2196A Build/PQ3A.190705.08211809; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36;webank/h5face;webank/1.0;netType:NETWORK_WIFI;appVersion:416;packageName:com.jp3.xg3");
headers.put("Referer", siteUrl);
return headers;
}
@Override
public void init(Context context, String extend) throws Exception {
this.extend = extend;
JsonObject domains = new Gson().fromJson(OkHttp.string("https://dns.alidns.com/resolve?name=swrdsfeiujo25sw.cc&type=TXT"), JsonObject.class);
String parts = domains.getAsJsonArray("Answer").get(0).getAsJsonObject().get("data").getAsString();
parts = parts.replace("\"", "");
String[] domain = parts.split(",");
for (String d : domain) {
siteUrl = "https://wangerniu." + d;
String json = OkHttp.string(siteUrl + "/api/appAuthConfig");
if (!json.isEmpty()) {
JsonObject root = new Gson().fromJson(json, JsonObject.class);
imgDomain = root.getAsJsonObject("data").get("imgDomain").getAsString();
break;
}
}
}
@Override
public String homeContent(boolean filter) throws Exception {
List<Class> classes = new ArrayList<>();
List<String> typeIds = Arrays.asList("0", "1", "2", "3", "4");
List<String> typeNames = Arrays.asList("全部", "电影", "电视剧", "动漫", "综艺");
List<String> typeIds = Arrays.asList("1", "2", "3", "4", "50", "99");
List<String> typeNames = Arrays.asList("電影", "電視劇", "動漫", "綜藝", "紀錄片", "Netflix");
for (int i = 0; i < typeIds.size(); i++) classes.add(new Class(typeIds.get(i), typeNames.get(i)));
return Result.string(classes, Json.parse(OkHttp.string(extend)));
return Result.string(classes, JsonParser.parseString(OkHttp.string(extend)));
}
@Override
public String homeVideoContent() {
List<Vod> list = new ArrayList<>();
String url = siteUrl + "/api/slide/list?code=unknown9039b6856c3a3306&pos_id=888&channel=wandoujia";
String url = siteUrl + "/api/slide/list?pos_id=88";
Resp resp = Resp.objectFrom(OkHttp.string(url, getHeader()));
for (Data data : resp.getData()) list.add(data.vod());
for (Data data : resp.getData()) list.add(data.homeVod(imgDomain));
return Result.string(list);
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) throws Exception {
if (tid.endsWith("/{pg}")) return searchContent(tid.split("/")[0], pg);
List<Vod> list = new ArrayList<>();
HashMap<String, String> ext = new HashMap<>();
if (extend != null && extend.size() > 0) ext.putAll(extend);
String cateId = ext.get("cateId") == null ? tid : ext.get("cateId");
String area = ext.get("area") == null ? "0" : ext.get("area");
String year = ext.get("year") == null ? "0" : ext.get("year");
String by = ext.get("by") == null ? "hot" : ext.get("by");
String url = siteUrl + String.format("/api/crumb/list?area=%s&category_id=%s&page=%s&type=0&limit=24&sort=%s&year=%s", area, cateId, pg, by, year);
Resp resp = Resp.objectFrom(OkHttp.string(url, getHeader()));
for (Data data : resp.getData()) list.add(data.vod());
return Result.string(Integer.parseInt(pg), Integer.parseInt(pg) + 1, 24, Integer.MAX_VALUE, list);
if (tid.equals("50") || tid.equals("99") || tid.equals("111")) {
List<Vod> list = new ArrayList<>();
String url = siteUrl + String.format("/api/dyTag/list?category_id=%s&page=%s", tid, pg);
Resp resp = Resp.objectFrom(OkHttp.string(url, getHeader()));
for (Data data : resp.getData()) for (Data dataList : data.getDataList()) list.add(dataList.vod(imgDomain));
return Result.get().page().vod(list).string();
} else {
List<Vod> list = new ArrayList<>();
HashMap<String, String> ext = new HashMap<>();
if (extend != null && !extend.isEmpty()) ext.putAll(extend);
String area = ext.get("area") == null ? "0" : ext.get("area");
String year = ext.get("year") == null ? "0" : ext.get("year");
String by = ext.get("by") == null ? "updata" : ext.get("by");
String url = siteUrl + String.format("/api/crumb/list?fcate_pid=%s&area=%s&year=%s&type=0&sort=%s&page=%s&category_id=", tid, area, year, by, pg);
Resp resp = Resp.objectFrom(OkHttp.string(url, getHeader()));
for (Data data : resp.getData()) list.add(data.vod(imgDomain));
return Result.string(list);
}
}
@Override
public String detailContent(List<String> ids) throws Exception {
String url = siteUrl + "/api/node/detail?channel=wandoujia&token=&id=" + ids.get(0);
String url = siteUrl + "/api/video/detailv2?id=" + ids.get(0);
Data data = Detail.objectFrom(OkHttp.string(url, getHeader())).getData();
Vod vod = data.vod();
vod.setVodPlayFrom("Jianpian");
Vod vod = data.vod(imgDomain);
vod.setVodPlayFrom(data.getVodFrom());
vod.setVodYear(data.getYear());
vod.setVodArea(data.getArea());
vod.setTypeName(data.getTypes());
vod.setVodActor(data.getActors());
vod.setVodPlayUrl(data.getPlayUrl());
vod.setVodPlayUrl(data.getVodUrl());
vod.setVodDirector(data.getDirectors());
vod.setVodContent(data.getDescription());
return Result.string(vod);
@ -101,9 +131,9 @@ public class Jianpian extends Spider {
public String searchContent(String key, String pg) throws Exception {
List<Vod> list = new ArrayList<>();
String url = siteUrl + "/api/video/search?page=" + pg + "&key=" + URLEncoder.encode(key);
Resp resp = Resp.objectFrom(OkHttp.string(url, getHeader()));
for (Data data : resp.getData()) list.add(data.vod());
String url = siteUrl + String.format("/api/v2/search/videoV2?key=%s&category_id=88&page=%s&pageSize=20", URLEncoder.encode(key), pg);
Search search = Search.objectFrom(OkHttp.string(url, getHeader()));
for (Search data : search.getData()) list.add(data.vod(imgDomain));
return Result.string(list);
}
}

Binary file not shown.

View File

@ -1 +1 @@
8c76ee60eb0363060a2d78fb8dc2f0b6
7df1f46baf40c21051abe0182086bef4

View File

@ -1,5 +1,5 @@
{
"spider": "https://andoridspidermt.netlify.app/jar/custom_spider.jar;md5;153fe041f1a364fef8f53545dd52588a",
"spider": "https://andoridspidermt.netlify.app/jar/custom_spider.jar;md5;7df1f46baf40c21051abe0182086bef4",
"lives": [
{
"name": "电视直播",

View File

@ -1,6 +1,7 @@
pluginManagement {
repositories {
maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }
maven { url 'https://maven.aliyun.com/repository/public/' }
maven { url 'https://maven.aliyun.com/repository/google/' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
@ -19,6 +20,7 @@ dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }
maven { url 'https://maven.aliyun.com/repository/public/' }
maven { url 'https://maven.aliyun.com/repository/google/' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }