Advertisement
Guest User

Untitled

a guest
Sep 16th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var fs = require('fs'),
  2.   zlib = require('zlib'),
  3.   crypto = require('crypto'),
  4.   spawn = require('child_process').spawnSync;
  5. var params = {}, i = 2;
  6. while(i<process.argv.length){
  7.   switch(process.argv[i++]){
  8.     case '-x': params.extract = true; break;
  9.     case '-e': params.embed = true; break;
  10.     case '-p': params.password = process.argv[i++]; break;
  11.     case '-i': params.input = process.argv[i++]; break;
  12.     case '-c': params.cover = process.argv[i++]; break;
  13.     default: throw 'unknow option';
  14.   }
  15. }
  16. if(params.embed){
  17.   var data = fs.readFileSync(params.input);
  18.   data = zlib.deflateSync(data, {level: 9});
  19.   var l = data.length,
  20.     tail = new Buffer(1800-(l+4+(params.password?16:0))%1800);
  21.   for (i = 0; i < tail.length; i++){tail[i] = Math.round(Math.random()*255);}
  22.   data = Buffer.concat([Buffer.from([l&255, (l>>>8)&255, (l>>>16)&255, (l>>>24)&255]), data, tail]);
  23.   if(params.password){
  24.     var iv = crypto.randomBytes(16),
  25.       key = crypto.pbkdf2Sync(params.password, iv, 1000000, 32, 'sha256'),
  26.       cipher = crypto.createCipheriv('aes-256-ctr', key, iv);
  27.     data = Buffer.concat([iv, cipher.update(data), cipher.final()]);
  28.   }
  29.   fs.writeFileSync('tmp_data.grey11', data);
  30.   if(params.cover){
  31.       spawn('convert',[params.cover,'-resize','1280x720^','-gravity','center','-crop','1280x720+0+0','+repage', '+level', '62.7451,100%', 'tmp_cvr_light.png']);
  32.       spawn('convert',[params.cover,'-resize','1280x720^','-gravity','center','-crop','1280x720+0+0','+repage', '+level', '0,37.6471%',   'tmp_cvr_dark.png']);
  33.       for (var i = 0; i < data.length/1800; i++) {
  34.         fs.writeFileSync('tmp_data.grey', data.slice(1800*i,1800*i+1800));
  35.         var ttt = spawn('convert',['-size','1280x720','tile:tmp_cvr_dark.png','tile:tmp_cvr_light.png','(','-depth','1','-size','160x90+0','gray:tmp_data.grey','-scale','1280x720',')','-composite', 'tmp_frame_'+i+'.png']);
  36.       }
  37.       spawn('ffmpeg',['-y','-framerate','60','-i','tmp_frame_%d.png','-threads','8','-deadline','best','-g','9000','-c:v','libvpx','-b:v','256k',params.input+'.webm']);
  38.       fs.unlinkSync('tmp_cvr_light.png');
  39.       fs.unlinkSync('tmp_cvr_dark.png');
  40.       fs.unlinkSync('tmp_data.grey');
  41.       for (var i = 0; i < data.length/1800; i++) {fs.unlinkSync('tmp_frame_'+i+'.png');}
  42.   }else{
  43.     fs.writeFileSync('tmp_data.grey', data);
  44.     spawn('ffmpeg',['-y','-f','rawvideo','-pix_fmt','monob','-s','160x90','-r','60','-i','tmp_data.grey','-vf','scale=iw*8:-1','-sws_flags','neighbor','-threads','8','-deadline','best','-c:v','libvpx','-b:v','256k',params.input+'.webm']);
  45.     fs.unlinkSync('tmp_data.grey');
  46.   }
  47. }else if(params.extract){
  48.   spawn('ffmpeg',['-y','-i',params.input,'-vf','curves=m=\'0.49,0 0.51,1\',format=pix_fmts=gray,scale=160x90','-sws_flags','area','-f','rawvideo','tmp_data.grey']);
  49.   var s = fs.statSync('tmp_data.grey');
  50.   spawn('convert',['-depth','8','-size','1800x'+(s.size/1800)+'+0','gray:tmp_data.grey ','-black-threshold','50%','-dither','none','-white-threshold','50%','-colors','2','-type','bilevel','-depth','1','tmp_data.bilevel']);
  51.   var data = fs.readFileSync('tmp_data.bilevel');
  52.   if(params.password){
  53.     var iv = data.slice(0, 16),
  54.       key = crypto.pbkdf2Sync(params.password, iv, 1000000, 32, 'sha256'),
  55.       cipher = crypto.createDecipheriv('aes-256-ctr', key, iv);
  56.     data = Buffer.concat([cipher.update(data.slice(16)), cipher.final()]);
  57.   }
  58.   l = data[0]+(data[1]<<8)+(data[2]<<16)+data[3]*16777216;
  59.   if(l+4 > data.length){console.log('invalid length');process.exit(1);}
  60.   data = zlib.inflateSync(data.slice(4));
  61.   fs.writeFileSync(params.input + '.unpacked', data);
  62.   fs.unlinkSync('tmp_data.grey');
  63.   fs.unlinkSync('tmp_data.bilevel');
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement