2016-03-23 35 views
11

Sto utilizzando PhantomJS e HorsemanJS per scaricare un file wav da un server remoto. Tuttavia, quando il file è codificato in base64 e scritto in un nuovo file, perde qualità che lo rende inutilizzabile. L'audio è lì ma è distorto che mi porta a pensare che sia un problema di codifica. Sono in esecuzione su Ubuntu 14.04 utilizzando il nodo v5Download di un file wav utilizzando Horseman e PhantomJS con perdita della qualità dei dati

Di seguito il mio script ha qualche idea per migliorare la codifica di Base64?

var Horseman = require('node-horseman'); 
var horseman = new Horseman({cookiesFile:'./cookiejar'}); 
var fs = require('fs'); 

horseman.on("urlChanged", function(url){ 
    console.log(url); 
}); 

horseman.on('consoleMessage', function(msg){ 
    console.log(msg); 
}); 

horseman 
    .userAgent("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36") 
    .open('https://remoteserver.com/audo.aspx?guid=01439900-5361-4828-ad0e-945b56e9fe51') 
    .waitForNextPage() 
    .type('input[name="password"]', process.env.PASS) 
    .type('input[name="username"]', process.env.UN) 
    .click("button:contains('Login')") 
    .waitForNextPage() 
    .evaluate(function(){ 
    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

    function base64encode(str) { 
     var out, i, len; 
     var c1, c2, c3; 

     len = str.length; 
     i = 0; 
     out = ""; 
     while(i < len) { 
     c1 = str.charCodeAt(i++) & 0xff; 
     if(i == len) 
     { 
      out += base64EncodeChars.charAt(c1 >> 2); 
      out += base64EncodeChars.charAt((c1 & 0x3) << 4); 
      out += "=="; 
      break; 
     } 
     c2 = str.charCodeAt(i++); 
     if(i == len) 
     { 
      out += base64EncodeChars.charAt(c1 >> 2); 
      out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 
      out += base64EncodeChars.charAt((c2 & 0xF) << 2); 
      out += "="; 
      break; 
     } 
     c3 = str.charCodeAt(i++); 
     out += base64EncodeChars.charAt(c1 >> 2); 
     out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 
     out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)); 
     out += base64EncodeChars.charAt(c3 & 0x3F); 
     } 
     return out; 
    } 

    var url = $("a:contains('Uncompressed file')").attr("href"); 

    console.log(url); 

    var out; 
    $.ajax({ 
     'async' : false, 
     'url' : url, 
     'success' : function(data, status, xhr) { 
     console.log(status); 
     console.log(xhr.getResponseHeader('Content-Type')); 
     out = base64encode(data); 
     } 
    }); 
    return out; 
    }) 
    .then(function(out){ 
    fs.writeFile('./mydownloadedfile.txt', out, 'base64', function(){ 
     return horseman.close(); 
    }); 
    }); 

Il tipo di contenuto ritorna come audio/wav

Se il file viene scaricato e giocato con lo stesso giocatore gioca bene manualmente, è solo quando si passa attraverso questo processo.

+0

Questo ha bisogno di maggiori informazioni. Nello specifico, puoi scaricare il file e salvarlo? Sembra un codec che tira la sequenza temporale sbagliata, ma è necessario un file wav di esempio. –

+0

È possibile scaricare un file con meno codice con CasperJS anziché con PhantomJS e non sarà necessario utilizzare la soluzione alternativa tramite base64. – st2erw2od

+0

@ st2erw2od Guarderò a CasperJS ma quando ho studiato in origine era autonomo, quindi non potevo fare ciò di cui avevo bisogno dopo il file (negozio su S3) – thegogz

risposta

1

Perché non si fa a controllare l'ambiente e utilizzare Buffer in NodeJS o btoa()/atob() browser, per la codifica Base64 e decodifica:

function base64Encode(plainData) { 
    if(isNode) { 
     return new Buffer(plainData).toString('base64'); 
    }else { 
     return window.btoa(plainData); 
    } 
} 

function base64Decode(encodedData) { 
    if(isNode) { 
     return new Buffer(encodedData, 'base64').toString(); 
    }else { 
     return window.atob(encodedData); 
    } 
} 

nello script:

var out; 
$.ajax({ 
    'async' : false, 
    'url' : url, 
    'success' : function(data, status, xhr) { 
    console.log(status); 
    console.log(xhr.getResponseHeader('Content-Type')); 
    out = base64Encode(data); 
    } 
}); 
return out; 
})... 
+0

Buffer è NodeJS solo così non può essere iniettato nel browser, lo script in cui sono codificato in base64 e dove si trova il problema. – thegogz

+0

Sì, è perché nella domanda hai detto: "Sto correndo su Ubuntu 14.04 usando il nodo v5" e supponevo che avessi bisogno di una soluzione basata su nodejs. Che dire del rilevamento dell'ambiente (nodo | browser) e l'esecuzione di metodi appropriati, come Buffer nel nodo e atob()/btoa() nel browser? Aggiornato la mia risposta. –