aardio 文档
aardio 范例: aria2 下载 —— 如果 BT 下载没速度,先找个热门种子下载就可以了
win.view 下载界面 | listview 进度条
// BT 下载 / WinForm
// win.view 下载界面: https://www.aardio.com/zh-cn/doc/example/Network/Transfer/bt.html.html
// listview 进度条: https://www.aardio.com/zh-cn/doc/example/Windows/ListView/progress-bar.html
import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
var winform = win.form(text="aria2 下载 —— 如果 BT 下载没速度,先找个热门种子下载就可以了";right=921;bottom=537;bgcolor=0xFFFFFF)
winform.add(
listview={cls="listview";left=12;top=7;right=912;bottom=471;bgcolor=0xFFFFFF;db=1;dl=1;dr=1;dt=1;edge=1;fullRow=1;z=1};
pie={cls="plus";left=25;top=480;right=77;bottom=532;z=2};
txtUrl={cls="plus";text="https://webtorrent.io/torrents/big-buck-bunny.torrent";left=358;top=497;right=906;bottom=523;align="right";border={bottom=1;color=0xFF808080};db=1;dl=1;editable="edit";notify=1;paddingTop=5;textPadding={right=24;bottom=1};z=3}
)
/*}}*/
winform.listview.columns = [
["文件",250],
["速度",80],
["已下载",120],
["状态",-1],
["连接数",120]
]
var btnAdd = winform.txtUrl.addCtrl(
cls="plus";
marginRight=0;marginBottom=2;width=24;
iconText = '\uF019';
iconStyle={
align="right";font=LOGFONT(h=-15;name='FontAwesome');padding={top=3}
}
)
btnAdd.skin({
color = {
default = 0xC0000000;
hover = 0xFFFF0000;
active = 0xFF00FF00;
};
})
winform.pie.setPieRange(0,100);
winform.show();
//启动 aria2 下载服务进程
import process.aria2;
var aria2 = process.aria2();
//指定日志文件
//aria2.logPath = "/aria2log.txt";
//自定义配置文件
//aria2.confPath = io.getSpecial(0x28/*_CSIDL_PROFILE*/,".config/aria2/aria2.conf")
//启动下载服务器
aria2.startServer( maxConcurrentDownloads = 10 );
//开启 listview 双缓冲,避免闪烁
winform.listview.enableDoubleBuffering();
//在 listview 里用纯文本模仿进度条效果
function textProgressBar(current, total, length = 20){
var percent = current / total;
var filled = math.floor(length * percent);
var bar = string.repeat(filled,"▓") + string.repeat(length - filled,"░");
return string.format(percent<10?'%s %.1f%%':'%s %.0f%%', bar, percent * 100);
}
var aria2Ui = {
downloadData = {};
getGid = function(item){
return table.find(owner.downloadData,item);
}
remove = function(gid){
var item = owner.downloadData[gid];
winform.listview.delItem(item);
}
addTaskInfo = function(gid,url,status){
if(!gid){
var name = bencode.magnet.getName(url);
winform.listview.addItem({
name,null,null,"出错了:"+ (status:"未知错误");
});
}
else {
var taskName = aria2.taskName(gid)
var item = owner.downloadData[gid];
if(!item){
var item = winform.listview.addItem({
taskName,null,null,status || textProgressBar(0,100)
});
owner.downloadData[gid] = item;
}
else {
winform.listview.setItemText(taskName,item,1);
winform.listview.setItemText(status : textProgressBar(0,100),item,4);
}
}
}
updateStatus = function(gid,status){
var item = owner.downloadData[gid]
if(!item){
owner.addTaskInfo(gid);
item = owner.downloadData[gid]
}
winform.listview.setItemText(status,item,4);
}
updateProgress = function(gid,progress){
var item = owner.downloadData[gid]
if(!item){
owner.addTaskInfo(gid);
item = owner.downloadData[gid]
}
var itemText;
if(progress){
itemText = [
2:math.size64(progress.downloadSpeed,item).format() + "/s",
3:math.size64(progress.completedLength).format() + "/" + math.size64(progress.totalLength).format(),
4:textProgressBar(progress.completedLength,progress.totalLength);//生成纯字符进度条
5:progress.connections
];
}
else {
var progress = aria2.tellStatus(gid,"totalLength");
itemText = [
2:"",
3:math.size64(progress.totalLength).format(),
5:""
];
}
winform.listview.setItemText(itemText,item)
}
}
//监听 aria2 事件
aria2.onDownloadStart = function(task){
aria2Ui.addTaskInfo(task.gid,,textProgressBar(0,100))
}
aria2.onDownloadPause = function(task){
aria2Ui.updateStatus(task.gid,"暂停下载");
}
aria2.onDownloadStop = function(task){
aria2Ui.updateStatus(task.gid,"已停止");
}
aria2.onDownloadComplete = function(task){
var path = aria2.taskFilePath(task.gid);
if(string.endsWith(path,".torrent",true)){
//已创建新的 BT 下载任务,不必重复显示已完成的 torrent
aria2Ui.remove(task.gid);
}
else{
aria2Ui.updateStatus(task.gid,"已完成");
aria2Ui.updateProgress(task.gid);
}
}
aria2.onDownloadError = function(task){
var errMsg = aria2.taskErrorMessage(task.gid);
aria2Ui.updateStatus(task.gid,errMsg);
}
//调用 aria2 下载
btnAdd.oncommand = function(){
var url = winform.txtUrl.text;
if(!#url){
winform.msgboxErr("请输入下载地址或种子文件路径");
winform.txtUrl.setFocus();
return;
}
aria2.taskAdd(url,function(gid,err){
if(err){
aria2Ui.addTaskInfo(null,url,err[["message"]]);
}
else {
aria2Ui.addTaskInfo(gid,url,"添加成功" );
}
});
}
winform.txtUrl.editBox.onOk = function(ctrl,alt,shift){
btnAdd.oncommand();
return true;
}
import com.interface.ITaskbarList3;
var taskbar = com.interface.ITaskbarList3.Create();
//https://aria2.github.io/manual/en/html/aria2c.html#aria2.tellStatus
updateDownloadStatus = function(init){
//下在下载的任务
aria2.tellActive(function(result,err){
if(result) {
var totalLength,completedLength = math.size64(),math.size64();
for(k,v in result){
totalLength.add(v.totalLength);
completedLength.add(v.completedLength);
aria2Ui.updateProgress(v.gid,v);
}
//显示所有下载任务的总进度
var pos = (completedLength / totalLength) *100;
winform.pie.progressPos = pos;
//在系统任务栏图标上显示进度
taskbar.SetProgressValue(winform.hwnd,pos,100)
}
},"gid","status","connections","downloadSpeed","totalLength","completedLength");
/*
关闭或重启时会自动保存与恢复下载会话。
但已完成的任务会从下载会话中删除,重启不会恢复。
如果需要保存与查看已完成的任务,则应添加代码记录到数据库(已完成的任务与 aria2 下载会话没什么关系)。
*/
if(init/*重启*/){
aria2.tellWaiting(0,20,function(result,err){
if(result) {
for(i,task in result){
aria2Ui.updateProgress(v.gid,v);
}
}
},"gid","status","connections","downloadSpeed","totalLength","completedLength");
}
}
//注意看错误信息。
aria2.onError = function(errMsg,rpcErr){
//print(errMsg);
}
//启动就绪执行
aria2.ready(
function(){
//查看默认配置。
//print(aria2.getGlobalOption());
updateDownloadStatus(true);
//创建定时器,更新下载进度
winform.setInterval(updateDownloadStatus,1500);
}
)
//下载任务右键管理菜单
import win.ui.menu;
winform.listview.onRightClick = function(item,subItem,nmListView){
//创建弹出菜单
var gid = aria2Ui.getGid(nmListView.iItem);
if(!gid) return;
var statusInfo = aria2.tellStatus(gid,"status","belongsTo");
if(!statusInfo) return;
var popmenu = win.ui.popmenu(winform);
popmenu.add('移除',function(id){
aria2.taskRemove(gid);
aria2Ui.remove(gid);
} )
if(statusInfo.status == "active"){
popmenu.add('暂停',function(id){
var gid = aria2Ui.getGid(nmListView.iItem);
aria2.taskPause(gid);
} )
}
if(statusInfo.status == "paused"){
popmenu.add('开始下载',function(id){
var gid = aria2Ui.getGid(nmListView.iItem);
aria2.taskUnpause(gid);
} )
}
var path = aria2.taskFilePath(gid)
if(#path){
popmenu.add('浏览文件',function(id){
raw.explore(path,"/select")
})
}
popmenu.add('复制链接',function(id){
var url = aria2.taskUrl(gid);
if(url){
import win.clip;
win.clip.write(url);
}
} )
popmenu.popup();
}
winform.onDestroy = function(){
//退出前务必关闭 aria2 并保存会话,下次启动才能恢复状态
aria2.stop();
}
win.loopMessage();
Markdown 格式