pull/309/head
FongMi 2 years ago
parent ace16308d8
commit 1d3f7bef3b
  1. 17
      app/src/main/java/com/fongmi/android/tv/bean/Flag.java
  2. 18
      app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java
  3. 49
      app/src/main/java/com/fongmi/android/tv/player/extractor/Magnet.java
  4. 40
      app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java
  5. 17
      app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java

@ -7,8 +7,6 @@ import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.player.extractor.Magnet;
import com.fongmi.android.tv.utils.Sniffer;
import com.fongmi.android.tv.utils.Util;
import com.github.catvod.utils.Trans;
import com.google.gson.annotations.SerializedName;
@ -17,7 +15,6 @@ import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Text;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
@ -124,20 +121,6 @@ public class Flag implements Parcelable {
return List.of(item);
}
public List<Magnet> getMagnet() {
Iterator<Episode> iterator = getEpisodes().iterator();
List<Magnet> items = new ArrayList<>();
while (iterator.hasNext()) addMagnet(iterator, items);
return items;
}
private void addMagnet(Iterator<Episode> iterator, List<Magnet> items) {
String url = iterator.next().getUrl();
if (!Sniffer.isThunder(url)) return;
items.add(Magnet.get(url));
iterator.remove();
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;

@ -20,6 +20,7 @@ import com.fongmi.android.tv.bean.Url;
import com.fongmi.android.tv.bean.Vod;
import com.fongmi.android.tv.exception.ExtractException;
import com.fongmi.android.tv.player.Source;
import com.fongmi.android.tv.player.extractor.Thunder;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.Sniffer;
import com.github.catvod.crawler.Spider;
@ -32,6 +33,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
@ -269,11 +271,25 @@ public class SiteViewModel extends ViewModel {
private void checkThunder(List<Flag> flags) throws Exception {
for (Flag flag : flags) {
ExecutorService executor = Executors.newFixedThreadPool(Constant.THREAD_POOL * 2);
for (Future<List<Episode>> future : executor.invokeAll(flag.getMagnet(), 30, TimeUnit.SECONDS)) flag.getEpisodes().addAll(future.get());
for (Future<List<Episode>> future : executor.invokeAll(getThunder(flag), 30, TimeUnit.SECONDS)) flag.getEpisodes().addAll(future.get());
executor.shutdownNow();
}
}
private List<Thunder.Parser> getThunder(Flag flag) {
List<Thunder.Parser> items = new ArrayList<>();
Iterator<Episode> iterator = flag.getEpisodes().iterator();
while (iterator.hasNext()) addThunder(iterator, items);
return items;
}
private void addThunder(Iterator<Episode> iterator, List<Thunder.Parser> items) {
String url = iterator.next().getUrl();
if (!Sniffer.isThunder(url)) return;
items.add(Thunder.Parser.get(url));
iterator.remove();
}
private void post(Site site, Result result) {
if (result.getList().isEmpty()) return;
for (Vod vod : result.getList()) vod.setSite(site);

@ -1,49 +0,0 @@
package com.fongmi.android.tv.player.extractor;
import android.os.SystemClock;
import com.fongmi.android.tv.bean.Episode;
import com.fongmi.android.tv.utils.Download;
import com.fongmi.android.tv.utils.Sniffer;
import com.github.catvod.utils.Path;
import com.github.catvod.utils.Util;
import com.xunlei.downloadlib.XLTaskHelper;
import com.xunlei.downloadlib.parameter.GetTaskId;
import com.xunlei.downloadlib.parameter.TorrentFileInfo;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
public class Magnet implements Callable<List<Episode>> {
private final String url;
private int time;
public static Magnet get(String url) {
return new Magnet(url);
}
public Magnet(String url) {
this.url = url;
}
private void sleep() {
SystemClock.sleep(10);
time += 10;
}
@Override
public List<Episode> call() {
boolean torrent = Sniffer.isTorrent(url);
List<Episode> episodes = new ArrayList<>();
GetTaskId taskId = XLTaskHelper.get().parse(url, Path.thunder(Util.md5(url)));
if (!torrent && !taskId.getRealUrl().startsWith("magnet")) return List.of(Episode.create(taskId.getFileName(), taskId.getRealUrl()));
if (torrent) Download.create(url, taskId.getSaveFile()).start();
else while (XLTaskHelper.get().getTaskInfo(taskId).getTaskStatus() != 2 && time < 5000) sleep();
List<TorrentFileInfo> medias = XLTaskHelper.get().getTorrentInfo(taskId.getSaveFile()).getMedias();
for (TorrentFileInfo media : medias) episodes.add(Episode.create(media.getFileName(), media.getSize(), media.getPlayUrl()));
XLTaskHelper.get().stopTask(taskId);
return episodes;
}
}

@ -3,17 +3,24 @@ package com.fongmi.android.tv.player.extractor;
import android.net.Uri;
import android.os.SystemClock;
import com.fongmi.android.tv.bean.Episode;
import com.fongmi.android.tv.exception.ExtractException;
import com.fongmi.android.tv.player.Source;
import com.fongmi.android.tv.utils.Download;
import com.fongmi.android.tv.utils.Sniffer;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.utils.Path;
import com.github.catvod.utils.Util;
import com.xunlei.downloadlib.XLTaskHelper;
import com.xunlei.downloadlib.parameter.GetTaskId;
import com.xunlei.downloadlib.parameter.TorrentFileInfo;
import com.xunlei.downloadlib.parameter.XLTaskInfo;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Callable;
public class Thunder implements Source.Extractor {
@ -59,4 +66,37 @@ public class Thunder implements Source.Extractor {
public void exit() {
XLTaskHelper.get().release();
}
public static class Parser implements Callable<List<Episode>> {
private final String url;
private int time;
public static Parser get(String url) {
return new Parser(url);
}
public Parser(String url) {
this.url = url;
}
private void sleep() {
SystemClock.sleep(10);
time += 10;
}
@Override
public List<Episode> call() {
boolean torrent = Sniffer.isTorrent(url);
List<Episode> episodes = new ArrayList<>();
GetTaskId taskId = XLTaskHelper.get().parse(url, Path.thunder(Util.md5(url)));
if (!torrent && !taskId.getRealUrl().startsWith("magnet")) return List.of(Episode.create(taskId.getFileName(), taskId.getRealUrl()));
if (torrent) Download.create(url, taskId.getSaveFile()).start();
else while (XLTaskHelper.get().getTaskInfo(taskId).getTaskStatus() != 2 && time < 5000) sleep();
List<TorrentFileInfo> medias = XLTaskHelper.get().getTorrentInfo(taskId.getSaveFile()).getMedias();
for (TorrentFileInfo media : medias) episodes.add(Episode.create(media.getFileName(), media.getSize(), media.getPlayUrl()));
XLTaskHelper.get().stopTask(taskId);
return episodes;
}
}
}

@ -18,8 +18,15 @@ public class Sniffer {
public static final Pattern CLICKER = Pattern.compile("\\[a=cr:(\\{.*?\\})\\/](.*?)\\[\\/a]");
public static final Pattern AI_PUSH = Pattern.compile("(http|https|rtmp|rtsp|smb|ftp|thunder|magnet|ed2k|mitv|tvbox-xg|jianpian|video):[^\\s]+", Pattern.MULTILINE);
public static final Pattern SNIFFER = Pattern.compile("http((?!http).){12,}?\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac)|http((?!http).)*?video/tos*|http((?!http).)*?obj/tos*");
public static final Pattern THUNDER = Pattern.compile("(magnet|thunder|ed2k):.*");
public static final List<String> THUNDER = Arrays.asList("thunder", "magnet", "ed2k");
public static boolean isThunder(String url) {
return THUNDER.matcher(url).find() || isTorrent(url);
}
public static boolean isTorrent(String url) {
return !url.startsWith("magnet") && url.split(";")[0].endsWith(".torrent");
}
public static String getUrl(String text) {
if (Json.valid(text)) return text;
@ -28,14 +35,6 @@ public class Sniffer {
return text;
}
public static boolean isThunder(String url) {
return THUNDER.contains(UrlUtil.scheme(url)) || isTorrent(url);
}
public static boolean isTorrent(String url) {
return !url.startsWith("magnet") && url.split(";")[0].endsWith(".torrent");
}
public static boolean isVideoFormat(String url) {
Rule rule = getRule(UrlUtil.uri(url));
for (String exclude : rule.getExclude()) if (url.contains(exclude)) return false;

Loading…
Cancel
Save