From 9efbe2d46eb8c155dbb618c28b746c73b336ecd8 Mon Sep 17 00:00:00 2001
From: okjackcaptain <378702538@qq.com>
Date: Fri, 2 Dec 2022 13:26:19 +0800
Subject: [PATCH] =?UTF-8?q?-=20IJK=E6=92=AD=E6=94=BE=E5=99=A8,mp3,mkv,avi?=
=?UTF-8?q?=E7=AD=89=E8=BE=B9=E7=BC=93=E5=AD=98=E8=BE=B9=E6=92=AD=E6=94=BE?=
=?UTF-8?q?=EF=BC=88=E5=85=AC=E6=B5=8B=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=9C=89?=
=?UTF-8?q?bug=E8=AF=B7=E5=8F=8D=E9=A6=88=EF=BC=89=20(by=20okjack)=20-=20?=
=?UTF-8?q?=E8=AE=BE=E7=BD=AE=E6=96=B0=E5=A2=9E=E6=B8=85=E7=A9=BAIJK?=
=?UTF-8?q?=E7=BC=93=E5=AD=98=20(by=20okjack)=20-=20=E6=8C=87=E5=AE=9A?=
=?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=BA=90=E5=8A=A8=E6=80=81=E5=A4=9A=E8=A1=8C?=
=?UTF-8?q?=E6=98=BE=E7=A4=BA=20(by=20okjack)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/misc.xml | 5 +
.../tvbox/osc/player/IjkMediaPlayer.java | 43 +++++++-
.../osc/ui/dialog/SearchCheckboxDialog.java | 15 ++-
.../osc/ui/fragment/ModelSettingFragment.java | 24 +++++
.../com/github/tvbox/osc/util/FileUtils.java | 8 ++
.../res/layout/dialog_checkbox_search.xml | 10 +-
app/src/main/res/layout/fragment_model.xml | 100 +++++++++++++-----
.../layout/item_dialog_checkbox_search.xml | 8 +-
8 files changed, 178 insertions(+), 35 deletions(-)
diff --git a/.idea/misc.xml b/.idea/misc.xml
index b0e41412..189a1a3d 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -39,7 +39,12 @@
+
+
+
+
+
diff --git a/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java b/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java
index 9aa1ebe7..9caee3f6 100644
--- a/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java
+++ b/app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java
@@ -5,7 +5,10 @@ import android.text.TextUtils;
import com.github.tvbox.osc.api.ApiConfig;
import com.github.tvbox.osc.bean.IJKCode;
+import com.github.tvbox.osc.util.FileUtils;
+import com.github.tvbox.osc.util.MD5;
+import java.io.File;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -56,11 +59,49 @@ public class IjkMediaPlayer extends IjkPlayer {
mMediaPlayer.setOption(1, "infbuf", 1);
mMediaPlayer.setOption(1, "rtsp_transport", "tcp");
mMediaPlayer.setOption(1, "rtsp_flags", "prefer_tcp");
+ } else if (!TextUtils.isEmpty(path) && (path.contains(".mp4") || path.contains(".mkv") || path.contains(".avi"))) {
+ String cachePath = FileUtils.getExternalCachePath() + "/ijkcaches/";
+ String cacheMapPath = cachePath;
+ File cacheFile = new File(cachePath);
+ if (!cacheFile.exists()) cacheFile.mkdirs();
+ String tmpMd5 = MD5.string2MD5(path);
+ cachePath += tmpMd5 + ".file";
+ cacheMapPath += tmpMd5 + ".map";
+ mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "cache_file_path", cachePath);
+ mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "cache_map_path", cacheMapPath);
+ mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "parse_cache_map", 1);
+ mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "auto_save_map", 1);
+ path = "ijkio:cache:ffio:" + path;
}
} catch (Exception e) {
e.printStackTrace();
}
- super.setDataSource(path, headers);
+ setDataSourceHeader(headers);
+ mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "protocol_whitelist", "ijkio,ffio,async,cache,crypto,file,http,https,ijkhttphook,ijkinject,ijklivehook,ijklongurl,ijksegment,ijktcphook,pipe,rtp,tcp,tls,udp,ijkurlhook,data");
+ super.setDataSource(path, null);
+ }
+
+ private void setDataSourceHeader(Map headers) {
+ if (headers != null && !headers.isEmpty()) {
+ String userAgent = headers.get("User-Agent");
+ if (!TextUtils.isEmpty(userAgent)) {
+ mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "user_agent", userAgent);
+ // 移除header中的User-Agent,防止重复
+ headers.remove("User-Agent");
+ }
+ if (headers.size() > 0) {
+ StringBuilder sb = new StringBuilder();
+ for (Map.Entry entry : headers.entrySet()) {
+ sb.append(entry.getKey());
+ sb.append(":");
+ String value = entry.getValue();
+ if (!TextUtils.isEmpty(value))
+ sb.append(entry.getValue());
+ sb.append("\r\n");
+ mMediaPlayer.setOption(tv.danmaku.ijk.media.player.IjkMediaPlayer.OPT_CATEGORY_FORMAT, "headers", sb.toString());
+ }
+ }
+ }
}
public TrackInfo getTrackInfo() {
diff --git a/app/src/main/java/com/github/tvbox/osc/ui/dialog/SearchCheckboxDialog.java b/app/src/main/java/com/github/tvbox/osc/ui/dialog/SearchCheckboxDialog.java
index 047b38c4..597aff4c 100644
--- a/app/src/main/java/com/github/tvbox/osc/ui/dialog/SearchCheckboxDialog.java
+++ b/app/src/main/java/com/github/tvbox/osc/ui/dialog/SearchCheckboxDialog.java
@@ -3,6 +3,7 @@ package com.github.tvbox.osc.ui.dialog;
import android.app.Activity;
import android.content.Context;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
@@ -14,6 +15,7 @@ import com.github.tvbox.osc.bean.SourceBean;
import com.github.tvbox.osc.ui.adapter.CheckboxSearchAdapter;
import com.github.tvbox.osc.util.FastClickCheckUtil;
import com.owen.tvrecyclerview.widget.TvRecyclerView;
+import com.owen.tvrecyclerview.widget.V7GridLayoutManager;
import com.owen.tvrecyclerview.widget.V7LinearLayoutManager;
import org.jetbrains.annotations.NotNull;
@@ -21,6 +23,8 @@ import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.List;
+import me.jessyan.autosize.utils.AutoSizeUtils;
+
public class SearchCheckboxDialog extends BaseDialog{
private TvRecyclerView mGridView;
@@ -66,7 +70,16 @@ public class SearchCheckboxDialog extends BaseDialog{
}
});
mGridView.setHasFixedSize(true);
- mGridView.setLayoutManager(new V7LinearLayoutManager(getContext(), 1, false));
+
+ int size = mSourceList.size();
+ int spanCount = (int) Math.floor(size / 10);
+ if (spanCount <= 0) spanCount = 1;
+ if (spanCount > 3) spanCount = 3;
+ mGridView.setLayoutManager(new V7GridLayoutManager(getContext(), spanCount));
+ View root = findViewById(R.id.root);
+ ViewGroup.LayoutParams clp = root.getLayoutParams();
+ clp.width = AutoSizeUtils.mm2px(getContext(), 400 + 260 * (spanCount - 1));
+
mGridView.setAdapter(checkboxSearchAdapter);
checkboxSearchAdapter.setData(mSourceList, mCheckSourcees);
int pos = 0;
diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java
index 2c332f82..524d1fe9 100644
--- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java
+++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java
@@ -28,8 +28,10 @@ import com.github.tvbox.osc.ui.dialog.SearchRemoteTvDialog;
import com.github.tvbox.osc.ui.dialog.SelectDialog;
import com.github.tvbox.osc.ui.dialog.XWalkInitDialog;
import com.github.tvbox.osc.util.FastClickCheckUtil;
+import com.github.tvbox.osc.util.FileUtils;
import com.github.tvbox.osc.util.HawkConfig;
import com.github.tvbox.osc.util.HistoryHelper;
+import com.github.tvbox.osc.util.LOG;
import com.github.tvbox.osc.util.OkGoHelper;
import com.github.tvbox.osc.util.PlayerHelper;
import com.lzy.okgo.OkGo;
@@ -653,6 +655,28 @@ public class ModelSettingFragment extends BaseLazyFragment {
}
});
+
+ findViewById(R.id.llClearIjkCache).setOnClickListener((view -> onClickClearIjkCache()));
+ }
+
+ private void onClickClearIjkCache() {
+ String cachePath = FileUtils.getExternalCachePath() + "/ijkcaches/";
+ File cacheDir = new File(cachePath);
+ if (!cacheDir.exists()) return;
+ File[] files = cacheDir.listFiles();
+ if (files != null && files.length > 0) {
+ try {
+ for(File one : files) {
+ LOG.i("ijkplayer cache:" + one.getAbsolutePath());
+ one.delete();
+ }
+ Toast.makeText(getContext(), "ijk缓存已清空", Toast.LENGTH_LONG).show();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else {
+ Toast.makeText(getContext(), "暂无ijk缓存", Toast.LENGTH_LONG).show();
+ }
}
diff --git a/app/src/main/java/com/github/tvbox/osc/util/FileUtils.java b/app/src/main/java/com/github/tvbox/osc/util/FileUtils.java
index b3c48bd0..8aecb430 100644
--- a/app/src/main/java/com/github/tvbox/osc/util/FileUtils.java
+++ b/app/src/main/java/com/github/tvbox/osc/util/FileUtils.java
@@ -125,6 +125,14 @@ public class FileUtils {
return new File(path.replace("file:/", getRootPath()));
}
+ public static File getExternalCacheDir() {
+ return App.getInstance().getExternalCacheDir();
+ }
+
+ public static String getExternalCachePath() {
+ return getExternalCacheDir().getAbsolutePath();
+ }
+
public static String read(String path) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(getLocal(path))));
diff --git a/app/src/main/res/layout/dialog_checkbox_search.xml b/app/src/main/res/layout/dialog_checkbox_search.xml
index f02c02bc..87c9b1a9 100644
--- a/app/src/main/res/layout/dialog_checkbox_search.xml
+++ b/app/src/main/res/layout/dialog_checkbox_search.xml
@@ -5,6 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
+ android:focusable="false"
+ android:orientation="horizontal">
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+