//导入界面库import win.ui;//创建主窗口mainForm = win.form(text="视频下载"); //显示主窗口mainForm.show();//启动界面消息循环win.loopMessage();
最后一句:win.loopMessage();
启动界面消息循环很重要,它就好比汽车的发动机 —— 要一直运转不停,窗口界面才能收发处理各种消息,用户才能在界面上操作、查看结果然后我们再添加几句代码创建网页浏览器:import win.ui; mainForm = win.form(text="视频下载");mainForm.show();//导入浏览器组件import web.view;//在主窗口上创建浏览器var wb = web.view(mainForm);//在浏览器中显示网页wb.go("https://www..com/video//")win.loopMessage();
现在我们再为浏览器添加一个网页可以调用的 external 对象,这样网页里的 JavaScript 脚本就可以直接调用本地导出的 aardio 对象了新增的代码如下://导出 aardio 对象到网页wb.external = { //添加一个网页可以调用的 aardio 函数 parseRenderData = function(renderData){ } }
上面这段代码应当添加在哪个位置呢?后面我会讲,但您可以动手试一下,看能不能提前找到答案那么现在我们就可以在网页 JavaScript 里调用上面的external.parseRenderData() 函数了下面我们调用 wb.waitEle 等待网页创建指定的节点,并执行 JavaScript 脚本,代码如下://导出 aardio 函数wb.external = { parseRenderData = function(renderData){ } }//打开视频页面wb.go("https://www..com/video//")//等待 CSS 选择器 "#RENDER_DATA" 指定的节点出现wb.waitEle("#RENDER_DATA",`aardio.parseRenderData( this.innerText )`);
wb.waitEle() 函数的第 1 个参数用于指定等待节点的 CSS 选择器,而 "#RENDER_DATA" 指的是 id 属性为 "RENDER_DATA" 的节点wb.waitEle() 函数的第 2 个参数指定节点出现后要执行的 JavaScript 脚本在这个 JS 脚本里 this 对象就指向找到的 HTML 节点,this.innerText 就是这个节点内部包含的文本数据JavaScript 的 aardio 对象就是 aardio 里的 wb.external 对象那么下面我们就要改进 aardio 中的 parseRenderData 函数分析网页传过来的数据,并提取视频地址改进的代码如下,每句都写了注释://导出 aardio 对象wb.external = { //导出 aardio 函数 parseRenderData = function(renderData){ // URL 解码 var json = inet.url.decode(renderData); // JSON 解码 var jsonData = web.json.tryParse(json); //提取视频信息,双 [[]] 的作用是 jsonData 为空不报错 var info = jsonData[["data"]][["initialVideo"]][["videoPlayInfo"]]; //忽略错误数据 if(!info) return; //视频下载地址列表(数组) var vList = info.dynamic_video.dynamic_video_list; //音频下载地址列表(数组) var aList = info.dynamic_video.dynamic_audio_list; //取出最后一个视频信息,#取数组长度(起始索引为 1) var video = vList[#vList]; //取出最后一个音频信息 var audio = aList[#aList]; //创建下载对话框,下载视频,支持断点续传 import inet.downBox; var d = inet.downBox(winform,"正在下载视频",1); d.download(video.backup_url,"/download/v.mp4"); //下载音频 var d = inet.downBox(winform,"正在下载音频",1); d.download(audio.backup_url,"/download/a.mp4"); //合并音频与视频 import process.ffmpeg; //第一个参数指定 FFmpeg 工作目录 var ffmpeg = process.ffmpeg("/download/" , "-y -i v.mp4 -i a.mp4 -vcodec copy -acodec copy " + "out.mp4"); //等待操作完成 ffmpeg.waitOne(); }}
下面是完整代码:import win.ui;mainForm = win.form(text="视频下载");import web.view;var wb = web.view(mainForm);wb.external = { parseRenderData = function(renderData){ var json = inet.url.decode(renderData); var jsonData = web.json.tryParse(json); var info = jsonData[["data"]][["initialVideo"]][["videoPlayInfo"]]; if(!info) return; var vList = info.dynamic_video.dynamic_video_list; var aList = info.dynamic_video.dynamic_audio_list; var video = vList[#vList]; var audio = aList[#aList]; import inet.downBox; var d = inet.downBox(winform,"正在下载视频",1); d.download(video.backup_url,"/download/v.mp4"); var d = inet.downBox(winform,"正在下载音频",1); d.download(audio.backup_url,"/download/a.mp4"); import process.ffmpeg; var ffmpeg = process.ffmpeg("/download/" , "-y -i v.mp4 -i a.mp4 -vcodec copy -acodec copy " + "out.mp4"); ffmpeg.waitOne(); process.exploreSelect("/download/out.mp4"); }}mainForm.show();wb.go("https://www..com/video//");wb.waitEle("#RENDER_DATA",`aardio.parseRenderData( this.innerText )`); win.loopMessage();
点击『保存 Ctrl +S』按钮:按『运行 F5 』按钮看效果,按 F7 一键生成独立 EXE 文件测试的视频网址这里就不写了,下载视频不是目的,学习编码技术才是最重要的(图片来源网络,侵删)
0 评论