diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index d0358d3b8..f291208ab 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -92,6 +92,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP private Runnable mR4; private Clock mClock; private int toggleCount; + private int errorCount; private int count; public static void start(Context context) { @@ -767,6 +768,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP break; case Player.STATE_READY: resetToggle(); + resetError(); setMetadata(); hideProgress(); mPlayers.reset(); @@ -795,7 +797,8 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { - if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); + if (addErrorCount() > 20) onErrorEnd(event); + else if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); else if (mPlayers.addRetry() > event.getRetry()) checkError(event); else fetch(); } @@ -816,10 +819,19 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP fetch(); } - private void onError(ErrorEvent event) { + private void onErrorEnd(ErrorEvent event) { + onErrorPlayer(event); + resetError(); + } + + private void onErrorPlayer(ErrorEvent event) { showError(event.getMsg()); mPlayers.reset(); mPlayers.stop(); + } + + private void onError(ErrorEvent event) { + onErrorPlayer(event); startFlow(); } @@ -888,6 +900,14 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP this.toggleCount = 0; } + public int addErrorCount() { + return ++errorCount; + } + + public void resetError() { + this.errorCount = 0; + } + @Override public boolean dispatchKeyEvent(KeyEvent event) { if (isVisible(mBinding.control.getRoot())) setR1Callback(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 9bc975dba..34db5bb24 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -144,6 +144,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private boolean autoMode; private boolean useParse; private int toggleCount; + private int errorCount; private int groupSize; private Runnable mR1; private Runnable mR2; @@ -1376,6 +1377,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List stopSearch(); setMetadata(); resetToggle(); + resetError(); hideProgress(); mPlayers.reset(); setDefaultTrack(); @@ -1422,7 +1424,8 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { if (isBackground()) return; - if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); + if (addErrorCount() > 20) onErrorEnd(event); + else if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); else if (mPlayers.addRetry() > event.getRetry()) checkError(event); else onRefresh(); } @@ -1444,12 +1447,21 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List onRefresh(); } - private void onError(ErrorEvent event) { + private void onErrorEnd(ErrorEvent event) { + onErrorPlayer(event); + resetError(); + } + + private void onErrorPlayer(ErrorEvent event) { Track.delete(getHistoryKey()); showError(event.getMsg()); mClock.setCallback(null); mPlayers.reset(); mPlayers.stop(); + } + + private void onError(ErrorEvent event) { + onErrorPlayer(event); startFlow(); } @@ -1634,6 +1646,14 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List this.toggleCount = 0; } + public int addErrorCount() { + return ++errorCount; + } + + public void resetError() { + this.errorCount = 0; + } + public int getGroupSize() { return groupSize; } diff --git a/app/src/main/java/com/fongmi/android/tv/api/loader/PyLoader.java b/app/src/main/java/com/fongmi/android/tv/api/loader/PyLoader.java index 08626af60..942d565f1 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/loader/PyLoader.java +++ b/app/src/main/java/com/fongmi/android/tv/api/loader/PyLoader.java @@ -42,8 +42,8 @@ public class PyLoader { public Spider getSpider(String key, String api, String ext) { try { if (spiders.containsKey(key)) return spiders.get(key); - Method method = loader.getClass().getMethod("spider", Context.class, String.class, String.class); - Spider spider = (Spider) method.invoke(loader, App.get(), key, api); + Method method = loader.getClass().getMethod("spider", Context.class, String.class); + Spider spider = (Spider) method.invoke(loader, App.get(), api); spider.init(App.get(), ext); spiders.put(key, spider); return spider; diff --git a/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java b/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java index cbab11a1f..f3e7e0a24 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java @@ -1,7 +1,5 @@ package com.fongmi.android.tv.event; -import androidx.media3.common.Player; - import org.greenrobot.eventbus.EventBus; public class PlayerEvent { @@ -12,10 +10,6 @@ public class PlayerEvent { EventBus.getDefault().post(new PlayerEvent(0)); } - public static void ready() { - EventBus.getDefault().post(new PlayerEvent(Player.STATE_READY)); - } - public static void state(int state) { EventBus.getDefault().post(new PlayerEvent(state)); } diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index 5389797cb..0c3dd8471 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -710,13 +710,14 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal @Override public void onPlaybackStateChanged(int state) { switch (state) { + case Player.STATE_IDLE: case Player.STATE_READY: - PlayerEvent.ready(); + case Player.STATE_ENDED: + PlayerEvent.state(state); break; case Player.STATE_BUFFERING: - case Player.STATE_ENDED: - case Player.STATE_IDLE: PlayerEvent.state(state); + setPlaybackState(PlaybackStateCompat.STATE_BUFFERING); break; } } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 92810e63c..5320c5b41 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -106,6 +106,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom private boolean stop; private boolean lock; private int toggleCount; + private int errorCount; private int passCount; private PiP mPiP; @@ -831,6 +832,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom case Player.STATE_READY: setMetadata(); resetToggle(); + resetError(); hideProgress(); mPlayers.reset(); setTrackVisible(true); @@ -860,7 +862,8 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { - if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); + if (addErrorCount() > 20) onErrorEnd(event); + else if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); else if (mPlayers.addRetry() > event.getRetry()) checkError(event); else fetch(); } @@ -881,10 +884,19 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom fetch(); } - private void onError(ErrorEvent event) { + private void onErrorEnd(ErrorEvent event) { + onErrorPlayer(event); + resetError(); + } + + private void onErrorPlayer(ErrorEvent event) { showError(event.getMsg()); mPlayers.reset(); mPlayers.stop(); + } + + private void onError(ErrorEvent event) { + onErrorPlayer(event); startFlow(); } @@ -1030,6 +1042,14 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom this.toggleCount = 0; } + public int addErrorCount() { + return ++errorCount; + } + + public void resetError() { + this.errorCount = 0; + } + private void stopService() { PlaybackService.stop(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index fd11de258..e0597aec2 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -158,6 +158,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private boolean stop; private boolean lock; private int toggleCount; + private int errorCount; private Runnable mR0; private Runnable mR1; private Runnable mR2; @@ -1304,6 +1305,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo checkRotate(); setMetadata(); resetToggle(); + resetError(); hideProgress(); mPlayers.reset(); setDefaultTrack(); @@ -1361,7 +1363,8 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { if (isRedirect()) return; - if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); + if (addErrorCount() > 20) onErrorEnd(event); + else if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); else if (mPlayers.addRetry() > event.getRetry()) checkError(event); else onRefresh(); } @@ -1383,13 +1386,22 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo onRefresh(); } - private void onError(ErrorEvent event) { + private void onErrorEnd(ErrorEvent event) { + onErrorPlayer(event); + resetError(); + } + + private void onErrorPlayer(ErrorEvent event) { mBinding.swipeLayout.setEnabled(true); Track.delete(getHistoryKey()); showError(event.getMsg()); mClock.setCallback(null); mPlayers.reset(); mPlayers.stop(); + } + + private void onError(ErrorEvent event) { + onErrorPlayer(event); startFlow(); } @@ -1607,6 +1619,14 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo this.toggleCount = 0; } + public int addErrorCount() { + return ++errorCount; + } + + public void resetError() { + this.errorCount = 0; + } + private void notifyItemChanged(RecyclerView.Adapter adapter) { adapter.notifyItemRangeChanged(0, adapter.getItemCount()); } diff --git a/catvod/src/main/java/com/github/catvod/utils/Path.java b/catvod/src/main/java/com/github/catvod/utils/Path.java index fc09e2932..7ced5cb5c 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Path.java +++ b/catvod/src/main/java/com/github/catvod/utils/Path.java @@ -129,6 +129,10 @@ public class Path { return new File(js(), name); } + public static File py(String name) { + return new File(py(), name); + } + public static File jar(String name) { return new File(jar(), Util.md5(name).concat(".jar")); } diff --git a/pyramid/src/main/java/com/undcover/freedom/pyramid/Loader.java b/pyramid/src/main/java/com/undcover/freedom/pyramid/Loader.java index 53be6d712..8532d886e 100644 --- a/pyramid/src/main/java/com/undcover/freedom/pyramid/Loader.java +++ b/pyramid/src/main/java/com/undcover/freedom/pyramid/Loader.java @@ -12,19 +12,17 @@ import com.github.catvod.utils.Path; public class Loader { private PyObject app; - private String cache; @Keep private void init(Context context) { if (!Python.isStarted()) Python.start(new AndroidPlatform(context)); app = Python.getInstance().getModule("app"); - cache = Path.py().getAbsolutePath(); } @Keep - public Spider spider(Context context, String key, String api) { + public Spider spider(Context context, String api) { if (app == null) init(context); - PyObject obj = app.callAttr("spider", cache, key, api); - return new Spider(app, obj); + PyObject obj = app.callAttr("spider", Path.py().getAbsolutePath(), api); + return new Spider(app, obj, api); } } diff --git a/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java b/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java index b0cca3d99..f3ce1dcb2 100644 --- a/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java +++ b/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java @@ -4,6 +4,8 @@ import android.content.Context; import com.chaquo.python.PyObject; import com.github.catvod.Proxy; +import com.github.catvod.utils.Path; +import com.github.catvod.utils.UriUtil; import com.github.catvod.utils.Util; import com.google.gson.Gson; @@ -16,12 +18,14 @@ public class Spider extends com.github.catvod.crawler.Spider { private final PyObject app; private final PyObject obj; + private final String api; private final Gson gson; - public Spider(PyObject app, PyObject obj) { + public Spider(PyObject app, PyObject obj, String api) { this.gson = new Gson(); this.app = app; this.obj = obj; + this.api = api; } @Override @@ -31,6 +35,8 @@ public class Spider extends com.github.catvod.crawler.Spider { @Override public void init(Context context, String extend) { + List items = app.callAttr("getDependence", obj).asList(); + for (PyObject item : items) download(item + ".py"); app.callAttr("init", obj, extend); } @@ -108,6 +114,12 @@ public class Spider extends com.github.catvod.crawler.Spider { } } + private void download(String name) { + String path = Path.py(name).getAbsolutePath(); + String url = UriUtil.resolve(api, name); + app.callAttr("download", path, url); + } + private String replaceProxy(String content) { return content.replace("http://127.0.0.1:UndCover/proxy", Proxy.getUrl(true)); } diff --git a/pyramid/src/main/python/app.py b/pyramid/src/main/python/app.py index 6e5db1fea..d39ac70fc 100644 --- a/pyramid/src/main/python/app.py +++ b/pyramid/src/main/python/app.py @@ -4,22 +4,23 @@ from importlib.machinery import SourceFileLoader import json -def spider(cache, key, api): +def spider(cache, api): name = os.path.basename(api) path = cache + '/' + name - downloadFile(path, api) + download(path, api) + name = name.split('.')[0] return SourceFileLoader(name, path).load_module().Spider() -def downloadFile(name, api): +def download(path, api): if api.startswith('http'): - writeFile(name, redirect(api).content) + writeFile(path, redirect(api).content) else: - writeFile(name, str.encode(api)) + writeFile(path, str.encode(api)) -def writeFile(name, content): - with open(name, 'wb') as f: +def writeFile(path, content): + with open(path, 'wb') as f: f.write(content) @@ -35,6 +36,16 @@ def str2json(content): return json.loads(content) +def getDependence(ru): + result = ru.getDependence() + return result + + +def getName(ru): + result = ru.getName() + return result + + def init(ru, extend): ru.init(extend) diff --git a/pyramid/src/main/python/base/spider.py b/pyramid/src/main/python/base/spider.py index 1944c942c..9c69d5010 100644 --- a/pyramid/src/main/python/base/spider.py +++ b/pyramid/src/main/python/base/spider.py @@ -1,7 +1,9 @@ import re +import os import json import requests from lxml import etree +from com.chaquo.python import Python from abc import abstractmethod, ABCMeta from importlib.machinery import SourceFileLoader @@ -69,15 +71,17 @@ class Spider(metaclass=ABCMeta): def getDependence(self): return [] - def regStr(self, src, reg, group=1): - m = re.search(reg, src) - src = '' - if m: - src = m.group(group) - return src + def loadSpider(self, name): + return self.loadModule(name).Spider() - def str2json(self, str): - return json.loads(str) + def loadModule(self, name): + cache_dir = Python.getPlatform().getApplication().getCacheDir().getAbsolutePath() + path = os.path.join(os.path.join(cache_dir, 'py'), f'{name}.py') + return SourceFileLoader(name, path).load_module() + + def removeHtmlTags(self, src): + clean = re.compile('<.*?>') + return re.sub(clean, '', src) def cleanText(self, src): clean = re.sub('[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\U0001F680-\U0001F6FF\U0001F1E0-\U0001F1FF]', '', src) @@ -88,25 +92,10 @@ class Spider(metaclass=ABCMeta): rsp.encoding = 'utf-8' return rsp - def post(self, url, params=None, data, cookies=None, headers=None, timeout=5, verify=True, stream=False, allow_redirects = True): - rsp = requests.post(url, params=params, data=data, cookies=cookies, headers=headers, timeout=timeout, verify=verify, stream=stream, allow_redirects=allow_redirects) - rsp.encoding = 'utf-8' - return rsp - - def postJson(self, url, params=None, json, cookies=None, headers=None, timeout=5, verify=True, stream=False, allow_redirects = True): - rsp = requests.post(url, params=params, json=json, cookies=cookies, headers=headers, timeout=timeout, verify=verify, stream=stream, allow_redirects=allow_redirects) + def post(self, url, params=None, data=None, json=None, cookies=None, headers=None, timeout=5, verify=True, stream=False, allow_redirects = True): + rsp = requests.post(url, params=params, data=data, json=json, cookies=cookies, headers=headers, timeout=timeout, verify=verify, stream=stream, allow_redirects=allow_redirects) rsp.encoding = 'utf-8' return rsp def html(self, content): return etree.HTML(content) - - def xpText(self, root, expr): - ele = root.xpath(expr) - if len(ele) == 0: - return '' - else: - return ele[0] - - def loadModule(self, name, path): - return SourceFileLoader(name, path).load_module()