直播源加载优化;

pull/144/head
于俊 12 months ago
parent cbe8119676
commit 3eaf11f042
  1. 1
      app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java
  2. 163
      app/src/main/java/com/github/tvbox/osc/ui/activity/LivePlayActivity.java

@ -850,6 +850,7 @@ public class ApiConfig {
}
LOG.i("echo-live-proxy-url:"+url);
}else {
liveChannelGroupList.clear();
return;
}
}

@ -1814,18 +1814,6 @@ public class LivePlayActivity extends BaseActivity {
if(position==Hawk.get(HawkConfig.LIVE_GROUP_INDEX, 0))break;
JsonArray live_groups=Hawk.get(HawkConfig.LIVE_GROUP_LIST,new JsonArray());
JsonObject livesOBJ = live_groups.get(position).getAsJsonObject();
if(livesOBJ.has("type")){
String type= livesOBJ.get("type").getAsString();
if(!type.equals("0") && !type.equals("3")){
Toast.makeText(App.getInstance(), "暂不支持该直播类型", Toast.LENGTH_SHORT).show();
break;
}
}else {
if(!livesOBJ.has("channels")){
Toast.makeText(App.getInstance(), "暂不支持该直播类型", Toast.LENGTH_SHORT).show();
break;
}
}
liveSettingItemAdapter.selectItem(position, true, true);
Hawk.put(HawkConfig.LIVE_GROUP_INDEX, position);
ApiConfig.get().loadLiveApi(livesOBJ);
@ -1839,28 +1827,13 @@ public class LivePlayActivity extends BaseActivity {
private void initLiveChannelList() {
List<LiveChannelGroup> list = ApiConfig.get().getChannelGroupList();
if (list.isEmpty()) {
if(Hawk.get(HawkConfig.LIVE_GROUP_INDEX, 0)!=0){
Hawk.put(HawkConfig.LIVE_GROUP_INDEX, 0);
JsonArray live_groups=Hawk.get(HawkConfig.LIVE_GROUP_LIST,new JsonArray());
if(!live_groups.isEmpty()){
JsonObject livesOBJ = live_groups.get(0).getAsJsonObject();
ApiConfig.get().loadLiveApi(livesOBJ);
}else {
Toast.makeText(App.getInstance(), "频道列表为空", Toast.LENGTH_SHORT).show();
finish();
return;
}
}else {
Toast.makeText(App.getInstance(), "频道列表为空", Toast.LENGTH_SHORT).show();
finish();
return;
}
setDefaultLiveChannelList();
return;
}
initLiveObj();
if (list.size() == 1 && list.get(0).getGroupName().startsWith("http://127.0.0.1")) {
loadProxyLives(list.get(0).getGroupName());
}
else {
} else {
liveChannelGroupList.clear();
liveChannelGroupList.addAll(list);
showSuccess();
@ -1873,9 +1846,8 @@ public class LivePlayActivity extends BaseActivity {
Uri parsedUrl = Uri.parse(url);
url = new String(Base64.decode(parsedUrl.getQueryParameter("ext"), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8");
} catch (Throwable th) {
if(!url.startsWith("http://127.0.0.1")){
Toast.makeText(App.getInstance(), "直播文件错误", Toast.LENGTH_SHORT).show();
finish();
if (!url.startsWith("http://127.0.0.1")) {
setDefaultLiveChannelList();
return;
}
}
@ -1885,8 +1857,9 @@ public class LivePlayActivity extends BaseActivity {
if(url.contains(".py")){
if (!hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// 权限不足时,直接设置默认播放列表
Toast.makeText(App.getInstance(), "该源需要存储权限", Toast.LENGTH_SHORT).show();
finish();
setDefaultLiveChannelList();
return;
}
String finalUrl = url;
@ -1896,7 +1869,7 @@ public class LivePlayActivity extends BaseActivity {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
public String call() {
LOG.i("echo--loadProxyLives-json--");
Spider sp = ApiConfig.get().getPyCSP(finalUrl);
String json=sp.liveContent(finalUrl);
@ -1913,31 +1886,19 @@ public class LivePlayActivity extends BaseActivity {
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
// 将字符串转换为 JSONObject
// try {
// assert sortJson != null;
// JSONObject jsonObject = new JSONObject(sortJson);
// sortJson = jsonObject.getString("liveList");
// } catch (JSONException e) {
// JsonArray live_groups=Hawk.get(HawkConfig.LIVE_GROUP_LIST,new JsonArray());
// Hawk.put(HawkConfig.LIVE_GROUP_INDEX,Hawk.get(HawkConfig.LIVE_GROUP_INDEX,0)+1);
// if(Hawk.get(HawkConfig.LIVE_GROUP_INDEX,0)>live_groups.size()-1){
// Hawk.put(HawkConfig.LIVE_GROUP_INDEX,0);
// }
// mHandler.post(new Runnable() {
// @Override
// public void run() {
// Toast.makeText(App.getInstance(), "加载错误,请重试", Toast.LENGTH_SHORT).show();
//
// jumpActivity(HomeActivity.class);
// }
// });
// return;
// }
JsonArray livesArray;
if (sortJson==null || sortJson.isEmpty()) {
// 频道列表为空时,使用默认播放列表
mHandler.post(new Runnable() {
@Override
public void run() {
setDefaultLiveChannelList();
}
});
return;
}
LinkedHashMap<String, LinkedHashMap<String, ArrayList<String>>> linkedHashMap = new LinkedHashMap<>();
TxtSubscribe.parse(linkedHashMap, sortJson);
livesArray = TxtSubscribe.live2JsonArray(linkedHashMap);
JsonArray livesArray = TxtSubscribe.live2JsonArray(linkedHashMap);
ApiConfig.get().loadLives(livesArray);
List<LiveChannelGroup> list = ApiConfig.get().getChannelGroupList();
@ -1945,8 +1906,7 @@ public class LivePlayActivity extends BaseActivity {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(App.getInstance(), "频道列表为空", Toast.LENGTH_SHORT).show();
finish();
setDefaultLiveChannelList();
}
});
return;
@ -1981,16 +1941,19 @@ public class LivePlayActivity extends BaseActivity {
@Override
public void onSuccess(Response<String> response) {
JsonArray livesArray;
LinkedHashMap<String, LinkedHashMap<String, ArrayList<String>>> linkedHashMap = new LinkedHashMap<>();
TxtSubscribe.parse(linkedHashMap, response.body());
livesArray = TxtSubscribe.live2JsonArray(linkedHashMap);
JsonArray livesArray = TxtSubscribe.live2JsonArray(linkedHashMap);
ApiConfig.get().loadLives(livesArray);
List<LiveChannelGroup> list = ApiConfig.get().getChannelGroupList();
if (list.isEmpty()) {
Toast.makeText(App.getInstance(), "频道列表为空", Toast.LENGTH_SHORT).show();
finish();
mHandler.post(new Runnable() {
@Override
public void run() {
setDefaultLiveChannelList();
}
});
return;
}
liveChannelGroupList.clear();
@ -2004,59 +1967,20 @@ public class LivePlayActivity extends BaseActivity {
}
});
}
@Override
public void onError(Response<String> response) {
Toast.makeText(App.getInstance(), "加载错误,请重试", Toast.LENGTH_SHORT).show();
JsonArray live_groups=Hawk.get(HawkConfig.LIVE_GROUP_LIST,new JsonArray());
Hawk.put(HawkConfig.LIVE_GROUP_INDEX,Hawk.get(HawkConfig.LIVE_GROUP_INDEX,0)+1);
if(Hawk.get(HawkConfig.LIVE_GROUP_INDEX,0)>live_groups.size()-1){
Hawk.put(HawkConfig.LIVE_GROUP_INDEX,0);
}
mHandler.post(new Runnable() {
@Override
public void run() {
jumpActivity(HomeActivity.class);
setDefaultLiveChannelList();
}
});
}
});
}
}
private void autoSwitchNextLive(){
Toast.makeText(App.getInstance(), "加载错误,自动切换下一个源", Toast.LENGTH_SHORT).show();
JsonArray live_groups=Hawk.get(HawkConfig.LIVE_GROUP_LIST,new JsonArray());
int position=Hawk.get(HawkConfig.LIVE_GROUP_INDEX,0)+1;
if(position>live_groups.size()-1){
Hawk.put(HawkConfig.LIVE_GROUP_INDEX,0);
Toast.makeText(App.getInstance(), "当前无有效直播,自动退出到主页", Toast.LENGTH_SHORT).show();
jumpActivity(HomeActivity.class);
}
JsonObject livesOBJ = live_groups.get(position).getAsJsonObject();
if(livesOBJ.has("type")){
String type= livesOBJ.get("type").getAsString();
if(!type.equals("0") && !type.equals("3")){
Toast.makeText(App.getInstance(), "暂不支持该直播类型", Toast.LENGTH_SHORT).show();
autoSwitchNextLive();
}
}else {
if(!livesOBJ.has("channels")){
Toast.makeText(App.getInstance(), "暂不支持该直播类型", Toast.LENGTH_SHORT).show();
autoSwitchNextLive();
}
}
liveSettingItemAdapter.selectItem(position, true, true);
Hawk.put(HawkConfig.LIVE_GROUP_INDEX, position);
ApiConfig.get().loadLiveApi(livesOBJ);
if (mVideoView != null) {
mVideoView.release();
mVideoView=null;
}
recreate();
}
private void initLiveState() {
String lastChannelName = Hawk.get(HawkConfig.LIVE_CHANNEL, "");
@ -2459,4 +2383,33 @@ public class LivePlayActivity extends BaseActivity {
countDownTimer3.start();
}
/**
* 当播放列表为空或加载失败时设置一个默认的播放列表保证播放界面不会崩溃
*/
private void setDefaultLiveChannelList() {
liveChannelGroupList.clear();
// 创建默认直播分组
LiveChannelGroup defaultGroup = new LiveChannelGroup();
defaultGroup.setGroupIndex(0);
defaultGroup.setGroupName("default group");
defaultGroup.setGroupPassword("");
LiveChannelItem defaultChannel = new LiveChannelItem();
defaultChannel.setChannelName("default channel");
defaultChannel.setChannelIndex(0);
defaultChannel.setChannelNum(1);
ArrayList<String> defaultSourceNames = new ArrayList<>();
ArrayList<String> defaultSourceUrls = new ArrayList<>();
defaultSourceNames.add("default source");
defaultSourceUrls.add("http://default.play.url/stream");
defaultChannel.setChannelSourceNames(defaultSourceNames);
defaultChannel.setChannelUrls(defaultSourceUrls);
// 将默认频道添加到分组内
ArrayList<LiveChannelItem> channels = new ArrayList<>();
channels.add(defaultChannel);
defaultGroup.setLiveChannels(channels);
// 添加分组到全局列表
liveChannelGroupList.add(defaultGroup);
showSuccess();
initLiveState();
}
}
Loading…
Cancel
Save