@@ -136,8 +133,8 @@
diff --git a/app/src/main/assets/js/script.js b/app/src/main/assets/js/script.js
index 9e53fe7be..176ee1f7f 100644
--- a/app/src/main/assets/js/script.js
+++ b/app/src/main/assets/js/script.js
@@ -12,8 +12,12 @@ function push() {
doAction('push', { url: $('#push_url').val() });
}
-function api() {
- doAction('api', { url: $('#api_url').val() });
+function setting() {
+ doAction('setting', { url: $('#setting_text').val() });
+}
+
+function file(path) {
+ doAction('file', { path: path });
}
function doAction(action, kv) {
@@ -73,8 +77,8 @@ function selectFile(path, canDel) {
$("#fileInfoDialog").show();
}
-function fileToApi() {
- doAction('api', { url: "file:/" + current_file });
+function pushFile() {
+ file("file:/" + current_file);
hideFileInfo();
}
diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Sub.java b/app/src/main/java/com/fongmi/android/tv/bean/Sub.java
index 82a89df59..899451795 100644
--- a/app/src/main/java/com/fongmi/android/tv/bean/Sub.java
+++ b/app/src/main/java/com/fongmi/android/tv/bean/Sub.java
@@ -7,6 +7,7 @@ import androidx.media3.common.C;
import androidx.media3.common.MediaItem;
import com.fongmi.android.tv.player.ExoUtil;
+import com.github.catvod.utils.Path;
import com.github.catvod.utils.Trans;
import com.google.gson.annotations.SerializedName;
@@ -26,10 +27,24 @@ public class Sub {
private int flag;
public static Sub from(String path) {
- return from(new File(path));
+ if (path.startsWith("http")) {
+ return http(path);
+ } else {
+ return file(Path.local(path));
+ }
}
- public static Sub from(File file) {
+ private static Sub http(String url) {
+ Uri uri = Uri.parse(url);
+ Sub sub = new Sub();
+ sub.url = url;
+ sub.name = uri.getLastPathSegment();
+ sub.flag = C.SELECTION_FLAG_FORCED;
+ sub.format = ExoUtil.getMimeType(uri.getLastPathSegment());
+ return sub;
+ }
+
+ private static Sub file(File file) {
Sub sub = new Sub();
sub.name = file.getName();
sub.url = file.getAbsolutePath();
diff --git a/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java b/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java
index eabaa0d56..e0d156152 100644
--- a/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java
+++ b/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java
@@ -5,6 +5,7 @@ import org.greenrobot.eventbus.EventBus;
public class RefreshEvent {
private final Type type;
+ private String path;
public static void empty() {
EventBus.getDefault().post(new RefreshEvent(Type.EMPTY));
@@ -46,15 +47,32 @@ public class RefreshEvent {
EventBus.getDefault().post(new RefreshEvent(Type.PLAYER));
}
+ public static void subtitle(String path) {
+ EventBus.getDefault().post(new RefreshEvent(Type.SUBTITLE, path));
+ }
+
+ public static void danmaku(String path) {
+ EventBus.getDefault().post(new RefreshEvent(Type.DANMAKU, path));
+ }
+
private RefreshEvent(Type type) {
this.type = type;
}
+ public RefreshEvent(Type type, String path) {
+ this.type = type;
+ this.path = path;
+ }
+
public Type getType() {
return type;
}
+ public String getPath() {
+ return path;
+ }
+
public enum Type {
- EMPTY, CONFIG, IMAGE, VIDEO, HISTORY, KEEP, SIZE, WALL, DETAIL, PLAYER
+ EMPTY, CONFIG, IMAGE, VIDEO, HISTORY, KEEP, SIZE, WALL, DETAIL, PLAYER, SUBTITLE, DANMAKU
}
}
diff --git a/app/src/main/java/com/fongmi/android/tv/event/ServerEvent.java b/app/src/main/java/com/fongmi/android/tv/event/ServerEvent.java
index 41dc19d8e..28c889398 100644
--- a/app/src/main/java/com/fongmi/android/tv/event/ServerEvent.java
+++ b/app/src/main/java/com/fongmi/android/tv/event/ServerEvent.java
@@ -15,8 +15,8 @@ public class ServerEvent {
EventBus.getDefault().post(new ServerEvent(Type.PUSH, text));
}
- public static void api(String text) {
- EventBus.getDefault().post(new ServerEvent(Type.API, text));
+ public static void setting(String text) {
+ EventBus.getDefault().post(new ServerEvent(Type.SETTING, text));
}
private ServerEvent(Type type, String text) {
@@ -33,6 +33,6 @@ public class ServerEvent {
}
public enum Type {
- SEARCH, PUSH, API
+ SEARCH, PUSH, SETTING
}
}
diff --git a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
index a1fcbeb02..8b7867025 100644
--- a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
+++ b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
@@ -3,6 +3,7 @@ package com.fongmi.android.tv.player;
import android.content.Context;
import android.graphics.Color;
import android.net.Uri;
+import android.text.TextUtils;
import android.view.accessibility.CaptioningManager;
import androidx.media3.common.MediaItem;
@@ -108,6 +109,7 @@ public class ExoUtil {
}
public static String getMimeType(String path) {
+ if (TextUtils.isEmpty(path)) return "";
if (path.endsWith(".vtt")) return MimeTypes.TEXT_VTT;
if (path.endsWith(".ssa") || path.endsWith(".ass")) return MimeTypes.TEXT_SSA;
if (path.endsWith(".ttml") || path.endsWith(".xml") || path.endsWith(".dfxp")) return MimeTypes.APPLICATION_TTML;
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 b24f20c5a..3150c4ed2 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
@@ -145,6 +145,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic
public void setSub(Sub sub) {
this.sub = sub;
+ if (isIjk()) return;
setMediaSource(headers, url);
}
diff --git a/app/src/main/java/com/fongmi/android/tv/player/danmu/Parser.java b/app/src/main/java/com/fongmi/android/tv/player/danmu/Parser.java
index 2c2a9b7a1..3b98a94b3 100644
--- a/app/src/main/java/com/fongmi/android/tv/player/danmu/Parser.java
+++ b/app/src/main/java/com/fongmi/android/tv/player/danmu/Parser.java
@@ -4,6 +4,8 @@ import android.graphics.Color;
import android.text.TextUtils;
import com.fongmi.android.tv.bean.Danmu;
+import com.github.catvod.net.OkHttp;
+import com.github.catvod.utils.Path;
import org.json.JSONArray;
import org.json.JSONException;
@@ -27,8 +29,14 @@ public class Parser extends BaseDanmakuParser {
private float scaleY;
private int index;
- public Parser(String xml) {
- this.danmu = Danmu.fromXml(xml);
+ public Parser(String path) {
+ this.danmu = Danmu.fromXml(getContent(path));
+ }
+
+ private String getContent(String path) {
+ if (path.startsWith("file")) return Path.read(path);
+ if (path.startsWith("http")) return OkHttp.string(path);
+ return path;
}
@Override
diff --git a/app/src/main/java/com/fongmi/android/tv/server/process/Action.java b/app/src/main/java/com/fongmi/android/tv/server/process/Action.java
index 044ed258b..8297f32bc 100644
--- a/app/src/main/java/com/fongmi/android/tv/server/process/Action.java
+++ b/app/src/main/java/com/fongmi/android/tv/server/process/Action.java
@@ -43,8 +43,11 @@ public class Action implements Process {
case "push":
onPush(params);
break;
- case "api":
- onApi(params);
+ case "setting":
+ onSetting(params);
+ break;
+ case "file":
+ onFile(params);
break;
case "refresh":
onRefresh(params);
@@ -60,27 +63,49 @@ public class Action implements Process {
}
private void onSearch(Map
params) {
- String word = Objects.requireNonNullElse(params.get("word"), "");
- if (word.length() > 0) ServerEvent.search(word);
+ String word = params.get("word");
+ if (TextUtils.isEmpty(word)) return;
+ ServerEvent.search(word);
}
private void onPush(Map params) {
- String url = Objects.requireNonNullElse(params.get("url"), "");
- if (url.length() > 0) ServerEvent.push(url);
+ String url = params.get("url");
+ if (TextUtils.isEmpty(url)) return;
+ ServerEvent.push(url);
+ }
+
+ private void onSetting(Map params) {
+ String text = params.get("text");
+ if (TextUtils.isEmpty(text)) return;
+ ServerEvent.setting(text);
}
- private void onApi(Map params) {
- String url = Objects.requireNonNullElse(params.get("url"), "");
- if (url.endsWith(".apk")) FileUtil.openFile(Path.local(url));
- else if (url.length() > 0) ServerEvent.api(url);
+ private void onFile(Map params) {
+ String path = params.get("path");
+ if (TextUtils.isEmpty(path)) return;
+ if (path.endsWith(".xml")) RefreshEvent.danmaku(path);
+ else if (path.endsWith(".apk")) FileUtil.openFile(Path.local(path));
+ else if (path.endsWith(".srt") || path.endsWith(".ssa") || path.endsWith(".ass")) RefreshEvent.subtitle(path);
+ else ServerEvent.setting(path);
}
private void onRefresh(Map params) {
String type = params.get("type");
- if ("detail".equals(type)) {
- RefreshEvent.detail();
- } else if ("player".equals(type)) {
- RefreshEvent.player();
+ String path = params.get("path");
+ if (TextUtils.isEmpty(type)) return;
+ switch (type) {
+ case "detail":
+ RefreshEvent.detail();
+ break;
+ case "player":
+ RefreshEvent.player();
+ break;
+ case "subtitle":
+ RefreshEvent.subtitle(path);
+ break;
+ case "danmaku":
+ RefreshEvent.danmaku(path);
+ break;
}
}
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 d27d26b5b..a134ba334 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
@@ -22,7 +22,7 @@ public class Sniffer {
private static final String TAG = Sniffer.class.getSimpleName();
public static final Pattern CLICKER = Pattern.compile("\\[a=cr:(\\{.*?\\})\\/](.*?)\\[\\/a]");
- public static final String RULE = "http((?!http).){12,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http((?!http).)*?video/tos*";
+ public static final String RULE = "http((?!http).){12,}?\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac)|http((?!http).)*?video/tos*";
public static final List THUNDER = Arrays.asList("thunder", "magnet", "ed2k");
public static String getUrl(String text) {
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 598472466..3fe9e9328 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
@@ -51,6 +51,7 @@ import com.fongmi.android.tv.bean.Keep;
import com.fongmi.android.tv.bean.Parse;
import com.fongmi.android.tv.bean.Result;
import com.fongmi.android.tv.bean.Site;
+import com.fongmi.android.tv.bean.Sub;
import com.fongmi.android.tv.bean.Track;
import com.fongmi.android.tv.bean.Vod;
import com.fongmi.android.tv.cast.CastVideo;
@@ -94,7 +95,6 @@ import com.fongmi.android.tv.utils.Sniffer;
import com.fongmi.android.tv.utils.Traffic;
import com.fongmi.android.tv.utils.Util;
import com.github.bassaer.library.MDColor;
-import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Trans;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.permissionx.guolindev.PermissionX;
@@ -584,11 +584,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
private void checkDanmu(String danmu) {
mBinding.danmaku.release();
mBinding.danmaku.setVisibility(danmu.isEmpty() ? View.GONE : View.VISIBLE);
- App.execute(() -> {
- String temp = danmu;
- if (temp.startsWith("http")) temp = OkHttp.string(temp);
- if (temp.length() > 0) mBinding.danmaku.prepare(new Parser(temp), mDanmakuContext);
- });
+ if (danmu.length() > 0) App.execute(() -> mBinding.danmaku.prepare(new Parser(danmu), mDanmakuContext));
}
@Override
@@ -1165,7 +1161,9 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
@Subscribe(threadMode = ThreadMode.MAIN)
public void onRefreshEvent(RefreshEvent event) {
if (event.getType() == RefreshEvent.Type.DETAIL) getDetail();
- if (event.getType() == RefreshEvent.Type.PLAYER) onRefresh();
+ else if (event.getType() == RefreshEvent.Type.PLAYER) onRefresh();
+ else if (event.getType() == RefreshEvent.Type.DANMAKU) checkDanmu(event.getPath());
+ else if (event.getType() == RefreshEvent.Type.SUBTITLE) mPlayers.setSub(Sub.from(event.getPath()));
}
@Subscribe(threadMode = ThreadMode.MAIN)