2017-04-19 6 views
1

Chrome 기본 메시지를 사용하여 node.js 호스트 스크립트를 사용하여 youtube-dl과 통신하는 확장 프로그램을 만들려고합니다. &도 하위 프로세스 (예 : touch file.dat)를 실행할 수 있었지만 내게 exec/spawn을 시도 할 때 명령에서 응답하지 않는 확장 프로그램에서 stdin을 성공적으로 파싱했습니다. 내가 크롬 원시 입력 독립적으로 호스트 스크립트를 시도하고 잘 작동합니다. 문제는 크롬 네이티브 메시징의 버퍼 크기에 대한 1MB 제한과 관련이 있다고 생각합니다. 버퍼를 읽는 방법이 있습니까? Chrome 기본 메시지 - 행 아웃 하위 프로세스

#! /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

에서 찾을 수 있습니다. 호스트 메시지와 크롬 메시지에 1MB 제한이 있습니다. stdout/stderr을 파일로 재지 정하면이 문제를 피할 수 있습니다.

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

이것은 나를 위해 일했습니다. 솔직히 나는 메시지가 1MB 이상으로 간주되는 이유와 누군가가 더 좋은 설명을 줄 수있는 이유가 전혀 다르지 않다.