如何使用 python youtube-dl 和 meteorjs 执行客户端视频下载
How can I perform client-side video download with python youtube-dl and meteorjs
在我的流星应用程序中,我使用 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);
}
});
下一步是用户可以看到视频的缩略图,可用格式列表,可以从客户端下载和保存他想要的格式;
我该如何执行??
有什么想法吗?
感谢您的帮助
您必须将此包 https://atmospherejs.com/meteorhacks/npm 添加到您的 Meteor 应用程序才能使用 Npm 包。
然后使用 https://www.npmjs.com/package/ytdl-core 而不是 exec 命令与 youtube-dl,它更容易。为了使用它,您必须在主文件夹中添加到 packages.json:
{
"ytdl-core":"0.7.9",
}
现在 server.js 使用 ydtl-core 示例创建一个方法。您需要使用 Futures 等待响应,然后 return 返回给客户端:
// 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);
}
编辑:要下载视频,您可以创建一个 link 并使用 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();
}
在我的流星应用程序中,我使用 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);
}
});
下一步是用户可以看到视频的缩略图,可用格式列表,可以从客户端下载和保存他想要的格式;
我该如何执行?? 有什么想法吗?
感谢您的帮助
您必须将此包 https://atmospherejs.com/meteorhacks/npm 添加到您的 Meteor 应用程序才能使用 Npm 包。
然后使用 https://www.npmjs.com/package/ytdl-core 而不是 exec 命令与 youtube-dl,它更容易。为了使用它,您必须在主文件夹中添加到 packages.json:
{
"ytdl-core":"0.7.9",
}
现在 server.js 使用 ydtl-core 示例创建一个方法。您需要使用 Futures 等待响应,然后 return 返回给客户端:
// 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);
}
编辑:要下载视频,您可以创建一个 link 并使用 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();
}