diff --git a/app/src/main/java/com/fongmi/android/tv/impl/NewPipeImpl.java b/app/src/main/java/com/fongmi/android/tv/impl/NewPipeImpl.java new file mode 100644 index 000000000..e7f6f9183 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/impl/NewPipeImpl.java @@ -0,0 +1,51 @@ +package com.fongmi.android.tv.impl; + +import com.fongmi.android.tv.utils.Sniffer; +import com.github.catvod.net.OkHttp; +import com.google.common.net.HttpHeaders; + +import org.schabi.newpipe.extractor.downloader.Downloader; +import org.schabi.newpipe.extractor.downloader.Request; +import org.schabi.newpipe.extractor.downloader.Response; +import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nonnull; + +import okhttp3.RequestBody; +import okhttp3.ResponseBody; + +public class NewPipeImpl extends Downloader { + + @Override + public Response execute(@Nonnull Request request) throws IOException, ReCaptchaException { + String url = request.url(); + RequestBody reqBody = null; + byte[] dataToSend = request.dataToSend(); + if (dataToSend != null) reqBody = RequestBody.create(dataToSend, null); + okhttp3.Request.Builder builder = new okhttp3.Request.Builder().method(request.httpMethod(), reqBody).url(url).addHeader(HttpHeaders.USER_AGENT, Sniffer.CHROME); + for (Map.Entry> pair : request.headers().entrySet()) { + String headerName = pair.getKey(); + List headerValueList = pair.getValue(); + if (headerValueList.size() > 1) { + builder.removeHeader(headerName); + for (String headerValue : headerValueList) builder.addHeader(headerName, headerValue); + } else if (headerValueList.size() == 1) { + builder.header(headerName, headerValueList.get(0)); + } + } + okhttp3.Response response = OkHttp.client().newCall(builder.build()).execute(); + if (response.code() == 429) { + response.close(); + throw new ReCaptchaException("reCaptcha Challenge requested", url); + } + String responseBodyToReturn = null; + ResponseBody resBody = response.body(); + if (resBody != null) responseBodyToReturn = resBody.string(); + String latestUrl = response.request().url().toString(); + return new Response(response.code(), response.message(), response.headers().toMultimap(), responseBodyToReturn, latestUrl); + } +} 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 32be65f0a..132a47c89 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,10 +1,19 @@ package com.fongmi.android.tv.player.extractor; +import com.fongmi.android.tv.impl.NewPipeImpl; import com.fongmi.android.tv.player.Source; import com.fongmi.android.tv.utils.Sniffer; import com.github.catvod.net.OkHttp; import com.google.common.net.HttpHeaders; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.ServiceList; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.linkhandler.LinkHandler; +import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor; +import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeStreamLinkHandlerFactory; +import org.schabi.newpipe.extractor.stream.VideoStream; + import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; @@ -16,31 +25,44 @@ public class Youtube implements Source.Extractor { @Override public boolean match(String scheme, String host) { - return host.contains("youtube.com"); + return host.contains("youtube.com") || host.contains("youtu.be"); + } + + public Youtube() { + NewPipe.init(new NewPipeImpl()); } @Override public String fetch(String url) throws Exception { - String result = OkHttp.newCall(url, Headers.of(HttpHeaders.USER_AGENT, Sniffer.CHROME)).execute().body().string(); - Pattern pattern = Pattern.compile("hlsManifestUrl\\S*?(https\\S*?\\.m3u8)"); - Matcher matcher = pattern.matcher(result); - if (!matcher.find()) return ""; - String stable = matcher.group(1); - result = OkHttp.newCall(stable, Headers.of(HttpHeaders.USER_AGENT, Sniffer.CHROME)).execute().body().string(); - String quality = find(result); - return quality.isEmpty() ? url : quality; + String html = OkHttp.newCall(url, Headers.of(HttpHeaders.USER_AGENT, Sniffer.CHROME)).execute().body().string(); + Matcher matcher = Pattern.compile("hlsManifestUrl\\S*?(https\\S*?\\.m3u8)").matcher(html); + if (matcher.find()) { + html = OkHttp.newCall(matcher.group(1), Headers.of(HttpHeaders.USER_AGENT, Sniffer.CHROME)).execute().body().string(); + return find(html); + } else { + LinkHandler handler = YoutubeStreamLinkHandlerFactory.getInstance().fromUrl(url); + YoutubeStreamExtractor extractor = new YoutubeStreamExtractor(ServiceList.YouTube, handler); + extractor.fetchPage(); + return find(extractor); + } + } + + private String find(YoutubeStreamExtractor extractor) throws ExtractionException { + VideoStream item = extractor.getVideoStreams().get(0); + for (VideoStream stream : extractor.getVideoStreams()) if (!stream.isVideoOnly() && stream.getHeight() >= item.getHeight()) item = stream; + return item.getContent(); } - private String find(String result) { + private String find(String html) { String url = ""; List items = Arrays.asList("301", "300", "96", "95", "94"); - for (String item : items) if (!(url = find(result, "https:/.*/" + item + "/.*index.m3u8")).isEmpty()) break; + for (String item : items) if (!(url = find(html, "https:/.*/" + item + "/.*index.m3u8")).isEmpty()) break; return url; } - private String find(String result, String rule) { + private String find(String html, String rule) { Pattern pattern = Pattern.compile(rule); - Matcher matcher = pattern.matcher(result); + Matcher matcher = pattern.matcher(html); if (matcher.find()) return matcher.group(); return ""; } @@ -50,10 +72,6 @@ public class Youtube implements Source.Extractor { } @Override - public void destroy() { - } - - @Override - public void release() { + public void exit() { } } diff --git a/catvod/src/main/java/com/github/catvod/crawler/SpiderDebug.java b/catvod/src/main/java/com/github/catvod/crawler/SpiderDebug.java index 9327c49d9..5cfcf7001 100644 --- a/catvod/src/main/java/com/github/catvod/crawler/SpiderDebug.java +++ b/catvod/src/main/java/com/github/catvod/crawler/SpiderDebug.java @@ -9,12 +9,10 @@ public class SpiderDebug { private static final String TAG = SpiderDebug.class.getSimpleName(); public static void log(Throwable th) { - if (th == null || TextUtils.isEmpty(th.getMessage())) return; - Logger.t(TAG).d(th.getMessage()); + if (th != null) th.printStackTrace(); } public static void log(String msg) { - if (TextUtils.isEmpty(msg)) return; - Logger.t(TAG).d(msg); + if (!TextUtils.isEmpty(msg)) Logger.t(TAG).d(msg); } } diff --git a/thunder/src/main/java/com/xunlei/downloadlib/XLDownloadManager.java b/thunder/src/main/java/com/xunlei/downloadlib/XLDownloadManager.java index cacfae1d4..9740e587e 100644 --- a/thunder/src/main/java/com/xunlei/downloadlib/XLDownloadManager.java +++ b/thunder/src/main/java/com/xunlei/downloadlib/XLDownloadManager.java @@ -50,8 +50,8 @@ public class XLDownloadManager { } public void release() { + if (loader != null) loader.unInit(); unregisterReceiver(); - loader.unInit(); context = null; loader = null; } diff --git a/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java b/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java index 08229be2c..8745942cc 100644 --- a/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java +++ b/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java @@ -164,7 +164,7 @@ public class XLTaskHelper { } public void release() { - manager.release(); + if (manager != null) manager.release(); manager = null; seq = null; }