Merge remote-tracking branch 'origin/main' into mine

# Conflicts:
#	jar/custom_spider.jar
#	jar/custom_spider.jar.md5
This commit is contained in:
lushunming 2024-08-27 10:46:10 +08:00
commit 21edccdd55
10 changed files with 94 additions and 53 deletions

View File

@ -97,6 +97,10 @@ public class Result {
return Result.get().vod(Collections.emptyList()).msg(msg).string(); return Result.get().vod(Collections.emptyList()).msg(msg).string();
} }
public static String notify(String msg) {
return Result.get().msg(msg).string();
}
public static Result get() { public static Result get() {
return new Result(); return new Result();
} }

View File

@ -34,6 +34,8 @@ public class Vod {
private String vodPlayUrl; private String vodPlayUrl;
@SerializedName("vod_tag") @SerializedName("vod_tag")
private String vodTag; private String vodTag;
@SerializedName("action")
private String action;
@SerializedName("style") @SerializedName("style")
private Style style; private Style style;
@ -42,6 +44,12 @@ public class Vod {
return item == null ? new Vod() : item; return item == null ? new Vod() : item;
} }
public static Vod action(String action) {
Vod vod = new Vod();
vod.action = action;
return vod;
}
public Vod() { public Vod() {
} }
@ -58,6 +66,14 @@ public class Vod {
setVodRemarks(vodRemarks); setVodRemarks(vodRemarks);
} }
public Vod(String vodId, String vodName, String vodPic, String vodRemarks, String action) {
setVodId(vodId);
setVodName(vodName);
setVodPic(vodPic);
setVodRemarks(vodRemarks);
setAction(action);
}
public Vod(String vodId, String vodName, String vodPic, String vodRemarks, Style style) { public Vod(String vodId, String vodName, String vodPic, String vodRemarks, Style style) {
setVodId(vodId); setVodId(vodId);
setVodName(vodName); setVodName(vodName);
@ -66,6 +82,15 @@ public class Vod {
setStyle(style); setStyle(style);
} }
public Vod(String vodId, String vodName, String vodPic, String vodRemarks, Style style, String action) {
setVodId(vodId);
setVodName(vodName);
setVodPic(vodPic);
setVodRemarks(vodRemarks);
setStyle(style);
setAction(action);
}
public Vod(String vodId, String vodName, String vodPic, String vodRemarks, boolean folder) { public Vod(String vodId, String vodName, String vodPic, String vodRemarks, boolean folder) {
setVodId(vodId); setVodId(vodId);
setVodName(vodName); setVodName(vodName);
@ -134,6 +159,10 @@ public class Vod {
this.vodTag = vodTag; this.vodTag = vodTag;
} }
public void setAction(String action) {
this.action = action;
}
public void setStyle(Style style) { public void setStyle(Style style) {
this.style = style; this.style = style;
} }

View File

@ -43,7 +43,7 @@ public class Item {
} }
public Vod vod() { public Vod vod() {
return new Vod(getUrl(), getName(), getIcon(), getVersion(), Vod.Style.rect(1.0f)); return new Vod("", getName(), getIcon(), getVersion(), Vod.Style.rect(1.0f), getUrl());
} }
@Override @Override

View File

@ -58,6 +58,10 @@ public abstract class Spider {
return null; return null;
} }
public String action(String action) {
return null;
}
public void destroy() { public void destroy() {
} }

View File

@ -22,6 +22,7 @@ import org.jsoup.Jsoup;
import org.jsoup.nodes.Document; import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element; import org.jsoup.nodes.Element;
import java.io.ByteArrayInputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@ -36,6 +37,8 @@ import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import okhttp3.Response;
public class AList extends Spider { public class AList extends Spider {
private List<Drive> drives; private List<Drive> drives;
@ -150,10 +153,10 @@ public class AList extends Spider {
public String playerContent(String flag, String id, List<String> vipFlags) { public String playerContent(String flag, String id, List<String> vipFlags) {
String[] ids = id.split("~~~"); String[] ids = id.split("~~~");
String url = getDetail(ids[0]).getUrl(); String url = getDetail(ids[0]).getUrl();
return Result.get().url(url).header(getPlayHeader(url)).subs(getSub(ids)).string(); return Result.get().url(url).header(getPlayHeader(url)).subs(getSubs(ids)).string();
} }
private Map<String, String> getPlayHeader(String url) { private static Map<String, String> getPlayHeader(String url) {
try { try {
Uri uri = Uri.parse(url); Uri uri = Uri.parse(url);
Map<String, String> header = new HashMap<>(); Map<String, String> header = new HashMap<>();
@ -244,19 +247,31 @@ public class AList extends Spider {
return sb.toString(); return sb.toString();
} }
private List<Sub> getSub(String[] ids) { private List<Sub> getSubs(String[] ids) {
List<Sub> sub = new ArrayList<>(); List<Sub> sub = new ArrayList<>();
for (String text : ids) { for (String text : ids) {
if (!text.contains("@@@")) continue; if (!text.contains("@@@")) continue;
String[] split = text.split("@@@"); String[] split = text.split("@@@");
String name = split[0]; String name = split[0];
String ext = split[1]; String ext = split[1];
String url = getDetail(split[2]).getUrl(); String url = Proxy.getUrl() + "?do=alist&type=sub&url=" + getDetail(split[2]).getUrl();
sub.add(Sub.create().name(name).ext(ext).url(url)); sub.add(Sub.create().name(name).ext(ext).url(url));
} }
return sub; return sub;
} }
public static Object[] proxy(Map<String, String> params) throws Exception {
if (!"sub".equals(params.get("type"))) return null;
String url = params.get("url");
Response res = OkHttp.newCall(url, getPlayHeader(url));
byte[] body = Util.toUtf8(res.body().bytes());
Object[] result = new Object[3];
result[0] = 200;
result[1] = "application/octet-stream";
result[2] = new ByteArrayInputStream(body);
return result;
}
class Job implements Callable<List<Vod>> { class Job implements Callable<List<Vod>> {
private final Drive drive; private final Drive drive;

View File

@ -38,7 +38,6 @@ import java.util.Map;
public class Bili extends Spider { public class Bili extends Spider {
private static final String COOKIE = "buvid3=84B0395D-C9F2-C490-E92E-A09AB48FE26E71636infoc"; private static final String COOKIE = "buvid3=84B0395D-C9F2-C490-E92E-A09AB48FE26E71636infoc";
private static Map<String, String> audios;
private static String cookie; private static String cookie;
private JsonObject extend; private JsonObject extend;
@ -54,13 +53,6 @@ public class Bili extends Spider {
return headers; return headers;
} }
private void setAudio() {
audios = new HashMap<>();
audios.put("30280", "192000");
audios.put("30232", "132000");
audios.put("30216", "64000");
}
private void setCookie() { private void setCookie() {
cookie = extend.get("cookie").getAsString(); cookie = extend.get("cookie").getAsString();
if (cookie.startsWith("http")) cookie = OkHttp.string(cookie).trim(); if (cookie.startsWith("http")) cookie = OkHttp.string(cookie).trim();
@ -83,7 +75,6 @@ public class Bili extends Spider {
public void init(Context context, String extend) throws Exception { public void init(Context context, String extend) throws Exception {
this.extend = Json.safeObject(extend); this.extend = Json.safeObject(extend);
setCookie(); setCookie();
setAudio();
} }
@Override @Override
@ -231,9 +222,17 @@ public class Bili extends Spider {
return result; return result;
} }
private static HashMap<String, String> getAudioFormat() {
HashMap<String, String> audios = new HashMap<>();
audios.put("30280", "192000");
audios.put("30232", "132000");
audios.put("30216", "64000");
return audios;
}
private static void findAudio(Dash dash, StringBuilder sb) { private static void findAudio(Dash dash, StringBuilder sb) {
for (Media audio : dash.getAudio()) { for (Media audio : dash.getAudio()) {
for (String key : audios.keySet()) { for (String key : getAudioFormat().keySet()) {
if (audio.getId().equals(key)) { if (audio.getId().equals(key)) {
sb.append(getMedia(audio)); sb.append(getMedia(audio));
} }
@ -253,7 +252,7 @@ public class Bili extends Spider {
if (media.getMimeType().startsWith("video")) { if (media.getMimeType().startsWith("video")) {
return getAdaptationSet(media, String.format(Locale.getDefault(), "height='%s' width='%s' frameRate='%s' sar='%s'", media.getHeight(), media.getWidth(), media.getFrameRate(), media.getSar())); return getAdaptationSet(media, String.format(Locale.getDefault(), "height='%s' width='%s' frameRate='%s' sar='%s'", media.getHeight(), media.getWidth(), media.getFrameRate(), media.getSar()));
} else if (media.getMimeType().startsWith("audio")) { } else if (media.getMimeType().startsWith("audio")) {
return getAdaptationSet(media, String.format("numChannels='2' sampleRate='%s'", audios.get(media.getId()))); return getAdaptationSet(media, String.format("numChannels='2' sampleRate='%s'", getAudioFormat().get(media.getId())));
} else { } else {
return ""; return "";
} }

View File

@ -1,19 +1,16 @@
package com.github.catvod.spider; package com.github.catvod.spider;
import android.app.Activity;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import com.github.catvod.bean.Class; import com.github.catvod.bean.Class;
import com.github.catvod.bean.Result; import com.github.catvod.bean.Result;
import com.github.catvod.bean.Vod;
import com.github.catvod.bean.market.Data; import com.github.catvod.bean.market.Data;
import com.github.catvod.bean.market.Item; import com.github.catvod.bean.market.Item;
import com.github.catvod.crawler.Spider; import com.github.catvod.crawler.Spider;
import com.github.catvod.net.OkHttp; import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.FileUtil; import com.github.catvod.utils.FileUtil;
import com.github.catvod.utils.Notify;
import com.github.catvod.utils.Path; import com.github.catvod.utils.Path;
import com.github.catvod.utils.Util; import com.github.catvod.utils.Util;
@ -62,40 +59,23 @@ public class Market extends Spider {
} }
@Override @Override
public String detailContent(List<String> ids) throws Exception { public String action(String action) {
Init.run(this::finish);
Vod vod = new Vod();
vod.setVodPlayFrom("FongMi");
vod.setVodPlayUrl("FongMi$FongMi");
Init.execute(() -> download(ids.get(0)));
return Result.string(vod);
}
private void finish() {
try { try {
Activity activity = Init.getActivity(); if (isBusy()) return "";
if (activity != null) activity.finish();
} catch (Exception e) {
e.printStackTrace();
}
}
private void download(String url) {
try {
if (isBusy()) return;
setBusy(true); setBusy(true);
Init.run(this::setDialog, 500); Init.run(this::setDialog, 500);
Response response = OkHttp.newCall(url); Response response = OkHttp.newCall(action);
File file = Path.create(new File(Path.download(), Uri.parse(url).getLastPathSegment())); File file = Path.create(new File(Path.download(), Uri.parse(action).getLastPathSegment()));
download(file, response.body().byteStream(), Double.parseDouble(response.header("Content-Length", "1"))); download(file, response.body().byteStream(), Double.parseDouble(response.header("Content-Length", "1")));
if (file.getName().endsWith(".zip")) FileUtil.unzip(file, Path.download()); if (file.getName().endsWith(".zip")) FileUtil.unzip(file, Path.download());
if (file.getName().endsWith(".apk")) FileUtil.openFile(file); if (file.getName().endsWith(".apk")) FileUtil.openFile(file);
else Notify.show("下載完成"); else Result.notify("下載完成");
checkCopy(url); checkCopy(action);
dismiss(); dismiss();
return "";
} catch (Exception e) { } catch (Exception e) {
Notify.show(e.getMessage());
dismiss(); dismiss();
return Result.notify(e.getMessage());
} }
} }

View File

@ -25,6 +25,8 @@ public class Proxy extends Spider {
return new Object[]{200, "text/plain; charset=utf-8", new ByteArrayInputStream("ok".getBytes("UTF-8"))}; return new Object[]{200, "text/plain; charset=utf-8", new ByteArrayInputStream("ok".getBytes("UTF-8"))};
case "ali": case "ali":
return Ali.proxy(params); return Ali.proxy(params);
case "alist":
return AList.proxy(params);
case "bili": case "bili":
return Bili.proxy(params); return Bili.proxy(params);
case "webdav": case "webdav":

View File

@ -71,12 +71,20 @@ public class Util {
UniversalDetector detector = new UniversalDetector(null); UniversalDetector detector = new UniversalDetector(null);
detector.handleData(bytes, 0, bytes.length); detector.handleData(bytes, 0, bytes.length);
detector.dataEnd(); detector.dataEnd();
return new String(bytes, detector.getDetectedCharset()).getBytes("UTF-8"); return removeBOM(new String(bytes, detector.getDetectedCharset()).getBytes("UTF-8"));
} catch (Exception e) { } catch (Exception e) {
return bytes; return bytes;
} }
} }
public static byte[] removeBOM(byte[] bytes) {
byte[] bom = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF};
if (bytes.length < 3 || !Arrays.equals(Arrays.copyOf(bytes, 3), bom)) return bytes;
byte[] newBytes = new byte[bytes.length - 3];
System.arraycopy(bytes, 3, newBytes, 0, newBytes.length);
return newBytes;
}
public static boolean isSub(String ext) { public static boolean isSub(String ext) {
return SUB.contains(ext); return SUB.contains(ext);
} }

View File

@ -13,49 +13,49 @@
"list": [ "list": [
{ {
"name": "電視-java", "name": "電視-java",
"url": "https://fm.caioa.link/main/apk/release/leanback-java-armeabi_v7a.apk", "url": "https://github.com/FongMi/Release/raw/fongmi/apk/release/leanback-java-armeabi_v7a.apk",
"icon": "https://i.imgs.ovh/2023/10/17/r8nk2.png", "icon": "https://i.imgs.ovh/2023/10/17/r8nk2.png",
"version": "v7a" "version": "v7a"
}, },
{ {
"name": "電視-java", "name": "電視-java",
"url": "https://fm.caioa.link/main/apk/release/leanback-java-arm64_v8a.apk", "url": "https://github.com/FongMi/Release/raw/fongmi/apk/release/leanback-java-arm64_v8a.apk",
"icon": "https://i.imgs.ovh/2023/10/17/r8nk2.png", "icon": "https://i.imgs.ovh/2023/10/17/r8nk2.png",
"version": "v8a" "version": "v8a"
}, },
{ {
"name": "電視-py", "name": "電視-py",
"url": "https://fm.caioa.link/main/apk/release/leanback-python-armeabi_v7a.apk", "url": "https://github.com/FongMi/Release/raw/fongmi/apk/release/leanback-python-armeabi_v7a.apk",
"icon": "https://i.imgs.ovh/2023/10/17/r8nk2.png", "icon": "https://i.imgs.ovh/2023/10/17/r8nk2.png",
"version": "v7a" "version": "v7a"
}, },
{ {
"name": "電視-py", "name": "電視-py",
"url": "https://fm.caioa.link/main/apk/release/leanback-python-arm64_v8a.apk", "url": "https://github.com/FongMi/Release/raw/fongmi/apk/release/leanback-python-arm64_v8a.apk",
"icon": "https://i.imgs.ovh/2023/10/17/r8nk2.png", "icon": "https://i.imgs.ovh/2023/10/17/r8nk2.png",
"version": "v8a" "version": "v8a"
}, },
{ {
"name": "手機-java", "name": "手機-java",
"url": "https://fm.caioa.link/main/apk/release/mobile-java-armeabi_v7a.apk", "url": "https://github.com/FongMi/Release/raw/fongmi/apk/release/mobile-java-armeabi_v7a.apk",
"icon": "https://i.imgs.ovh/2023/10/17/r8lVK.png", "icon": "https://i.imgs.ovh/2023/10/17/r8lVK.png",
"version": "v7a" "version": "v7a"
}, },
{ {
"name": "手機-java", "name": "手機-java",
"url": "https://fm.caioa.link/main/apk/release/mobile-java-arm64_v8a.apk", "url": "https://github.com/FongMi/Release/raw/fongmi/apk/release/mobile-java-arm64_v8a.apk",
"icon": "https://i.imgs.ovh/2023/10/17/r8lVK.png", "icon": "https://i.imgs.ovh/2023/10/17/r8lVK.png",
"version": "v8a" "version": "v8a"
}, },
{ {
"name": "手機-py", "name": "手機-py",
"url": "https://fm.caioa.link/main/apk/release/mobile-python-armeabi_v7a.apk", "url": "https://github.com/FongMi/Release/raw/fongmi/apk/release/mobile-python-armeabi_v7a.apk",
"icon": "https://i.imgs.ovh/2023/10/17/r8lVK.png", "icon": "https://i.imgs.ovh/2023/10/17/r8lVK.png",
"version": "v7a" "version": "v7a"
}, },
{ {
"name": "手機-py", "name": "手機-py",
"url": "https://fm.caioa.link/main/apk/release/mobile-python-arm64_v8a.apk", "url": "https://github.com/FongMi/Release/raw/fongmi/apk/release/mobile-python-arm64_v8a.apk",
"icon": "https://i.imgs.ovh/2023/10/17/r8lVK.png", "icon": "https://i.imgs.ovh/2023/10/17/r8lVK.png",
"version": "v8a" "version": "v8a"
} }