Chrome原生消息 - 悬挂子进程

时间:2017-04-19 17:32:09

标签: node.js chrome-native-messaging

我正在尝试使用chrome本机消息传递使用node.js主机脚本与youtube-dl进行通信。我已经能够成功解析扩展名中的标准输入。也能够运行子进程(即touch file.dat),但是当我尝试exec / spawn youtube-dl时,它会挂起命令。我已经尝试独立于chrome本机输入的主机脚本,它工作正常。我认为这个问题可能与chrome本机消息传递缓冲区大小的1MB限制有关。有没有办法读取缓冲区?

#! /usr/bin/env node
"use strict";
const fs = require('fs');
const exec = require('child_process').execSync;

const dlPath = '/home/toughluck/Music';

let first = true;
let buffers = [];
process.stdin.on('readable', () => {
  let chunk = process.stdin.read();
  if (chunk !== null) {
    if (first) {
      chunk = chunk.slice(4);
      first = false;
    }
    buffers.push(chunk);
  }
});
process.stdin.on('end', () => {
  const res = Buffer.concat(buffers);
  const url = JSON.parse(res).url;
  const outTemplate = `${dlPath}/%(title)s.%(ext)s`;
  const cmdOptions = {
    shell: '/bin/bash'
  };
  const cmd = `youtube-dl --extract-audio --audio-format mp3 -o \"${outTemplate}\" ${url}`;
  // const args = ['--extract-audio', '--audio-format', 'mp3', '-o', outTemplate, url];
  // const cmd2 = 'youtube-dl';

  process.stderr.write('Suck it chrome');
  process.stderr.write('stderr doesnt stop host');

  exec(cmd, cmdOptions, (err, stdout, stderr) => {
    if (err) throw err;
    process.stderr.write(stdout);
    process.stderr.write(stderr);
  });

  process.stderr.write('\n Okay....');
});

完整的代码库可以在https://github.com/wrleskovec/chrome-youtube-mp3-dl

找到

1 个答案:

答案 0 :(得分:1)

所以我对导致问题的原因是对的。它与主机到chrome消息的1 MB限制有关。您可以通过将stdout / stderr重定向到文件来避免这种情况。

  const cmd = `youtube-dl --extract-audio --audio-format mp3 -o \"${outTemplate}\" ${url} &> d.txt`;

这对我有用。说实话,我不完全是为什么要考虑这个消息> 1 MB,如果有人可以提供更好的解释,那就太好了。