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"> - - + - + + + + + + + + + + + + + + + +