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;