Support ed2k and ftp

pull/137/head
FongMi 3 years ago
parent 3c1be92da3
commit 899fd1ff25
  1. 8
      app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java
  2. 43
      app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java
  3. 10
      catvod/src/main/java/com/github/catvod/utils/Path.java
  4. 42
      thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java
  5. 24
      thunder/src/main/java/com/xunlei/downloadlib/parameter/BtTaskParam.java
  6. 33
      thunder/src/main/java/com/xunlei/downloadlib/parameter/GetTaskId.java

@ -222,11 +222,11 @@ public class SiteViewModel extends ViewModel {
for (Vod.Flag.Episode episode : flag.getEpisodes()) {
String scheme = Util.scheme(episode.getUrl());
if (!scheme.equals("magnet") && !scheme.equals("thunder")) continue;
File torrent = Path.thunder(Util.md5(episode.getUrl()), XLTaskHelper.get().getFileName(episode.getUrl()));
GetTaskId taskId = XLTaskHelper.get().addThunderTask(episode.getUrl(), torrent.getParent(), torrent.getName());
File folder = Path.thunder(Util.md5(episode.getUrl()));
GetTaskId taskId = XLTaskHelper.get().addThunderTask(episode.getUrl(), folder);
while (XLTaskHelper.get().getTaskInfo(taskId).getTaskStatus() != 2) SystemClock.sleep(10);
TorrentFileInfo[] infoArray = XLTaskHelper.get().getTorrentInfo(torrent).getSubFileInfo();
for (TorrentFileInfo info : infoArray) if (Sniffer.isMedia(info.getExt())) items.add(new Vod.Flag.Episode(info.getFileName(), info.getPlayUrl(torrent)));
TorrentFileInfo[] infoArray = XLTaskHelper.get().getTorrentInfo(taskId.getSaveFile()).getSubFileInfo();
for (TorrentFileInfo info : infoArray) if (Sniffer.isMedia(info.getExt())) items.add(new Vod.Flag.Episode(info.getFileName(), info.getPlayUrl(taskId.getSaveFile())));
if (items.size() > 0) flag.setEpisodes(items);
XLTaskHelper.get().stopTask(taskId);
}

@ -1,34 +1,57 @@
package com.fongmi.android.tv.player.extractor;
import android.net.Uri;
import android.os.SystemClock;
import com.fongmi.android.tv.player.Source;
import com.github.catvod.utils.Path;
import com.github.catvod.utils.Util;
import com.xunlei.downloadlib.XLTaskHelper;
import com.xunlei.downloadlib.parameter.GetTaskId;
import java.io.File;
import java.util.Objects;
public class Thunder implements Source.Extractor {
public Thunder() {
}
private GetTaskId taskId;
@Override
public boolean match(String scheme, String host) {
return scheme.equalsIgnoreCase("ed2k") || scheme.equalsIgnoreCase("ftp") || scheme.equalsIgnoreCase("thunder") || scheme.equalsIgnoreCase("magnet");
return scheme.equals("ed2k") || scheme.equals("ftp") || scheme.equals("torrent");
}
@Override
public String fetch(String url) throws Exception {
return url;
Uri uri = Uri.parse(url);
boolean torrent = "torrent".equals(uri.getScheme());
return torrent ? fetchTorrent(uri) : fetchThunder(url);
}
@Override
public void stop() {
private String fetchTorrent(Uri uri) {
File torrent = new File(uri.getPath());
String name = uri.getQueryParameter("name");
int index = Integer.parseInt(uri.getQueryParameter("index"));
taskId = XLTaskHelper.get().addTorrentTask(torrent, Objects.requireNonNull(torrent.getParentFile()), index);
while (XLTaskHelper.get().getBtSubTaskInfo(taskId, index).mTaskInfo.mTaskStatus == 0) SystemClock.sleep(10);
return XLTaskHelper.get().getLocalUrl(new File(torrent.getParent(), name));
}
private String fetchThunder(String url) {
File folder = Path.thunder(Util.md5(url));
taskId = XLTaskHelper.get().addThunderTask(url, folder);
return XLTaskHelper.get().getLocalUrl(taskId.getSaveFile());
}
@Override
public void destroy() {
public void stop() {
if (taskId == null) return;
XLTaskHelper.get().deleteTask(taskId);
taskId = null;
}
@Override
public void release() {
public void exit() {
XLTaskHelper.get().release();
}
}

@ -105,11 +105,7 @@ public class Path {
}
public static File thunder(String name) {
return new File(thunder(), name);
}
public static File thunder(String child, String name) {
return new File(check(new File(thunder(), child)), name);
return check(new File(thunder(), name));
}
public static File local(String path) {
@ -193,10 +189,6 @@ public class Path {
return files == null ? Collections.emptyList() : Arrays.asList(files);
}
public static void clear(String path) {
clear(new File(path));
}
public static void clear(File dir) {
if (dir == null) return;
if (dir.isDirectory()) for (File file : list(dir)) clear(file);

@ -47,29 +47,33 @@ public class XLTaskHelper {
downloadManager = new XLDownloadManager(Init.getContext());
}
public synchronized GetTaskId addThunderTask(String url, String savePath, String fileName) {
public synchronized GetTaskId addThunderTask(String url, File savePath) {
return addThunderTask(url, savePath, null);
}
public synchronized GetTaskId addThunderTask(String url, File savePath, String fileName) {
GetTaskId taskId = new GetTaskId(savePath, fileName);
if (url.startsWith("thunder://")) url = downloadManager.parserThunderUrl(url);
GetTaskId taskId = new GetTaskId();
taskId.setSavePath(savePath);
if (TextUtils.isEmpty(fileName)) {
GetFileName getFileName = new GetFileName();
downloadManager.getFileNameFromUrl(url, getFileName);
fileName = getFileName.getFileName();
taskId.setFileName(fileName);
}
if (url.startsWith("magnet:?")) {
MagnetTaskParam param = new MagnetTaskParam();
param.setFilePath(savePath.getAbsolutePath());
param.setFileName(fileName);
param.setFilePath(savePath);
param.setUrl(url);
int code = downloadManager.createBtMagnetTask(param, taskId);
if (code != XLConstant.XLErrorCode.NO_ERROR) return taskId;
} else if (url.startsWith("ftp://")) {
P2spTaskParam param = new P2spTaskParam();
param.setCreateMode(1);
param.setFilePath(savePath.getAbsolutePath());
param.setSeqId(seq.incrementAndGet());
param.setFileName(fileName);
param.setFilePath(savePath);
param.setCreateMode(1);
param.setUrl(url);
param.setSeqId(seq.incrementAndGet());
param.setCookie("");
param.setRefUrl("");
param.setUser("");
@ -81,11 +85,11 @@ public class XLTaskHelper {
addRequestHeadersToXlEngine(taskId.getTaskId());
} else if (url.startsWith("ed2k://")) {
EmuleTaskParam param = new EmuleTaskParam();
param.setFilePath(savePath);
param.setFileName(fileName);
param.setUrl(url);
param.setFilePath(savePath.getAbsolutePath());
param.setSeqId(seq.incrementAndGet());
param.setFileName(fileName);
param.setCreateMode(1);
param.setUrl(url);
int code = downloadManager.createEmuleTask(param, taskId);
if (code != XLConstant.XLErrorCode.NO_ERROR) return taskId;
}
@ -94,18 +98,17 @@ public class XLTaskHelper {
return taskId;
}
public synchronized GetTaskId addTorrentTask(File torrent, String savePath, int index) {
public synchronized GetTaskId addTorrentTask(File torrent, File savePath, int index) {
TorrentInfo torrentInfo = new TorrentInfo();
downloadManager.getTorrentInfo(torrent.getAbsolutePath(), torrentInfo);
TorrentFileInfo[] fileInfos = torrentInfo.mSubFileInfo;
BtTaskParam taskParam = new BtTaskParam();
taskParam.setCreateMode(1);
taskParam.setMaxConcurrent(3);
taskParam.setFilePath(savePath);
taskParam.setSeqId(seq.incrementAndGet());
taskParam.setFilePath(savePath.getAbsolutePath());
taskParam.setTorrentPath(torrent.getAbsolutePath());
GetTaskId taskId = new GetTaskId();
taskId.setSavePath(savePath);
GetTaskId taskId = new GetTaskId(savePath);
int code = downloadManager.createBtTask(taskParam, taskId);
if (code != XLConstant.XLErrorCode.NO_ERROR) return taskId;
if (fileInfos.length > 1) {
@ -140,22 +143,15 @@ public class XLTaskHelper {
}
}
public synchronized String getFileName(String url) {
if (url.startsWith("thunder://")) url = downloadManager.parserThunderUrl(url);
GetFileName getFileName = new GetFileName();
downloadManager.getFileNameFromUrl(url, getFileName);
return getFileName.getFileName();
}
public synchronized TorrentInfo getTorrentInfo(File file) {
TorrentInfo torrentInfo = new TorrentInfo();
downloadManager.getTorrentInfo(file.getAbsolutePath(), torrentInfo);
return torrentInfo;
}
public synchronized String getLocalUrl(String path) {
public synchronized String getLocalUrl(File file) {
XLTaskLocalUrl localUrl = new XLTaskLocalUrl();
downloadManager.getLocalUrl(path, localUrl);
downloadManager.getLocalUrl(file.getAbsolutePath(), localUrl);
return localUrl.mStrUrl;
}

@ -2,29 +2,29 @@ package com.xunlei.downloadlib.parameter;
public class BtTaskParam {
public int mSeqId;
public int mCreateMode;
public String mFilePath;
public int mMaxConcurrent;
public int mSeqId;
public String mFilePath;
public String mTorrentPath;
public void setTorrentPath(String str) {
this.mTorrentPath = str;
public void setSeqId(int seqId) {
this.mSeqId = seqId;
}
public void setFilePath(String str) {
this.mFilePath = str;
public void setCreateMode(int createMode) {
this.mCreateMode = createMode;
}
public void setMaxConcurrent(int i) {
this.mMaxConcurrent = i;
public void setMaxConcurrent(int maxConcurrent) {
this.mMaxConcurrent = maxConcurrent;
}
public void setCreateMode(int i) {
this.mCreateMode = i;
public void setFilePath(String filePath) {
this.mFilePath = filePath;
}
public void setSeqId(int i) {
this.mSeqId = i;
public void setTorrentPath(String torrentPath) {
this.mTorrentPath = torrentPath;
}
}

@ -1,19 +1,42 @@
package com.xunlei.downloadlib.parameter;
import java.io.File;
public class GetTaskId {
private long mTaskId;
private String mSavePath;
private File mSavePath;
private String mFileName;
public long getTaskId() {
return this.mTaskId;
public GetTaskId() {
}
public GetTaskId(File savePath) {
this.mSavePath = savePath;
}
public void setSavePath(String savePath) {
public GetTaskId(File savePath, String fileName) {
this.mSavePath = savePath;
this.mFileName = fileName;
}
public long getTaskId() {
return this.mTaskId;
}
public String getSavePath() {
public File getSavePath() {
return mSavePath;
}
public String getFileName() {
return mFileName;
}
public void setFileName(String fileName) {
this.mFileName = fileName;
}
public File getSaveFile() {
return new File(getSavePath(), getFileName());
}
}

Loading…
Cancel
Save