fix bug https://github.com/AriaLyy/Aria/issues/508
fix bug https://github.com/AriaLyy/Aria/issues/503
修复m3u8创建索引不成功的问题
This commit is contained in:
laoyuyu
2019-11-10 13:25:21 +08:00
parent 012f94511b
commit 5ad485890c
44 changed files with 753 additions and 242 deletions

View File

@@ -71,6 +71,29 @@ public class DownloadModule extends BaseModule {
return list;
}
/**
* 创建m3u8下载地址
*/
public List<FileListEntity> createM3u8TestList(){
String[] names = new String[]{"m3u8test1.ts", "m3u8test2.ts"};
String[] urls = new String[]{
"http://qn.shytong.cn/b83137769ff6b555/11b0c9970f9a3fa0.mp4.m3u8",
"http://qn.shytong.cn/8f4011f2a31bd347da42b54fe37a7ba8-transcode.m3u8"
};
List<FileListEntity> list = new ArrayList<>();
int i = 0;
for (String name : names) {
FileListEntity entity = new FileListEntity();
entity.name = name;
entity.key = urls[i];
entity.type = 2;
entity.downloadPath = Environment.getExternalStorageDirectory() + "/Download/" + name;
list.add(entity);
i++;
}
return list;
}
private String[] getStringArray(int array) {
return getContext().getResources().getStringArray(array);
}
@@ -91,7 +114,7 @@ public class DownloadModule extends BaseModule {
FileListEntity entity = new FileListEntity();
entity.urls = getStringArray(urls);
entity.names = getStringArray(names);
entity.isGroup = true;
entity.type = 1;
entity.name = alias;
entity.key = CommonUtil.getMd5Code(Arrays.asList(entity.urls));
entity.downloadPath = Environment.getExternalStorageDirectory() + "/Download/" + alias;

View File

@@ -215,6 +215,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
@Download.onTaskResume
void taskResume(DownloadTask task) {
ALog.d(TAG, "resume");
if (task.getKey().equals(mUrl)) {
getBinding().setStateStr(getString(R.string.stop));
}

View File

@@ -24,12 +24,14 @@ import com.arialyy.aria.core.common.FtpOption;
import com.arialyy.aria.core.download.DownloadGroupEntity;
import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.task.DownloadGroupTask;
import com.arialyy.aria.util.ALog;
import com.arialyy.frame.util.show.L;
import com.arialyy.frame.util.show.T;
import com.arialyy.simple.R;
import com.arialyy.simple.base.BaseActivity;
import com.arialyy.simple.databinding.ActivityDownloadGroupBinding;
import com.arialyy.simple.widget.SubStateLinearLayout;
import java.security.AlgorithmConstraints;
/**
* Created by lyy on 2017/7/6.
@@ -128,6 +130,7 @@ public class FTPDirDownloadActivity extends BaseActivity<ActivityDownloadGroupBi
}
@DownloadGroup.onTaskResume() void taskResume(DownloadGroupTask task) {
ALog.d(TAG, "ftp dir resume");
}
@DownloadGroup.onTaskStop() void taskStop(DownloadGroupTask task) {

View File

@@ -213,17 +213,10 @@ public class M3U8LiveDLoadActivity extends BaseActivity<ActivityM3u8LiveBinding>
public void onClick(View view) {
switch (view.getId()) {
case R.id.start:
startD();
if (!AppUtil.chekEntityValid(mEntity)) {
startD();
break;
}
if (Aria.download(this).load(mEntity.getId()).isRunning()) {
Aria.download(this).load(mEntity.getId()).stop();
} else {
Aria.download(this).load(mEntity.getId())
.m3u8LiveOption(getLiveoption())
.resume();
startD();
}
break;
case R.id.cancel:
@@ -245,6 +238,7 @@ public class M3U8LiveDLoadActivity extends BaseActivity<ActivityM3u8LiveBinding>
private M3U8LiveOption getLiveoption() {
M3U8LiveOption option = new M3U8LiveOption();
option
//.generateIndexFile()
.setLiveTsUrlConvert(new LiveTsUrlConverter());
//.setBandWidthUrlConverter(new BandWidthUrlConverter(mUrl));
return option;

View File

@@ -90,10 +90,10 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
getBinding().setFilePath(entity.getFilePath());
mUrl = entity.getUrl();
mFilePath = entity.getFilePath();
mVideoFragment = new VideoPlayerFragment(0, entity);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.video_content, mVideoFragment);
ft.commit();
//mVideoFragment = new VideoPlayerFragment(0, entity);
//FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//ft.add(R.id.video_content, mVideoFragment);
//ft.commit();
}
});
getBinding().setViewModel(this);
@@ -176,7 +176,7 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
@M3U8.onPeerComplete
void onPeerComplete(String m3u8Url, String peerPath, int peerIndex) {
//ALog.d(TAG, "peer complete, path: " + peerPath + ", index: " + peerIndex);
mVideoFragment.addPlayer(peerIndex, peerPath);
//mVideoFragment.addPlayer(peerIndex, peerPath);
}
@M3U8.onPeerFail
@@ -217,6 +217,7 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
@Download.onTaskResume
void taskResume(DownloadTask task) {
ALog.d(TAG, "m3u8 vod resume");
if (task.getKey().equals(mUrl)) {
getBinding().setStateStr(getString(R.string.stop));
}
@@ -303,9 +304,10 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
private M3U8VodOption getM3U8Option() {
M3U8VodOption option = new M3U8VodOption();
option
.generateIndexFile()
.setVodTsUrlConvert(new VodTsUrlConverter())
.setMergeHandler(new TsMergeHandler());
//.generateIndexFile()
//.merge(true)
.setVodTsUrlConvert(new VodTsUrlConverter());
//.setMergeHandler(new TsMergeHandler());
//.setBandWidthUrlConverter(new BandWidthUrlConverter(mUrl));
return option;
}

View File

@@ -35,10 +35,12 @@ public class M3U8VodModule extends BaseViewModule {
//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://cn1.fa1244.cn/hls/20190516/6d271eaa73b2e4cb51d13831b0c1ab4c/1557976262/index.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 filePath =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath()
+ "/道士下山.ts";
//+ "/道士下山.ts";
+ "/bb1.ts";
private MutableLiveData<DownloadEntity> liveData = new MutableLiveData<>();
private DownloadEntity singDownloadInfo;

View File

@@ -28,7 +28,7 @@ import com.arialyy.aria.core.common.AbsEntity;
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.wrapper.AbsTaskWrapper;
import com.arialyy.aria.core.wrapper.ITaskWrapper;
import com.arialyy.aria.util.CommonUtil;
import com.arialyy.simple.R;
import com.arialyy.simple.base.adapter.AbsHolder;
@@ -152,12 +152,19 @@ public class DownloadAdapter extends AbsRVAdapter<AbsEntity, DownloadAdapter.Sim
* 只更新速度
*/
private void updateSpeed(SimpleHolder holder, final AbsEntity entity) {
long size = entity.getFileSize();
long progress = entity.getCurrentProgress();
int current = size == 0 ? 0 : (int) (progress * 100 / size);
holder.speed.setText(entity.getConvertSpeed());
holder.fileSize.setText(covertCurrentSize(progress) + "/" + CommonUtil.formatFileSize(size));
holder.progress.setProgress(current);
if (entity.getTaskType() == ITaskWrapper.M3U8_VOD
|| entity.getTaskType() == ITaskWrapper.M3U8_LIVE) {
holder.progress.setProgress(entity.getPercent());
holder.fileSize.setVisibility(View.GONE);
} else {
long size = entity.getFileSize();
long progress = entity.getCurrentProgress();
int current = size == 0 ? 0 : (int) (progress * 100 / size);
holder.fileSize.setText(covertCurrentSize(progress) + "/" + CommonUtil.formatFileSize(size));
holder.progress.setProgress(current);
}
//if (holder instanceof GroupHolder){
// handleSubChild((GroupHolder) holder, entity);
//}
@@ -257,9 +264,9 @@ public class DownloadAdapter extends AbsRVAdapter<AbsEntity, DownloadAdapter.Sim
case IEntity.STATE_STOP:
case IEntity.STATE_PRE:
case IEntity.STATE_POST_PRE:
if (entity.getId() < 0){
if (entity.getId() < 0) {
start(entity);
}else {
} else {
resume(entity);
}
break;
@@ -278,36 +285,38 @@ public class DownloadAdapter extends AbsRVAdapter<AbsEntity, DownloadAdapter.Sim
return;
}
switch (entity.getTaskType()) {
case AbsTaskWrapper.D_FTP:
case ITaskWrapper.D_FTP:
Aria.download(getContext())
.loadFtp(entity.getId())
//.login("lao", "123456")
.cancel(true);
break;
case AbsTaskWrapper.D_FTP_DIR:
case ITaskWrapper.D_FTP_DIR:
break;
case AbsTaskWrapper.D_HTTP:
case ITaskWrapper.D_HTTP:
case ITaskWrapper.M3U8_VOD:
Aria.download(getContext()).load(entity.getId()).cancel(true);
break;
case AbsTaskWrapper.DG_HTTP:
case ITaskWrapper.DG_HTTP:
Aria.download(getContext()).load(entity.getId()).cancel(true);
break;
}
}
private void resume(AbsEntity entity){
private void resume(AbsEntity entity) {
switch (entity.getTaskType()) {
case AbsTaskWrapper.D_FTP:
case ITaskWrapper.D_FTP:
//Aria.download(getContext()).loadFtp((DownloadEntity) entity).login("lao", "123456").create();
Aria.download(getContext()).loadFtp(entity.getId()).resume();
break;
case AbsTaskWrapper.D_FTP_DIR:
case ITaskWrapper.D_FTP_DIR:
Aria.download(getContext()).loadFtpDir(entity.getId()).resume();
break;
case AbsTaskWrapper.D_HTTP:
case ITaskWrapper.D_HTTP:
case ITaskWrapper.M3U8_VOD:
Aria.download(getContext()).load(entity.getId()).resume();
break;
case AbsTaskWrapper.DG_HTTP:
case ITaskWrapper.DG_HTTP:
Aria.download(getContext()).loadGroup(entity.getId()).resume();
break;
}
@@ -315,16 +324,17 @@ public class DownloadAdapter extends AbsRVAdapter<AbsEntity, DownloadAdapter.Sim
private void start(AbsEntity entity) {
switch (entity.getTaskType()) {
case AbsTaskWrapper.D_FTP:
case ITaskWrapper.D_FTP:
//Aria.download(getContext()).loadFtp((DownloadEntity) entity).login("lao", "123456").create();
Aria.download(getContext()).loadFtp(entity.getKey()).create();
break;
case AbsTaskWrapper.D_FTP_DIR:
case ITaskWrapper.D_FTP_DIR:
break;
case AbsTaskWrapper.D_HTTP:
case ITaskWrapper.D_HTTP:
case ITaskWrapper.M3U8_VOD:
Aria.download(getContext()).load(entity.getKey()).create();
break;
case AbsTaskWrapper.DG_HTTP:
case ITaskWrapper.DG_HTTP:
Aria.download(getContext()).loadGroup(((DownloadGroupEntity) entity).getUrls()).create();
break;
}
@@ -336,15 +346,16 @@ public class DownloadAdapter extends AbsRVAdapter<AbsEntity, DownloadAdapter.Sim
}
switch (entity.getTaskType()) {
case AbsTaskWrapper.D_FTP:
case ITaskWrapper.D_FTP:
Aria.download(getContext()).loadFtp(entity.getId()).stop();
break;
case AbsTaskWrapper.D_FTP_DIR:
case ITaskWrapper.D_FTP_DIR:
break;
case AbsTaskWrapper.D_HTTP:
case ITaskWrapper.D_HTTP:
case ITaskWrapper.M3U8_VOD:
Aria.download(getContext()).load(entity.getId()).stop();
break;
case AbsTaskWrapper.DG_HTTP:
case ITaskWrapper.DG_HTTP:
Aria.download(getContext()).loadGroup(entity.getId()).stop();
break;
}

View File

@@ -22,9 +22,13 @@ import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.arialyy.aria.core.Aria;
import com.arialyy.aria.core.download.m3u8.M3U8VodOption;
import com.arialyy.aria.core.processor.IVodTsUrlConverter;
import com.arialyy.simple.R;
import com.arialyy.simple.base.adapter.AbsHolder;
import com.arialyy.simple.base.adapter.AbsRVAdapter;
import com.arialyy.simple.core.download.m3u8.M3U8VodDLoadActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -60,27 +64,44 @@ final class FileListAdapter extends AbsRVAdapter<FileListEntity, FileListAdapter
protected void bindData(FileListHolder holder, int position, final FileListEntity item) {
holder.name.setText("文件名:" + item.name);
holder.url.setText("下载地址:" + item.key);
holder.url.setVisibility(item.isGroup ? View.GONE : View.VISIBLE);
if (item.type == 1) {
holder.url.setVisibility(View.GONE);
}
holder.path.setText("保存路径:" + item.downloadPath);
if (mBtStates.get(item.key)) {
holder.bt.setEnabled(true);
holder.bt.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
Toast.makeText(getContext(), "开始下载:" + item.name, Toast.LENGTH_SHORT).show();
if (item.isGroup) {
Aria.download(getContext())
.loadGroup(Arrays.asList(item.urls))
.setSubFileName(Arrays.asList(item.names))
.setDirPath(item.downloadPath)
.setGroupAlias(item.name)
.unknownSize()
.create();
} else {
Aria.download(getContext())
.load(item.key)
.setFilePath(item.downloadPath)
.create();
switch (item.type) {
case 0:
Aria.download(getContext())
.load(item.key)
.setFilePath(item.downloadPath)
.create();
break;
case 1:
Aria.download(getContext())
.loadGroup(Arrays.asList(item.urls))
.setSubFileName(Arrays.asList(item.names))
.setDirPath(item.downloadPath)
.setGroupAlias(item.name)
.unknownSize()
.create();
break;
case 2:
M3U8VodOption option = new M3U8VodOption();
option.setVodTsUrlConvert(new IVodTs());
option.generateIndexFile();
Aria.download(getContext())
.load(item.key)
.setFilePath(item.downloadPath, true)
.m3u8VodOption(option)
.create();
break;
}
}
});
} else {
@@ -125,4 +146,15 @@ final class FileListAdapter extends AbsRVAdapter<FileListEntity, FileListAdapter
bt = findViewById(R.id.bt);
}
}
static class IVodTs implements IVodTsUrlConverter{
@Override public List<String> convert(String m3u8Url, List<String> tsUrls) {
List<String> temp = new ArrayList<>();
for (String tsUrl : tsUrls){
temp.add("http://qn.shytong.cn" + tsUrl);
}
return temp;
}
}
}

View File

@@ -22,7 +22,13 @@ package com.arialyy.simple.core.download.mutil;
public class FileListEntity {
public String name, key, downloadPath;
public boolean isGroup = false;
/**
* 0普通任务
* 1组合任务
* 2m3u8任务
*/
public int type = 0;
public String[] urls, names;
}

View File

@@ -113,7 +113,7 @@ public class MultiDownloadActivity extends BaseActivity<ActivityMultiDownloadBin
mAdapter.updateState(task.getEntity());
}
@Download.onTaskRunning() void taskRunning(DownloadTask task) {
@Download.onTaskRunning void taskRunning(DownloadTask task) {
mAdapter.setProgress(task.getEntity());
}

View File

@@ -57,6 +57,7 @@ public class MultiTaskActivity extends BaseActivity<ActivityMultiBinding> {
setTitle("多任务下载");
mData.addAll(getModule(DownloadModule.class).createGroupTestList());
mData.addAll(getModule(DownloadModule.class).createMultiTestList());
mData.addAll(getModule(DownloadModule.class).createM3u8TestList());
mAdapter = new FileListAdapter(this, mData);
mList = getBinding().list;
mBar = findViewById(R.id.toolbar);