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;
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<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;
}
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() {
}
}

@ -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);
}
}

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

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

Loading…
Cancel
Save