在我的meteor应用程序中,我使用youtube-dl从youtube和其他网站下载视频; 实际上,我可以使用下面的代码从服务器端获取有关视频的信息
var exec = Meteor.npmRequire('child_process').exec;
var Future = Meteor.npmRequire("fibers/future");
Meteor.methods({
'comman': function(url){
this.unblock();
var future = new Future();
exec("youtube-dl -F " + url, function(error, stdout, stderr) {
future.return({stdout: stdout, stderr: stderr});
});
return future.wait();
}
});
客户端的电话
Meteor.call('comman', url, function(error, result){
if (result.stdout) {
console.log('output:' + result.stdout);
} else {
console.log('error:'+ result.stderr);
}
});
下一步是用户可以看到视频的缩略图,可用的格式列表,能够从客户端下载并保存他想要的格式;
我该怎么做? 有什么想法吗?
感谢您的帮助
答案 0 :(得分:3)
您必须将此包https://atmospherejs.com/meteorhacks/npm添加到Meteor应用程序才能使用Npm包。
然后使用https://www.npmjs.com/package/ytdl-core而不是使用youtube-dl的exec命令,它更容易。要使用它,您必须在主文件夹中添加packages.json:
{
"ytdl-core":"0.7.9",
}
现在在server.js上使用ydtl-core示例创建一个方法。您需要使用Futures等待响应并将其返回给客户:
// load future from fibers
var Future = Meteor.npmRequire("fibers/future");
// load ytdl-core
var ytdl = Meteor.npmRequire('ytdl-core');
Meteor.methods({
// Get info from Youtube video
'getVideoInfo':function(videoUrl) {
this.unblock();
var future = new Future();
ytdl.getInfo(videoUrl, function(err, result) {
future.return(result)
});
return future.wait();
},
});
在client.js上:
var videoUrl = "http://youtube.com/watch?v=I8qtzxpDM4k";
Meteor.call('getVideoInfo', videoUrl, function(err, result) {
console.log(result);
console.log (result.thumbnail_url);
}
编辑:要下载视频,您可以创建一个链接,然后使用javascript点击它。您必须选择要下载的格式。在这个例子中,我正在下载第一个可用的格式。
在client.js上
var videoUrl = "http://youtube.com/watch?v=I8qtzxpDM4k";
Meteor.call('getVideoInfo', videoUrl, function(err, result) {
console.log(result);
console.log (result.thumbnail_url);
downloadLink(result.formats[0].url);
}
downloadLink = function(link) {
//Create url to download from
var url = document.createElement('a');
// Add direct video link to a clickable link
url.setAttribute('href', link);
// Add download attribute to initiate download
url.setAttribute('download', 'filename.mp4');
// Click to start download
url.click();
}