Merge pull request #557 from okcaptain/dev

Dev
pull/558/head^2
okcaptain 1 year ago committed by GitHub
commit 756e0331f3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      .gitignore
  2. 18
      app/build.gradle
  3. BIN
      app/libs/dlna-core-release.aar
  4. BIN
      app/libs/dlna-core.aar
  5. BIN
      app/libs/dlna-dmc-release.aar
  6. BIN
      app/libs/dlna-dmc.aar
  7. BIN
      app/libs/dlna-dmr-release.aar
  8. BIN
      app/libs/dlna-dmr.aar
  9. 2
      app/src/main/java/com/fongmi/android/tv/Constant.java
  10. 13
      app/src/main/java/com/fongmi/android/tv/api/Decoder.java
  11. 2
      app/src/main/java/com/fongmi/android/tv/bean/Drm.java
  12. 4
      app/src/main/java/com/fongmi/android/tv/bean/Vod.java
  13. 2
      app/src/main/java/com/fongmi/android/tv/server/Server.java
  14. 2
      app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java
  15. 6
      app/src/main/java/com/fongmi/android/tv/utils/Tbs.java
  16. 17
      app/src/main/java/com/fongmi/android/tv/utils/Traffic.java
  17. 8
      app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java
  18. 2
      app/src/main/res/values-zh-rCN/strings.xml
  19. 4
      app/src/main/res/values-zh-rTW/strings.xml
  20. 2
      app/src/main/res/values/strings.xml
  21. 15
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  22. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/LinkDialog.java
  23. 9
      pyramid/src/main/python/base/spider.py
  24. 4
      quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java

2
.gitignore vendored

@ -1,7 +1,7 @@
.idea
.gradle
*.jks
*.aar
lib-*.aar
*build
/media*
/Release

@ -14,7 +14,7 @@ android {
//noinspection ExpiredTargetSdkVersion
targetSdk 28
versionCode 244
versionName "2.4.4"
versionName "0726"
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
@ -131,17 +131,17 @@ dependencies {
implementation 'io.antmedia:rtmp-client:3.2.0'
implementation 'javax.servlet:javax.servlet-api:3.1.0'
implementation 'org.chromium.net:cronet-embedded:76.3809.111'
implementation 'org.eclipse.jetty:jetty-client:8.1.21.v20160908'
implementation 'org.eclipse.jetty:jetty-server:8.1.21.v20160908'
implementation 'org.eclipse.jetty:jetty-servlet:8.1.21.v20160908'
implementation 'org.fourthline.cling:cling-core:2.1.1'
implementation 'org.fourthline.cling:cling-support:2.1.1'
implementation 'org.eclipse.jetty:jetty-client:8.1.22.v20160922'
implementation('org.eclipse.jetty:jetty-server:8.1.22.v20160922') { exclude group: 'org.eclipse.jetty.orbit', module: 'javax.servlet' }
implementation('org.eclipse.jetty:jetty-servlet:8.1.22.v20160922') { exclude group: 'org.eclipse.jetty.orbit', module: 'javax.servlet' }
implementation 'org.fourthline.cling:cling-core:2.1.2-SNAPSHOT'
implementation 'org.fourthline.cling:cling-support:2.1.2-SNAPSHOT'
implementation 'org.greenrobot:eventbus:3.3.1'
implementation 'org.nanohttpd:nanohttpd:2.3.1'
implementation('org.simpleframework:simple-xml:2.7.1') { exclude group: 'stax', module: 'stax-api' exclude group: 'xpp3', module: 'xpp3' }
implementation(ext: 'aar', name: 'dlna-core', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'dlna-dmc', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'dlna-dmr', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'dlna-core-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'dlna-dmc-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'dlna-dmr-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-common-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-container-release', group: 'fongmi', version: 'release')
implementation(ext: 'aar', name: 'lib-database-release', group: 'fongmi', version: 'release')

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -6,7 +6,7 @@ public class Constant {
//控件隱藏時間
public static final int INTERVAL_HIDE = 5 * 1000;
//網路偵測間隔
public static final int INTERVAL_TRAFFIC = 500;
public static final int INTERVAL_TRAFFIC = 1000;
//點播爬蟲時間
public static final int TIMEOUT_VOD = 30 * 1000;
//直播爬蟲時間

@ -20,6 +20,8 @@ import javax.crypto.spec.SecretKeySpec;
public class Decoder {
private static final Pattern JS_URI = Pattern.compile("\"(\\.|\\.\\.)/(.?|.+?)\\.js\\?(.?|.+?)\"");
public static String getJson(String url) throws Exception {
String key = url.contains(";") ? url.split(";")[2] : "";
url = url.contains(";") ? url.split(";")[0] : url;
@ -34,8 +36,19 @@ public class Decoder {
private static String fix(String url, String data) {
if (url.startsWith("file") || url.startsWith("assets")) url = UrlUtil.convert(url);
Matcher matcher = JS_URI.matcher(data);
while (matcher.find()) {
String ext = matcher.group(0);
String t = ext.replace("\"./", "\"" + UrlUtil.resolve(url, "./"));
t = t.replace("\"../", "\"" + UrlUtil.resolve(url, "../"));
t = t.replace("./", "__JS1__");
t = t.replace("../", "__JS2__");
data = data.replace(ext, t);
}
if (data.contains("../")) data = data.replace("../", UrlUtil.resolve(url, "../"));
if (data.contains("./")) data = data.replace("./", UrlUtil.resolve(url, "./"));
if (data.contains("__JS1__")) data = data.replace("__JS1__", "./");
if (data.contains("__JS2__")) data = data.replace("__JS2__", "../");
return data;
}

@ -44,7 +44,7 @@ public class Drm {
private String getUri() {
if (getKey().startsWith("http")) return getKey();
return Server.get().getAddress("license/") + Util.base64(getKey(), Util.URL_SAFE);
return Server.get().getAddress("/license/") + Util.base64(getKey(), Util.URL_SAFE);
}
public MediaItem.DrmConfiguration get() {

@ -240,12 +240,12 @@ public class Vod implements Parcelable {
}
public String getVodPic(String pic) {
if (!TextUtils.isEmpty(pic)) setVodPic(pic);
if (getVodPic().isEmpty()) setVodPic(pic);
return getVodPic();
}
public String getVodName(String name) {
if (!TextUtils.isEmpty(name)) setVodName(name);
if (getVodName().isEmpty()) setVodName(name);
return getVodName();
}

@ -43,7 +43,7 @@ public class Server {
}
public String getAddress(String path) {
return getAddress(true) + "/" + path;
return getAddress(true) + path;
}
public String getAddress(boolean local) {

@ -21,7 +21,7 @@ public class Sniffer {
public static final Pattern SNIFFER = Pattern.compile("http((?!http).){12,}?\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac|mpd)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac|mpd)|http((?!http).)*?video/tos*|http((?!http).)*?obj/tos*");
public static String getUrl(String text) {
if (Json.valid(text)) return text;
if (Json.valid(text) || text.contains("$")) return text;
Matcher m = AI_PUSH.matcher(text);
if (m.find()) return m.group(0);
return text;

@ -31,10 +31,10 @@ public class Tbs {
public static String getUrl() {
File file = new File(Path.tv(), "x5.tbs.apk");
if (file.exists()) return Server.get().getAddress("file/TV/x5.tbs.apk");
if (file.exists()) return Server.get().getAddress("/file/TV/x5.tbs.apk");
File x5 = new File(Path.download(), "x5.tbs.apk");
if (x5.exists()) return Server.get().getAddress("file/"+ Environment.DIRECTORY_DOWNLOADS +"/x5.tbs.apk");
return Server.get().getAddress("x5.tbs.apk");
if (x5.exists()) return Server.get().getAddress("/file/"+ Environment.DIRECTORY_DOWNLOADS +"/x5.tbs.apk");
return Server.get().getAddress("/x5.tbs.apk");
}
private static void tbsInit() {

@ -6,8 +6,11 @@ import android.widget.TextView;
import com.fongmi.android.tv.App;
import java.text.DecimalFormat;
public class Traffic {
private static final DecimalFormat format = new DecimalFormat("#.0");
private static final String UNIT_KB = " KB/s";
private static final String UNIT_MB = " MB/s";
private static long lastTotalRxBytes = 0;
@ -24,14 +27,12 @@ public class Traffic {
}
private static String getSpeed() {
long total = TrafficStats.getTotalRxBytes() / 1024;
long time = System.currentTimeMillis();
long diff = (total - lastTotalRxBytes) * 1000;
long speed = diff / Math.max(time - lastTimeStamp, 1);
lastTimeStamp = time;
lastTotalRxBytes = total;
if (speed > 1000) return speed / 1000 + UNIT_MB;
else return speed + UNIT_KB;
long nowTotalRxBytes = TrafficStats.getTotalRxBytes() / 1024;
long nowTimeStamp = System.currentTimeMillis();
long speed = (nowTotalRxBytes - lastTotalRxBytes) * 1000 / Math.max(nowTimeStamp - lastTimeStamp, 1);
lastTimeStamp = nowTimeStamp;
lastTotalRxBytes = nowTotalRxBytes;
return speed < 1000 ? speed + UNIT_KB : format.format(speed / 1024f) + UNIT_MB;
}
public static void reset() {

@ -43,10 +43,10 @@ public class UrlUtil {
public static String convert(String url) {
String scheme = scheme(url);
if ("clan".equals(scheme)) return convert(fixUrl(url));
if ("local".equals(scheme)) return url.replace("local://", Server.get().getAddress(""));
if ("assets".equals(scheme)) return url.replace("assets://", Server.get().getAddress(""));
if ("file".equals(scheme)) return url.replace("file://", Server.get().getAddress("file/"));
if ("proxy".equals(scheme)) return url.replace("proxy://", Server.get().getAddress("proxy?"));
if ("local".equals(scheme)) return url.replace("local://", Server.get().getAddress("/"));
if ("assets".equals(scheme)) return url.replace("assets://", Server.get().getAddress("/"));
if ("file".equals(scheme)) return url.replace("file://", Server.get().getAddress("/file/"));
if ("proxy".equals(scheme)) return url.replace("proxy://", Server.get().getAddress("/proxy?"));
return url;
}

@ -39,7 +39,7 @@
<string name="play_time">时间</string>
<string name="play_netspeed">网速</string>
<string name="play_duration">进度</string>
<string name="play_mini_progress">迷你进度</string>
<string name="play_mini_progress">迷你</string>
<string name="play_video_title">标题</string>
<string name="play_danmu">弹幕</string>
<string name="play_display">屏显</string>

@ -39,7 +39,7 @@
<string name="play_time">時間</string>
<string name="play_netspeed">網速</string>
<string name="play_duration">進度</string>
<string name="play_mini_progress">迷你進度</string>
<string name="play_mini_progress">迷你</string>
<string name="play_video_title">標題</string>
<string name="play_danmu">彈幕</string>
<string name="play_display">屏顯</string>
@ -155,7 +155,7 @@
<string name="error_play_next">已經是最後一集了!</string>
<string name="error_play_prev">已經是第一集了!</string>
<string name="error_play_parse">播放網址解析失敗</string>
<string name="error_play_url">播放網址載入失敗\n錯誤代碼 <xliff:g name="name">%s</xliff:g></string>
<string name="error_play_url">播放網址載入失敗\n錯誤代碼<xliff:g name="name">%s</xliff:g></string>
<string name="error_play_flag">暫無線路資料</string>
<string name="error_play_timeout">連線逾時</string>
<string name="error_detail">暫無播放資料</string>

@ -39,7 +39,7 @@
<string name="play_time">Time</string>
<string name="play_netspeed">Net Speed</string>
<string name="play_duration">Duration</string>
<string name="play_mini_progress">Mini Progress</string>
<string name="play_mini_progress">Mini</string>
<string name="play_video_title">Title</string>
<string name="play_danmu">Danmu</string>
<string name="play_display">Display</string>

@ -186,6 +186,10 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
start(activity, key, id, name, pic, null, true);
}
public static void download(Activity activity, String id, String name, String pic) {
start(activity, "push_agent", id, name, pic, null, false, true);
}
public static void start(Activity activity, String url) {
start(activity, "push_agent", url, url, null);
}
@ -199,7 +203,12 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
}
public static void start(Activity activity, String key, String id, String name, String pic, String mark, boolean collect) {
start(activity, key, id, name, pic, mark, collect, false);
}
public static void start(Activity activity, String key, String id, String name, String pic, String mark, boolean collect, boolean download) {
Intent intent = new Intent(activity, VideoActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("download", download);
intent.putExtra("collect", collect);
intent.putExtra("mark", mark);
intent.putExtra("name", name);
@ -269,6 +278,10 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
return getIntent().getBooleanExtra("collect", false);
}
private boolean isFromDownload() {
return getIntent().getBooleanExtra("download", false);
}
private boolean isAutoRotate() {
return Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) == 1;
}
@ -547,6 +560,8 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
private void setDetail(Vod item) {
mBinding.progressLayout.showContent();
if (isFromDownload()) item.setVodName("");
if (isFromDownload()) item.setVodPic("");
mBinding.video.setTag(item.getVodPic(getPic()));
mBinding.name.setText(item.getVodName(getName()));
Downloader.get().image(item.getVodPic());

@ -1,6 +1,7 @@
package com.fongmi.android.tv.ui.dialog;
import android.content.DialogInterface;
import android.text.InputFilter;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@ -46,6 +47,7 @@ public class LinkDialog {
private void initView() {
CharSequence text = Util.getClipText();
binding.text.setFilters(new InputFilter[]{new InputFilter.LengthFilter(Integer.MAX_VALUE)});
if (!TextUtils.isEmpty(text)) binding.text.setText(Sniffer.getUrl(text.toString()));
}

@ -43,6 +43,7 @@ class Spider(metaclass=ABCMeta):
def searchContent(self, key, quick):
pass
@abstractmethod
def searchContentPage(self, key, quick, pg):
pass
@ -66,6 +67,7 @@ class Spider(metaclass=ABCMeta):
def getName(self):
pass
@abstractmethod
def destroy(self):
pass
@ -80,6 +82,13 @@ class Spider(metaclass=ABCMeta):
path = os.path.join(os.path.join(cache_dir, 'py'), f'{name}.py')
return SourceFileLoader(name, path).load_module()
def regStr(self, reg, src, group=1):
m = re.search(reg, src)
src = ''
if m:
src = m.group(group)
return src
def removeHtmlTags(self, src):
clean = re.compile('<.*?>')
return re.sub(clean, '', src)

@ -38,7 +38,7 @@ public class Crypto {
SecretKeySpec keySpec = new SecretKeySpec(keyBuf, "AES");
if (iv == null) cipher.init(encrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, keySpec);
else cipher.init(encrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(ivBuf));
byte[] inBuf = inBase64 ? Base64.decode(input, Base64.DEFAULT | Base64.URL_SAFE) : input.getBytes("UTF-8");
byte[] inBuf = inBase64 ? Base64.decode(input.replaceAll("_", "/").replaceAll("-", "+"), Base64.DEFAULT) : input.getBytes("UTF-8");
return outBase64 ? Base64.encodeToString(cipher.doFinal(inBuf), Base64.NO_WRAP) : new String(cipher.doFinal(inBuf), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
@ -51,7 +51,7 @@ public class Crypto {
Key rsaKey = generateKey(pub, key);
int len = getModulusLength(rsaKey);
byte[] outBytes = new byte[0];
byte[] inBytes = inBase64 ? Base64.decode(input, Base64.DEFAULT | Base64.URL_SAFE) : input.getBytes("UTF-8");
byte[] inBytes = inBase64 ? Base64.decode(input.replaceAll("_", "/").replaceAll("-", "+"), Base64.DEFAULT) : input.getBytes("UTF-8");
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(encrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, rsaKey);
int blockLen = encrypt ? len / 8 - 11 : len / 8;

Loading…
Cancel
Save