2016-03-23 4 views
11

मैं दूरस्थ सर्वर से एक WAV फ़ाइल डाउनलोड करने के लिए PhantomJS और HorsemanJS का उपयोग कर रहा हूं। हालांकि जब फ़ाइल बेस 64 एन्कोडेड होती है और एक नई फ़ाइल में लिखी जाती है तो यह गुणवत्ता खो देती है जो इसे अनुपयोगी बनाती है। ऑडियो वहां है लेकिन इसके विकृत जो मुझे लगता है कि यह एक एन्कोडिंग समस्या है। मैं नोड v5हॉर्समन और फैंटॉमजेएस का उपयोग करके एक वैव फ़ाइल डाउनलोड करना डेटा गुणवत्ता

का उपयोग कर उबंटू 14.04 पर चल रहा हूं नीचे मेरी 64 स्क्रिप्ट एन्कोडिंग को बेहतर बनाने के लिए कोई स्क्रिप्ट है?

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(); 
    }); 
    }); 

सामग्री प्रकार वापस के रूप में audio/wav

फ़ाइल मैन्युअल रूप से डाउनलोड किया है और एक ही खिलाड़ी यह ठीक नाटकों के माध्यम से खेला जाता है, तो आता है, यह केवल तब होता है जब यह इस प्रक्रिया के माध्यम से चला जाता है।

+0

यह अधिक जानकारी की आवश्यकता है। विशेष रूप से, क्या आप फ़ाइल डाउनलोड कर सकते हैं और इसे सहेज सकते हैं? यह गलत समय अनुक्रमण को खींचने वाले कोडेक की तरह लगता है, लेकिन एक नमूना WAV फ़ाइल की आवश्यकता है। –

+0

आप फ़ैंटॉमजेएस के बजाय कैस्परजेएस के साथ कम कोड वाली फ़ाइल डाउनलोड कर सकते हैं और आपको बेस 64 के माध्यम से वर्कअराउंड का उपयोग नहीं करना पड़ेगा। – st2erw2od

+0

@ st2erw2od मैं कैस्परजेएस में देखूंगा लेकिन जब मैंने मूल रूप से जांच की थी तो यह स्टैंडअलोन था इसलिए मैं फ़ाइल (एस 3 पर स्टोर) – thegogz

उत्तर

1

क्यों आप पर्यावरण की जांच नहीं करते और NodeJS में बफर या btoa()/atob() ब्राउज़र में का उपयोग करें, बेस 64 एन्कोडिंग और डिकोडिंग के लिए:

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); 
    } 
} 
अपनी स्क्रिप्ट में

:

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

बफर नोडजेएस केवल इतना नहीं हो सकता है ब्राउज़र में इंजेक्शन, स्क्रिप्ट जहां मैं बेस 64 एन्कोडिंग हूं और जहां समस्या निहित है। – thegogz

+0

हां, ऐसा इसलिए है क्योंकि आपने कहा था: "मैं नोड v5 का उपयोग कर उबंटू 14.04 पर चल रहा हूं" और मुझे लगता है कि आपको नोडजेस आधारित समाधान की आवश्यकता है। पर्यावरण (नोड | ब्राउज़र) का पता लगाने और ब्राउज़र में बफर में नोड और atob()/btoa() जैसे उचित तरीकों को चलाने के बारे में क्या? मेरा जवाब अपडेट किया गया। –

संबंधित मुद्दे