我正在尝试使用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
找到答案 0 :(得分:1)
所以我对导致问题的原因是对的。它与主机到chrome消息的1 MB限制有关。您可以通过将stdout / stderr重定向到文件来避免这种情况。
const cmd = `youtube-dl --extract-audio --audio-format mp3 -o \"${outTemplate}\" ${url} &> d.txt`;
这对我有用。说实话,我不完全是为什么要考虑这个消息> 1 MB,如果有人可以提供更好的解释,那就太好了。