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 0d1f976eb..ea09ff09d 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 @@ -34,12 +34,11 @@ import androidx.media3.extractor.ts.TsExtractor; import androidx.media3.ui.CaptionStyleCompat; import com.fongmi.android.tv.App; -import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.Result; -import com.fongmi.android.tv.bean.Rule; import com.fongmi.android.tv.bean.Sub; import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.Prefers; +import com.fongmi.android.tv.utils.Sniffer; import com.github.catvod.net.OkHttp; import com.google.common.net.HttpHeaders; @@ -102,12 +101,7 @@ public class ExoUtil { else if (errorCode == PlaybackException.ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED || errorCode == PlaybackException.ERROR_CODE_IO_UNSPECIFIED) builder.setMimeType(MimeTypes.APPLICATION_M3U8); if (subs.size() > 0) builder.setSubtitleConfigurations(getSubtitles(subs)); builder.setAllowChunklessPreparation(Prefers.getDecode() == 1); - return builder.setAds(getAdsRegex(uri)).build(); - } - - private static List getAdsRegex(Uri uri) { - if (uri.getHost() != null) for (Rule rule : ApiConfig.get().getRules()) for (String host : rule.getHosts()) if (uri.getHost().contains(host)) return rule.getRegex(); - return Collections.emptyList(); + return builder.setAds(Sniffer.getAdsRegex(uri)).build(); } private static List getSubtitles(List subs) { diff --git a/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java b/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java new file mode 100644 index 000000000..c0344129b --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java @@ -0,0 +1,25 @@ +package com.fongmi.android.tv.player; + +import android.net.Uri; + +import com.fongmi.android.tv.bean.Result; +import com.fongmi.android.tv.server.Server; +import com.fongmi.android.tv.utils.Sniffer; + +import java.util.Map; + +import tv.danmaku.ijk.media.player.MediaSource; + +public class IjkUtil { + + public static MediaSource getSource(Result result) { + return getSource(result.getHeaders(), result.getRealUrl()); + } + + public static MediaSource getSource(Map headers, String url) { + Uri uri = Uri.parse(url.trim().replace("\\", "")); + boolean hasAds = Sniffer.getAdsRegex(uri).size() > 0; + if (hasAds) uri = Uri.parse(Server.get().getAddress(true).concat("/m3u8?url=").concat(url)); + return new MediaSource(headers, uri); + } +} 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 3c45a52da..0cfedb8ae 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 @@ -336,7 +336,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic private void setMediaSource(Result result) { SpiderDebug.log(errorCode + "," + result.getRealUrl() + "," + checkHeaders(result.getHeaders())); - if (isIjk()) ijkPlayer.setMediaSource(result.getRealUrl(), result.getHeaders()); + if (isIjk()) ijkPlayer.setMediaSource(IjkUtil.getSource(result)); if (isExo()) exoPlayer.setMediaSource(ExoUtil.getSource(result, errorCode)); if (isExo()) exoPlayer.prepare(); setTimeoutCheck(result.getRealUrl()); @@ -344,7 +344,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic private void setMediaSource(Map headers, String url) { SpiderDebug.log(errorCode + "," + url + "," + checkHeaders(headers)); - if (isIjk()) ijkPlayer.setMediaSource(url, headers); + if (isIjk()) ijkPlayer.setMediaSource(IjkUtil.getSource(headers, url)); if (isExo()) exoPlayer.setMediaSource(ExoUtil.getSource(headers, url, errorCode)); if (isExo()) exoPlayer.prepare(); setTimeoutCheck(url); diff --git a/app/src/main/java/com/fongmi/android/tv/server/process/ActionRequestProcess.java b/app/src/main/java/com/fongmi/android/tv/server/process/ActionRequestProcess.java index e51efaaa3..6262821c9 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/process/ActionRequestProcess.java +++ b/app/src/main/java/com/fongmi/android/tv/server/process/ActionRequestProcess.java @@ -54,29 +54,29 @@ public class ActionRequestProcess implements RequestProcess { return Nano.createSuccessResponse(); } - public void onSearch(Map params) { + private void onSearch(Map params) { String word = Objects.requireNonNullElse(params.get("word"), ""); if (word.length() > 0) ServerEvent.search(word); } - public void onPush(Map params) { + private void onPush(Map params) { String url = Objects.requireNonNullElse(params.get("url"), ""); if (url.length() > 0) ServerEvent.push(url); } - public void onApi(Map params) { + private void onApi(Map params) { String url = Objects.requireNonNullElse(params.get("url"), ""); if (url.length() > 0) ServerEvent.api(url); } - public void onCast(Map params) { + private void onCast(Map params) { Config config = Config.find(params.get("url"), 0); Device device = Device.objectFrom(params.get("device")); History history = History.objectFrom(params.get("history")); CastEvent.post(config, device, history); } - public void onSync(Map params) { + private void onSync(Map params) { boolean sync = Objects.equals(params.get("mode"), "0"); boolean keep = Objects.equals(params.get("type"), "keep"); boolean history = Objects.equals(params.get("type"), "history"); @@ -145,7 +145,7 @@ public class ActionRequestProcess implements RequestProcess { }; } - public void syncKeep(Map params) { + private void syncKeep(Map params) { List configs = Config.arrayFrom(params.get("configs")); List targets = Keep.arrayFrom(params.get("targets")); boolean replace = Objects.equals(params.get("mode"), "1"); 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 ca2ecff3e..921f7bf21 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 @@ -6,7 +6,9 @@ import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.Rule; import com.github.catvod.crawler.SpiderDebug; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.regex.Pattern; @@ -38,4 +40,9 @@ public class Sniffer { for (Rule rule : ApiConfig.get().getRules()) for (String host : rule.getHosts()) if (host.equals("*")) for (String regex : rule.getRegex()) return Pattern.compile(regex).matcher(url).find(); return false; } + + public static List getAdsRegex(Uri uri) { + if (uri.getHost() != null) for (Rule rule : ApiConfig.get().getRules()) for (String host : rule.getHosts()) if (uri.getHost().contains(host)) return rule.getRegex(); + return Collections.emptyList(); + } } diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java index 7bc23306c..2dc758ae9 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java @@ -160,13 +160,11 @@ public final class IjkMediaPlayer extends AbstractMediaPlayer { private PowerManager.WakeLock mWakeLock = null; private boolean mScreenOnWhilePlaying; private boolean mStayAwake; - private boolean dotOpen; private int mVideoWidth; private int mVideoHeight; private int mVideoSarNum; private int mVideoSarDen; - private int dotPort; private String mDataSource; diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/MediaInfo.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/MediaInfo.java index a57297700..d13ba9a39 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/MediaInfo.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/MediaInfo.java @@ -18,6 +18,7 @@ package tv.danmaku.ijk.media.player; public class MediaInfo { + public String mMediaPlayerName; public String mVideoDecoder; diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/MediaSource.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/MediaSource.java new file mode 100644 index 000000000..8c1f87922 --- /dev/null +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/MediaSource.java @@ -0,0 +1,24 @@ +package tv.danmaku.ijk.media.player; + +import android.net.Uri; + +import java.util.Map; + +public class MediaSource { + + private final Map headers; + private final Uri uri; + + public MediaSource(Map headers, Uri uri) { + this.headers = headers; + this.uri = uri; + } + + public Map getHeaders() { + return headers; + } + + public Uri getUri() { + return uri; + } +} diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java index 75fbb4f00..2e4ae89db 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java @@ -21,6 +21,7 @@ import java.util.Map; import tv.danmaku.ijk.media.player.IMediaPlayer; import tv.danmaku.ijk.media.player.IjkMediaPlayer; import tv.danmaku.ijk.media.player.IjkTimedText; +import tv.danmaku.ijk.media.player.MediaSource; import tv.danmaku.ijk.media.player.R; import tv.danmaku.ijk.media.player.misc.ITrackInfo; import tv.danmaku.ijk.media.player.misc.IjkTrackInfo; @@ -155,8 +156,8 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl if (mRenderView != null) mRenderView.setAspectRatio(resizeMode); } - public void setMediaSource(String path, Map headers) { - setVideoURI(Uri.parse(path.trim().replace("\\", "")), headers); + public void setMediaSource(MediaSource source) { + setVideoURI(source.getUri(), source.getHeaders()); } private void setVideoURI(Uri uri, Map headers) {