如何使用 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();
}