diff --git a/.gitignore b/.gitignore
index 79a68503c..c7b1543ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
.idea
.gradle
*.jks
-*.aar
+lib-*.aar
*build
/media*
/Release
diff --git a/app/build.gradle b/app/build.gradle
index 59309d7a7..be5011389 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -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')
diff --git a/app/libs/dlna-core-release.aar b/app/libs/dlna-core-release.aar
new file mode 100644
index 000000000..43643fa9d
Binary files /dev/null and b/app/libs/dlna-core-release.aar differ
diff --git a/app/libs/dlna-core.aar b/app/libs/dlna-core.aar
deleted file mode 100644
index af4c9fcc3..000000000
Binary files a/app/libs/dlna-core.aar and /dev/null differ
diff --git a/app/libs/dlna-dmc-release.aar b/app/libs/dlna-dmc-release.aar
new file mode 100644
index 000000000..c529ce2b9
Binary files /dev/null and b/app/libs/dlna-dmc-release.aar differ
diff --git a/app/libs/dlna-dmc.aar b/app/libs/dlna-dmc.aar
deleted file mode 100644
index 97634d04c..000000000
Binary files a/app/libs/dlna-dmc.aar and /dev/null differ
diff --git a/app/libs/dlna-dmr-release.aar b/app/libs/dlna-dmr-release.aar
new file mode 100644
index 000000000..08b2cf143
Binary files /dev/null and b/app/libs/dlna-dmr-release.aar differ
diff --git a/app/libs/dlna-dmr.aar b/app/libs/dlna-dmr.aar
deleted file mode 100644
index 7bb79a622..000000000
Binary files a/app/libs/dlna-dmr.aar and /dev/null differ
diff --git a/app/src/main/java/com/fongmi/android/tv/Constant.java b/app/src/main/java/com/fongmi/android/tv/Constant.java
index 9a24e9349..b080b9533 100644
--- a/app/src/main/java/com/fongmi/android/tv/Constant.java
+++ b/app/src/main/java/com/fongmi/android/tv/Constant.java
@@ -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;
//直播爬蟲時間
diff --git a/app/src/main/java/com/fongmi/android/tv/api/Decoder.java b/app/src/main/java/com/fongmi/android/tv/api/Decoder.java
index 08ae18c00..73f0a4986 100644
--- a/app/src/main/java/com/fongmi/android/tv/api/Decoder.java
+++ b/app/src/main/java/com/fongmi/android/tv/api/Decoder.java
@@ -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;
}
diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Drm.java b/app/src/main/java/com/fongmi/android/tv/bean/Drm.java
index 58f847c66..4f5bf03cc 100644
--- a/app/src/main/java/com/fongmi/android/tv/bean/Drm.java
+++ b/app/src/main/java/com/fongmi/android/tv/bean/Drm.java
@@ -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() {
diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java
index 1ca6c07b1..65b0dbfde 100644
--- a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java
+++ b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java
@@ -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();
}
diff --git a/app/src/main/java/com/fongmi/android/tv/server/Server.java b/app/src/main/java/com/fongmi/android/tv/server/Server.java
index 7fc271ff9..7dbdbeeeb 100644
--- a/app/src/main/java/com/fongmi/android/tv/server/Server.java
+++ b/app/src/main/java/com/fongmi/android/tv/server/Server.java
@@ -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) {
diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java
index cbd113615..a1a3f04e8 100644
--- a/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java
+++ b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java
@@ -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;
diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Tbs.java b/app/src/main/java/com/fongmi/android/tv/utils/Tbs.java
index 49170055c..640b41b69 100644
--- a/app/src/main/java/com/fongmi/android/tv/utils/Tbs.java
+++ b/app/src/main/java/com/fongmi/android/tv/utils/Tbs.java
@@ -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() {
diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Traffic.java b/app/src/main/java/com/fongmi/android/tv/utils/Traffic.java
index e115b4622..0213f7cd1 100644
--- a/app/src/main/java/com/fongmi/android/tv/utils/Traffic.java
+++ b/app/src/main/java/com/fongmi/android/tv/utils/Traffic.java
@@ -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() {
diff --git a/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java
index 63dae1309..efb92405b 100644
--- a/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java
+++ b/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java
@@ -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;
}
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index ae77272b3..3559941c4 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -39,7 +39,7 @@
时间
网速
进度
- 迷你进度
+ 迷你
标题
弹幕
屏显
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 8a1a4fcb9..3675d3751 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -39,7 +39,7 @@
時間
網速
進度
- 迷你進度
+ 迷你
標題
彈幕
屏顯
@@ -155,7 +155,7 @@
已經是最後一集了!
已經是第一集了!
播放網址解析失敗
- 播放網址載入失敗\n錯誤代碼 %s
+ 播放網址載入失敗\n錯誤代碼:%s
暫無線路資料
連線逾時
暫無播放資料
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index da7b4e76a..9c4b2e099 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -39,7 +39,7 @@
Time
Net Speed
Duration
- Mini Progress
+ Mini
Title
Danmu
Display
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 2dec1ed30..49a07a21d 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
@@ -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());
diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/LinkDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/LinkDialog.java
index cb1655e43..9e92db3b4 100644
--- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/LinkDialog.java
+++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/LinkDialog.java
@@ -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()));
}
diff --git a/pyramid/src/main/python/base/spider.py b/pyramid/src/main/python/base/spider.py
index db8613304..64f64e2fb 100644
--- a/pyramid/src/main/python/base/spider.py
+++ b/pyramid/src/main/python/base/spider.py
@@ -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)
diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java
index 22d4b628b..44357c97d 100644
--- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java
+++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java
@@ -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;