2017-04-19 3 views
1

J'essaie de créer une extension qui utilise la messagerie native Chrome pour communiquer avec youtube-dl à l'aide d'un script hôte node.js. J'ai été capable d'analyser avec succès le stdin de l'extension & également été en mesure d'exécuter un processus enfant (c'est-à-dire touch file.dat), mais lorsque j'essaie d'exec/spawn youtube-dl il se bloque sur la commande. J'ai essayé le script hôte indépendamment de l'entrée native de chrome et cela fonctionne très bien. Je pense que le problème peut avoir quelque chose à voir avec les limitations de 1 Mo sur la taille du tampon de la messagerie native Chrome. Y at-il un moyen de lire le tampon?Messagerie native Chrome - Processus enfant suspendu

#! /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....'); 
}); 

Le code de base complet peut être trouvé à https://github.com/wrleskovec/chrome-youtube-mp3-dl

Répondre

1

J'avais raison sur ce qui était à l'origine du problème. Il a dû faire avec 1 Mo de limitation sur l'hôte au message de chrome. Vous pouvez éviter cela en redirigeant stdout/stderr vers un fichier.

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

Cela a fonctionné pour moi. Pour être honnête je ne suis pas entièrement pourquoi le message est considéré> 1 Mo et si quelqu'un peut donner une meilleure explication ce serait génial.