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 格式