diff --git a/app/src/main/java/com/github/catvod/bean/Result.java b/app/src/main/java/com/github/catvod/bean/Result.java index 84a572d5..2864e5a0 100644 --- a/app/src/main/java/com/github/catvod/bean/Result.java +++ b/app/src/main/java/com/github/catvod/bean/Result.java @@ -97,6 +97,10 @@ public class Result { 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() { return new Result(); } diff --git a/app/src/main/java/com/github/catvod/bean/Vod.java b/app/src/main/java/com/github/catvod/bean/Vod.java index 0e59ac8b..a50e8ebd 100644 --- a/app/src/main/java/com/github/catvod/bean/Vod.java +++ b/app/src/main/java/com/github/catvod/bean/Vod.java @@ -34,6 +34,8 @@ public class Vod { private String vodPlayUrl; @SerializedName("vod_tag") private String vodTag; + @SerializedName("action") + private String action; @SerializedName("style") private Style style; @@ -42,6 +44,12 @@ public class Vod { return item == null ? new Vod() : item; } + public static Vod action(String action) { + Vod vod = new Vod(); + vod.action = action; + return vod; + } + public Vod() { } @@ -58,6 +66,14 @@ public class Vod { 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) { setVodId(vodId); setVodName(vodName); @@ -66,6 +82,15 @@ public class Vod { 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) { setVodId(vodId); setVodName(vodName); @@ -134,6 +159,10 @@ public class Vod { this.vodTag = vodTag; } + public void setAction(String action) { + this.action = action; + } + public void setStyle(Style style) { this.style = style; } diff --git a/app/src/main/java/com/github/catvod/bean/market/Item.java b/app/src/main/java/com/github/catvod/bean/market/Item.java index f2b274c3..8e95b8a5 100644 --- a/app/src/main/java/com/github/catvod/bean/market/Item.java +++ b/app/src/main/java/com/github/catvod/bean/market/Item.java @@ -43,7 +43,7 @@ public class Item { } 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 diff --git a/app/src/main/java/com/github/catvod/crawler/Spider.java b/app/src/main/java/com/github/catvod/crawler/Spider.java index 1d43cad8..665e9fa7 100644 --- a/app/src/main/java/com/github/catvod/crawler/Spider.java +++ b/app/src/main/java/com/github/catvod/crawler/Spider.java @@ -58,6 +58,10 @@ public abstract class Spider { return null; } + public String action(String action) { + return null; + } + public void destroy() { } diff --git a/app/src/main/java/com/github/catvod/spider/AList.java b/app/src/main/java/com/github/catvod/spider/AList.java index 292dc53f..5363f8d5 100644 --- a/app/src/main/java/com/github/catvod/spider/AList.java +++ b/app/src/main/java/com/github/catvod/spider/AList.java @@ -22,6 +22,7 @@ import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; +import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -36,6 +37,8 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import okhttp3.Response; + public class AList extends Spider { private List drives; @@ -150,10 +153,10 @@ public class AList extends Spider { public String playerContent(String flag, String id, List vipFlags) { String[] ids = id.split("~~~"); 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 getPlayHeader(String url) { + private static Map getPlayHeader(String url) { try { Uri uri = Uri.parse(url); Map header = new HashMap<>(); @@ -244,19 +247,31 @@ public class AList extends Spider { return sb.toString(); } - private List getSub(String[] ids) { + private List getSubs(String[] ids) { List sub = new ArrayList<>(); for (String text : ids) { if (!text.contains("@@@")) continue; String[] split = text.split("@@@"); String name = split[0]; 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)); } return sub; } + public static Object[] proxy(Map 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> { private final Drive drive; diff --git a/app/src/main/java/com/github/catvod/spider/Bili.java b/app/src/main/java/com/github/catvod/spider/Bili.java index 7c890eca..766cd0a8 100644 --- a/app/src/main/java/com/github/catvod/spider/Bili.java +++ b/app/src/main/java/com/github/catvod/spider/Bili.java @@ -38,7 +38,6 @@ import java.util.Map; public class Bili extends Spider { private static final String COOKIE = "buvid3=84B0395D-C9F2-C490-E92E-A09AB48FE26E71636infoc"; - private static Map audios; private static String cookie; private JsonObject extend; @@ -54,13 +53,6 @@ public class Bili extends Spider { return headers; } - private void setAudio() { - audios = new HashMap<>(); - audios.put("30280", "192000"); - audios.put("30232", "132000"); - audios.put("30216", "64000"); - } - private void setCookie() { cookie = extend.get("cookie").getAsString(); 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 { this.extend = Json.safeObject(extend); setCookie(); - setAudio(); } @Override @@ -231,9 +222,17 @@ public class Bili extends Spider { return result; } + private static HashMap getAudioFormat() { + HashMap 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) { for (Media audio : dash.getAudio()) { - for (String key : audios.keySet()) { + for (String key : getAudioFormat().keySet()) { if (audio.getId().equals(key)) { sb.append(getMedia(audio)); } @@ -253,7 +252,7 @@ public class Bili extends Spider { 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())); } 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 { return ""; } diff --git a/app/src/main/java/com/github/catvod/spider/Market.java b/app/src/main/java/com/github/catvod/spider/Market.java index 338cf790..33a8d135 100644 --- a/app/src/main/java/com/github/catvod/spider/Market.java +++ b/app/src/main/java/com/github/catvod/spider/Market.java @@ -1,19 +1,16 @@ package com.github.catvod.spider; -import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.net.Uri; import com.github.catvod.bean.Class; 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.Item; import com.github.catvod.crawler.Spider; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.FileUtil; -import com.github.catvod.utils.Notify; import com.github.catvod.utils.Path; import com.github.catvod.utils.Util; @@ -62,40 +59,23 @@ public class Market extends Spider { } @Override - public String detailContent(List ids) throws Exception { - 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() { + public String action(String action) { try { - Activity activity = Init.getActivity(); - if (activity != null) activity.finish(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - private void download(String url) { - try { - if (isBusy()) return; + if (isBusy()) return ""; setBusy(true); Init.run(this::setDialog, 500); - Response response = OkHttp.newCall(url); - File file = Path.create(new File(Path.download(), Uri.parse(url).getLastPathSegment())); + Response response = OkHttp.newCall(action); + File file = Path.create(new File(Path.download(), Uri.parse(action).getLastPathSegment())); 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(".apk")) FileUtil.openFile(file); - else Notify.show("下載完成"); - checkCopy(url); + else Result.notify("下載完成"); + checkCopy(action); dismiss(); + return ""; } catch (Exception e) { - Notify.show(e.getMessage()); dismiss(); + return Result.notify(e.getMessage()); } } diff --git a/app/src/main/java/com/github/catvod/spider/Proxy.java b/app/src/main/java/com/github/catvod/spider/Proxy.java index c3fa001c..40e9ffb1 100644 --- a/app/src/main/java/com/github/catvod/spider/Proxy.java +++ b/app/src/main/java/com/github/catvod/spider/Proxy.java @@ -25,6 +25,8 @@ public class Proxy extends Spider { return new Object[]{200, "text/plain; charset=utf-8", new ByteArrayInputStream("ok".getBytes("UTF-8"))}; case "ali": return Ali.proxy(params); + case "alist": + return AList.proxy(params); case "bili": return Bili.proxy(params); case "webdav": diff --git a/app/src/main/java/com/github/catvod/utils/Util.java b/app/src/main/java/com/github/catvod/utils/Util.java index 8f628690..56578293 100644 --- a/app/src/main/java/com/github/catvod/utils/Util.java +++ b/app/src/main/java/com/github/catvod/utils/Util.java @@ -71,12 +71,20 @@ public class Util { UniversalDetector detector = new UniversalDetector(null); detector.handleData(bytes, 0, bytes.length); detector.dataEnd(); - return new String(bytes, detector.getDetectedCharset()).getBytes("UTF-8"); + return removeBOM(new String(bytes, detector.getDetectedCharset()).getBytes("UTF-8")); } catch (Exception e) { 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) { return SUB.contains(ext); } diff --git a/json/market.json b/json/market.json index cf5ce656..a32e9cdc 100644 --- a/json/market.json +++ b/json/market.json @@ -13,49 +13,49 @@ "list": [ { "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", "version": "v7a" }, { "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", "version": "v8a" }, { "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", "version": "v7a" }, { "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", "version": "v8a" }, { "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", "version": "v7a" }, { "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", "version": "v8a" }, { "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", "version": "v7a" }, { "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", "version": "v8a" }