Merge remote-tracking branch 'origin/main' into mine
# Conflicts: # jar/custom_spider.jar # jar/custom_spider.jar.md5
This commit is contained in:
commit
21edccdd55
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 "";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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":
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue