This commit is contained in:
GH Action - Upstream Sync 2023-01-03 12:34:47 +00:00
commit 7e0979a7e9
27 changed files with 803 additions and 2344 deletions

View File

@ -27,7 +27,7 @@ public class Result {
@SerializedName("url") @SerializedName("url")
private String url; private String url;
@SerializedName("sub") @SerializedName("sub")
private String sub; private List<Sub> sub;
@SerializedName("parse") @SerializedName("parse")
private int parse; private int parse;
@SerializedName("jx") @SerializedName("jx")
@ -129,7 +129,7 @@ public class Result {
return this; return this;
} }
public Result sub(String sub) { public Result sub(List<Sub> sub) {
this.sub = sub; this.sub = sub;
return this; return this;
} }

View File

@ -0,0 +1,52 @@
package com.github.catvod.bean;
import com.github.catvod.utils.Trans;
import com.google.gson.annotations.SerializedName;
public class Sub {
@SerializedName("url")
private String url;
@SerializedName("name")
private String name;
@SerializedName("lang")
private String lang;
@SerializedName("format")
private String format;
public static Sub create() {
return new Sub();
}
public Sub name(String name) {
this.name = Trans.get(name);
return this;
}
public Sub url(String url) {
this.url = url;
return this;
}
public Sub lang(String lang) {
this.lang = lang;
return this;
}
public Sub format(String format) {
this.format = format;
return this;
}
public Sub ext(String ext) {
switch (ext) {
case "vtt":
return format("text/vtt");
case "ass":
case "ssa":
return format("text/x-ssa");
default:
return format("application/x-subrip");
}
}
}

View File

@ -0,0 +1,62 @@
package com.github.catvod.bean.ali;
import android.text.TextUtils;
import android.widget.ImageView;
public class Auth {
private String refreshToken;
private String accessToken;
private long expiresTime;
private ImageView view;
public Auth(String refreshToken) {
this.refreshToken = refreshToken;
}
public String getRefreshToken() {
return TextUtils.isEmpty(refreshToken) ? "" : refreshToken;
}
public void setRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}
public String getAccessToken() {
return TextUtils.isEmpty(accessToken) ? "" : accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public long getExpiresTime() {
return expiresTime;
}
public void setExpiresTime(long expiresTime) {
this.expiresTime = expiresTime;
}
public ImageView getView() {
return view;
}
public void setView(ImageView view) {
this.view = view;
}
public boolean needRefresh() {
return System.currentTimeMillis() > getExpiresTime();
}
public boolean isEmpty() {
return getRefreshToken().isEmpty() || getAccessToken().isEmpty();
}
public void clean() {
setRefreshToken("");
setAccessToken("");
setExpiresTime(0);
}
}

View File

@ -31,10 +31,10 @@ public class Item {
@SerializedName("list") @SerializedName("list")
private List<ListDTO> list; private List<ListDTO> list;
public List<Vod> getList() { public List<Vod> getList(String key) {
List<Vod> items = new ArrayList<>(); List<Vod> items = new ArrayList<>();
list = list == null ? Collections.emptyList() : list; list = list == null ? Collections.emptyList() : list;
for (ListDTO item : list) items.add(item.getVod()); for (ListDTO item : list) if (item.getName().contains(key)) items.add(item.getVod());
return items; return items;
} }
@ -59,9 +59,13 @@ public class Item {
return fileInfos; return fileInfos;
} }
public String getName() {
return getFileInfos().get(0).getFileName();
}
public Vod getVod() { public Vod getVod() {
String id = getUrl(); String id = getUrl();
String name = getFileInfos().get(0).getFileName(); String name = getName();
String remark = getGmtCreate(); String remark = getGmtCreate();
String pic = "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000"; String pic = "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000";
return new Vod(id, name, pic, remark); return new Vod(id, name, pic, remark);

View File

@ -6,6 +6,7 @@ import android.text.TextUtils;
import com.github.catvod.bean.Class; import com.github.catvod.bean.Class;
import com.github.catvod.bean.Filter; import com.github.catvod.bean.Filter;
import com.github.catvod.bean.Result; import com.github.catvod.bean.Result;
import com.github.catvod.bean.Sub;
import com.github.catvod.bean.Vod; import com.github.catvod.bean.Vod;
import com.github.catvod.bean.alist.Drive; import com.github.catvod.bean.alist.Drive;
import com.github.catvod.bean.alist.Item; import com.github.catvod.bean.alist.Item;
@ -165,8 +166,7 @@ public class AList extends Spider {
String response = OkHttp.postJson(drive.searchApi(), drive.params(keyword)); String response = OkHttp.postJson(drive.searchApi(), drive.params(keyword));
List<Item> items = Item.arrayFrom(getSearchJson(drive.isNew(), response)); List<Item> items = Item.arrayFrom(getSearchJson(drive.isNew(), response));
for (Item item : items) if (!item.ignore(drive.isNew())) list.add(item.getVod(drive)); for (Item item : items) if (!item.ignore(drive.isNew())) list.add(item.getVod(drive));
} catch (Exception e) { } catch (Exception ignored) {
e.printStackTrace();
} finally { } finally {
cd.countDown(); cd.countDown();
} }
@ -198,17 +198,20 @@ public class AList extends Spider {
private String findSubs(String path, List<Item> items) { private String findSubs(String path, List<Item> items) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (Item item : items) if (Misc.isSub(item.getExt())) sb.append("~~~").append(Trans.get(item.getName())).append("@@@").append(Misc.getSubMimeType(item.getExt())).append("@@@").append(item.getVodId(path)); for (Item item : items) if (Misc.isSub(item.getExt())) sb.append("~~~").append(item.getName()).append("@@@").append(item.getExt()).append("@@@").append(item.getVodId(path));
return sb.toString(); return sb.toString();
} }
private String getSub(String[] ids) { private List<Sub> getSub(String[] ids) {
StringBuilder sb = new StringBuilder(); List<Sub> sub = new ArrayList<>();
for (String text : ids) { for (String text : ids) {
if (!text.contains("@@@")) continue; if (!text.contains("@@@")) continue;
String[] arr = text.split("@@@"); String[] split = text.split("@@@");
sb.append(arr[0]).append("#").append(arr[1]).append("#").append(getDetail(arr[2]).getUrl()).append("$$$"); String name = split[0];
String ext = split[1];
String url = getDetail(split[2]).getUrl();
sub.add(Sub.create().name(name).ext(ext).url(url));
} }
return Misc.substring(sb.toString(), 3); return sub;
} }
} }

View File

@ -7,7 +7,9 @@ import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import com.github.catvod.bean.Result; import com.github.catvod.bean.Result;
import com.github.catvod.bean.Sub;
import com.github.catvod.bean.Vod; import com.github.catvod.bean.Vod;
import com.github.catvod.bean.ali.Auth;
import com.github.catvod.bean.ali.Data; import com.github.catvod.bean.ali.Data;
import com.github.catvod.bean.ali.Item; import com.github.catvod.bean.ali.Item;
import com.github.catvod.crawler.SpiderDebug; import com.github.catvod.crawler.SpiderDebug;
@ -42,27 +44,26 @@ public class Ali {
private final Pattern pattern = Pattern.compile("www.aliyundrive.com/s/([^/]+)(/folder/([^/]+))?"); private final Pattern pattern = Pattern.compile("www.aliyundrive.com/s/([^/]+)(/folder/([^/]+))?");
private ScheduledExecutorService service; private ScheduledExecutorService service;
private static String authorization; private Auth auth;
private String refreshToken;
private long expiresTime;
private ImageView view;
public Ali(String token) { public Ali token(String token) {
if (auth != null && auth.getRefreshToken().length() > 0) return this;
if (TextUtils.isEmpty(token)) Init.show("尚未設定 Token"); if (TextUtils.isEmpty(token)) Init.show("尚未設定 Token");
if (token.startsWith("http")) token = OkHttp.string(token); if (token.startsWith("http")) token = OkHttp.string(token);
refreshToken = Prefers.getString("token", token); auth = new Auth(Prefers.getString("token", token));
return this;
} }
private static HashMap<String, String> getHeaders() { private HashMap<String, String> getHeaders() {
HashMap<String, String> headers = new HashMap<>(); HashMap<String, String> headers = new HashMap<>();
headers.put("User-Agent", Misc.CHROME); headers.put("User-Agent", Misc.CHROME);
headers.put("Referer", "https://www.aliyundrive.com/"); headers.put("Referer", "https://www.aliyundrive.com/");
return headers; return headers;
} }
private static HashMap<String, String> getHeaders(String shareToken) { private HashMap<String, String> getHeaders(String shareToken) {
HashMap<String, String> headers = getHeaders(); HashMap<String, String> headers = getHeaders();
if (authorization != null) headers.put("authorization", authorization); headers.put("authorization", auth.getAccessToken());
headers.put("x-share-token", shareToken); headers.put("x-share-token", shareToken);
return headers; return headers;
} }
@ -72,9 +73,17 @@ public class Ali {
return OkHttp.postJson(url, body.toString(), getHeaders()); return OkHttp.postJson(url, body.toString(), getHeaders());
} }
private static String post(String url, JSONObject body, String shareToken) { private String post(String url, JSONObject body, String shareToken) {
url = url.startsWith("https") ? url : "https://api.aliyundrive.com/" + url; url = url.startsWith("https") ? url : "https://api.aliyundrive.com/" + url;
return OkHttp.postJson(url, body.toString(), getHeaders(shareToken)); String result = OkHttp.postJson(url, body.toString(), getHeaders(shareToken));
if (check401(result)) return post(url, body, shareToken);
return result;
}
private boolean check401(String result) {
if (!result.contains("AccessTokenInvalid")) return false;
refreshAccessToken();
return true;
} }
public String detailContent(List<String> ids) throws Exception { public String detailContent(List<String> ids) throws Exception {
@ -85,14 +94,13 @@ public class Ali {
} }
public String playerContent(String flag, String id) { public String playerContent(String flag, String id) {
if (id.equals("无数据")) return ""; if (id.equals("Empty")) return "";
String[] ids = id.split("\\+"); String[] ids = id.split("\\+");
String shareId = ids[0]; String shareId = ids[0];
String shareToken = ids[1]; String shareToken = ids[1];
String fileId = ids[2]; String fileId = ids[2];
String sub = getSub(shareId, shareToken, ids); List<Sub> sub = getSub(shareId, shareToken, ids);
if (System.currentTimeMillis() > expiresTime) refreshAccessToken(); if (auth.needRefresh()) refreshAccessToken();
while (TextUtils.isEmpty(authorization)) SystemClock.sleep(250);
if (flag.equals("原畫")) { if (flag.equals("原畫")) {
return Result.get().url(getDownloadUrl(shareId, shareToken, fileId)).sub(sub).header(getHeaders()).string(); return Result.get().url(getDownloadUrl(shareId, shareToken, fileId)).sub(sub).header(getHeaders()).string();
} else { } else {
@ -114,7 +122,7 @@ public class Ali {
List<String> playUrls = new ArrayList<>(); List<String> playUrls = new ArrayList<>();
List<Item> files = new ArrayList<>(fileMap.keySet()); List<Item> files = new ArrayList<>(fileMap.keySet());
for (Item file : files) playUrls.add(Trans.get(file.getDisplayName()) + "$" + fileMap.get(file) + findSubs(file.getName(), subMap)); for (Item file : files) playUrls.add(Trans.get(file.getDisplayName()) + "$" + fileMap.get(file) + findSubs(file.getName(), subMap));
if (playUrls.isEmpty()) playUrls.add("无数据$无数据"); if (playUrls.isEmpty()) playUrls.add("Empty$Empty");
List<String> sourceUrls = new ArrayList<>(); List<String> sourceUrls = new ArrayList<>();
sourceUrls.add(TextUtils.join("#", playUrls)); sourceUrls.add(TextUtils.join("#", playUrls));
sourceUrls.add(TextUtils.join("#", playUrls)); sourceUrls.add(TextUtils.join("#", playUrls));
@ -151,7 +159,7 @@ public class Ali {
} else if (Misc.isSub(file.getExt())) { } else if (Misc.isSub(file.getExt())) {
String key = file.removeExt(); String key = file.removeExt();
if (!subMap.containsKey(key)) subMap.put(key, new ArrayList<>()); if (!subMap.containsKey(key)) subMap.put(key, new ArrayList<>());
subMap.get(key).add(key + "@@@" + file.getFileId() + "@@@" + file.getExt()); subMap.get(key).add(key + "@@@" + file.getExt() + "@@@" + file.getFileId());
} }
} }
if (item.getNextMarker().length() > 0) { if (item.getNextMarker().length() > 0) {
@ -175,18 +183,19 @@ public class Ali {
private void refreshAccessToken() { private void refreshAccessToken() {
try { try {
JSONObject body = new JSONObject(); JSONObject body = new JSONObject();
body.put("refresh_token", refreshToken); body.put("refresh_token", auth.getRefreshToken());
body.put("grant_type", "refresh_token"); body.put("grant_type", "refresh_token");
JSONObject object = new JSONObject(post("https://auth.aliyundrive.com/v2/account/token", body)); JSONObject object = new JSONObject(post("https://auth.aliyundrive.com/v2/account/token", body));
authorization = object.getString("token_type") + " " + object.getString("access_token"); auth.setAccessToken(object.getString("token_type") + " " + object.getString("access_token"));
expiresTime = System.currentTimeMillis() + object.getInt("expires_in") * 1000L; auth.setExpiresTime(System.currentTimeMillis() + object.getInt("expires_in") * 1000L);
refreshToken = object.getString("refresh_token"); auth.setRefreshToken(object.getString("refresh_token"));
SpiderDebug.log("refresh token: " + refreshToken); SpiderDebug.log("refresh token: " + auth.getRefreshToken());
} catch (JSONException e) { } catch (JSONException e) {
authorization = null;
e.printStackTrace();
checkService(); checkService();
auth.clean();
getQRCode(); getQRCode();
} finally {
while (auth.isEmpty()) SystemClock.sleep(250);
} }
} }
@ -205,15 +214,17 @@ public class Ali {
return sb.toString(); return sb.toString();
} }
private String getSub(String shareId, String shareToken, String[] ids) { private List<Sub> getSub(String shareId, String shareToken, String[] ids) {
StringBuilder sb = new StringBuilder(); List<Sub> sub = new ArrayList<>();
for (String text : ids) { for (String text : ids) {
if (!text.contains("@@@")) continue; if (!text.contains("@@@")) continue;
String[] arr = text.split("@@@"); String[] split = text.split("@@@");
String url = Proxy.getUrl() + "?do=ali&type=sub&share_id=" + shareId + "&share_token=" + shareToken + "&file_id=" + arr[1]; String name = split[0];
sb.append(Trans.get(arr[0])).append("#").append(Misc.getSubMimeType(arr[2])).append("#").append(url).append("$$$"); String ext = split[1];
String url = Proxy.getUrl() + "?do=ali&type=sub&share_id=" + shareId + "&share_token=" + shareToken + "&file_id=" + split[2];
sub.add(Sub.create().name(name).ext(ext).url(url));
} }
return Misc.substring(sb.toString(), 3); return sub;
} }
private String getShareToken(String shareId) { private String getShareToken(String shareId) {
@ -260,7 +271,7 @@ public class Ali {
} }
} }
private static String getDownloadUrl(String shareId, String shareToken, String fileId) { private String getDownloadUrl(String shareId, String shareToken, String fileId) {
try { try {
JSONObject body = new JSONObject(); JSONObject body = new JSONObject();
body.put("file_id", fileId); body.put("file_id", fileId);
@ -277,7 +288,7 @@ public class Ali {
} }
} }
public static Object[] vod(Map<String, String> params) { public Object[] vod(Map<String, String> params) {
String shareId = params.get("share_id"); String shareId = params.get("share_id");
String shareToken = params.get("share_token"); String shareToken = params.get("share_token");
String fileId = params.get("file_id"); String fileId = params.get("file_id");
@ -291,7 +302,7 @@ public class Ali {
private void checkService() { private void checkService() {
if (service != null) service.shutdownNow(); if (service != null) service.shutdownNow();
if (view != null) Init.run(() -> Misc.removeView(view)); if (auth.getView() != null) Init.run(() -> Misc.removeView(auth.getView()));
} }
private void getQRCode() { private void getQRCode() {
@ -310,15 +321,16 @@ public class Ali {
} }
private void setToken(String value) { private void setToken(String value) {
Prefers.put("token", refreshToken = value); Prefers.put("token", value);
Init.show("請重新進入播放頁"); Init.show("請重新進入播放頁");
auth.setRefreshToken(value);
checkService(); checkService();
} }
private void showCode(Data data) { private void showCode(Data data) {
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER; params.gravity = Gravity.CENTER;
Misc.addView(view = create(data.getData().getCodeContent()), params); Misc.addView(create(data.getData().getCodeContent()), params);
Init.show("請使用阿里雲盤 App 掃描二維碼"); Init.show("請使用阿里雲盤 App 掃描二維碼");
} }
@ -326,6 +338,7 @@ public class Ali {
ImageView view = new ImageView(Init.context()); ImageView view = new ImageView(Init.context());
view.setScaleType(ImageView.ScaleType.CENTER_CROP); view.setScaleType(ImageView.ScaleType.CENTER_CROP);
view.setImageBitmap(QRCode.getBitmap(value, 250, 2)); view.setImageBitmap(QRCode.getBitmap(value, 250, 2));
auth.setView(view);
return view; return view;
} }
} }

View File

@ -17,6 +17,7 @@ public class Init {
private final Handler handler; private final Handler handler;
private Application app; private Application app;
private Ali ali;
private static class Loader { private static class Loader {
static volatile Init INSTANCE = new Init(); static volatile Init INSTANCE = new Init();
@ -27,6 +28,7 @@ public class Init {
} }
public Init() { public Init() {
this.ali = new Ali();
this.handler = new Handler(Looper.getMainLooper()); this.handler = new Handler(Looper.getMainLooper());
} }
@ -34,6 +36,14 @@ public class Init {
return get().app; return get().app;
} }
public static Ali getAli() {
return get().ali;
}
public static void setAli(Ali ali) {
get().ali = ali;
}
public static void init(Context context) { public static void init(Context context) {
SpiderDebug.log("自定義爬蟲代碼載入成功!"); SpiderDebug.log("自定義爬蟲代碼載入成功!");
get().app = ((Application) context); get().app = ((Application) context);

View File

@ -37,7 +37,7 @@ public class PanSou extends Spider {
@Override @Override
public void init(Context context, String extend) { public void init(Context context, String extend) {
ali = new Ali(extend); ali = Init.getAli().token(extend);
} }
@Override @Override

View File

@ -43,7 +43,7 @@ public class Paper extends Spider {
@Override @Override
public void init(Context context, String extend) { public void init(Context context, String extend) {
types = Arrays.asList("hyds", "rhds", "omds", "qtds", "hydy", "rhdy", "omdy", "qtdy", "hydm", "rhdm", "omdm", "jlp", "zyp", "jypx", "qtsp"); types = Arrays.asList("hyds", "rhds", "omds", "qtds", "hydy", "rhdy", "omdy", "qtdy", "hydm", "rhdm", "omdm", "jlp", "zyp", "jypx", "qtsp");
ali = new Ali(extend); ali = Init.getAli().token(extend);
} }
@Override @Override

View File

@ -18,7 +18,7 @@ public class Proxy extends Spider {
case "ck": case "ck":
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.vod(params); return Init.getAli().vod(params);
default: default:
return null; return null;
} }

View File

@ -15,7 +15,7 @@ public class Push extends Spider {
@Override @Override
public void init(Context context, String extend) { public void init(Context context, String extend) {
ali = new Ali(extend); ali = Init.getAli().token(extend);
} }
@Override @Override

View File

@ -33,7 +33,7 @@ public class UpYun extends Spider {
@Override @Override
public void init(Context context, String extend) { public void init(Context context, String extend) {
ali = new Ali(extend); ali = Init.getAli().token(extend);
} }
@Override @Override
@ -46,7 +46,7 @@ public class UpYun extends Spider {
String url = apiUrl + "search?keyword=" + URLEncoder.encode(key) + "&page=1&s_type=2"; String url = apiUrl + "search?keyword=" + URLEncoder.encode(key) + "&page=1&s_type=2";
String res = new String(Base64.decode(OkHttp.string(url, getHeaders()), Base64.DEFAULT)); String res = new String(Base64.decode(OkHttp.string(url, getHeaders()), Base64.DEFAULT));
List<Vod> list = new ArrayList<>(); List<Vod> list = new ArrayList<>();
for (Item item : Data.objectFrom(res).getResult().getItems()) if (item.isAli()) list.add(item.getVod()); for (Item item : Data.objectFrom(res).getResult().getItems()) if (item.isAli() && item.getTitle().contains(key)) list.add(item.getVod());
return Result.string(list); return Result.string(list);
} }

View File

@ -24,7 +24,7 @@ public class YiSo extends Spider {
@Override @Override
public void init(Context context, String extend) { public void init(Context context, String extend) {
ali = new Ali(extend); ali = Init.getAli().token(extend);
} }
@Override @Override
@ -45,7 +45,7 @@ public class YiSo extends Spider {
Misc.loadWebView(url, getWebViewClient(result)); Misc.loadWebView(url, getWebViewClient(result));
while (!result.containsKey("json")) SystemClock.sleep(50); while (!result.containsKey("json")) SystemClock.sleep(50);
String json = JsonParser.parseString(Objects.requireNonNull(result.get("json"))).getAsJsonPrimitive().getAsString(); String json = JsonParser.parseString(Objects.requireNonNull(result.get("json"))).getAsJsonPrimitive().getAsString();
return Result.string(Item.objectFrom(json).getData().getList()); return Result.string(Item.objectFrom(json).getData().getList(key));
} }
private WebViewClient getWebViewClient(Map<String, String> result) { private WebViewClient getWebViewClient(Map<String, String> result) {

View File

@ -52,7 +52,7 @@ public class Zhaozy extends Spider {
@Override @Override
public void init(Context context, String extend) { public void init(Context context, String extend) {
ali = new Ali(extend); ali = Init.getAli().token(extend);
} }
@Override @Override
@ -78,6 +78,7 @@ public class Zhaozy extends Spider {
Matcher matcher = regexVid.matcher(href); Matcher matcher = regexVid.matcher(href);
if (!matcher.find()) continue; if (!matcher.find()) continue;
String name = element.select("div.news_text a h3").text(); String name = element.select("div.news_text a h3").text();
if (!name.contains(key)) continue;
String remark = element.select("div.news_text a p").text().split("\\|")[1].split("")[1]; String remark = element.select("div.news_text a p").text().split("\\|")[1].split("")[1];
Vod vod = new Vod(); Vod vod = new Vod();
vod.setVodPic("https://inews.gtimg.com/newsapp_bt/0/13263837859/1000"); vod.setVodPic("https://inews.gtimg.com/newsapp_bt/0/13263837859/1000");

View File

@ -3,7 +3,6 @@ package com.github.catvod.utils;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -41,12 +40,6 @@ public class Misc {
return ext.equals("srt") || ext.equals("ass") || ext.equals("ssa"); return ext.equals("srt") || ext.equals("ass") || ext.equals("ssa");
} }
public static String getSubMimeType(String type) {
if (type.equals("srt")) return "application/x-subrip";
if (type.equals("ass") || type.equals("ssa")) return "text/x-ssa";
return "application/x-subrip";
}
public static String getSize(double size) { public static String getSize(double size) {
if (size == 0) return ""; if (size == 0) return "";
if (size > 1024 * 1024 * 1024 * 1024.0) { if (size > 1024 * 1024 * 1024 * 1024.0) {

Binary file not shown.

View File

@ -1 +1 @@
945b391d7430796229f6d5309037abeb 0c652bdac4683c84e151f867dd3abe54

View File

@ -1,5 +1,5 @@
{ {
"spider": "https://ghproxy.com/https://raw.githubusercontent.com/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;945b391d7430796229f6d5309037abeb", "spider": "https://ghproxy.com/https://raw.githubusercontent.com/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;0c652bdac4683c84e151f867dd3abe54",
"wallpaper": "https://gao.chuqiuyu.tk", "wallpaper": "https://gao.chuqiuyu.tk",
"lives": [ "lives": [
{ {

View File

@ -1,5 +1,5 @@
{ {
"spider": "https://ghproxy.com/https://raw.githubusercontent.com/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;945b391d7430796229f6d5309037abeb", "spider": "https://ghproxy.com/https://raw.githubusercontent.com/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;0c652bdac4683c84e151f867dd3abe54",
"wallpaper": "http://www.kf666888.cn/api/tvbox/img", "wallpaper": "http://www.kf666888.cn/api/tvbox/img",
"lives": [ "lives": [
{ {

View File

@ -57,6 +57,8 @@
}, },
{ {
"urls": [ "urls": [
"http://baidu.douyincdn.freetvtv.com/tvbjade/m2.m3u8",
"https://pull-l3-cny.douyincdn.com/live/e07fb43ab773bd88a01b9a96f354bfa9.m3u8",
"http://113.64.147.149:808/hls/67/index.m3u8", "http://113.64.147.149:808/hls/67/index.m3u8",
"http://113.64.147.170:808/hls/67/index.m3u8" "http://113.64.147.170:808/hls/67/index.m3u8"
], ],
@ -142,6 +144,7 @@
}, },
{ {
"urls": [ "urls": [
"https://pull-l3-cny.douyincdn.com/live/281ad35ffd611b16b5d4b4e55d86de69.m3u8",
"http://198.16.64.10:8278/j2_twn/playlist.m3u8?tid=MA8A1176878411768784&ct=19225&tsum=fea41bb592165942b9971148376f8b70", "http://198.16.64.10:8278/j2_twn/playlist.m3u8?tid=MA8A1176878411768784&ct=19225&tsum=fea41bb592165942b9971148376f8b70",
"http://198.16.64.10:8278/j2_twn/playlist.m3u8?tid=m22905da1d346&ct=18336&tsum=3b4998c4f5367bb820165f66b0caab0e", "http://198.16.64.10:8278/j2_twn/playlist.m3u8?tid=m22905da1d346&ct=18336&tsum=3b4998c4f5367bb820165f66b0caab0e",
"http://120.84.96.196:808/hls/86/index.m3u8", "http://120.84.96.196:808/hls/86/index.m3u8",
@ -204,6 +207,7 @@
}, },
{ {
"urls": [ "urls": [
"http://baidu.douyincdn.freetvtv.com/vius/m2.m3u8",
"http://198.16.64.10:8278/viu_twn/playlist.m3u8?tid=MF2F6219999362199993&ct=19225&tsum=0315b071e42f6b8b6f49b6ca58b7393b" "http://198.16.64.10:8278/viu_twn/playlist.m3u8?tid=MF2F6219999362199993&ct=19225&tsum=0315b071e42f6b8b6f49b6ca58b7393b"
], ],
"number": "019", "number": "019",
@ -295,6 +299,7 @@
}, },
{ {
"urls": [ "urls": [
"https://pull-l3-cny.douyincdn.com/live/8f0f5b53f8ad921929fc9ac8771cbd82.m3u8",
"http://198.16.64.10:8278/Wlt/playlist.m3u8?tid=MC9C7523788875237888&ct=19225&tsum=fc74aa160d3ca61369c2e5f3ae79ee8e" "http://198.16.64.10:8278/Wlt/playlist.m3u8?tid=MC9C7523788875237888&ct=19225&tsum=fc74aa160d3ca61369c2e5f3ae79ee8e"
], ],
"number": "028", "number": "028",

View File

@ -3,8 +3,8 @@ plugins {
} }
java { java {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_11
} }
dependencies { dependencies {

BIN
tools/gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -13,9 +13,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import okhttp3.OkHttpClient;
import okhttp3.Request;
public class Run { public class Run {
private final List<Group> groups; private final List<Group> groups;
@ -23,7 +20,7 @@ public class Run {
private final Gson gson; private final Gson gson;
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
new Run().start(); new Run().start("http://home.jundie.top:81/Cat/tv/live.txt");
} }
public Run() { public Run() {
@ -32,14 +29,13 @@ public class Run {
gson = new Gson().newBuilder().disableHtmlEscaping().setPrettyPrinting().create(); gson = new Gson().newBuilder().disableHtmlEscaping().setPrettyPrinting().create();
} }
private void start() throws IOException { private void start(String text) throws IOException {
parseOnline(new OkHttpClient().newCall(new Request.Builder().url("http://home.jundie.top:81/Cat/tv/live.txt").build()).execute().body().string());
//parseTxt(Util.getFile(getClass(), "live.txt")); //parseTxt(Util.getFile(getClass(), "live.txt"));
System.out.println(gson.toJson(groups)); parse(Util.call(text));
writeFile(); writeFile();
} }
private void parseOnline(String text) { private void parse(String text) {
for (String line : text.split("\n")) { for (String line : text.split("\n")) {
String[] split = line.split(","); String[] split = line.split(",");
if (split.length < 2) continue; if (split.length < 2) continue;
@ -79,8 +75,8 @@ public class Run {
private void combine(Channel channel) { private void combine(Channel channel) {
for (Data item : data) { for (Data item : data) {
if (item.getName().contains(channel.getName())) { if (item.getName().contains(channel.getName())) {
channel.epg(item.getEpgid());
channel.logo(item.getLogo()); channel.logo(item.getLogo());
channel.epg(item.getEpg());
break; break;
} }
} }

View File

@ -1,13 +1,22 @@
package com.fongmi.tools; package com.fongmi.tools;
import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.stream.Stream; import java.util.stream.Stream;
import okhttp3.OkHttpClient;
import okhttp3.Request;
public class Util { public class Util {
public static String call(String url) throws IOException {
return new OkHttpClient().newCall(new Request.Builder().url(url).build()).execute().body().string();
}
public static String getFile(Class<?> clz, String fileName) { public static String getFile(Class<?> clz, String fileName) {
try { try {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@ -19,4 +28,12 @@ public class Util {
return ""; return "";
} }
} }
public static String getFile(String fileName) {
try {
return Files.readString(Path.of(fileName));
} catch (Exception e) {
return "";
}
}
} }

View File

@ -10,74 +10,28 @@ import java.util.List;
public class Data { public class Data {
@SerializedName("tvid")
private String tvid;
@SerializedName("epgid")
private String epgid;
@SerializedName("name") @SerializedName("name")
private String name; private String name;
@SerializedName("status") @SerializedName("epg")
private String status; private String epg;
@SerializedName("note")
private String note;
@SerializedName("logo") @SerializedName("logo")
private String logo; private String logo;
public static Data objectFrom(String str) {
return new Gson().fromJson(str, Data.class);
}
public static List<Data> arrayFrom(String str) { public static List<Data> arrayFrom(String str) {
Type listType = new TypeToken<ArrayList<Data>>() { Type listType = new TypeToken<ArrayList<Data>>() {}.getType();
}.getType();
return new Gson().fromJson(str, listType); return new Gson().fromJson(str, listType);
} }
public String getTvid() {
return tvid;
}
public void setTvid(String tvid) {
this.tvid = tvid;
}
public String getEpgid() {
return epgid;
}
public void setEpgid(String epgid) {
this.epgid = epgid;
}
public String getName() { public String getName() {
return name; return name;
} }
public void setName(String name) { public String getEpg() {
this.name = name; return epg;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
} }
public String getLogo() { public String getLogo() {
return logo; return logo;
} }
public void setLogo(String logo) {
this.logo = logo;
}
} }

File diff suppressed because it is too large Load Diff