pull/137/head
FongMi 2 years ago
parent 04653d7ac2
commit c56814369a
  1. 51
      app/src/main/java/com/fongmi/android/tv/impl/NewPipeImpl.java
  2. 54
      app/src/main/java/com/fongmi/android/tv/player/extractor/Youtube.java
  3. 6
      catvod/src/main/java/com/github/catvod/crawler/SpiderDebug.java
  4. 2
      thunder/src/main/java/com/xunlei/downloadlib/XLDownloadManager.java
  5. 2
      thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.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<String, List<String>> pair : request.headers().entrySet()) {
String headerName = pair.getKey();
List<String> 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);
}
}

@ -1,10 +1,19 @@
package com.fongmi.android.tv.player.extractor; 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.player.Source;
import com.fongmi.android.tv.utils.Sniffer; import com.fongmi.android.tv.utils.Sniffer;
import com.github.catvod.net.OkHttp; import com.github.catvod.net.OkHttp;
import com.google.common.net.HttpHeaders; 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.Arrays;
import java.util.List; import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -16,31 +25,44 @@ public class Youtube implements Source.Extractor {
@Override @Override
public boolean match(String scheme, String host) { 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 @Override
public String fetch(String url) throws Exception { public String fetch(String url) throws Exception {
String result = OkHttp.newCall(url, Headers.of(HttpHeaders.USER_AGENT, Sniffer.CHROME)).execute().body().string(); String html = 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.compile("hlsManifestUrl\\S*?(https\\S*?\\.m3u8)").matcher(html);
Matcher matcher = pattern.matcher(result); if (matcher.find()) {
if (!matcher.find()) return ""; html = OkHttp.newCall(matcher.group(1), Headers.of(HttpHeaders.USER_AGENT, Sniffer.CHROME)).execute().body().string();
String stable = matcher.group(1); return find(html);
result = OkHttp.newCall(stable, Headers.of(HttpHeaders.USER_AGENT, Sniffer.CHROME)).execute().body().string(); } else {
String quality = find(result); LinkHandler handler = YoutubeStreamLinkHandlerFactory.getInstance().fromUrl(url);
return quality.isEmpty() ? url : quality; 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 = ""; String url = "";
List<String> items = Arrays.asList("301", "300", "96", "95", "94"); List<String> 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; return url;
} }
private String find(String result, String rule) { private String find(String html, String rule) {
Pattern pattern = Pattern.compile(rule); Pattern pattern = Pattern.compile(rule);
Matcher matcher = pattern.matcher(result); Matcher matcher = pattern.matcher(html);
if (matcher.find()) return matcher.group(); if (matcher.find()) return matcher.group();
return ""; return "";
} }
@ -50,10 +72,6 @@ public class Youtube implements Source.Extractor {
} }
@Override @Override
public void destroy() { public void exit() {
}
@Override
public void release() {
} }
} }

@ -9,12 +9,10 @@ public class SpiderDebug {
private static final String TAG = SpiderDebug.class.getSimpleName(); private static final String TAG = SpiderDebug.class.getSimpleName();
public static void log(Throwable th) { public static void log(Throwable th) {
if (th == null || TextUtils.isEmpty(th.getMessage())) return; if (th != null) th.printStackTrace();
Logger.t(TAG).d(th.getMessage());
} }
public static void log(String msg) { public static void log(String msg) {
if (TextUtils.isEmpty(msg)) return; if (!TextUtils.isEmpty(msg)) Logger.t(TAG).d(msg);
Logger.t(TAG).d(msg);
} }
} }

@ -50,8 +50,8 @@ public class XLDownloadManager {
} }
public void release() { public void release() {
if (loader != null) loader.unInit();
unregisterReceiver(); unregisterReceiver();
loader.unInit();
context = null; context = null;
loader = null; loader = null;
} }

@ -164,7 +164,7 @@ public class XLTaskHelper {
} }
public void release() { public void release() {
manager.release(); if (manager != null) manager.release();
manager = null; manager = null;
seq = null; seq = null;
} }

Loading…
Cancel
Save