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 015b44822..b142d9485 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 @@ -226,8 +226,8 @@ public class SiteViewModel extends ViewModel { 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(taskId.getSaveFile()).getSubFileInfo(); - for (TorrentFileInfo info : infoArray) if (Sniffer.isMedia(info.getExt())) items.add(new Vod.Flag.Episode(info.getFileName(), info.getPlayUrl(taskId.getSaveFile()))); + List medias = XLTaskHelper.get().getTorrentInfo(taskId.getSaveFile()).getMedias(); + for (TorrentFileInfo media : medias) items.add(new Vod.Flag.Episode(media.getFileName(), media.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/utils/Sniffer.java b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java index bb26c61ca..18cc11c0b 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java @@ -19,8 +19,6 @@ public class Sniffer { public static final String CHROME = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"; public static final Pattern RULE = Pattern.compile("http((?!http).){12,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http((?!http).)*?video/tos*"); - public static final List VIDEO = Arrays.asList("avi", "flv", "mkv", "mov", "mp4", "mpeg", "mpe", "mpg", "wmv"); - public static final List AUDIO = Arrays.asList("aac", "ape", "flac", "mp3", "m4a", "ogg"); public static final List PUSH = Arrays.asList("http", "https", "smb", "ftp", "ed2k", "magnet", "thunder"); private static boolean matchOrContain(String url) { @@ -33,10 +31,6 @@ public class Sniffer { return false; } - public static boolean isMedia(String ext) { - return VIDEO.contains(ext) || AUDIO.contains(ext); - } - public static boolean isPush(Uri uri) { return PUSH.contains(uri.getScheme()); } diff --git a/thunder/src/main/java/com/xunlei/downloadlib/Util.java b/thunder/src/main/java/com/xunlei/downloadlib/Util.java new file mode 100644 index 000000000..e17af0a15 --- /dev/null +++ b/thunder/src/main/java/com/xunlei/downloadlib/Util.java @@ -0,0 +1,14 @@ +package com.xunlei.downloadlib; + +import java.util.Arrays; +import java.util.List; + +public class Util { + + private static final List VIDEO = Arrays.asList("avi", "flv", "mkv", "mov", "mp4", "mpeg", "mpe", "mpg", "wmv"); + private static final List AUDIO = Arrays.asList("aac", "ape", "flac", "mp3", "m4a", "ogg"); + + public static boolean isMedia(String ext) { + return VIDEO.contains(ext) || AUDIO.contains(ext); + } +} diff --git a/thunder/src/main/java/com/xunlei/downloadlib/XLDownloadManager.java b/thunder/src/main/java/com/xunlei/downloadlib/XLDownloadManager.java index 6042378af..cacfae1d4 100644 --- a/thunder/src/main/java/com/xunlei/downloadlib/XLDownloadManager.java +++ b/thunder/src/main/java/com/xunlei/downloadlib/XLDownloadManager.java @@ -7,6 +7,7 @@ import android.content.IntentFilter; import android.os.Build; import android.util.Log; +import com.github.catvod.Init; import com.xunlei.downloadlib.android.XLUtil; import com.xunlei.downloadlib.parameter.BtIndexSet; import com.xunlei.downloadlib.parameter.BtSubTaskDetail; @@ -26,43 +27,33 @@ import com.xunlei.downloadlib.parameter.XLTaskLocalUrl; public class XLDownloadManager { private final String TAG = XLDownloadManager.class.getSimpleName(); - private final XLLoader loader; + private XLLoader loader; private NetworkChangeReceiver receiver; - private final Context context; - private boolean init; + private Context context; - public XLDownloadManager(Context context) { + public XLDownloadManager() { + this.context = Init.getContext(); this.loader = new XLLoader(); - this.context = context; this.init(); } - public synchronized void init() { - if (init) { - Log.i(TAG, "XLDownloadManager is already init"); - return; - } + public void init() { InitParam param = new InitParam(context.getFilesDir().getAbsolutePath()); - int code = loader.init(param.getSoKey(), "com.android.providers.downloads", param.mAppVersion, "", getPeerId(), getGuid(), param.mStatSavePath, param.mStatCfgSavePath, XLUtil.getNetworkType(context), param.mPermissionLevel, param.mQueryConfOnInit); - if (code != 9000) { - init = false; - Log.i(TAG, "XLDownloadManager init fail"); - } else { - getDownloadLibVersion(new GetDownloadLibVersion()); - setOSVersion(Build.VERSION.INCREMENTAL + "_alpha"); - setLocalProperty("PhoneModel", Build.MODEL); - setStatReportSwitch(false); - setSpeedLimit(-1, -1); - registerReceiver(); - init = true; - } + loader.init(param.getSoKey(), "com.android.providers.downloads", param.mAppVersion, "", getPeerId(), getGuid(), param.mStatSavePath, param.mStatCfgSavePath, XLUtil.getNetworkType(context), param.mPermissionLevel, param.mQueryConfOnInit); + getDownloadLibVersion(new GetDownloadLibVersion()); + setOSVersion(Build.VERSION.INCREMENTAL + "_alpha"); + setLocalProperty("PhoneModel", Build.MODEL); + setStatReportSwitch(false); + setSpeedLimit(-1, -1); + registerReceiver(); } - public synchronized void release() { + public void release() { unregisterReceiver(); loader.unInit(); - init = false; + context = null; + loader = null; } private void registerReceiver() { diff --git a/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java b/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java index ae53f5729..08229be2c 100644 --- a/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java +++ b/thunder/src/main/java/com/xunlei/downloadlib/XLTaskHelper.java @@ -1,9 +1,7 @@ package com.xunlei.downloadlib; import android.text.TextUtils; -import android.util.Pair; -import com.github.catvod.Init; import com.github.catvod.utils.Path; import com.xunlei.downloadlib.parameter.BtIndexSet; import com.xunlei.downloadlib.parameter.BtSubTaskDetail; @@ -20,18 +18,14 @@ import com.xunlei.downloadlib.parameter.XLTaskInfo; import com.xunlei.downloadlib.parameter.XLTaskLocalUrl; import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicInteger; public class XLTaskHelper { - private final List> requestHeaders; - private final XLDownloadManager downloadManager; - private final AtomicInteger seq; + private XLDownloadManager manager; + private AtomicInteger seq; private static class Loader { static volatile XLTaskHelper INSTANCE = new XLTaskHelper(); @@ -41,10 +35,12 @@ public class XLTaskHelper { return Loader.INSTANCE; } - public XLTaskHelper() { - seq = new AtomicInteger(0); - requestHeaders = new ArrayList<>(); - downloadManager = new XLDownloadManager(Init.getContext()); + private AtomicInteger getSeq() { + return seq = seq == null ? new AtomicInteger(0) : seq; + } + + private XLDownloadManager getManager() { + return manager = manager == null ? new XLDownloadManager() : manager; } public synchronized GetTaskId addThunderTask(String url, File savePath) { @@ -53,10 +49,10 @@ public class XLTaskHelper { public synchronized GetTaskId addThunderTask(String url, File savePath, String fileName) { GetTaskId taskId = new GetTaskId(savePath, fileName); - if (url.startsWith("thunder://")) url = downloadManager.parserThunderUrl(url); + if (url.startsWith("thunder://")) url = getManager().parserThunderUrl(url); if (TextUtils.isEmpty(fileName)) { GetFileName getFileName = new GetFileName(); - downloadManager.getFileNameFromUrl(url, getFileName); + getManager().getFileNameFromUrl(url, getFileName); fileName = getFileName.getFileName(); taskId.setFileName(fileName); } @@ -65,12 +61,12 @@ public class XLTaskHelper { param.setFilePath(savePath.getAbsolutePath()); param.setFileName(fileName); param.setUrl(url); - int code = downloadManager.createBtMagnetTask(param, taskId); + int code = getManager().createBtMagnetTask(param, taskId); if (code != XLConstant.XLErrorCode.NO_ERROR) return taskId; } else if (url.startsWith("ftp://")) { P2spTaskParam param = new P2spTaskParam(); param.setFilePath(savePath.getAbsolutePath()); - param.setSeqId(seq.incrementAndGet()); + param.setSeqId(getSeq().incrementAndGet()); param.setFileName(fileName); param.setCreateMode(1); param.setUrl(url); @@ -78,38 +74,37 @@ public class XLTaskHelper { param.setRefUrl(""); param.setUser(""); param.setPass(""); - int code = downloadManager.createP2spTask(param, taskId); + int code = getManager().createP2spTask(param, taskId); if (code != XLConstant.XLErrorCode.NO_ERROR) return taskId; - downloadManager.setDownloadTaskOrigin(taskId.getTaskId(), "out_app/out_app_paste"); - downloadManager.setOriginUserAgent(taskId.getTaskId(), "AndroidDownloadManager/5.41.2.4980 (Linux; U; Android 4.4.4; Build/KTU84Q)"); - addRequestHeadersToXlEngine(taskId.getTaskId()); + getManager().setDownloadTaskOrigin(taskId.getTaskId(), "out_app/out_app_paste"); + getManager().setOriginUserAgent(taskId.getTaskId(), "AndroidDownloadManager/5.41.2.4980 (Linux; U; Android 4.4.4; Build/KTU84Q)"); } else if (url.startsWith("ed2k://")) { EmuleTaskParam param = new EmuleTaskParam(); param.setFilePath(savePath.getAbsolutePath()); - param.setSeqId(seq.incrementAndGet()); + param.setSeqId(getSeq().incrementAndGet()); param.setFileName(fileName); param.setCreateMode(1); param.setUrl(url); - int code = downloadManager.createEmuleTask(param, taskId); + int code = getManager().createEmuleTask(param, taskId); if (code != XLConstant.XLErrorCode.NO_ERROR) return taskId; } - downloadManager.startTask(taskId.getTaskId()); - downloadManager.setTaskGsState(taskId.getTaskId(), 0, 2); + getManager().startTask(taskId.getTaskId()); + getManager().setTaskGsState(taskId.getTaskId(), 0, 2); return taskId; } public synchronized GetTaskId addTorrentTask(File torrent, File savePath, int index) { TorrentInfo torrentInfo = new TorrentInfo(); - downloadManager.getTorrentInfo(torrent.getAbsolutePath(), torrentInfo); + getManager().getTorrentInfo(torrent.getAbsolutePath(), torrentInfo); TorrentFileInfo[] fileInfos = torrentInfo.mSubFileInfo; BtTaskParam taskParam = new BtTaskParam(); taskParam.setCreateMode(1); - taskParam.setMaxConcurrent(3); - taskParam.setSeqId(seq.incrementAndGet()); + taskParam.setMaxConcurrent(10); + taskParam.setSeqId(getSeq().incrementAndGet()); taskParam.setFilePath(savePath.getAbsolutePath()); taskParam.setTorrentPath(torrent.getAbsolutePath()); GetTaskId taskId = new GetTaskId(savePath); - int code = downloadManager.createBtTask(taskParam, taskId); + int code = getManager().createBtTask(taskParam, taskId); if (code != XLConstant.XLErrorCode.NO_ERROR) return taskId; if (fileInfos.length > 1) { List list = new CopyOnWriteArrayList<>(); @@ -120,38 +115,23 @@ public class XLTaskHelper { } BtIndexSet btIndexSet = new BtIndexSet(list.size()); for (int i = 0; i < list.size(); i++) btIndexSet.mIndexSet[i] = list.get(i); - downloadManager.deselectBtSubTask(taskId.getTaskId(), btIndexSet); + getManager().deselectBtSubTask(taskId.getTaskId(), btIndexSet); } - downloadManager.startTask(taskId.getTaskId()); - downloadManager.setTaskGsState(taskId.getTaskId(), index, 2); + getManager().startTask(taskId.getTaskId()); + getManager().setTaskGsState(taskId.getTaskId(), index, 2); return taskId; } - public void addHeader(String key, String value) { - requestHeaders.add(Pair.create(key, value)); - } - - private Collection> getHeaders() { - return Collections.unmodifiableList(requestHeaders); - } - - private void addRequestHeadersToXlEngine(long taskId) { - for (Pair pair : getHeaders()) { - if (!(pair.first == null || pair.second == null)) { - downloadManager.setHttpHeaderProperty(taskId, pair.first, pair.second); - } - } - } public synchronized TorrentInfo getTorrentInfo(File file) { TorrentInfo torrentInfo = new TorrentInfo(); - downloadManager.getTorrentInfo(file.getAbsolutePath(), torrentInfo); + getManager().getTorrentInfo(file.getAbsolutePath(), torrentInfo); return torrentInfo; } public synchronized String getLocalUrl(File file) { XLTaskLocalUrl localUrl = new XLTaskLocalUrl(); - downloadManager.getLocalUrl(file.getAbsolutePath(), localUrl); + getManager().getLocalUrl(file.getAbsolutePath(), localUrl); return localUrl.mStrUrl; } @@ -166,23 +146,26 @@ public class XLTaskHelper { } public synchronized void stopTask(GetTaskId taskId) { - downloadManager.stopTask(taskId.getTaskId()); - downloadManager.releaseTask(taskId.getTaskId()); + getManager().stopTask(taskId.getTaskId()); + getManager().releaseTask(taskId.getTaskId()); } public synchronized XLTaskInfo getTaskInfo(GetTaskId taskId) { XLTaskInfo taskInfo = new XLTaskInfo(); - downloadManager.getTaskInfo(taskId.getTaskId(), 1, taskInfo); + if (taskId.getSaveFile().exists()) taskInfo.setTaskStatus(2); + else getManager().getTaskInfo(taskId.getTaskId(), 1, taskInfo); return taskInfo; } public synchronized BtSubTaskDetail getBtSubTaskInfo(GetTaskId taskId, int index) { BtSubTaskDetail subTaskDetail = new BtSubTaskDetail(); - downloadManager.getBtSubTaskInfo(taskId.getTaskId(), index, subTaskDetail); + getManager().getBtSubTaskInfo(taskId.getTaskId(), index, subTaskDetail); return subTaskDetail; } public void release() { - downloadManager.release(); + manager.release(); + manager = null; + seq = null; } } \ No newline at end of file diff --git a/thunder/src/main/java/com/xunlei/downloadlib/parameter/TorrentInfo.java b/thunder/src/main/java/com/xunlei/downloadlib/parameter/TorrentInfo.java index 0d38b6fc2..e6bcafd3c 100644 --- a/thunder/src/main/java/com/xunlei/downloadlib/parameter/TorrentInfo.java +++ b/thunder/src/main/java/com/xunlei/downloadlib/parameter/TorrentInfo.java @@ -1,5 +1,10 @@ package com.xunlei.downloadlib.parameter; +import com.xunlei.downloadlib.Util; + +import java.util.ArrayList; +import java.util.List; + public class TorrentInfo { public int mFileCount; @@ -24,7 +29,13 @@ public class TorrentInfo { return mMultiFileBaseFolder; } - public TorrentFileInfo[] getSubFileInfo() { + private TorrentFileInfo[] getSubFileInfo() { return mSubFileInfo == null ? new TorrentFileInfo[0] : mSubFileInfo; } + + public List getMedias() { + List items = new ArrayList<>(); + for (TorrentFileInfo item : getSubFileInfo()) if (Util.isMedia(item.getExt())) items.add(item); + return items; + } } diff --git a/thunder/src/main/java/com/xunlei/downloadlib/parameter/XLTaskInfo.java b/thunder/src/main/java/com/xunlei/downloadlib/parameter/XLTaskInfo.java index a653941b2..1b0cd1f6c 100644 --- a/thunder/src/main/java/com/xunlei/downloadlib/parameter/XLTaskInfo.java +++ b/thunder/src/main/java/com/xunlei/downloadlib/parameter/XLTaskInfo.java @@ -174,6 +174,10 @@ public class XLTaskInfo implements Parcelable { return mTaskStatus; } + public void setTaskStatus(int taskStatus) { + this.mTaskStatus = taskStatus; + } + @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeLong(this.mTaskId);