aria2虽然很强大,配置就略有些复杂,一些懒人包说实话整成了累人包。 今天抽了点时间改进了一下aardio中的process。aria2扩展库,顺手解决了aria2不支持UPnP内网穿透的问题再也不用手动去配置了。 process。aria2可以自动创建并管理aria2服务进程,自动获取并添加最新Tracker服务器,自动探测可用空闲端口,多个aria2进程不会冲突。并且自动检测系统环境并自动设置最佳配置。 写界面也要不了几句代码。下面介绍2种实现界面的方案: 1、用网页写界面。先用WebView2AriaNg演示一下。至于强大的WebView2请参考:放弃Electron,拥抱WebView2!JavaScript快速开发独立EXE程序 2、直接用aardio创建原生界面。 这两种方案的完整源码我放到process。aria2扩展库的范例里了。运行aardio工具扩展库,在库名称中输入process。aria2找到扩展库,双击扩展库名字可以打开范例(右键菜单也可以): 这里要注意一下,BT下载如果一开始没速度是正常的,等一下或者先找个热门资源下载速度就会上来了。方案一:网页(WebView2AriaNg)实现aria2界面 先看效果: 软件的全部aardio代码其实没几句,如下:importwin。DSG{{varwinformwin。form(textaria下载器;right1250;bottom704;bordernone)winform。add(bk{left0;top0;right1251;bottom31;bgcolor11841964;dl1;dr1;dt1;forecolor5392444;linearGradient0;z2};custom{left0;top28;right1251;bottom706;bgcolor16777215;db1;dl1;dr1;dt1;z1})}}importprocess。aria2;vararia2process。aria2();aria2。startServer();importweb。varwbweb。view(winform。custom);创建嵌入HTTP服务器importwsock。tcp。simpleHttpSwsock。tcp。simpleHttpServer。threadGlobal{ARIA2RPCPORTtostring(aria2。rpcPort);ARIA2RPCSECRETcrypt。bin。encodeBase64(aria2。rpcToken);}wb。go(htmlindex。html);关闭窗口前关闭aria2winform。onDestroyfunction(){aria2。stop();}添加窗口标题栏、边框、阴影等importwin。ui。simpleWwin。ui。simpleWindow(winform);winform。show();win。loopMessage(); aardio用simpleHttpServer创建了一个嵌入式的微型HTTP服务端,另外aardio也可以将网页端的AriaNg自动嵌入EXE文件所以能生成独立EXE。 aardio支持类似PHP的服务端模板语法,这里我们简单地将初始化配置的。js文件改为。aardio文件,然后在这个aardio文件里动态读取上面代码设置的 ARIA2RPCPORT,ARIA2RPCSECRET 就可以让AriaNg愉快地连接到aardio创建的aria2服务端了。 实际上就是修改ariang。min。js,主要修改代码如下:response。contentT?省略其他代码angular。module(ariaNg)。constant(ariaNgDefaultOptions,{rpcPort:?ARIA2RPCPORT?,secret:?ARIA2RPCSECRET?}) 当然这种事就不需要自己动手去改动AriaNg了,我在范例里写了一个更新前端HTML。aardio,直接运行这个代码就可以自动下载最新版AriaNg,自动修改AriaNg全自动搞定。 方案二:直接用aardio创建原生界面 这个界面我写得比较简单,主要演示用aardio直接调用aria2的JSONRPC接口有多方便。这个先搞定了的话,单纯画个界面用什么界面组件就可以自由发挥了。 先看界面: 此方案生成的软件体积更小,下面看完整源码(不再需要其他代码)。importwin。DSG{{varwinformwin。form(textaria2下载;right921;bottom537;bgcolor16777215)winform。add(btnAdd{text调用aria2下载文件;left605;top326;right747;bottom369;db1;dr1;z3};listview{left12;top7;right912;bottom318;bgcolor16777215;db1;dl1;dr1;dt1;edge1;fullRow1;z1};txtData{left32;top331;right585;bottom367;db1;dl1;dr1;edge1;z2};txtMessage{left8;top380;right909;bottom523;db1;dl1;dr1;edge1;hscroll1;multiline1;vscroll1;z4})}}winform。listview。insertColumn(网址,180);winform。listview。insertColumn(GID,100);winform。listview。insertColumn(连接数,120);winform。listview。insertColumn(状态,100);winform。listview。insertColumn(大小,80);winform。listview。insertColumn(速度,80);winform。listview。insertColumn(已下载,120);winform。listview。adjustfunction(cx,cy){winform。listview。fillParent(1);}importprocess。aria2;vararia2process。aria2();aria2。loggerwinform。txtMaria2。startServer();获取JSONRPC客户端varjsonClientaria2。jsonClient();jsonClient。on(error,function(err,serverError){winform。txtMessage。print(err,serverError);})jsonClient。on(close,function(e){winform。txtMessage。print(websocket已关闭,e);jsonClient。connect()})监听aria2事件jsonClient。on(aria2。onDownloadStart,function(param){varitemwinform。listview。downloadData〔param。gid〕if(!item){itemwinform。listview。addItem({,param。gid,null,添加成功});winform。listview。downloadData〔param。gid〕}winform。listview。setItemText(开始下载,item,4);})jsonClient。on(aria2。onDownloadPause,function(param){varitemwinform。listview。downloadData〔param。gid〕winform。listview。setItemText(暂停下载,item,4);})jsonClient。on(aria2。onDownloadStop,function(param){varitemwinform。listview。downloadData〔param。gid〕winform。listview。setItemText(已停止,item,4);})jsonClient。on(aria2。onDownloadComplete,function(param){varitemwinform。listview。downloadData〔param。gid〕winform。listview。setItemText(已完成,item,4);})jsonClient。on(aria2。onDownloadError,function(param){varitemwinform。listview。downloadData〔param。gid〕jsonClient。aria2。tellStatus(param。gid,{errorMessage})。endfunction(result,err){if(result)winform。listview。setItemText(result。errorMessage,item,4);}})winform。listview。downloadData{}vardownloadfunction(url){if(io。exist(url)。。string。endWith(url,。torrent,true)){returnjsonClient。aria2。addTorrent(crypt。encodeBin(string。load(url)))。endfunction(result,err){if(err){winform。listview。addItem({url,null,null,出错了:web。json。stringify(err)});}else{varitemwinform。listview。addItem({url,result,null,添加成功});winform。listview。downloadData〔result〕}}}jsonClient。aria2。addUri({url})。endfunction(result,err){if(err){winform。listview。addItem({url,null,null,出错了:web。json。stringify(err)});}else{varitemwinform。listview。addItem({url,result,null,添加成功});winform。listview。downloadData〔result〕}}}调用aria2打开一个网页winform。btnAdd。oncommandfunction(id,event){varurlwinform。txtData。if(!url){winform。msgboxErr(请输入下载地址或种子文件路径)}download(string。trim(url,));}winform。show();vargetDownloadSvargetNextDownloadSvarstatusQueue{}updateDownloadStatusfunction(){for(gid,iteminwinform。listview。downloadData){if(statusQueue〔gid〕)statusQueue〔gid〕jsonClient。aria2。tellStatus(gid,{gid,connections,downloadSpeed,totalLength,completedLength})。endfunction(result,err){if(result){varitemwinform。listview。downloadData〔result。gid〕winform。listview。setItemText(result。connections,item,3);winform。listview。setItemText(math。size64(result。downloadSpeed,item)。format()s,item,6);winform。listview。setItemText(math。size64(result。totalLength)。format(),item,5);winform。listview。setItemText(math。size64(result。completedLength)。format(),item,7);}else{}statusQueue〔gid〕}}}启动就绪执行aria2。ready(function(){查看默认配置jsonClient。aria2。getGlobalOption()。endfunction(result,err){winform。txtMessage。print(result)}创建定时器,更新下载进度winform。setInterval(updateDownloadStatus,100);})下载任务右键管理菜单importwin。ui。winform。listview。onnotifyfunction(id,code,ptr){if(code0xFFFFFFFBNMRCLICK){varnmwinform。listview。getNotifyMessage(code,ptr);创建弹出菜单varpopmenuwin。ui。popmenu(winform);popmenu。add(移除,function(id){vargidwinform。listview。getItemText(nm。iItem,2);jsonClient。aria2。remove(gid);winform。listview。delItem(nm。iItem);})popmenu。add(浏览文件,function(id){vargidwinform。listview。getItemText(nm。iItem,2);jsonClient。aria2。getFiles(gid)。endfunction(result,err){if(resultresult〔1〕){process。exploreSelect(result〔1〕。path)}}})popmenu。popup();}}关闭窗口,退出下载winform。onDestroyfunction(){aria2。stop()}winform。txtData。setCueBannerText(请输入下载地址或种子文件路径);winform。show();win。loopMessage();