TGsou百度

This commit is contained in:
lushunming 2025-10-15 08:53:26 +08:00
parent c9ebf3c7d7
commit ccf4c0b068
4 changed files with 52 additions and 51 deletions

View File

@ -11,19 +11,15 @@ import com.github.catvod.utils.Util;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import java.util.ArrayList;
import java.util.HashMap; import java.util.*;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class TgSearchBaidu extends Cloud { public class TgSearchBaidu extends Cloud {
private static final String KEY_API_URLS = "api_urls"; private static final String KEY_API_URLS = "api_urls";
private static final String KEY_DOMAIN_MAP = "siteurl"; private static final String KEY_DOMAIN_MAP = "siteurl";
private static final String KEY_SOURCES = "sources"; private static final String KEY_SOURCES = "sources";
private static final int DEFAULT_PAGE_SIZE = 10; private static final int DEFAULT_PAGE_SIZE = 10;
private List<String> apiUrls = new ArrayList<>(); private List<String> apiUrls = new ArrayList<>();
private Map<String, String> domainMap = new HashMap<String, String>() {{ private Map<String, String> domainMap = new HashMap<String, String>() {{
put("alipan", "阿里"); put("alipan", "阿里");
@ -42,15 +38,15 @@ public class TgSearchBaidu extends Cloud {
@Override @Override
public synchronized void init(Context context, String extend) throws Exception { public synchronized void init(Context context, String extend) throws Exception {
super.init(context, extend); super.init(context, extend);
this.apiUrls.clear(); this.apiUrls.clear();
if (!TextUtils.isEmpty(extend)) { if (!TextUtils.isEmpty(extend)) {
try { try {
if (extend.contains("###")) { if (extend.contains("###")) {
String[] infos = extend.split("###"); String[] infos = extend.split("###");
this.extInfos = infos; this.extInfos = infos;
if (infos.length > 0 && !TextUtils.isEmpty(infos[0])) { if (infos.length > 0 && !TextUtils.isEmpty(infos[0])) {
processExtendConfig(infos[0]); processExtendConfig(infos[0]);
} }
@ -58,11 +54,12 @@ public class TgSearchBaidu extends Cloud {
this.extInfos = new String[]{extend}; this.extInfos = new String[]{extend};
processExtendConfig(extend); processExtendConfig(extend);
} }
} catch (Exception e) {} } catch (Exception e) {
}
} }
this.extInfos = null; // 重置避免内存泄漏 this.extInfos = null; // 重置避免内存泄漏
} }
private void processExtendConfig(String config) { private void processExtendConfig(String config) {
try { try {
// 检查是否为HTTP URL // 检查是否为HTTP URL
@ -72,23 +69,23 @@ public class TgSearchBaidu extends Cloud {
} }
return; return;
} }
// 尝试JSON格式解析 // 尝试JSON格式解析
JsonObject ext = Json.safeObject(config); JsonObject ext = Json.safeObject(config);
// 处理API URLs配置 // 处理API URLs配置
processApiUrls(ext); processApiUrls(ext);
// 处理域名映射配置 // 处理域名映射配置
processDomainMap(ext); processDomainMap(ext);
// 处理来源过滤配置 // 处理来源过滤配置
processSources(ext, true); processSources(ext, true);
} catch (Exception e) { } catch (Exception e) {
// 可以添加日志记录 // 可以添加日志记录
} }
} }
private void processApiUrls(JsonObject config) { private void processApiUrls(JsonObject config) {
if (config.has(KEY_API_URLS) && config.get(KEY_API_URLS).isJsonArray()) { if (config.has(KEY_API_URLS) && config.get(KEY_API_URLS).isJsonArray()) {
JsonArray urlsArray = config.getAsJsonArray(KEY_API_URLS); JsonArray urlsArray = config.getAsJsonArray(KEY_API_URLS);
@ -102,30 +99,34 @@ public class TgSearchBaidu extends Cloud {
} }
} }
} }
private void processDomainMap(JsonObject config) { private void processDomainMap(JsonObject config) {
if (config.has(KEY_DOMAIN_MAP) && config.get(KEY_DOMAIN_MAP).isJsonObject()) { if (config.has(KEY_DOMAIN_MAP) && config.get(KEY_DOMAIN_MAP).isJsonObject()) {
JsonObject customDomains = config.getAsJsonObject(KEY_DOMAIN_MAP); JsonObject customDomains = config.getAsJsonObject(KEY_DOMAIN_MAP);
for (Map.Entry<String, JsonElement> entry : customDomains.entrySet()) { for (Map.Entry<String, JsonElement> entry : customDomains.entrySet()) {
if (entry == null || entry.getValue() == null) continue; if (entry == null || entry.getValue() == null) continue;
String domain = entry.getKey(); String domain = entry.getKey();
String sourceName = ""; String sourceName = "";
try { sourceName = entry.getValue().getAsString(); } catch (Exception e) { continue; } try {
sourceName = entry.getValue().getAsString();
} catch (Exception e) {
continue;
}
if (!TextUtils.isEmpty(domain) && !TextUtils.isEmpty(sourceName) && !domainMap.containsKey(domain)) { if (!TextUtils.isEmpty(domain) && !TextUtils.isEmpty(sourceName) && !domainMap.containsKey(domain)) {
domainMap.put(domain, sourceName); domainMap.put(domain, sourceName);
} }
} }
} }
} }
private void processSources(JsonObject config, boolean clearExisting) { private void processSources(JsonObject config, boolean clearExisting) {
if (config.has(KEY_SOURCES) && config.get(KEY_SOURCES).isJsonArray()) { if (config.has(KEY_SOURCES) && config.get(KEY_SOURCES).isJsonArray()) {
if (clearExisting) { if (clearExisting) {
this.sources.clear(); this.sources.clear();
} }
JsonArray sourcesArray = config.getAsJsonArray(KEY_SOURCES); JsonArray sourcesArray = config.getAsJsonArray(KEY_SOURCES);
for (JsonElement element : sourcesArray) { for (JsonElement element : sourcesArray) {
if (element != null && element.isJsonPrimitive() && element.getAsJsonPrimitive().isString()) { if (element != null && element.isJsonPrimitive() && element.getAsJsonPrimitive().isString()) {
@ -141,7 +142,6 @@ public class TgSearchBaidu extends Cloud {
private boolean isValidUrl(String url) { private boolean isValidUrl(String url) {
return !TextUtils.isEmpty(url) && (url.startsWith("http://") || url.startsWith("https://")); return !TextUtils.isEmpty(url) && (url.startsWith("http://") || url.startsWith("https://"));
} }
private Map<String, String> getHeader() { private Map<String, String> getHeader() {
@ -155,74 +155,75 @@ public class TgSearchBaidu extends Cloud {
if (key == null || key.trim().isEmpty()) { if (key == null || key.trim().isEmpty()) {
return Result.error("关键词不能为空"); return Result.error("关键词不能为空");
} }
return performSearch(key, 1, DEFAULT_PAGE_SIZE); return performSearch(key, 1, DEFAULT_PAGE_SIZE);
} }
private String performSearch(String key, int page, int pageSize) throws Exception { private String performSearch(String key, int page, int pageSize) throws Exception {
List<Vod> list = new ArrayList<>(); List<Vod> list = new ArrayList<>();
int total = 0; int total = 0;
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("kw", key); params.put("kw", key);
params.put("page", String.valueOf(page)); params.put("page", String.valueOf(page));
params.put("size", String.valueOf(pageSize)); params.put("size", String.valueOf(pageSize));
for (String apiUrl : apiUrls) { for (String apiUrl : apiUrls) {
if (!isValidUrl(apiUrl)) continue; if (!isValidUrl(apiUrl)) continue;
try { try {
OkResult result = OkHttp.get(apiUrl, params, getHeader()); OkResult result = OkHttp.get(apiUrl, params, getHeader());
if (result.getCode() == 500 || TextUtils.isEmpty(result.getBody())) continue; if (result.getCode() == 500 || TextUtils.isEmpty(result.getBody())) continue;
JsonObject jsonObject = Json.safeObject(result.getBody()); JsonObject jsonObject = Json.safeObject(result.getBody());
if (!jsonObject.has("code") || jsonObject.get("code").getAsInt() != 0 || !jsonObject.has("data")) continue; if (!jsonObject.has("code") || jsonObject.get("code").getAsInt() != 0 || !jsonObject.has("data"))
continue;
JsonObject data = jsonObject.getAsJsonObject("data"); JsonObject data = jsonObject.getAsJsonObject("data");
total = data.has("total") && !data.get("total").isJsonNull() ? data.get("total").getAsInt() : 0; total = data.has("total") && !data.get("total").isJsonNull() ? data.get("total").getAsInt() : 0;
// 直接检查merged_by_type字段无需三重判断 // 直接检查merged_by_type字段无需三重判断
if (!data.has("merged_by_type") || !data.get("merged_by_type").isJsonObject()) continue; if (!data.has("merged_by_type") || !data.get("merged_by_type").isJsonObject()) continue;
JsonObject mergedByType = data.getAsJsonObject("merged_by_type"); JsonObject mergedByType = data.getAsJsonObject("merged_by_type");
for (Map.Entry<String, JsonElement> categoryEntry : mergedByType.entrySet()) { for (Map.Entry<String, JsonElement> categoryEntry : mergedByType.entrySet()) {
if (!categoryEntry.getValue().isJsonArray()) continue; if (!categoryEntry.getValue().isJsonArray()) continue;
JsonArray items = categoryEntry.getValue().getAsJsonArray(); JsonArray items = categoryEntry.getValue().getAsJsonArray();
for (JsonElement item : items) { for (JsonElement item : items) {
if (!item.isJsonObject()) continue; if (!item.isJsonObject()) continue;
JsonObject entry = item.getAsJsonObject(); JsonObject entry = item.getAsJsonObject();
String vodUrl = entry.has("url") && !entry.get("url").isJsonNull() ? entry.get("url").getAsString() : ""; String vodUrl = entry.has("url") && !entry.get("url").isJsonNull() ? entry.get("url").getAsString() : "";
if (TextUtils.isEmpty(vodUrl)) continue; if (TextUtils.isEmpty(vodUrl)) continue;
// 获取来源信息并映射 // 获取来源信息并映射
String originalSource = entry.has("source") && !entry.get("source").isJsonNull() ? entry.get("source").getAsString() : "未知来源"; String originalSource = entry.has("source") && !entry.get("source").isJsonNull() ? entry.get("source").getAsString() : "未知来源";
String sourceName = mapSource(vodUrl, originalSource); String sourceName = mapSource(vodUrl, originalSource);
// 获取标题 // 获取标题
String title = entry.has("note") && !entry.get("note").isJsonNull() ? entry.get("note").getAsString() : "未命名资源"; String title = entry.has("note") && !entry.get("note").isJsonNull() ? entry.get("note").getAsString() : "未命名资源";
// 获取图片 // 获取图片
String pic = getFirstImage(entry); String pic = getFirstImage(entry);
// 简化VodPlayBuilder的使用 // 简化VodPlayBuilder的使用
Vod vod = new Vod("push://" + vodUrl, title, pic, sourceName + " (" + originalSource + ")"); Vod vod = new Vod(vodUrl, title, pic, sourceName + " (" + originalSource + ")");
// 由于只有一个播放源直接设置播放信息 // 由于只有一个播放源直接设置播放信息
vod.setVodPlayFrom(sourceName); vod.setVodPlayFrom(sourceName);
vod.setVodPlayUrl("播放源$" + vodUrl); vod.setVodPlayUrl("播放源$" + vodUrl);
// 来源过滤 // 来源过滤
if (sources.isEmpty() || sources.contains(sourceName)) { if (sources.isEmpty() || sources.contains(sourceName)) {
list.add(vod); list.add(vod);
} }
} }
} }
int pageCount = total > 0 && pageSize > 0 ? (total + pageSize - 1) / pageSize : 1; int pageCount = total > 0 && pageSize > 0 ? (total + pageSize - 1) / pageSize : 1;
return Result.string(page, pageCount, pageSize, total, list); return Result.string(page, pageCount, pageSize, total, list);
} catch (Exception e) { } catch (Exception e) {
@ -230,10 +231,10 @@ public class TgSearchBaidu extends Cloud {
continue; continue;
} }
} }
return Result.error("无法连接到任何搜索API"); return Result.error("无法连接到任何搜索API");
} }
// 提取来源映射逻辑为单独方法 // 提取来源映射逻辑为单独方法
private String mapSource(String vodUrl, String originalSource) { private String mapSource(String vodUrl, String originalSource) {
for (Map.Entry<String, String> domainEntry : domainMap.entrySet()) { for (Map.Entry<String, String> domainEntry : domainMap.entrySet()) {
@ -243,7 +244,7 @@ public class TgSearchBaidu extends Cloud {
} }
return originalSource; return originalSource;
} }
// 提取图片获取逻辑为单独方法 // 提取图片获取逻辑为单独方法
private String getFirstImage(JsonObject entry) { private String getFirstImage(JsonObject entry) {
if (entry.has("images") && !entry.get("images").isJsonNull() && entry.get("images").isJsonArray()) { if (entry.has("images") && !entry.get("images").isJsonNull() && entry.get("images").isJsonArray()) {

Binary file not shown.

View File

@ -1 +1 @@
3a9716ee845abbc8cc2daf9b812128f0 1b4f17a721470f8b074d883d9d4c4839

View File

@ -1,5 +1,5 @@
{ {
"spider": "https://andoridspidermt.netlify.app/jar/custom_spider.jar;md5;3a9716ee845abbc8cc2daf9b812128f0", "spider": "https://andoridspidermt.netlify.app/jar/custom_spider.jar;md5;1b4f17a721470f8b074d883d9d4c4839",
"lives": [ "lives": [
{ {
"name": "电视直播", "name": "电视直播",