diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Url.java b/app/src/main/java/com/fongmi/android/tv/bean/Url.java index ae7f64059..514e728a1 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Url.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Url.java @@ -1,5 +1,6 @@ package com.fongmi.android.tv.bean; +import android.net.Uri; import android.text.TextUtils; import com.fongmi.android.tv.App; @@ -36,6 +37,10 @@ public class Url { return position; } + public Uri uri() { + return Uri.parse(v()); + } + public String v() { return v(getPosition()); } diff --git a/app/src/main/java/com/fongmi/android/tv/player/Source.java b/app/src/main/java/com/fongmi/android/tv/player/Source.java index 99d4c4965..a766680d0 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Source.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Source.java @@ -1,5 +1,7 @@ package com.fongmi.android.tv.player; +import android.net.Uri; + import com.fongmi.android.tv.App; import com.fongmi.android.tv.bean.Episode; import com.fongmi.android.tv.bean.Flag; @@ -7,11 +9,11 @@ import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.player.extractor.Force; import com.fongmi.android.tv.player.extractor.JianPian; import com.fongmi.android.tv.player.extractor.Push; +import com.fongmi.android.tv.player.extractor.Strm; import com.fongmi.android.tv.player.extractor.TVBus; import com.fongmi.android.tv.player.extractor.Thunder; import com.fongmi.android.tv.player.extractor.Video; import com.fongmi.android.tv.player.extractor.Youtube; -import com.fongmi.android.tv.utils.UrlUtil; import java.util.ArrayList; import java.util.Iterator; @@ -39,17 +41,15 @@ public class Source { extractors.add(new Force()); extractors.add(new JianPian()); extractors.add(new Push()); + extractors.add(new Strm()); extractors.add(new Thunder()); extractors.add(new TVBus()); extractors.add(new Video()); extractors.add(new Youtube()); } - private Extractor getExtractor(String url) { - String host = UrlUtil.host(url); - String scheme = UrlUtil.scheme(url); - for (Extractor extractor : extractors) if (extractor.match(scheme, host)) return extractor; - return null; + private Extractor getExtractor(Uri uri) { + return extractors.stream().filter(extractor -> extractor.match(uri)).findFirst().orElse(null); } private void addCallable(Iterator iterator, List>> items) { @@ -75,8 +75,9 @@ public class Source { } public String fetch(Result result) throws Exception { + Uri uri = result.getUrl().uri(); String url = result.getUrl().v(); - Extractor extractor = getExtractor(url); + Extractor extractor = getExtractor(uri); if (extractor != null) result.setParse(0); if (extractor instanceof Video) result.setParse(1); return extractor == null ? url : extractor.fetch(url); @@ -94,10 +95,10 @@ public class Source { public interface Extractor { - boolean match(String scheme, String host); - String fetch(String url) throws Exception; + boolean match(Uri uri); + void stop(); void exit(); diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Force.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Force.java index 9de459670..f20fdd6fc 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/Force.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Force.java @@ -9,23 +9,23 @@ import android.os.SystemClock; import com.fongmi.android.tv.App; import com.fongmi.android.tv.player.Source; +import com.fongmi.android.tv.utils.UrlUtil; import com.forcetech.Util; import com.github.catvod.net.OkHttp; import com.google.common.net.HttpHeaders; import java.util.HashSet; +import java.util.Map; import java.util.regex.Pattern; -import okhttp3.Headers; - public class Force implements Source.Extractor, ServiceConnection { private static final Pattern PATTERN = Pattern.compile("(?i)(p[2-9]p|mitv)"); private final HashSet set = new HashSet<>(); @Override - public boolean match(String scheme, String host) { - return PATTERN.matcher(scheme).find(); + public boolean match(Uri uri) { + return PATTERN.matcher(UrlUtil.scheme(uri)).find(); } private void init(String scheme) { @@ -41,9 +41,8 @@ public class Force implements Source.Extractor, ServiceConnection { int port = Util.port(scheme); String id = uri.getLastPathSegment(); String cmd = "http://127.0.0.1:" + port + "/cmd.xml?cmd=switch_chan&server=" + uri.getHost() + ":" + uri.getPort() + "&id=" + id; - String result = "http://127.0.0.1:" + port + "/" + id; - OkHttp.newCall(cmd, Headers.of(HttpHeaders.USER_AGENT, "MTV")).execute().body().string(); - return result; + OkHttp.string(cmd, Map.of(HttpHeaders.USER_AGENT, "MTV")); + return "http://127.0.0.1:" + port + "/" + id; } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/JianPian.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/JianPian.java index 2e2e32736..6742e5a90 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/JianPian.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/JianPian.java @@ -4,11 +4,13 @@ import android.net.Uri; import com.fongmi.android.tv.player.Source; import com.fongmi.android.tv.utils.FileUtil; +import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.utils.Path; import com.p2p.P2PClass; import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.Arrays; public class JianPian implements Source.Extractor { @@ -16,8 +18,8 @@ public class JianPian implements Source.Extractor { private String path; @Override - public boolean match(String scheme, String host) { - return "tvbox-xg".equals(scheme) || "jianpian".equals(scheme) || "ftp".equals(scheme); + public boolean match(Uri uri) { + return Arrays.asList("tvbox-xg", "jianpian", "ftp").contains(UrlUtil.scheme(uri)); } private void init() { diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Push.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Push.java index 0a1910ea6..f486bf80c 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/Push.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Push.java @@ -1,16 +1,18 @@ package com.fongmi.android.tv.player.extractor; +import android.net.Uri; import android.os.SystemClock; import com.fongmi.android.tv.App; import com.fongmi.android.tv.player.Source; import com.fongmi.android.tv.ui.activity.VideoActivity; +import com.fongmi.android.tv.utils.UrlUtil; public class Push implements Source.Extractor { @Override - public boolean match(String scheme, String host) { - return "push".equals(scheme); + public boolean match(Uri uri) { + return "push".equals(UrlUtil.scheme(uri)); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Strm.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Strm.java new file mode 100644 index 000000000..e33264576 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Strm.java @@ -0,0 +1,33 @@ +package com.fongmi.android.tv.player.extractor; + +import android.net.Uri; + +import com.fongmi.android.tv.player.Source; +import com.fongmi.android.tv.utils.UrlUtil; +import com.github.catvod.net.OkHttp; +import com.github.catvod.utils.Path; + +import java.io.File; + +public class Strm implements Source.Extractor { + + @Override + public boolean match(Uri uri) { + return UrlUtil.path(uri).contains(".strm"); + } + + @Override + public String fetch(String url) throws Exception { + if (url.startsWith("file")) url = url.substring(7); + if (url.startsWith("http")) return OkHttp.string(url).split("\\R", 2)[0]; + return Path.read(new File(url)).split("\\R", 2)[0]; + } + + @Override + public void stop() { + } + + @Override + public void exit() { + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/TVBus.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/TVBus.java index 9f30d5b00..9099bdc03 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/TVBus.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/TVBus.java @@ -11,6 +11,7 @@ import com.fongmi.android.tv.bean.Core; import com.fongmi.android.tv.exception.ExtractException; import com.fongmi.android.tv.player.Source; import com.fongmi.android.tv.utils.ResUtil; +import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Path; import com.google.gson.JsonObject; @@ -30,8 +31,8 @@ public class TVBus implements Source.Extractor, Listener { private Core core; @Override - public boolean match(String scheme, String host) { - return "tvbus".equals(scheme); + public boolean match(Uri uri) { + return "tvbus".equals(UrlUtil.scheme(uri)); } private void init(Core core) { diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java index b139e388f..3c96cc445 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java @@ -28,13 +28,13 @@ public class Thunder implements Source.Extractor { private GetTaskId taskId; @Override - public boolean match(String scheme, String host) { - return "magnet".equals(scheme) || "ed2k".equals(scheme); + public boolean match(Uri uri) { + return Arrays.asList("magnet", "ed2k").contains(UrlUtil.scheme(uri)); } @Override public String fetch(String url) throws Exception { - return UrlUtil.scheme(url).equals("magnet") ? addTorrentTask(Uri.parse(url)) : addThunderTask(url); + return url.startsWith("magnet") ? addTorrentTask(Uri.parse(url)) : addThunderTask(url); } private String addTorrentTask(Uri uri) throws Exception { diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Video.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Video.java index add9b2beb..83205ba9b 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/Video.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Video.java @@ -1,12 +1,15 @@ package com.fongmi.android.tv.player.extractor; +import android.net.Uri; + import com.fongmi.android.tv.player.Source; +import com.fongmi.android.tv.utils.UrlUtil; public class Video implements Source.Extractor { @Override - public boolean match(String scheme, String host) { - return "video".equals(scheme); + public boolean match(Uri uri) { + return "video".equals(UrlUtil.scheme(uri)); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Youtube.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Youtube.java index 163483fc8..bf6cb03b6 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/Youtube.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Youtube.java @@ -1,5 +1,6 @@ package com.fongmi.android.tv.player.extractor; +import android.net.Uri; import android.util.Base64; import com.fongmi.android.tv.bean.Episode; @@ -7,6 +8,7 @@ import com.fongmi.android.tv.bean.Vod; import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.impl.NewPipeImpl; import com.fongmi.android.tv.player.Source; +import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.utils.Trans; import org.schabi.newpipe.extractor.ListExtractor; @@ -40,7 +42,8 @@ public class Youtube implements Source.Extractor { } @Override - public boolean match(String scheme, String host) { + public boolean match(Uri uri) { + String host = UrlUtil.host(uri); return host.contains("youtube.com") || host.contains("youtu.be"); }