Merge pull request #545 from okcaptain/dev

Dev
pull/547/head
okcaptain 2 years ago committed by GitHub
commit 96fa7b9c84
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 24
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  2. 24
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  3. 4
      app/src/main/java/com/fongmi/android/tv/api/loader/PyLoader.java
  4. 6
      app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java
  5. 7
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  6. 24
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  7. 24
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  8. 4
      catvod/src/main/java/com/github/catvod/utils/Path.java
  9. 8
      pyramid/src/main/java/com/undcover/freedom/pyramid/Loader.java
  10. 14
      pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java
  11. 25
      pyramid/src/main/python/app.py
  12. 39
      pyramid/src/main/python/base/spider.py

@ -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();

@ -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;
}

@ -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;

@ -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));
}

@ -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;
}
}

@ -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();
}

@ -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());
}

@ -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"));
}

@ -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);
}
}

@ -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<PyObject> 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));
}

@ -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)

@ -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()

Loading…
Cancel
Save