From 899fd1ff25f5c87105dba736c4fb4451ac55b43f Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 27 Jul 2023 14:51:27 +0800 Subject: [PATCH] Support ed2k and ftp --- .../android/tv/model/SiteViewModel.java | 8 ++-- .../android/tv/player/extractor/Thunder.java | 43 ++++++++++++++----- .../java/com/github/catvod/utils/Path.java | 10 +---- .../com/xunlei/downloadlib/XLTaskHelper.java | 42 ++++++++---------- .../downloadlib/parameter/BtTaskParam.java | 24 +++++------ .../downloadlib/parameter/GetTaskId.java | 33 +++++++++++--- 6 files changed, 97 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java index 367a70b44..63c68a39b 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.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); } diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java index d1e356824..bcff239eb 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java @@ -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(); } } diff --git a/catvod/src/main/java/com/github/catvod/utils/Path.java b/catvod/src/main/java/com/github/catvod/utils/Path.java index cb3370f78..5d6cb8f66 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Path.java +++ b/catvod/src/main/java/com/github/catvod/utils/Path.java @@ -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); diff --git a/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java b/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java index cfb1b3352..498d6aa60 100644 --- a/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java +++ b/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java @@ -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; } diff --git a/thunder/src/main/java/com/xunlei/downloadlib/parameter/BtTaskParam.java b/thunder/src/main/java/com/xunlei/downloadlib/parameter/BtTaskParam.java index e686c7479..703203a38 100644 --- a/thunder/src/main/java/com/xunlei/downloadlib/parameter/BtTaskParam.java +++ b/thunder/src/main/java/com/xunlei/downloadlib/parameter/BtTaskParam.java @@ -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; } } diff --git a/thunder/src/main/java/com/xunlei/downloadlib/parameter/GetTaskId.java b/thunder/src/main/java/com/xunlei/downloadlib/parameter/GetTaskId.java index dbe2248bb..d9eeb1399 100644 --- a/thunder/src/main/java/com/xunlei/downloadlib/parameter/GetTaskId.java +++ b/thunder/src/main/java/com/xunlei/downloadlib/parameter/GetTaskId.java @@ -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()); + } }