Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
418ec74b7b | ||
|
|
29f9bdcdbd |
@@ -37,12 +37,23 @@ public class M3U8Option<OP extends M3U8Option> extends BaseOption {
|
|||||||
private IKeyUrlConverter keyUrlConverter;
|
private IKeyUrlConverter keyUrlConverter;
|
||||||
private boolean ignoreFailureTs = false;
|
private boolean ignoreFailureTs = false;
|
||||||
private String keyPath;
|
private String keyPath;
|
||||||
|
private boolean useDefConvert = true;
|
||||||
|
|
||||||
M3U8Option() {
|
M3U8Option() {
|
||||||
super();
|
super();
|
||||||
ComponentUtil.getInstance().checkComponentExist(ComponentUtil.COMPONENT_TYPE_M3U8);
|
ComponentUtil.getInstance().checkComponentExist(ComponentUtil.COMPONENT_TYPE_M3U8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置使用默认的码率转换器和TS转换器,默认打开
|
||||||
|
* @param useDefConvert true 使用默认的转换器,false 关闭默认的转换器
|
||||||
|
*/
|
||||||
|
public OP setUseDefConvert(boolean useDefConvert) {
|
||||||
|
this.useDefConvert = true;
|
||||||
|
ALog.d(TAG, "使用默认的码率转换器和TS转换器,如果无法下载,请参考:https://github.com/AriaLyy/Aria/issues/597 定制转换器");
|
||||||
|
return (OP) this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置密钥文件的保存路径
|
* 设置密钥文件的保存路径
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
## 开发日志
|
## 开发日志
|
||||||
|
+ v_3.8.9 (2020/6/14)
|
||||||
|
- fix bug https://github.com/AriaLyy/Aria/issues/688
|
||||||
|
- fix bug https://github.com/AriaLyy/Aria/issues/690
|
||||||
|
- m3u8任务增加`setUseDefConvert()`方法,用于处理默认的m3u8任务
|
||||||
|
+ v_3.8.8 (2020/6/7)
|
||||||
|
- 修复设置了cancel(false),文件还是被删除的问题 https://github.com/AriaLyy/Aria/issues/686
|
||||||
|
- 修复错误url的下载任务,无法删除的问题 https://github.com/AriaLyy/Aria/issues/684
|
||||||
+ v_3.8.7 (2020/5/25)
|
+ v_3.8.7 (2020/5/25)
|
||||||
- 修复组合任务单个子任务失败后,重新恢复组合任务,组合任务状态变为完成的问题
|
- 修复组合任务单个子任务失败后,重新恢复组合任务,组合任务状态变为完成的问题
|
||||||
- 修复40x错误,会继续重试并且无法重试成功的问题 https://github.com/AriaLyy/Aria/issues/619
|
- 修复40x错误,会继续重试并且无法重试成功的问题 https://github.com/AriaLyy/Aria/issues/619
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* 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.m3u8;
|
||||||
|
|
||||||
|
import com.arialyy.aria.core.processor.IBandWidthUrlConverter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 点播文件默认的码率转换器
|
||||||
|
*/
|
||||||
|
class BandWidthDefConverter implements IBandWidthUrlConverter {
|
||||||
|
|
||||||
|
@Override public String convert(String m3u8Url, String bandWidthUrl) {
|
||||||
|
int index = m3u8Url.lastIndexOf("/");
|
||||||
|
return m3u8Url.substring(0, index + 1) + bandWidthUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -328,9 +328,10 @@ final public class M3U8InfoTask implements IInfoTask {
|
|||||||
* 处理码率
|
* 处理码率
|
||||||
*/
|
*/
|
||||||
private void handleBandWidth(HttpURLConnection conn, String bandWidthM3u8Url) throws IOException {
|
private void handleBandWidth(HttpURLConnection conn, String bandWidthM3u8Url) throws IOException {
|
||||||
IBandWidthUrlConverter converter = mM3U8Option.getBandWidthUrlConverter();
|
IBandWidthUrlConverter converter = mM3U8Option.isUseDefConvert() ? new BandWidthDefConverter()
|
||||||
|
: mM3U8Option.getBandWidthUrlConverter();
|
||||||
if (converter != null) {
|
if (converter != null) {
|
||||||
bandWidthM3u8Url = converter.convert(bandWidthM3u8Url);
|
bandWidthM3u8Url = converter.convert(mEntity.getUrl(), bandWidthM3u8Url);
|
||||||
if (!bandWidthM3u8Url.startsWith("http")) {
|
if (!bandWidthM3u8Url.startsWith("http")) {
|
||||||
failDownload(String.format("码率转换器转换后的url地址无效,转换后的url:%s", bandWidthM3u8Url), false);
|
failDownload(String.format("码率转换器转换后的url地址无效,转换后的url:%s", bandWidthM3u8Url), false);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -120,6 +120,19 @@ public final class M3U8TaskOption implements ITaskOption {
|
|||||||
*/
|
*/
|
||||||
private String keyPath;
|
private String keyPath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否使用默认的码率转换器和Ts转换器
|
||||||
|
*/
|
||||||
|
private boolean useDefConvert = false;
|
||||||
|
|
||||||
|
public boolean isUseDefConvert() {
|
||||||
|
return useDefConvert;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUseDefConvert(boolean useDefConvert) {
|
||||||
|
this.useDefConvert = useDefConvert;
|
||||||
|
}
|
||||||
|
|
||||||
public String getKeyPath() {
|
public String getKeyPath() {
|
||||||
return keyPath;
|
return keyPath;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* 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.m3u8.live;
|
||||||
|
|
||||||
|
import com.arialyy.aria.core.processor.ILiveTsUrlConverter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认的m3u8 ts转换器
|
||||||
|
*/
|
||||||
|
class LiveTsDefConverter implements ILiveTsUrlConverter {
|
||||||
|
@Override public String convert(String m3u8Url, String tsUrl) {
|
||||||
|
int index = m3u8Url.lastIndexOf("/");
|
||||||
|
String parentUrl = m3u8Url.substring(0, index + 1);
|
||||||
|
return parentUrl + tsUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,8 +32,8 @@ 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.task.ThreadTask;
|
import com.arialyy.aria.core.task.ThreadTask;
|
||||||
import com.arialyy.aria.core.wrapper.ITaskWrapper;
|
import com.arialyy.aria.core.wrapper.ITaskWrapper;
|
||||||
import com.arialyy.aria.exception.AriaM3U8Exception;
|
|
||||||
import com.arialyy.aria.exception.AriaException;
|
import com.arialyy.aria.exception.AriaException;
|
||||||
|
import com.arialyy.aria.exception.AriaM3U8Exception;
|
||||||
import com.arialyy.aria.m3u8.BaseM3U8Loader;
|
import com.arialyy.aria.m3u8.BaseM3U8Loader;
|
||||||
import com.arialyy.aria.m3u8.IdGenerator;
|
import com.arialyy.aria.m3u8.IdGenerator;
|
||||||
import com.arialyy.aria.m3u8.M3U8InfoTask;
|
import com.arialyy.aria.m3u8.M3U8InfoTask;
|
||||||
@@ -265,7 +265,9 @@ final class M3U8LiveLoader extends BaseM3U8Loader {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mPeerUrls.add(url);
|
mPeerUrls.add(url);
|
||||||
ILiveTsUrlConverter converter = mM3U8Option.getLiveTsUrlConverter();
|
ILiveTsUrlConverter converter = mM3U8Option.isUseDefConvert() ?
|
||||||
|
new LiveTsDefConverter() :
|
||||||
|
mM3U8Option.getLiveTsUrlConverter();
|
||||||
if (converter != null) {
|
if (converter != null) {
|
||||||
if (TextUtils.isEmpty(mM3U8Option.getBandWidthUrl())) {
|
if (TextUtils.isEmpty(mM3U8Option.getBandWidthUrl())) {
|
||||||
url = converter.convert(getEntity().getUrl(), url);
|
url = converter.convert(getEntity().getUrl(), url);
|
||||||
|
|||||||
@@ -504,7 +504,9 @@ final class M3U8VodLoader extends BaseM3U8Loader {
|
|||||||
final List<String> urls = new ArrayList<>();
|
final List<String> urls = new ArrayList<>();
|
||||||
mInfoTask.setCallback(new IInfoTask.Callback() {
|
mInfoTask.setCallback(new IInfoTask.Callback() {
|
||||||
@Override public void onSucceed(String key, CompleteInfo info) {
|
@Override public void onSucceed(String key, CompleteInfo info) {
|
||||||
IVodTsUrlConverter converter = mM3U8Option.getVodUrlConverter();
|
IVodTsUrlConverter converter = mM3U8Option.isUseDefConvert() ?
|
||||||
|
new VodTsDefConverter() :
|
||||||
|
mM3U8Option.getVodUrlConverter();
|
||||||
if (converter != null) {
|
if (converter != null) {
|
||||||
if (TextUtils.isEmpty(mM3U8Option.getBandWidthUrl())) {
|
if (TextUtils.isEmpty(mM3U8Option.getBandWidthUrl())) {
|
||||||
urls.addAll(
|
urls.addAll(
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* 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.m3u8.vod;
|
||||||
|
|
||||||
|
import com.arialyy.aria.core.processor.IVodTsUrlConverter;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认的m3u8 ts转换器
|
||||||
|
*/
|
||||||
|
class VodTsDefConverter implements IVodTsUrlConverter {
|
||||||
|
@Override public List<String> convert(String m3u8Url, List<String> tsUrls) {
|
||||||
|
int index = m3u8Url.lastIndexOf("/");
|
||||||
|
List<String> convertedTsUrl = new ArrayList<>();
|
||||||
|
|
||||||
|
String parentUrl = m3u8Url.substring(0, index + 1);
|
||||||
|
for (String temp : tsUrls) {
|
||||||
|
convertedTsUrl.add(parentUrl + temp);
|
||||||
|
}
|
||||||
|
return convertedTsUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,6 +20,7 @@ import android.os.Bundle;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import com.arialyy.aria.core.AriaConfig;
|
import com.arialyy.aria.core.AriaConfig;
|
||||||
|
import com.arialyy.aria.core.TaskRecord;
|
||||||
import com.arialyy.aria.core.config.Configuration;
|
import com.arialyy.aria.core.config.Configuration;
|
||||||
import com.arialyy.aria.core.inf.IThreadStateManager;
|
import com.arialyy.aria.core.inf.IThreadStateManager;
|
||||||
import com.arialyy.aria.core.loader.IRecordHandler;
|
import com.arialyy.aria.core.loader.IRecordHandler;
|
||||||
@@ -169,10 +170,11 @@ final class SimpleSchedulers implements Handler.Callback {
|
|||||||
*/
|
*/
|
||||||
private synchronized void handleComplete(AbsSubDLoadUtil loader) {
|
private synchronized void handleComplete(AbsSubDLoadUtil loader) {
|
||||||
ALog.d(TAG, String.format("子任务【%s】完成", loader.getEntity().getFileName()));
|
ALog.d(TAG, String.format("子任务【%s】完成", loader.getEntity().getFileName()));
|
||||||
if (loader.getRecord().isBlock) {
|
TaskRecord record = loader.getRecord();
|
||||||
|
if (record != null && record.isBlock) {
|
||||||
File partFile =
|
File partFile =
|
||||||
new File(String.format(IRecordHandler.SUB_PATH, loader.getRecord().filePath, 0));
|
new File(String.format(IRecordHandler.SUB_PATH, record.filePath, 0));
|
||||||
partFile.renameTo(new File(loader.getRecord().filePath));
|
partFile.renameTo(new File(record.filePath));
|
||||||
}
|
}
|
||||||
ThreadTaskManager.getInstance().removeTaskThread(loader.getKey());
|
ThreadTaskManager.getInstance().removeTaskThread(loader.getKey());
|
||||||
mGState.listener.onSubComplete(loader.getEntity());
|
mGState.listener.onSubComplete(loader.getEntity());
|
||||||
|
|||||||
@@ -106,6 +106,11 @@ public final class SubLoader implements ILoader, ILoaderVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
record = recordHandler.getRecord(wrapper.getEntity().getFileSize());
|
record = recordHandler.getRecord(wrapper.getEntity().getFileSize());
|
||||||
|
if (record == null){
|
||||||
|
ALog.d(TAG, "子任务记录为空");
|
||||||
|
sendFailState(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (record.threadRecords != null
|
if (record.threadRecords != null
|
||||||
&& !TextUtils.isEmpty(record.filePath)
|
&& !TextUtils.isEmpty(record.filePath)
|
||||||
&& new File(record.filePath).exists()
|
&& new File(record.filePath).exists()
|
||||||
|
|||||||
@@ -27,8 +27,9 @@ public interface IBandWidthUrlConverter extends IEventHandler {
|
|||||||
* 转换码率地址为可用的http地址,对于某些服务器,返回的切片信息有可能是相对地址,也可能是处理过的,
|
* 转换码率地址为可用的http地址,对于某些服务器,返回的切片信息有可能是相对地址,也可能是处理过的,
|
||||||
* 对于这种情况,你需要使用url转换器将地址转换为可正常访问的http地址
|
* 对于这种情况,你需要使用url转换器将地址转换为可正常访问的http地址
|
||||||
*
|
*
|
||||||
|
* @param m3u8Url m3u8url地址
|
||||||
* @param bandWidthUrl 原始码率地址
|
* @param bandWidthUrl 原始码率地址
|
||||||
* @return 可正常访问的http地址
|
* @return 可正常访问的http地址
|
||||||
*/
|
*/
|
||||||
String convert(String bandWidthUrl);
|
String convert(String m3u8Url, String bandWidthUrl);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,5 +30,5 @@ public interface ILiveTsUrlConverter extends IEventHandler {
|
|||||||
* @param tsUrl ts文件下载地址
|
* @param tsUrl ts文件下载地址
|
||||||
* @return 转换后的http地址
|
* @return 转换后的http地址
|
||||||
*/
|
*/
|
||||||
public String convert(String m3u8Url, String tsUrl);
|
String convert(String m3u8Url, String tsUrl);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -171,8 +171,11 @@ final class SqlHelper extends SQLiteOpenHelper {
|
|||||||
|
|
||||||
private void createDbCacheDir() {
|
private void createDbCacheDir() {
|
||||||
String cacheDir = mContext.getCacheDir().getPath() + "/AriaDbCacheDir";
|
String cacheDir = mContext.getCacheDir().getPath() + "/AriaDbCacheDir";
|
||||||
boolean rs = new File(cacheDir).mkdir();
|
File cacheFile = new File(cacheDir);
|
||||||
ALog.d(TAG, rs + "");
|
if (!cacheFile.exists()){
|
||||||
|
boolean rs = cacheFile.mkdirs();
|
||||||
|
ALog.d(TAG, rs + "");
|
||||||
|
}
|
||||||
super.getReadableDatabase()
|
super.getReadableDatabase()
|
||||||
.execSQL("PRAGMA temp_store_directory = '" + cacheDir + "'");
|
.execSQL("PRAGMA temp_store_directory = '" + cacheDir + "'");
|
||||||
mainTmpDirSet = true;
|
mainTmpDirSet = true;
|
||||||
|
|||||||
@@ -32,14 +32,14 @@ public class DeleteDRecord implements IDeleteRecord {
|
|||||||
private String TAG = CommonUtil.getClassName(this);
|
private String TAG = CommonUtil.getClassName(this);
|
||||||
private static volatile DeleteDRecord INSTANCE = null;
|
private static volatile DeleteDRecord INSTANCE = null;
|
||||||
|
|
||||||
private DeleteDRecord(){
|
private DeleteDRecord() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DeleteDRecord getInstance() {
|
public static DeleteDRecord getInstance() {
|
||||||
if (INSTANCE == null){
|
if (INSTANCE == null) {
|
||||||
synchronized (DeleteDRecord.class){
|
synchronized (DeleteDRecord.class) {
|
||||||
if (INSTANCE == null){
|
if (INSTANCE == null) {
|
||||||
INSTANCE = new DeleteDRecord();
|
INSTANCE = new DeleteDRecord();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -84,7 +84,8 @@ public class DeleteDRecord implements IDeleteRecord {
|
|||||||
File targetFile = new File(filePath);
|
File targetFile = new File(filePath);
|
||||||
|
|
||||||
// 兼容以前版本
|
// 兼容以前版本
|
||||||
if (entity.getTaskType() == ITaskWrapper.M3U8_VOD || entity.getTaskType() == ITaskWrapper.M3U8_LIVE){
|
if (entity.getTaskType() == ITaskWrapper.M3U8_VOD
|
||||||
|
|| entity.getTaskType() == ITaskWrapper.M3U8_LIVE) {
|
||||||
DeleteM3u8Record.getInstance().deleteRecord(entity, needRemoveFile, needRemoveEntity);
|
DeleteM3u8Record.getInstance().deleteRecord(entity, needRemoveFile, needRemoveEntity);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -92,13 +93,18 @@ public class DeleteDRecord implements IDeleteRecord {
|
|||||||
TaskRecord record = DbDataHelper.getTaskRecord(entity.getFilePath(), entity.getTaskType());
|
TaskRecord record = DbDataHelper.getTaskRecord(entity.getFilePath(), entity.getTaskType());
|
||||||
if (record == null) {
|
if (record == null) {
|
||||||
ALog.e(TAG, "删除下载记录失败,记录为空,filePath:" + entity.getFilePath());
|
ALog.e(TAG, "删除下载记录失败,记录为空,filePath:" + entity.getFilePath());
|
||||||
|
FileUtil.deleteFile(targetFile);
|
||||||
|
DbEntity.deleteData(DownloadEntity.class, "downloadPath=?", filePath);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 删除下载的线程记录和任务记录
|
||||||
DbEntity.deleteData(ThreadRecord.class, "taskKey=? AND threadType=?", filePath,
|
DbEntity.deleteData(ThreadRecord.class, "taskKey=? AND threadType=?", filePath,
|
||||||
String.valueOf(entity.getTaskType()));
|
String.valueOf(entity.getTaskType()));
|
||||||
|
DbEntity.deleteData(TaskRecord.class, "filePath=? AND taskType=?", filePath,
|
||||||
|
String.valueOf(entity.getTaskType()));
|
||||||
|
|
||||||
if (needRemoveEntity || !entity.isComplete()) {
|
if (needRemoveFile || !entity.isComplete()) {
|
||||||
FileUtil.deleteFile(targetFile);
|
FileUtil.deleteFile(targetFile);
|
||||||
if (record.isBlock) {
|
if (record.isBlock) {
|
||||||
removeBlockFile(record);
|
removeBlockFile(record);
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ package com.arialyy.aria.util;
|
|||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import com.arialyy.aria.core.TaskRecord;
|
import com.arialyy.aria.core.TaskRecord;
|
||||||
|
import com.arialyy.aria.core.ThreadRecord;
|
||||||
import com.arialyy.aria.core.common.AbsEntity;
|
import com.arialyy.aria.core.common.AbsEntity;
|
||||||
import com.arialyy.aria.core.download.DownloadEntity;
|
import com.arialyy.aria.core.download.DownloadEntity;
|
||||||
import com.arialyy.aria.core.download.M3U8Entity;
|
import com.arialyy.aria.core.download.M3U8Entity;
|
||||||
@@ -82,6 +83,11 @@ public class DeleteM3u8Record implements IDeleteRecord {
|
|||||||
}
|
}
|
||||||
final String filePath = entity.getFilePath();
|
final String filePath = entity.getFilePath();
|
||||||
|
|
||||||
|
// 删除下载的线程记录和任务记录
|
||||||
|
DbEntity.deleteData(ThreadRecord.class, "taskKey=? AND threadType=?", filePath,
|
||||||
|
String.valueOf(entity.getTaskType()));
|
||||||
|
DbEntity.deleteData(TaskRecord.class, "filePath=? AND taskType=?", filePath,
|
||||||
|
String.valueOf(entity.getTaskType()));
|
||||||
DbEntity.deleteData(M3U8Entity.class, "filePath=?", filePath);
|
DbEntity.deleteData(M3U8Entity.class, "filePath=?", filePath);
|
||||||
|
|
||||||
if (needRemoveFile || !entity.isComplete()) {
|
if (needRemoveFile || !entity.isComplete()) {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ package com.arialyy.aria.util;
|
|||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import com.arialyy.aria.core.TaskRecord;
|
import com.arialyy.aria.core.TaskRecord;
|
||||||
|
import com.arialyy.aria.core.ThreadRecord;
|
||||||
import com.arialyy.aria.core.common.AbsEntity;
|
import com.arialyy.aria.core.common.AbsEntity;
|
||||||
import com.arialyy.aria.core.upload.UploadEntity;
|
import com.arialyy.aria.core.upload.UploadEntity;
|
||||||
import com.arialyy.aria.orm.DbEntity;
|
import com.arialyy.aria.orm.DbEntity;
|
||||||
@@ -76,6 +77,10 @@ public class DeleteURecord implements IDeleteRecord {
|
|||||||
}
|
}
|
||||||
|
|
||||||
UploadEntity entity = (UploadEntity) absEntity;
|
UploadEntity entity = (UploadEntity) absEntity;
|
||||||
|
|
||||||
|
// 删除下载的线程记录和任务记录
|
||||||
|
DbEntity.deleteData(ThreadRecord.class, "taskKey=? AND threadType=?", entity.getFilePath(),
|
||||||
|
String.valueOf(entity.getTaskType()));
|
||||||
DbEntity.deleteData(TaskRecord.class, "filePath=? AND taskType=?", entity.getFilePath(),
|
DbEntity.deleteData(TaskRecord.class, "filePath=? AND taskType=?", entity.getFilePath(),
|
||||||
String.valueOf(entity.getTaskType()));
|
String.valueOf(entity.getTaskType()));
|
||||||
|
|
||||||
|
|||||||
35
README.md
35
README.md
@@ -45,19 +45,19 @@ Aria有以下特点:
|
|||||||
|
|
||||||
## 引入库
|
## 引入库
|
||||||
[](https://github.com/AriaLyy/Aria/blob/master/LICENSE)
|
[](https://github.com/AriaLyy/Aria/blob/master/LICENSE)
|
||||||
[](https://github.com/AriaLyy/Aria)
|
[](https://github.com/AriaLyy/Aria)
|
||||||
[](https://github.com/AriaLyy/Aria)
|
[](https://github.com/AriaLyy/Aria)
|
||||||
[](https://github.com/AriaLyy/Aria)
|
[](https://github.com/AriaLyy/Aria)
|
||||||
[](https://github.com/AriaLyy/Aria)
|
[](https://github.com/AriaLyy/Aria)
|
||||||
[](https://github.com/AriaLyy/Aria)
|
[](https://github.com/AriaLyy/Aria)
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
implementation 'com.arialyy.aria:core:3.8.7'
|
implementation 'com.arialyy.aria:core:3.8.9'
|
||||||
annotationProcessor 'com.arialyy.aria:compiler:3.8.7'
|
annotationProcessor 'com.arialyy.aria:compiler:3.8.9'
|
||||||
implementation 'com.arialyy.aria:ftpComponent:3.8.7' # 如果需要使用ftp,请增加该组件
|
implementation 'com.arialyy.aria:ftpComponent:3.8.9' # 如果需要使用ftp,请增加该组件
|
||||||
implementation 'com.arialyy.aria:sftpComponent:3.8.7' # 如果需要使用ftp,请增加该组件
|
implementation 'com.arialyy.aria:sftpComponent:3.8.9' # 如果需要使用ftp,请增加该组件
|
||||||
implementation 'com.arialyy.aria:m3u8Component:3.8.7' # 如果需要使用m3u8下载功能,请增加该组件
|
implementation 'com.arialyy.aria:m3u8Component:3.8.9' # 如果需要使用m3u8下载功能,请增加该组件
|
||||||
```
|
```
|
||||||
|
|
||||||
如果你使用的是kotlin,请使用kotlin官方提供的方法配置apt,[kotlin kapt官方配置传送门](https://www.kotlincn.net/docs/reference/kapt.html)
|
如果你使用的是kotlin,请使用kotlin官方提供的方法配置apt,[kotlin kapt官方配置传送门](https://www.kotlincn.net/docs/reference/kapt.html)
|
||||||
@@ -138,17 +138,10 @@ protected void onCreate(Bundle savedInstanceState) {
|
|||||||
|
|
||||||
|
|
||||||
### 版本日志
|
### 版本日志
|
||||||
+ v_3.8.7 (2020/5/25)
|
+ v_3.8.9 (2020/6/14)
|
||||||
- 修复组合任务单个子任务失败后,重新恢复组合任务,组合任务状态变为完成的问题
|
- fix bug https://github.com/AriaLyy/Aria/issues/688
|
||||||
- 修复40x错误,会继续重试并且无法重试成功的问题 https://github.com/AriaLyy/Aria/issues/619
|
- fix bug https://github.com/AriaLyy/Aria/issues/690
|
||||||
- 修复wait模式下,resume(true)无效问题
|
- m3u8任务增加`setUseDefConvert()`方法,用于处理默认的m3u8任务
|
||||||
- 修复now模式下的一些问题 https://github.com/AriaLyy/Aria/issues/620
|
|
||||||
- 修复组任务,其中一个子任务在获取文件长度失败后,重新恢复组合任务,组合任务状态变为完成的问题 https://github.com/AriaLyy/Aria/issues/628
|
|
||||||
- 修复组任务中,其中一个子任务是30x地址,导致调度器无法出现该子任务状态的问题
|
|
||||||
- 增加组任务groupHash冲突检查 https://github.com/AriaLyy/Aria/issues/635
|
|
||||||
- 修复task.cancel(false)还是把本地文件删除的问题 https://github.com/AriaLyy/Aria/issues/646
|
|
||||||
- fix bug https://github.com/AriaLyy/Aria/issues/670
|
|
||||||
- fix bug https://github.com/AriaLyy/Aria/issues/664
|
|
||||||
|
|
||||||
[更多版本记录](https://github.com/AriaLyy/Aria/blob/master/DEV_LOG.md)
|
[更多版本记录](https://github.com/AriaLyy/Aria/blob/master/DEV_LOG.md)
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
<download>
|
<download>
|
||||||
|
|
||||||
<!--设置任务最大下载速度,0表示不限速,单位为:kb-->
|
<!--设置任务最大下载速度,0表示不限速,单位为:kb-->
|
||||||
<maxSpeed value="0"/>
|
<maxSpeed value="128"/>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
多线程下载是否使用块下载模式,{@code true}使用,{@code false}不使用
|
多线程下载是否使用块下载模式,{@code true}使用,{@code false}不使用
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
<threadNum value="3"/>
|
<threadNum value="3"/>
|
||||||
|
|
||||||
<!--设置下载队列最大任务数, 默认为2-->
|
<!--设置下载队列最大任务数, 默认为2-->
|
||||||
<maxTaskNum value="2"/>
|
<maxTaskNum value="1"/>
|
||||||
|
|
||||||
<!--设置下载失败,重试次数,默认为10-->
|
<!--设置下载失败,重试次数,默认为10-->
|
||||||
<reTryNum value="5"/>
|
<reTryNum value="5"/>
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
<convertSpeed value="true"/>
|
<convertSpeed value="true"/>
|
||||||
|
|
||||||
<!--执行队列类型,见com.arialyy.aria.core.QueueMod,默认类型为wait-->
|
<!--执行队列类型,见com.arialyy.aria.core.QueueMod,默认类型为wait-->
|
||||||
<queueMod value="now"/>
|
<queueMod value="wait"/>
|
||||||
|
|
||||||
<!--进度更新更新间隔,默认1000毫秒-->
|
<!--进度更新更新间隔,默认1000毫秒-->
|
||||||
<updateInterval value="1000"/>
|
<updateInterval value="1000"/>
|
||||||
|
|||||||
@@ -55,10 +55,10 @@ public class HttpDownloadModule extends BaseViewModule {
|
|||||||
//String url = "http://fdfs.speedata.cn:9989/group1/M00/00/05/rBGFrl3fdAKAVJwfMtSa9R18wLU139.zip";
|
//String url = "http://fdfs.speedata.cn:9989/group1/M00/00/05/rBGFrl3fdAKAVJwfMtSa9R18wLU139.zip";
|
||||||
//String url = "http://9.9.9.28:8088/files/update.zip";
|
//String url = "http://9.9.9.28:8088/files/update.zip";
|
||||||
//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 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://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);
|
||||||
//String url = "https://y.qq.com/download/import/QQMusic-import-1.2.1.zip";
|
String url = "https://y.qq.com/download/import/QQMusic-import-1.2.1.zip1";
|
||||||
//String url = "https://video-hkt1-1.xx.fbcdn.net/v/t42.9040-2/89465702_658301101378505_5469280744218034176_n.mp4?_nc_cat=107&_nc_sid=985c63&efg=eyJ2ZW5jb2RlX3RhZyI6ImxlZ2FjeV9zZCJ9&_nc_oc=AQmzYwQG9vccyqr7S44-cfHc4wJ9010O1nvspG2DPV4cTct1pLrjKl1e1UmOJV99bJw&_nc_ht=video-hkt1-1.xx&oh=49bd04435aaa8b4459b8d5cb7d1e7c79&oe=5E672E37";
|
//String url = "https://video-hkt1-1.xx.fbcdn.net/v/t42.9040-2/89465702_658301101378505_5469280744218034176_n.mp4?_nc_cat=107&_nc_sid=985c63&efg=eyJ2ZW5jb2RlX3RhZyI6ImxlZ2FjeV9zZCJ9&_nc_oc=AQmzYwQG9vccyqr7S44-cfHc4wJ9010O1nvspG2DPV4cTct1pLrjKl1e1UmOJV99bJw&_nc_ht=video-hkt1-1.xx&oh=49bd04435aaa8b4459b8d5cb7d1e7c79&oe=5E672E37";
|
||||||
//String url = "http://donuts.aigauss.com/doc_fPhW2DBGj3_1578932414.png";
|
//String url = "http://donuts.aigauss.com/doc_fPhW2DBGj3_1578932414.png";
|
||||||
String filePath = "/mnt/sdcard/update.mp4";
|
String filePath = "/mnt/sdcard/update.mp4";
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override public void cancel(View v, AbsEntity entity) {
|
@Override public void cancel(View v, AbsEntity entity) {
|
||||||
Aria.download(this).load(mTaskId).cancel(true);
|
Aria.download(this).load(mTaskId).cancel(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -266,15 +266,10 @@ public class M3U8LiveDLoadActivity extends BaseActivity<ActivityM3u8LiveBinding>
|
|||||||
}
|
}
|
||||||
|
|
||||||
static class BandWidthUrlConverter implements IBandWidthUrlConverter {
|
static class BandWidthUrlConverter implements IBandWidthUrlConverter {
|
||||||
String url;
|
|
||||||
|
|
||||||
BandWidthUrlConverter(String url) {
|
@Override public String convert(String m3u8Url, String bandWidthUrl) {
|
||||||
this.url = url;
|
int peerIndex = m3u8Url.lastIndexOf("/");
|
||||||
}
|
return m3u8Url.substring(0, peerIndex + 1) + bandWidthUrl;
|
||||||
|
|
||||||
@Override public String convert(String bandWidthUrl) {
|
|
||||||
int peerIndex = url.lastIndexOf("/");
|
|
||||||
return url.substring(0, peerIndex + 1) + bandWidthUrl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -304,14 +304,14 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
|
|||||||
|
|
||||||
private M3U8VodOption getM3U8Option() {
|
private M3U8VodOption getM3U8Option() {
|
||||||
M3U8VodOption option = new M3U8VodOption();
|
M3U8VodOption option = new M3U8VodOption();
|
||||||
option
|
//option.setBandWidth(200000);
|
||||||
.setBandWidth(200000)
|
|
||||||
//.generateIndexFile()
|
//.generateIndexFile()
|
||||||
//.merge(true)
|
//.merge(true)
|
||||||
.setVodTsUrlConvert(new VodTsUrlConverter());
|
//.setVodTsUrlConvert(new VodTsUrlConverter());
|
||||||
//.setMergeHandler(new TsMergeHandler());
|
//.setMergeHandler(new TsMergeHandler());
|
||||||
option.setKeyUrlConverter(new KeyUrlConverter());
|
//option.setKeyUrlConverter(new KeyUrlConverter());
|
||||||
option.setBandWidthUrlConverter(new BandWidthUrlConverter(mUrl));
|
//option.setBandWidthUrlConverter(new BandWidthUrlConverter());
|
||||||
|
//option.setUseDefConvert(true);
|
||||||
return option;
|
return option;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,7 +327,8 @@ 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://devimages.apple.com/iphone/samples/bipbop/gear1/";
|
//String parentUrl = "http://devimages.apple.com/iphone/samples/bipbop/gear1/";
|
||||||
|
String parentUrl = "http://youku.cdn7-okzy.com/20200123/16815_fbe419ed/1000k/hls/";
|
||||||
//String parentUrl = "http://" + uri.getHost() + "/gear1/";
|
//String parentUrl = "http://" + uri.getHost() + "/gear1/";
|
||||||
//int index = m3u8Url.lastIndexOf("/");
|
//int index = m3u8Url.lastIndexOf("/");
|
||||||
//String parentUrl = m3u8Url.substring(0, index + 1);
|
//String parentUrl = m3u8Url.substring(0, index + 1);
|
||||||
@@ -351,15 +352,10 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
|
|||||||
|
|
||||||
static class BandWidthUrlConverter implements IBandWidthUrlConverter {
|
static class BandWidthUrlConverter implements IBandWidthUrlConverter {
|
||||||
|
|
||||||
private String url;
|
|
||||||
|
|
||||||
BandWidthUrlConverter(String url) {
|
@Override public String convert(String m3u8Url, String bandWidthUrl) {
|
||||||
this.url = url;
|
int index = m3u8Url.lastIndexOf("/");
|
||||||
}
|
return m3u8Url.substring(0, index + 1) + bandWidthUrl;
|
||||||
|
|
||||||
@Override public String convert(String bandWidthUrl) {
|
|
||||||
int index = url.lastIndexOf("/");
|
|
||||||
return url.substring(0, index + 1) + bandWidthUrl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ public class M3U8VodModule extends BaseViewModule {
|
|||||||
//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://youku.cdn7-okzy.com/20200123/16815_fbe419ed/index.m3u8";
|
||||||
|
|
||||||
//private final String defUrl = "https://cn7.kankia.com/hls/20200108/e1eaec074274c64fe46a3bdb5d2ba487/1578488360/index.m3u8";
|
//private final String defUrl = "https://cn7.kankia.com/hls/20200108/e1eaec074274c64fe46a3bdb5d2ba487/1578488360/index.m3u8";
|
||||||
//private final String defUrl = "https://youku.cdn7-okzy.com/20191213/16167_c3592a02/index.m3u8";
|
//private final String defUrl = "https://youku.cdn7-okzy.com/20191213/16167_c3592a02/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";
|
||||||
|
|||||||
@@ -44,8 +44,8 @@ task clean(type: Delete) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
versionCode = 387
|
versionCode = 389
|
||||||
versionName = '3.8.7'
|
versionName = '3.8.9'
|
||||||
userOrg = 'arialyy'
|
userOrg = 'arialyy'
|
||||||
groupId = 'com.arialyy.aria'
|
groupId = 'com.arialyy.aria'
|
||||||
publishVersion = versionName
|
publishVersion = versionName
|
||||||
|
|||||||
Reference in New Issue
Block a user