8 Commits
3.7.6 ... 3.7.8

Author SHA1 Message Date
laoyuyu
ee5ee6e080 增加m3u8密钥url转换器 2019-11-28 09:59:08 +08:00
laoyuyu
c4cc804c67 增加立即恢复任务的接口,正常来说,当执行队列满时,调用恢复任务接口,只能将任务放到缓存队列中。如果希望调用恢复接口,马上进入执行队列,需要调用resume(true)这个重载方法。
修复一个非分块模式下,无法恢复下载的问题
增加M3U8加密密钥的下载地址转换器 https://github.com/AriaLyy/Aria/issues/522
2019-11-27 21:38:25 +08:00
laoyuyu
c9c00c38c6 Merge branch 'master' of github.com:AriaLyy/Aria 2019-11-26 19:32:16 +08:00
laoyuyu
846235a826 fix bug https://github.com/AriaLyy/Aria/issues/533
fix bug https://github.com/AriaLyy/Aria/issues/535
2019-11-26 19:28:06 +08:00
lyy
06dd6b35e0 Update README.md 2019-11-26 15:39:47 +08:00
lyy
944d69a1af Update README.md 2019-11-21 10:37:21 +08:00
laoyuyu
1ee36e0bc1 fix bug https://github.com/AriaLyy/Aria/issues/526 2019-11-20 21:33:56 +08:00
laoyuyu
0765ab67f7 3.7.7 2019-11-20 10:17:08 +08:00
38 changed files with 243 additions and 140 deletions

View File

@@ -15,6 +15,7 @@
*/ */
package com.arialyy.aria.core.command; package com.arialyy.aria.core.command;
import com.arialyy.aria.core.task.ITask;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
/** /**
@@ -25,8 +26,7 @@ public abstract class AbsCmdFactory<TASK_ENTITY extends AbsTaskWrapper, CMD exte
/** /**
* @param entity 下载实体 * @param entity 下载实体
* @param taskType {@link ICmd#TASK_TYPE_DOWNLOAD}、{@link ICmd#TASK_TYPE_DOWNLOAD_GROUP}、{@link * {@link ITask#DOWNLOAD}、{@link ITask#DOWNLOAD_GROUP}、{@link ITask#UPLOAD}
* ICmd#TASK_TYPE_UPLOAD}
*/ */
public abstract CMD createCmd(TASK_ENTITY entity, int type, int taskType); public abstract CMD createCmd(TASK_ENTITY entity, int type, int taskType);
} }

View File

@@ -157,14 +157,6 @@ public abstract class AbsNormalCmd<T extends AbsTaskWrapper> extends AbsCmd<T> {
mQueue.resumeTask(task); mQueue.resumeTask(task);
} }
/**
* 启动指定任务
*
* @param task 指定任务
*/
void startTask(AbsTask task) {
mQueue.startTask(task);
}
/** /**
* 从队列中获取任务 * 从队列中获取任务

View File

@@ -16,6 +16,7 @@
package com.arialyy.aria.core.command; package com.arialyy.aria.core.command;
import com.arialyy.aria.core.task.ITask;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
/** /**
@@ -83,8 +84,7 @@ public class NormalCmdFactory extends AbsCmdFactory<AbsTaskWrapper, AbsNormalCmd
* @param entity 下载实体 * @param entity 下载实体
* @param type 命令类型{@link #TASK_CREATE}、{@link #TASK_START}、{@link #TASK_CANCEL}、{@link * @param type 命令类型{@link #TASK_CREATE}、{@link #TASK_START}、{@link #TASK_CANCEL}、{@link
* #TASK_STOP}、{@link #TASK_HIGHEST_PRIORITY}、{@link #TASK_STOP_ALL}、{@link #TASK_RESUME_ALL} * #TASK_STOP}、{@link #TASK_HIGHEST_PRIORITY}、{@link #TASK_STOP_ALL}、{@link #TASK_RESUME_ALL}
* @param taskType {@link ICmd#TASK_TYPE_DOWNLOAD}、{@link ICmd#TASK_TYPE_DOWNLOAD_GROUP}、{@link * @param taskType {@link ITask#DOWNLOAD}、{@link ITask#DOWNLOAD_GROUP}、{@link ITask#UPLOAD}
* ICmd#TASK_TYPE_UPLOAD}
*/ */
public AbsNormalCmd createCmd(AbsTaskWrapper entity, int type, int taskType) { public AbsNormalCmd createCmd(AbsTaskWrapper entity, int type, int taskType) {
switch (type) { switch (type) {

View File

@@ -16,29 +16,10 @@
package com.arialyy.aria.core.command; package com.arialyy.aria.core.command;
import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.AriaManager;
import com.arialyy.aria.core.common.AbsEntity;
import com.arialyy.aria.core.download.DGTaskWrapper;
import com.arialyy.aria.core.download.DTaskWrapper;
import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.download.DownloadGroupEntity;
import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.inf.IOptionConstant;
import com.arialyy.aria.core.manager.TaskWrapperManager;
import com.arialyy.aria.core.queue.DGroupTaskQueue;
import com.arialyy.aria.core.queue.DTaskQueue;
import com.arialyy.aria.core.queue.UTaskQueue;
import com.arialyy.aria.core.task.AbsTask;
import com.arialyy.aria.core.upload.UTaskWrapper;
import com.arialyy.aria.core.upload.UploadEntity;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.core.wrapper.ITaskWrapper;
import com.arialyy.aria.orm.DbEntity;
import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.ALog;
import com.arialyy.aria.util.CommonUtil;
import com.arialyy.aria.util.NetUtils; import com.arialyy.aria.util.NetUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
/** /**
* Created by AriaL on 2017/6/13. * Created by AriaL on 2017/6/13.
@@ -50,7 +31,6 @@ import java.util.concurrent.Executors;
*/ */
final class ResumeAllCmd<T extends AbsTaskWrapper> extends AbsNormalCmd<T> { final class ResumeAllCmd<T extends AbsTaskWrapper> extends AbsNormalCmd<T> {
ResumeAllCmd(T entity, int taskType) { ResumeAllCmd(T entity, int taskType) {
super(entity, taskType); super(entity, taskType);
} }
@@ -60,8 +40,7 @@ final class ResumeAllCmd<T extends AbsTaskWrapper> extends AbsNormalCmd<T> {
ALog.w(TAG, "恢复任务失败,网络未连接"); ALog.w(TAG, "恢复任务失败,网络未连接");
return; return;
} }
new Thread(new ResumeThread(isDownloadCmd, IEntity.STATE_COMPLETE)).start(); new Thread(new ResumeThread(isDownloadCmd,
String.format("state!=%s", IEntity.STATE_COMPLETE))).start();
} }
} }

View File

@@ -47,11 +47,11 @@ public class ResumeThread implements Runnable {
private String TAG = CommonUtil.getClassName(getClass()); private String TAG = CommonUtil.getClassName(getClass());
private List<AbsTaskWrapper> mWaitList = new ArrayList<>(); private List<AbsTaskWrapper> mWaitList = new ArrayList<>();
private boolean isDownloadCmd; private boolean isDownloadCmd;
private int excludeState; private String sqlCondition;
ResumeThread(boolean isDownload, int excludeState) { ResumeThread(boolean isDownload, String sqlCondition) {
this.isDownloadCmd = isDownload; this.isDownloadCmd = isDownload;
this.excludeState = excludeState; this.sqlCondition = sqlCondition;
} }
/** /**
@@ -63,8 +63,8 @@ public class ResumeThread implements Runnable {
if (type == 1) { if (type == 1) {
List<DownloadEntity> entities = List<DownloadEntity> entities =
DbEntity.findDatas(DownloadEntity.class, DbEntity.findDatas(DownloadEntity.class,
"isGroupChild=? AND state!=? ORDER BY stopTime DESC", "false", String.format("NOT(isGroupChild) AND NOT(isComplete) AND %s ORDER BY stopTime DESC",
String.valueOf(excludeState)); sqlCondition));
if (entities != null && !entities.isEmpty()) { if (entities != null && !entities.isEmpty()) {
for (DownloadEntity entity : entities) { for (DownloadEntity entity : entities) {
addResumeEntity(TaskWrapperManager.getInstance() addResumeEntity(TaskWrapperManager.getInstance()
@@ -73,8 +73,9 @@ public class ResumeThread implements Runnable {
} }
} else if (type == 2) { } else if (type == 2) {
List<DownloadGroupEntity> entities = List<DownloadGroupEntity> entities =
DbEntity.findDatas(DownloadGroupEntity.class, "state!=? ORDER BY stopTime DESC", DbEntity.findDatas(DownloadGroupEntity.class,
String.valueOf(excludeState)); String.format("NOT(isComplete) AND %s ORDER BY stopTime DESC",
sqlCondition));
if (entities != null && !entities.isEmpty()) { if (entities != null && !entities.isEmpty()) {
for (DownloadGroupEntity entity : entities) { for (DownloadGroupEntity entity : entities) {
addResumeEntity( addResumeEntity(
@@ -84,8 +85,9 @@ public class ResumeThread implements Runnable {
} }
} else if (type == 3) { } else if (type == 3) {
List<UploadEntity> entities = List<UploadEntity> entities =
DbEntity.findDatas(UploadEntity.class, "state!=? ORDER BY stopTime DESC", DbEntity.findDatas(UploadEntity.class,
String.valueOf(excludeState)); String.format("NOT(isComplete) AND %s ORDER BY stopTime DESC",
sqlCondition));
if (entities != null && !entities.isEmpty()) { if (entities != null && !entities.isEmpty()) {
for (UploadEntity entity : entities) { for (UploadEntity entity : entities) {
addResumeEntity(TaskWrapperManager.getInstance() addResumeEntity(TaskWrapperManager.getInstance()
@@ -125,7 +127,7 @@ public class ResumeThread implements Runnable {
queue = DGroupTaskQueue.getInstance(); queue = DGroupTaskQueue.getInstance();
} }
if (queue == null){ if (queue == null) {
ALog.e(TAG, "任务类型错误"); ALog.e(TAG, "任务类型错误");
continue; continue;
} }

View File

@@ -27,12 +27,22 @@ import com.arialyy.aria.util.NetUtils;
/** /**
* Created by lyy on 2016/8/22. 开始命令 队列模型{@link QueueMod#NOW}、{@link QueueMod#WAIT} * Created by lyy on 2016/8/22. 开始命令 队列模型{@link QueueMod#NOW}、{@link QueueMod#WAIT}
*/ */
final class StartCmd<T extends AbsTaskWrapper> extends AbsNormalCmd<T> { final public class StartCmd<T extends AbsTaskWrapper> extends AbsNormalCmd<T> {
private boolean newStart = false;
StartCmd(T entity, int taskType) { StartCmd(T entity, int taskType) {
super(entity, taskType); super(entity, taskType);
} }
/**
* 立即执行任务
* @param newStart true 立即执行任务,无论执行队列是否满了
*/
public void setNewStart(boolean newStart) {
this.newStart = newStart;
}
@Override public void executeCmd() { @Override public void executeCmd() {
if (!canExeCmd) return; if (!canExeCmd) return;
if (!NetUtils.isConnected(AriaManager.getInstance().getAPP())) { if (!NetUtils.isConnected(AriaManager.getInstance().getAPP())) {
@@ -71,7 +81,11 @@ final class StartCmd<T extends AbsTaskWrapper> extends AbsNormalCmd<T> {
startTask(); startTask();
} }
} else { } else {
sendWaitState(task); if (newStart){
startTask();
}else {
sendWaitState(task);
}
} }
} }
} else { } else {
@@ -91,6 +105,7 @@ final class StartCmd<T extends AbsTaskWrapper> extends AbsNormalCmd<T> {
* 当缓冲队列为null时查找数据库中所有等待中的任务 * 当缓冲队列为null时查找数据库中所有等待中的任务
*/ */
private void findAllWaitTask() { private void findAllWaitTask() {
new Thread(new ResumeThread(isDownloadCmd, IEntity.STATE_WAIT)).start(); new Thread(
new ResumeThread(isDownloadCmd, String.format("state=%s", IEntity.STATE_WAIT))).start();
} }
} }

View File

@@ -150,7 +150,17 @@ public abstract class AbsNormalTarget<TARGET extends AbsNormalTarget> extends Ab
*/ */
@Override @Override
public void resume() { public void resume() {
getController().resume(); resume(false);
}
/**
* 正常来说,当执行队列满时,调用恢复任务接口,只能将任务放到缓存队列中。
* 如果希望调用恢复接口,马上进入执行队列,需要使用该方法
*
* @param newStart true 立即将任务恢复到执行队列中
*/
@Override public void resume(boolean newStart) {
getController().resume(newStart);
} }
/** /**

View File

@@ -30,6 +30,14 @@ public interface INormalFeature {
*/ */
void resume(); void resume();
/**
* 正常来说,当执行队列满时,调用恢复任务接口,只能将任务放到缓存队列中。
* 如果希望调用恢复接口,马上进入执行队列,需要使用该方法
*
* @param newStart true 立即将任务恢复到执行队列中
*/
void resume(boolean newStart);
/** /**
* 删除任务 * 删除任务
*/ */

View File

@@ -16,11 +16,12 @@
package com.arialyy.aria.core.common.controller; package com.arialyy.aria.core.common.controller;
import com.arialyy.aria.core.command.CancelCmd; import com.arialyy.aria.core.command.CancelCmd;
import com.arialyy.aria.core.command.CmdHelper;
import com.arialyy.aria.core.command.NormalCmdFactory; import com.arialyy.aria.core.command.NormalCmdFactory;
import com.arialyy.aria.core.command.StartCmd;
import com.arialyy.aria.core.event.EventMsgUtil; import com.arialyy.aria.core.event.EventMsgUtil;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.ALog;
import com.arialyy.aria.core.command.CmdHelper;
/** /**
* 启动控制器 * 启动控制器
@@ -49,10 +50,23 @@ public final class NormalController extends FeatureController implements INormal
*/ */
@Override @Override
public void resume() { public void resume() {
resume(false);
}
/**
* 正常来说,当执行队列满时,调用恢复任务接口,只能将任务放到缓存队列中。
* 如果希望调用恢复接口,马上进入执行队列,需要使用该方法
*
* @param newStart true 立即将任务恢复到执行队列中
*/
@Override public void resume(boolean newStart) {
if (checkConfig()) { if (checkConfig()) {
StartCmd cmd =
(StartCmd) CmdHelper.createNormalCmd(getTaskWrapper(), NormalCmdFactory.TASK_START,
checkTaskType());
cmd.setNewStart(newStart);
EventMsgUtil.getDefault() EventMsgUtil.getDefault()
.post(CmdHelper.createNormalCmd(getTaskWrapper(), NormalCmdFactory.TASK_START, .post(cmd);
checkTaskType()));
} }
} }

View File

@@ -17,6 +17,7 @@ package com.arialyy.aria.core.download.m3u8;
import com.arialyy.aria.core.common.BaseOption; import com.arialyy.aria.core.common.BaseOption;
import com.arialyy.aria.core.processor.IBandWidthUrlConverter; import com.arialyy.aria.core.processor.IBandWidthUrlConverter;
import com.arialyy.aria.core.processor.IKeyUrlConverter;
import com.arialyy.aria.core.processor.ITsMergeHandler; import com.arialyy.aria.core.processor.ITsMergeHandler;
import com.arialyy.aria.util.CheckUtil; import com.arialyy.aria.util.CheckUtil;
import com.arialyy.aria.util.ComponentUtil; import com.arialyy.aria.util.ComponentUtil;
@@ -31,6 +32,7 @@ public class M3U8Option<OP extends M3U8Option> extends BaseOption {
private int bandWidth; private int bandWidth;
private ITsMergeHandler mergeHandler; private ITsMergeHandler mergeHandler;
private IBandWidthUrlConverter bandWidthUrlConverter; private IBandWidthUrlConverter bandWidthUrlConverter;
private IKeyUrlConverter keyUrlConverter;
M3U8Option() { M3U8Option() {
super(); super();
@@ -88,4 +90,15 @@ public class M3U8Option<OP extends M3U8Option> extends BaseOption {
this.bandWidthUrlConverter = bandWidthUrlConverter; this.bandWidthUrlConverter = bandWidthUrlConverter;
return (OP) this; return (OP) this;
} }
/**
* M3U8 密钥url转换器对于某些服务器密钥的下载地址是被加密的因此需要使用该方法将被加密的密钥解密成可被识别的http地址
*
* @param keyUrlConverter {@link IKeyUrlConverter}
*/
public OP setKeyUrlConverter(IKeyUrlConverter keyUrlConverter) {
CheckUtil.checkMemberClass(keyUrlConverter.getClass());
this.keyUrlConverter = keyUrlConverter;
return (OP) this;
}
} }

View File

@@ -1,4 +1,15 @@
## 开发日志 ## 开发日志
+ v_3.7.8 (2019/11/28)
- fix bug https://github.com/AriaLyy/Aria/issues/526
- fix bug https://github.com/AriaLyy/Aria/issues/533
- fix bug https://github.com/AriaLyy/Aria/issues/535
- 修复ftp无法完成下载的问题
- 修复一个非分块模式下,调用`updateUrl(newUrl)`后无法恢复下载的问题
- 增加立即恢复任务的接口,正常来说,当执行队列满时,调用恢复任务接口,只能将任务放到缓存队列中。如果希望调用恢复接口,马上进入执行队列,需要调用`resume(true)`这个重载方法。
- 增加M3U8加密密钥的下载地址转换器 https://github.com/AriaLyy/Aria/issues/522
+ v_3.7.7 (2019/11/20)
- 修复ftp无法完成下载的问题
- 修复一个http下载崩溃的问题
+ v_3.7.6 (2019/11/19) + v_3.7.6 (2019/11/19)
- fix bug https://github.com/AriaLyy/Aria/issues/505 - fix bug https://github.com/AriaLyy/Aria/issues/505
- fix bug https://github.com/AriaLyy/Aria/issues/516 - fix bug https://github.com/AriaLyy/Aria/issues/516

View File

@@ -85,6 +85,8 @@ public class FtpDirDLoaderUtil extends AbsGroupUtil {
* @param needCloneInfo 第一次下载,信息已经在{@link FtpDirInfoThread}中clone了 * @param needCloneInfo 第一次下载,信息已经在{@link FtpDirInfoThread}中clone了
*/ */
private void startDownload(boolean needCloneInfo) { private void startDownload(boolean needCloneInfo) {
// ftp需要获取完成只任务信息才更新只任务数量
getState().setSubSize(getWrapper().getSubTaskWrapper().size());
try { try {
LOCK.lock(); LOCK.lock();
condition.signalAll(); condition.signalAll();

View File

@@ -73,6 +73,7 @@ public class DGroupLoaderUtil extends AbsGroupUtil {
@Override protected boolean onStart() { @Override protected boolean onStart() {
super.onStart(); super.onStart();
getState().setSubSize(getWrapper().getSubTaskWrapper().size());
if (getState().getCompleteNum() == getState().getSubSize()) { if (getState().getCompleteNum() == getState().getSubSize()) {
mListener.onComplete(); mListener.onComplete();
} else { } else {

View File

@@ -24,6 +24,7 @@ import com.arialyy.aria.http.BaseHttpThreadTaskAdapter;
import com.arialyy.aria.http.ConnectionHelp; import com.arialyy.aria.http.ConnectionHelp;
import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.ALog;
import com.arialyy.aria.util.BufferedRandomAccessFile; import com.arialyy.aria.util.BufferedRandomAccessFile;
import com.arialyy.aria.util.FileUtil;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;

View File

@@ -26,6 +26,7 @@ import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.download.M3U8Entity; import com.arialyy.aria.core.download.M3U8Entity;
import com.arialyy.aria.core.inf.OnFileInfoCallback; import com.arialyy.aria.core.inf.OnFileInfoCallback;
import com.arialyy.aria.core.processor.IBandWidthUrlConverter; import com.arialyy.aria.core.processor.IBandWidthUrlConverter;
import com.arialyy.aria.core.processor.IKeyUrlConverter;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.core.wrapper.ITaskWrapper; import com.arialyy.aria.core.wrapper.ITaskWrapper;
import com.arialyy.aria.exception.M3U8Exception; import com.arialyy.aria.exception.M3U8Exception;
@@ -127,7 +128,7 @@ final public class M3U8InfoThread implements Runnable {
File indexFile = new File(indexPath); File indexFile = new File(indexPath);
if (!indexFile.exists()) { if (!indexFile.exists()) {
FileUtil.createFile(indexPath); FileUtil.createFile(indexPath);
}else { } else {
//FileUtil.deleteFile(indexPath); //FileUtil.deleteFile(indexPath);
} }
fos = new FileOutputStream(indexFile); fos = new FileOutputStream(indexFile);
@@ -353,7 +354,18 @@ final public class M3U8InfoThread implements Runnable {
} else { } else {
return; return;
} }
URL url = ConnectionHelp.handleUrl(info.keyUrl, mHttpOption);
IKeyUrlConverter keyUrlConverter = mM3U8Option.getKeyUrlConverter();
String keyUrl = info.keyUrl;
if (keyUrlConverter != null) {
keyUrl = keyUrlConverter.convert(keyUrl);
}
if (TextUtils.isEmpty(keyUrl)){
ALog.e(TAG, "m3u8密钥key url 为空");
return;
}
URL url = ConnectionHelp.handleUrl(keyUrl, mHttpOption);
conn = ConnectionHelp.handleConnection(url, mHttpOption); conn = ConnectionHelp.handleConnection(url, mHttpOption);
ConnectionHelp.setConnectParam(mHttpOption, conn); ConnectionHelp.setConnectParam(mHttpOption, conn);
conn.setConnectTimeout(mConnectTimeOut); conn.setConnectTimeout(mConnectTimeOut);

View File

@@ -17,6 +17,7 @@ package com.arialyy.aria.m3u8;
import com.arialyy.aria.core.inf.ITaskOption; import com.arialyy.aria.core.inf.ITaskOption;
import com.arialyy.aria.core.processor.IBandWidthUrlConverter; import com.arialyy.aria.core.processor.IBandWidthUrlConverter;
import com.arialyy.aria.core.processor.IKeyUrlConverter;
import com.arialyy.aria.core.processor.ILiveTsUrlConverter; import com.arialyy.aria.core.processor.ILiveTsUrlConverter;
import com.arialyy.aria.core.processor.ITsMergeHandler; import com.arialyy.aria.core.processor.ITsMergeHandler;
import com.arialyy.aria.core.processor.IVodTsUrlConverter; import com.arialyy.aria.core.processor.IVodTsUrlConverter;
@@ -103,6 +104,19 @@ public class M3U8TaskOption implements ITaskOption {
*/ */
private boolean generateIndexFile = false; private boolean generateIndexFile = false;
/**
* 加密密钥的解密处理器
*/
private SoftReference<IKeyUrlConverter> keyUrlConverter;
public IKeyUrlConverter getKeyUrlConverter() {
return keyUrlConverter == null ? null : keyUrlConverter.get();
}
public void setKeyUrlConverter(IKeyUrlConverter keyUrlConverter) {
this.keyUrlConverter = new SoftReference<>(keyUrlConverter);
}
public boolean isGenerateIndexFile() { public boolean isGenerateIndexFile() {
return generateIndexFile; return generateIndexFile;
} }

View File

@@ -463,7 +463,8 @@ public class M3U8VodLoader extends BaseM3U8Loader {
private int cancelNum = 0; // 已经取消的线程的数 private int cancelNum = 0; // 已经取消的线程的数
private int stopNum = 0; // 已经停止的线程数 private int stopNum = 0; // 已经停止的线程数
private int failNum = 0; // 失败的线程数 private int failNum = 0; // 失败的线程数
private long progress; //当前总进度,百分比进度 private long percent; //当前总进度,百分比进度
private long progress;
private TaskRecord taskRecord; // 任务记录 private TaskRecord taskRecord; // 任务记录
private Looper looper; private Looper looper;
@@ -480,6 +481,7 @@ public class M3U8VodLoader extends BaseM3U8Loader {
} }
} }
this.listener = listener; this.listener = listener;
progress = getEntity().getCurrentProgress();
} }
private void updateStateCount() { private void updateStateCount() {
@@ -586,7 +588,7 @@ public class M3U8VodLoader extends BaseM3U8Loader {
} }
break; break;
case STATE_RUNNING: case STATE_RUNNING:
//progress += (long) msg.obj; progress += (long) msg.obj;
break; break;
} }
return true; return true;
@@ -610,7 +612,7 @@ public class M3U8VodLoader extends BaseM3U8Loader {
int percent = completeNum * 100 / taskRecord.threadRecords.size(); int percent = completeNum * 100 / taskRecord.threadRecords.size();
getEntity().setPercent(percent); getEntity().setPercent(percent);
getEntity().update(); getEntity().update();
progress = percent; this.percent = percent;
} }
@Override public boolean isFail() { @Override public boolean isFail() {

View File

@@ -22,6 +22,7 @@ import com.arialyy.aria.core.processor.FtpInterceptHandler;
import com.arialyy.aria.core.processor.IBandWidthUrlConverter; import com.arialyy.aria.core.processor.IBandWidthUrlConverter;
import com.arialyy.aria.core.processor.IFtpUploadInterceptor; import com.arialyy.aria.core.processor.IFtpUploadInterceptor;
import com.arialyy.aria.core.processor.IHttpFileLenAdapter; import com.arialyy.aria.core.processor.IHttpFileLenAdapter;
import com.arialyy.aria.core.processor.IKeyUrlConverter;
import com.arialyy.aria.core.processor.ILiveTsUrlConverter; import com.arialyy.aria.core.processor.ILiveTsUrlConverter;
import com.arialyy.aria.core.processor.ITsMergeHandler; import com.arialyy.aria.core.processor.ITsMergeHandler;
import com.arialyy.aria.core.processor.IVodTsUrlConverter; import com.arialyy.aria.core.processor.IVodTsUrlConverter;
@@ -61,6 +62,7 @@ public class TaskOptionParams {
PROCESSORES.add(ILiveTsUrlConverter.class); PROCESSORES.add(ILiveTsUrlConverter.class);
PROCESSORES.add(ITsMergeHandler.class); PROCESSORES.add(ITsMergeHandler.class);
PROCESSORES.add(IVodTsUrlConverter.class); PROCESSORES.add(IVodTsUrlConverter.class);
PROCESSORES.add(IKeyUrlConverter.class);
} }
/** /**

View File

@@ -63,7 +63,8 @@ public class RecordHelper {
fileExists = true; fileExists = true;
} }
// 处理文件被删除的情况 // 处理文件被删除的情况
if (fileExists) { if (!fileExists) {
ALog.w(TAG, String.format("文件【%s】被删除重新分配线程区间", mTaskRecord.filePath));
for (int i = 0; i < mTaskRecord.threadNum; i++) { for (int i = 0; i < mTaskRecord.threadNum; i++) {
long startL = i * blockSize, endL = (i + 1) * blockSize; long startL = i * blockSize, endL = (i + 1) * blockSize;
ThreadRecord tr = mTaskRecord.threadRecords.get(i); ThreadRecord tr = mTaskRecord.threadRecords.get(i);

View File

@@ -81,8 +81,7 @@ public abstract class AbsGroupUtil implements IUtil, Runnable {
* 初始化组合任务状态 * 初始化组合任务状态
*/ */
private void initState() { private void initState() {
mState = new GroupRunState(getWrapper().getKey(), mListener, mState = new GroupRunState(getWrapper().getKey(), mListener, mSubQueue);
mGTWrapper.getSubTaskWrapper().size(), mSubQueue);
for (DTaskWrapper wrapper : mGTWrapper.getSubTaskWrapper()) { for (DTaskWrapper wrapper : mGTWrapper.getSubTaskWrapper()) {
if (wrapper.getEntity().getState() == IEntity.STATE_COMPLETE) { if (wrapper.getEntity().getState() == IEntity.STATE_COMPLETE) {
mState.updateCompleteNum(); mState.updateCompleteNum();

View File

@@ -112,30 +112,4 @@ public abstract class AbsSubDLoadUtil implements IUtil {
mSchedulers.obtainMessage(ISchedulers.STOP, this).sendToTarget(); mSchedulers.obtainMessage(ISchedulers.STOP, this).sendToTarget();
} }
} }
//@Override public void start() {
// if (mWrapper.getRequestType() == ITaskWrapper.D_HTTP) {
// if (needGetInfo) {
// new Thread(new HttpFileInfoThread(mWrapper, new OnFileInfoCallback() {
//
// @Override public void onComplete(String url, CompleteInfo info) {
// mDLoader = new Downloader(mListener, mWrapper);
// mDLoader.start();
// }
//
// @Override public void onFail(AbsEntity entity, BaseException e, boolean needRetry) {
// mSchedulers.obtainMessage(ISchedulers.FAIL, SubDLoadUtil.this).sendToTarget();
// }
// })).start();
// } else {
// mDLoader = new Downloader(mListener, mWrapper);
// mDLoader.start();
// }
// } else if (mWrapper.getRequestType() == ITaskWrapper.D_FTP) {
// mDLoader = new Downloader(mListener, mWrapper);
// mDLoader.start();
// } else {
// ALog.w(TAG, String.format("不识别的类型requestType%s", mWrapper.getRequestType()));
// }
//}
} }

View File

@@ -72,14 +72,16 @@ public class GroupRunState {
private String mGroupHash; private String mGroupHash;
GroupRunState(String groupHash, IDGroupListener listener, int subSize, GroupRunState(String groupHash, IDGroupListener listener, SimpleSubQueue queue) {
SimpleSubQueue queue) {
this.listener = listener; this.listener = listener;
this.queue = queue; this.queue = queue;
mSubSize = subSize;
mGroupHash = groupHash; mGroupHash = groupHash;
} }
public void setSubSize(int subSize){
mSubSize = subSize;
}
/** /**
* 组合任务是否正在自行 * 组合任务是否正在自行
* *

View File

@@ -0,0 +1,32 @@
/*
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.arialyy.aria.core.processor;
import com.arialyy.aria.core.inf.IEventHandler;
/**
* M3U8 密钥下载地址处理器,可用于解密被加密的密钥的下载地址
*/
public interface IKeyUrlConverter extends IEventHandler {
/**
* 将被加密的密钥下载地址转换为可使用的http下载地址
*
* @param keyUrl 加密的url地址
* @return 可正常访问的http地址
*/
String convert(String keyUrl);
}

View File

@@ -34,10 +34,6 @@ public abstract class AbsThreadTaskAdapter implements IThreadTaskAdapter {
* 速度限制工具 * 速度限制工具
*/ */
protected BandwidthLimiter mSpeedBandUtil; protected BandwidthLimiter mSpeedBandUtil;
/**
* 当前线程的下去区间的进度
*/
private long mRangeProgress;
private ThreadRecord mThreadRecord; private ThreadRecord mThreadRecord;
private IThreadTaskObserver mObserver; private IThreadTaskObserver mObserver;
private AbsTaskWrapper mWrapper; private AbsTaskWrapper mWrapper;
@@ -48,7 +44,6 @@ public abstract class AbsThreadTaskAdapter implements IThreadTaskAdapter {
mThreadRecord = config.record; mThreadRecord = config.record;
mWrapper = config.taskWrapper; mWrapper = config.taskWrapper;
mThreadConfig = config; mThreadConfig = config;
mRangeProgress = mThreadRecord.startLocation;
if (getTaskConfig().getMaxSpeed() > 0) { if (getTaskConfig().getMaxSpeed() > 0) {
mSpeedBandUtil = new BandwidthLimiter(getTaskConfig().getMaxSpeed(), config.startThreadNum); mSpeedBandUtil = new BandwidthLimiter(getTaskConfig().getMaxSpeed(), config.startThreadNum);
} }
@@ -68,7 +63,7 @@ public abstract class AbsThreadTaskAdapter implements IThreadTaskAdapter {
* 当前线程的下去区间的进度 * 当前线程的下去区间的进度
*/ */
protected long getRangeProgress() { protected long getRangeProgress() {
return mRangeProgress; return mObserver.getThreadProgress();
} }
protected ThreadRecord getThreadRecord() { protected ThreadRecord getThreadRecord() {

View File

@@ -53,4 +53,9 @@ public interface IThreadTaskObserver {
* @param len 新增的长度 * @param len 新增的长度
*/ */
void updateProgress(long len); void updateProgress(long len);
/**
* 获取线程当前进度
*/
long getThreadProgress();
} }

View File

@@ -318,6 +318,11 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
} }
} }
@Override
public long getThreadProgress() {
return mRangeProgress;
}
/** /**
* 取消任务 * 取消任务
*/ */

View File

@@ -71,15 +71,15 @@ public class CommonUtil {
ALog.e(TAG, "sql语句表达式不能为null"); ALog.e(TAG, "sql语句表达式不能为null");
return false; return false;
} }
if (expression.length == 1) { //if (expression.length == 1) {
ALog.e(TAG, String.format("表达式需要写入参数,参数信息:%s", Arrays.toString(expression))); // ALog.e(TAG, String.format("表达式需要写入参数,参数信息:%s", Arrays.toString(expression)));
return false; // return false;
} //}
String where = expression[0]; String where = expression[0];
if (!where.contains("?")) { //if (!where.contains("?")) {
ALog.e(TAG, String.format("请在where语句的'='后编写?,参数信息:%s", Arrays.toString(expression))); // ALog.e(TAG, String.format("请在where语句的'='后编写?,参数信息:%s", Arrays.toString(expression)));
return false; // return false;
} //}
Pattern pattern = Pattern.compile("\\?"); Pattern pattern = Pattern.compile("\\?");
Matcher matcher = pattern.matcher(where); Matcher matcher = pattern.matcher(where);
int count = 0; int count = 0;

View File

@@ -101,9 +101,6 @@ public class ComponentUtil {
public <T extends IUtil> T buildUtil(AbsTaskWrapper wrapper, IEventListener listener) { public <T extends IUtil> T buildUtil(AbsTaskWrapper wrapper, IEventListener listener) {
int requestType = wrapper.getRequestType(); int requestType = wrapper.getRequestType();
String className = null; String className = null;
if (requestType == 1){
throw new IllegalArgumentException("xxxx");
}
switch (requestType) { switch (requestType) {
case ITaskWrapper.M3U8_LIVE: case ITaskWrapper.M3U8_LIVE:
className = "com.arialyy.aria.m3u8.live.M3U8LiveUtil"; className = "com.arialyy.aria.m3u8.live.M3U8LiveUtil";

View File

@@ -44,16 +44,16 @@ Aria有以下特点
## 引入库 ## 引入库
[![license](http://img.shields.io/badge/license-Apache2.0-brightgreen.svg?style=flat)](https://github.com/AriaLyy/Aria/blob/master/LICENSE) [![license](http://img.shields.io/badge/license-Apache2.0-brightgreen.svg?style=flat)](https://github.com/AriaLyy/Aria/blob/master/LICENSE)
[![Core](https://img.shields.io/badge/Core-3.7.6-blue)](https://github.com/AriaLyy/Aria) [![Core](https://img.shields.io/badge/Core-3.7.8-blue)](https://github.com/AriaLyy/Aria)
[![Compiler](https://img.shields.io/badge/Compiler-3.7.6-blue)](https://github.com/AriaLyy/Aria) [![Compiler](https://img.shields.io/badge/Compiler-3.7.8-blue)](https://github.com/AriaLyy/Aria)
[![FtpComponent](https://img.shields.io/badge/FtpComponent-3.7.6-orange)](https://github.com/AriaLyy/Aria) [![FtpComponent](https://img.shields.io/badge/FtpComponent-3.7.8-orange)](https://github.com/AriaLyy/Aria)
[![M3U8Component](https://img.shields.io/badge/M3U8Component-3.7.6-orange)](https://github.com/AriaLyy/Aria) [![M3U8Component](https://img.shields.io/badge/M3U8Component-3.7.8-orange)](https://github.com/AriaLyy/Aria)
```java ```java
implementation 'com.arialyy.aria:core:3.7.6' implementation 'com.arialyy.aria:core:3.7.8'
annotationProcessor 'com.arialyy.aria:compiler:3.7.6' annotationProcessor 'com.arialyy.aria:compiler:3.7.8'
implementation 'com.arialyy.aria:ftpComponent:3.7.6' # 如果需要使用ftp请增加该组件 implementation 'com.arialyy.aria:ftpComponent:3.7.8' # 如果需要使用ftp请增加该组件
implementation 'com.arialyy.aria:m3u8Component:3.7.6' # 如果需要使用m3u8下载功能请增加该组件 implementation 'com.arialyy.aria:m3u8Component:3.7.8' # 如果需要使用m3u8下载功能请增加该组件
``` ```
如果出现android support依赖错误请将 `compile 'com.arialyy.aria:core:<last-version>'`替换为 如果出现android support依赖错误请将 `compile 'com.arialyy.aria:core:<last-version>'`替换为
``` ```
@@ -137,14 +137,14 @@ protected void onCreate(Bundle savedInstanceState) {
### 版本日志 ### 版本日志
+ v_3.7.6 (2019/11/19) + v_3.7.8 (2019/11/28)
- fix bug https://github.com/AriaLyy/Aria/issues/505 - fix bug https://github.com/AriaLyy/Aria/issues/526
- fix bug https://github.com/AriaLyy/Aria/issues/516 - fix bug https://github.com/AriaLyy/Aria/issues/533
- fix bug https://github.com/AriaLyy/Aria/issues/515 - fix bug https://github.com/AriaLyy/Aria/issues/535
- 增加强制上传的api`forceUpload()` - 修复ftp无法完成下载的问题
- 修复for循环上传文件出现的问题 - 修复一个非分块模式下,调用`updateUrl(newUrl)`后无法恢复下载的问题
- 移除创建任务的500ms间隔限制 - 增加立即恢复任务的接口,正常来说,当执行队列满时,调用恢复任务接口,只能将任务放到缓存队列中。如果希望调用恢复接口,马上进入执行队列,需要调用`resume(true)`这个重载方法。
- 修复多线程读写时可能出现的`database is locked`的问题 - 增加M3U8加密密钥的下载地址转换器 https://github.com/AriaLyy/Aria/issues/522
[更多版本记录](https://github.com/AriaLyy/Aria/blob/master/DEV_LOG.md) [更多版本记录](https://github.com/AriaLyy/Aria/blob/master/DEV_LOG.md)

View File

@@ -29,5 +29,5 @@ dependencies {
implementation "com.jcraft:jsch:0.1.55" implementation "com.jcraft:jsch:0.1.55"
implementation "com.jcraft:jzlib:1.1.3" implementation "com.jcraft:jzlib:1.1.3"
implementation project(path: ':FtpComponent') implementation project(path: ':FtpComponent')
compile project(path: ':PublicComponent') implementation project(path: ':PublicComponent')
} }

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:sharedUserId="com.arialyy"
package="com.arialyy.simple"> package="com.arialyy.simple">
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>

View File

@@ -39,7 +39,7 @@ public class HttpDownloadModule extends BaseViewModule {
//"http://202.98.201.103:7000/vrs/TPK/ZTC440402001Z.tpk"; //"http://202.98.201.103:7000/vrs/TPK/ZTC440402001Z.tpk";
private final String defFilePath = private final String defFilePath =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath()
+ "/TOTWOO-v3.5.6.apk"; + "/tttt.apk";
private MutableLiveData<DownloadEntity> liveData = new MutableLiveData<>(); private MutableLiveData<DownloadEntity> liveData = new MutableLiveData<>();
private DownloadEntity singDownloadInfo; private DownloadEntity singDownloadInfo;
@@ -52,6 +52,7 @@ public class HttpDownloadModule extends BaseViewModule {
//String url = //String url =
// "http://sdkdown.muzhiwan.com/openfile/2019/05/21/com.netease.tom.mzw_5ce3ef8754d05.apk"; // "http://sdkdown.muzhiwan.com/openfile/2019/05/21/com.netease.tom.mzw_5ce3ef8754d05.apk";
String url = "http://image.totwoo.com/totwoo-TOTWOO-v3.5.6.apk"; String url = "http://image.totwoo.com/totwoo-TOTWOO-v3.5.6.apk";
//String url = "https://imtt.dd.qq.com/16891/apk/70BFFDB05AB8686F2A4CF3E07588A377.apk?fsname=com.tencent.tmgp.speedmobile_1.16.0.33877_1160033877.apk&csr=1bbd";
//String url = "https://ss1.baidu.com/-4o3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=a9e671b9a551f3dedcb2bf64a4eff0ec/4610b912c8fcc3cef70d70409845d688d53f20f7.jpg"; //String url = "https://ss1.baidu.com/-4o3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=a9e671b9a551f3dedcb2bf64a4eff0ec/4610b912c8fcc3cef70d70409845d688d53f20f7.jpg";
String filePath = AppUtil.getConfigValue(context, HTTP_PATH_KEY, defFilePath); String filePath = AppUtil.getConfigValue(context, HTTP_PATH_KEY, defFilePath);

View File

@@ -276,8 +276,9 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
if (Aria.download(this).load(mTaskId).isRunning()) { if (Aria.download(this).load(mTaskId).isRunning()) {
Aria.download(this).load(mTaskId).stop(); Aria.download(this).load(mTaskId).stop();
} else { } else {
mUrl = "http://sdkdown.muzhiwan.com/openfile/2019/07/11/com.netease.syfz.mzw_5d26f8d9cee27.apk";
Aria.download(this).load(mTaskId) Aria.download(this).load(mTaskId)
//.updateUrl("http://sdkdown.muzhiwan.com/openfile/2019/07/11/com.netease.syfz.mzw_5d26f8d9cee27.apk") .updateUrl(mUrl)
.resume(); .resume();
} }
break; break;

View File

@@ -32,10 +32,10 @@ public class GroupModule extends BaseModule {
public List<String> getUrls() { public List<String> getUrls() {
List<String> urls = new ArrayList<>(); List<String> urls = new ArrayList<>();
urls.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1574141924275&di=a7ea1497a4a2528a45ce7103bf61adf4&imgtype=0&src=http%3A%2F%2Fg.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2Fc2cec3fdfc03924590b2a9b58d94a4c27d1e2500.jpg"); //urls.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1574141924275&di=a7ea1497a4a2528a45ce7103bf61adf4&imgtype=0&src=http%3A%2F%2Fg.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2Fc2cec3fdfc03924590b2a9b58d94a4c27d1e2500.jpg");
urls.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1574141924272&di=7861479e7cb3cea98d585eaf108f056f&imgtype=0&src=http%3A%2F%2Fd.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F562c11dfa9ec8a13c0741f5afd03918fa0ecc01a.jpg"); //urls.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1574141924272&di=7861479e7cb3cea98d585eaf108f056f&imgtype=0&src=http%3A%2F%2Fd.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F562c11dfa9ec8a13c0741f5afd03918fa0ecc01a.jpg");
//String[] str = getContext().getResources().getStringArray(R.array.group_urls_1); String[] str = getContext().getResources().getStringArray(R.array.group_urls_1);
//Collections.addAll(urls, str); Collections.addAll(urls, str);
return urls; return urls;
} }

View File

@@ -36,6 +36,7 @@ import com.arialyy.aria.core.download.M3U8Entity;
import com.arialyy.aria.core.download.m3u8.M3U8VodOption; import com.arialyy.aria.core.download.m3u8.M3U8VodOption;
import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.processor.IBandWidthUrlConverter; import com.arialyy.aria.core.processor.IBandWidthUrlConverter;
import com.arialyy.aria.core.processor.IKeyUrlConverter;
import com.arialyy.aria.core.processor.ITsMergeHandler; import com.arialyy.aria.core.processor.ITsMergeHandler;
import com.arialyy.aria.core.processor.IVodTsUrlConverter; import com.arialyy.aria.core.processor.IVodTsUrlConverter;
import com.arialyy.aria.core.task.DownloadTask; import com.arialyy.aria.core.task.DownloadTask;
@@ -308,7 +309,8 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
//.merge(true) //.merge(true)
.setVodTsUrlConvert(new VodTsUrlConverter()); .setVodTsUrlConvert(new VodTsUrlConverter());
//.setMergeHandler(new TsMergeHandler()); //.setMergeHandler(new TsMergeHandler());
//.setBandWidthUrlConverter(new BandWidthUrlConverter(mUrl)); option.setKeyUrlConverter(new KeyUrlConverter());
option.setBandWidthUrlConverter(new BandWidthUrlConverter(mUrl));
return option; return option;
} }
@@ -324,7 +326,10 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
static class VodTsUrlConverter implements IVodTsUrlConverter { static class VodTsUrlConverter implements IVodTsUrlConverter {
@Override public List<String> convert(String m3u8Url, List<String> tsUrls) { @Override public List<String> convert(String m3u8Url, List<String> tsUrls) {
Uri uri = Uri.parse(m3u8Url); Uri uri = Uri.parse(m3u8Url);
String parentUrl = "http://" + uri.getHost(); //String parentUrl = "http://" + uri.getHost() + "/gear1/";
int index = m3u8Url.lastIndexOf("/");
String parentUrl = m3u8Url.substring(0, index + 1);
//String parentUrl = "http://" + uri.getHost() + "/";
List<String> newUrls = new ArrayList<>(); List<String> newUrls = new ArrayList<>();
for (String url : tsUrls) { for (String url : tsUrls) {
newUrls.add(parentUrl + url); newUrls.add(parentUrl + url);
@@ -354,4 +359,12 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
return url.substring(0, index + 1) + bandWidthUrl; return url.substring(0, index + 1) + bandWidthUrl;
} }
} }
static class KeyUrlConverter implements IKeyUrlConverter{
@Override public String convert(String keyUrl) {
ALog.d("TAG", "convertUrl....");
return null;
}
}
} }

View File

@@ -34,9 +34,8 @@ public class M3U8VodModule extends BaseViewModule {
// m3u8测试集合http://www.voidcn.com/article/p-snaliarm-ct.html // m3u8测试集合http://www.voidcn.com/article/p-snaliarm-ct.html
//private final String defUrl = "https://www.gaoya123.cn/2019/1557993797897.m3u8"; //private final String defUrl = "https://www.gaoya123.cn/2019/1557993797897.m3u8";
// 多码率地址: // 多码率地址:
//private final String defUrl = "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"; private final String defUrl = "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8";
//private final String defUrl = "http://cn1.fa1244.cn/hls/20190516/6d271eaa73b2e4cb51d13831b0c1ab4c/1557976262/index.m3u8"; //private final String defUrl = "http://qn.shytong.cn/b83137769ff6b555/11b0c9970f9a3fa0.mp4.m3u8";
private final String defUrl = "http://qn.shytong.cn/b83137769ff6b555/11b0c9970f9a3fa0.mp4.m3u8";
private final String filePath = private final String filePath =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath()
//+ "/道士下山.ts"; //+ "/道士下山.ts";

View File

@@ -307,17 +307,17 @@ public class DownloadAdapter extends AbsRVAdapter<AbsEntity, DownloadAdapter.Sim
switch (entity.getTaskType()) { switch (entity.getTaskType()) {
case ITaskWrapper.D_FTP: case ITaskWrapper.D_FTP:
//Aria.download(getContext()).loadFtp((DownloadEntity) entity).login("lao", "123456").create(); //Aria.download(getContext()).loadFtp((DownloadEntity) entity).login("lao", "123456").create();
Aria.download(getContext()).loadFtp(entity.getId()).resume(); Aria.download(getContext()).loadFtp(entity.getId()).resume(true);
break; break;
case ITaskWrapper.D_FTP_DIR: case ITaskWrapper.D_FTP_DIR:
Aria.download(getContext()).loadFtpDir(entity.getId()).resume(); Aria.download(getContext()).loadFtpDir(entity.getId()).resume(true);
break; break;
case ITaskWrapper.D_HTTP: case ITaskWrapper.D_HTTP:
case ITaskWrapper.M3U8_VOD: case ITaskWrapper.M3U8_VOD:
Aria.download(getContext()).load(entity.getId()).resume(); Aria.download(getContext()).load(entity.getId()).resume(true);
break; break;
case ITaskWrapper.DG_HTTP: case ITaskWrapper.DG_HTTP:
Aria.download(getContext()).loadGroup(entity.getId()).resume(); Aria.download(getContext()).loadGroup(entity.getId()).resume(true);
break; break;
} }
} }

View File

@@ -44,8 +44,8 @@ task clean(type: Delete) {
} }
ext { ext {
versionCode = 376 versionCode = 378
versionName = '3.7.6' versionName = '3.7.8'
userOrg = 'arialyy' userOrg = 'arialyy'
groupId = 'com.arialyy.aria' groupId = 'com.arialyy.aria'
publishVersion = versionName publishVersion = versionName