Skip to content
Permalink
Browse files

fix bug #493

  • Loading branch information...
AriaLyy committed Nov 2, 2019
1 parent e8c5a9f commit c1b1cc139050dfd0f7862c8e3c22c290bcb33550
Showing with 331 additions and 52 deletions.
  1. +0 −1 FtpComponent/build.gradle
  2. +1 −1 FtpComponent/src/main/java/com/arialyy/aria/ftp/AbsFtpInfoThread.java
  3. +7 −6 FtpComponent/src/main/java/com/arialyy/aria/ftp/FtpRecordAdapter.java
  4. +0 −3 FtpComponent/src/main/res/values/strings.xml
  5. +9 −4 HttpComponent/src/main/java/com/arialyy/aria/http/HttpRecordAdapter.java
  6. +3 −3 HttpComponent/src/main/java/com/arialyy/aria/http/download/HttpDLoaderAdapter.java
  7. +5 −1 HttpComponent/src/main/java/com/arialyy/aria/http/download/HttpDThreadTaskAdapter.java
  8. +0 −3 HttpComponent/src/main/res/values/strings.xml
  9. +1 −1 M3U8Component/src/main/java/com/arialyy/aria/m3u8/M3U8InfoThread.java
  10. +1 −1 M3U8Component/src/main/java/com/arialyy/aria/m3u8/live/M3U8LiveLoader.java
  11. +1 −1 M3U8Component/src/main/java/com/arialyy/aria/m3u8/vod/M3U8VodLoader.java
  12. +0 −3 M3U8Component/src/main/res/values/strings.xml
  13. +2 −2 PublicComponent/src/main/java/com/arialyy/aria/core/common/RecordHandler.java
  14. +41 −0 PublicComponent/src/main/java/com/arialyy/aria/core/common/RecordHelper.java
  15. +2 −2 PublicComponent/src/main/java/com/arialyy/aria/core/task/ThreadTask.java
  16. +1 −1 PublicComponent/src/main/java/com/arialyy/aria/util/ErrorHelp.java
  17. +13 −12 PublicComponent/src/main/java/com/arialyy/aria/util/FileUtil.java
  18. +0 −3 PublicComponent/src/main/res/values/strings.xml
  19. +1 −0 SFtpComponent/.gitignore
  20. +33 −0 SFtpComponent/build.gradle
  21. 0 SFtpComponent/consumer-rules.pro
  22. +21 −0 SFtpComponent/proguard-rules.pro
  23. +2 −0 SFtpComponent/src/main/AndroidManifest.xml
  24. +58 −0 SFtpComponent/src/main/java/com/arialyy/aria/sftp/AbsSFtpInfoThread.java
  25. +125 −0 SFtpComponent/src/main/java/com/arialyy/aria/sftp/SFtpLogin.java
  26. +1 −1 app/src/main/assets/aria_config.xml
  27. +1 −1 app/src/main/java/com/arialyy/simple/core/download/HttpDownloadModule.java
  28. +1 −1 app/src/main/java/com/arialyy/simple/util/AppUtil.java
  29. +1 −1 settings.gradle
@@ -27,7 +27,6 @@ dependencies {

implementation "androidx.appcompat:appcompat:${rootProject.ext.XAppcompatVersion}"

// implementation project(path: ':AriaFtpPlug')
implementation project(path: ':PublicComponent')
}

@@ -53,7 +53,7 @@
public abstract class AbsFtpInfoThread<ENTITY extends AbsEntity, TASK_WRAPPER extends AbsTaskWrapper<ENTITY>>
implements Runnable {

private final String TAG = "AbsFtpInfoThread";
private final String TAG = CommonUtil.getClassName(getClass());
protected ENTITY mEntity;
protected TASK_WRAPPER mTaskWrapper;
protected FtpTaskOption mTaskOption;
@@ -21,9 +21,8 @@
import com.arialyy.aria.core.common.RecordHelper;
import com.arialyy.aria.core.config.Configuration;
import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.common.AbsNormalEntity;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.core.inf.IRecordHandler;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.core.wrapper.ITaskWrapper;
import com.arialyy.aria.util.RecordUtil;
import java.util.ArrayList;
@@ -40,8 +39,12 @@ public FtpRecordAdapter(AbsTaskWrapper wrapper) {

@Override public void handlerTaskRecord(TaskRecord record) {
RecordHelper helper = new RecordHelper(getWrapper(), record);
if (record.isBlock) {
helper.handleBlockRecord();
if (getWrapper().isSupportBP()) {
if (record.isBlock) {
helper.handleBlockRecord();
} else {
helper.handleMutilRecord();
}
} else if (record.threadNum == 1) {
helper.handleSingleThreadRecord();
}
@@ -104,6 +107,4 @@ public ThreadRecord createThreadRecord(TaskRecord record, int threadId, long sta
return 1;
}
}


}

This file was deleted.

@@ -38,15 +38,19 @@ public HttpRecordAdapter(AbsTaskWrapper wrapper) {

@Override public void onPre() {
super.onPre();
if (getWrapper().getRequestType() == ITaskWrapper.U_HTTP){
if (getWrapper().getRequestType() == ITaskWrapper.U_HTTP) {
RecordUtil.delTaskRecord(getEntity().getFilePath(), IRecordHandler.TYPE_UPLOAD);
}
}

@Override public void handlerTaskRecord(TaskRecord record) {
RecordHelper helper = new RecordHelper(getWrapper(), record);
if (record.isBlock) {
helper.handleBlockRecord();
if (getWrapper().isSupportBP()) {
if (record.isBlock) {
helper.handleBlockRecord();
} else {
helper.handleMutilRecord();
}
} else if (!getWrapper().isSupportBP()) {
helper.handleNoSupportBPRecord();
} else {
@@ -81,7 +85,8 @@ public ThreadRecord createThreadRecord(TaskRecord record, int threadId, long sta
record.threadNum = threadNum;

int requestType = getWrapper().getRequestType();
if (requestType == ITaskWrapper.D_FTP || requestType == ITaskWrapper.D_FTP_DIR) {
if (requestType == ITaskWrapper.D_FTP || requestType == ITaskWrapper.D_FTP_DIR
|| requestType == ITaskWrapper.D_HTTP || requestType == ITaskWrapper.DG_HTTP) {
record.isBlock = threadNum > 1 && Configuration.getInstance().downloadCfg.isUseBlock();
// 线程数为1,或者使用了分块,则认为是使用动态长度文件
record.isOpenDynamicFile = threadNum == 1 || record.isBlock;
@@ -28,6 +28,7 @@
import com.arialyy.aria.http.HttpRecordAdapter;
import com.arialyy.aria.util.ALog;
import com.arialyy.aria.util.BufferedRandomAccessFile;
import com.arialyy.aria.util.FileUtil;
import java.io.File;
import java.io.IOException;

@@ -43,16 +44,15 @@
@Override public boolean handleNewTask(TaskRecord record, int totalThreadNum) {
if (!record.isBlock) {
if (getTempFile().exists()) {
getTempFile().delete();
FileUtil.deleteFile(getTempFile());
}
//CommonUtil.createFile(mTempFile.getPath());
} else {
for (int i = 0; i < totalThreadNum; i++) {
File blockFile =
new File(String.format(IRecordHandler.SUB_PATH, getTempFile().getPath(), i));
if (blockFile.exists()) {
ALog.d(TAG, String.format("分块【%s】已经存在,将删除该分块", i));
blockFile.delete();
FileUtil.deleteFile(blockFile);
}
}
}
@@ -15,13 +15,13 @@
*/
package com.arialyy.aria.http.download;

import com.arialyy.aria.core.common.RequestEnum;
import com.arialyy.aria.core.common.SubThreadConfig;
import com.arialyy.aria.core.download.DTaskWrapper;
import com.arialyy.aria.exception.AriaIOException;
import com.arialyy.aria.exception.TaskException;
import com.arialyy.aria.http.BaseHttpThreadTaskAdapter;
import com.arialyy.aria.http.ConnectionHelp;
import com.arialyy.aria.core.common.RequestEnum;
import com.arialyy.aria.util.ALog;
import com.arialyy.aria.util.BufferedRandomAccessFile;
import java.io.BufferedInputStream;
@@ -123,6 +123,10 @@
fail(new TaskException(TAG,
String.format("任务【%s】下载失败,filePath: %s, url: %s", getFileName(),
getEntity().getFilePath(), getEntity().getUrl()), e), true);
} catch (ArrayIndexOutOfBoundsException e) {
fail(new TaskException(TAG,
String.format("任务【%s】下载失败,filePath: %s, url: %s", getFileName(),
getEntity().getFilePath(), getEntity().getUrl()), e), false);
} catch (Exception e) {
fail(new TaskException(TAG,
String.format("任务【%s】下载失败,filePath: %s, url: %s", getFileName(),

This file was deleted.

@@ -355,7 +355,7 @@ private void downloadKey(M3U8Entity info) {
File keyF = new File(info.keyPath);
if (!keyF.exists()) {
ALog.d(TAG, "密钥不存在,下载密钥");
FileUtil.createFile(keyF.getPath());
FileUtil.createFile(keyF);
} else {
return;
}
@@ -150,7 +150,7 @@ private ThreadTask createThreadTask(String cacheDir, int indexId, String tsUrl)
config.stateHandler = mStateHandler;

if (!config.tempFile.exists()) {
FileUtil.createFile(config.tempFile.getPath());
FileUtil.createFile(config.tempFile);
}
ThreadTask threadTask = new ThreadTask(config);
M3U8ThreadTaskAdapter adapter = new M3U8ThreadTaskAdapter(config);
@@ -434,7 +434,7 @@ private ThreadTask createThreadTask(String cacheDir, ThreadRecord record, int in
config.stateHandler = mStateHandler;
config.peerIndex = index;
if (!config.tempFile.exists()) {
FileUtil.createFile(config.tempFile.getPath());
FileUtil.createFile(config.tempFile);
}
ThreadTask threadTask = new ThreadTask(config);
M3U8ThreadTaskAdapter adapter = new M3U8ThreadTaskAdapter(config);

This file was deleted.

@@ -86,8 +86,8 @@ public TaskRecord getRecord() {
mTaskRecord.threadNum = mAdapter.initTaskThreadNum();
initRecord(false);
}
mAdapter.handlerTaskRecord(mTaskRecord);
}
mAdapter.handlerTaskRecord(mTaskRecord);
}
saveRecord();
return mTaskRecord;
@@ -145,7 +145,7 @@ private void convertDb() {
}
mTaskRecord.threadRecords.add(tRecord);
}
mConfigFile.delete();
FileUtil.deleteFile(mConfigFile);
}
}

@@ -20,7 +20,10 @@
import com.arialyy.aria.core.inf.IRecordHandler;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.util.ALog;
import com.arialyy.aria.util.BufferedRandomAccessFile;
import com.arialyy.aria.util.FileUtil;
import java.io.File;
import java.io.IOException;

/**
* 任务记录帮助类,用于处理统一的逻辑
@@ -39,6 +42,44 @@ public RecordHelper(AbsTaskWrapper wrapper, TaskRecord record) {
mTaskRecord = record;
}

/**
* 处理非分块的,多线程任务
*/
public void handleMutilRecord() {
// 默认线程分块长度
long blockSize = mWrapper.getEntity().getFileSize() / mTaskRecord.threadRecords.size();
File temp = new File(mTaskRecord.filePath);
boolean fileExists = false;
if (!temp.exists()) {
BufferedRandomAccessFile tempFile = null;
try {
tempFile = new BufferedRandomAccessFile(temp, "rw");
tempFile.setLength(mWrapper.getEntity().getFileSize());
} catch (IOException e) {
e.printStackTrace();
}

} else {
fileExists = true;
}
// 处理文件被删除的情况
if (fileExists) {
for (int i = 0; i < mTaskRecord.threadNum; i++) {
long startL = i * blockSize, endL = (i + 1) * blockSize;
ThreadRecord tr = mTaskRecord.threadRecords.get(i);
tr.startLocation = startL;
tr.isComplete = false;

//最后一个线程的结束位置即为文件的总长度
if (tr.threadId == (mTaskRecord.threadNum - 1)) {
endL = mWrapper.getEntity().getFileSize();
}
tr.endLocation = endL;
}
}
mWrapper.setNewTask(false);
}

/**
* 处理分块任务的记录,分块文件(blockFileLen)长度必须需要小于等于线程区间(threadRectLen)的长度
*/
@@ -367,8 +367,8 @@ private void retryM3U8Peer(boolean needRetry) {
|| isNotNetRetry) && !isBreak()) {
ALog.w(TAG, String.format("ts切片【%s】正在重试", getFileName()));
mFailTimes++;
mConfig.tempFile.delete();
FileUtil.createFile(mConfig.tempFile.getPath());
FileUtil.deleteFile(mConfig.tempFile);
FileUtil.createFile(mConfig.tempFile);
ThreadTaskManager.getInstance().retryThread(this);
} else {
sendFailMsg(null);
@@ -79,7 +79,7 @@ private static int writeLogToFile(String tag, String message) {
try {
File file = new File(getLogPath());
if (!file.exists()) {
FileUtil.createFile(file.getPath());
FileUtil.createFile(file);
}
writer = new PrintWriter(new FileWriter(file.getPath(), true));
writer.append(stringBuffer);
@@ -86,22 +86,23 @@ public static boolean createFile(String path) {
ALog.e(TAG, "文件路径不能为null");
return false;
}
File file = new File(path);
return createFile(new File(path));
}

/**
* 创建文件 当文件不存在的时候就创建一个文件。 如果文件存在,先删除原文件,然后重新创建一个新文件
*
* @return {@code true} 创建成功、{@code false} 创建失败
*/
public static boolean createFile(File file) {
if (file.getParentFile() == null || !file.getParentFile().exists()) {
ALog.d(TAG, "目标文件所在路径不存在,准备创建……");
if (!createDir(file.getParent())) {
ALog.d(TAG, "创建目录文件所在的目录失败!文件路径【" + path + "");
}
}
// 创建目标文件
if (file.exists()) {
final File to = new File(file.getAbsolutePath() + System.currentTimeMillis());
if (file.renameTo(to)) {
to.delete();
} else {
file.delete();
ALog.d(TAG, "创建目录文件所在的目录失败!文件路径【" + file.getPath() + "");
}
}
// 文件存在,删除文件
deleteFile(file);
try {
if (file.createNewFile()) {
//ALog.d(TAG, "创建文件成功:" + file.getAbsolutePath());
@@ -327,7 +328,7 @@ public static void splitFile(String filePath, int num) {
ALog.d(TAG, String.format("block = %s", block));
File subFile = new File(subPath);
if (!subFile.exists()) {
subFile.createNewFile();
createFile(subFile);
}
FileOutputStream fos = new FileOutputStream(subFile);
FileChannel sfoc = fos.getChannel();

This file was deleted.

@@ -0,0 +1 @@
/build
@@ -0,0 +1,33 @@
apply plugin: 'com.android.library'

android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion

defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation "androidx.appcompat:appcompat:${rootProject.ext.XAppcompatVersion}"
implementation "com.jcraft:jsch:0.1.55"
implementation "com.jcraft:jzlib:1.1.3"
implementation project(path: ':FtpComponent')
compile project(path: ':PublicComponent')
}
No changes.
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
@@ -0,0 +1,2 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.arialyy.aria.sftp" />

0 comments on commit c1b1cc1

Please sign in to comment.
You can’t perform that action at this time.