Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var fs = require('fs'),
- zlib = require('zlib'),
- crypto = require('crypto'),
- spawn = require('child_process').spawnSync;
- var params = {}, i = 2;
- while(i<process.argv.length){
- switch(process.argv[i++]){
- case '-x': params.extract = true; break;
- case '-e': params.embed = true; break;
- case '-p': params.password = process.argv[i++]; break;
- case '-i': params.input = process.argv[i++]; break;
- case '-c': params.cover = process.argv[i++]; break;
- default: throw 'unknow option';
- }
- }
- if(params.embed){
- var data = fs.readFileSync(params.input);
- data = zlib.deflateSync(data, {level: 9});
- var l = data.length,
- tail = new Buffer(1800-(l+4+(params.password?16:0))%1800);
- for (i = 0; i < tail.length; i++){tail[i] = Math.round(Math.random()*255);}
- data = Buffer.concat([Buffer.from([l&255, (l>>>8)&255, (l>>>16)&255, (l>>>24)&255]), data, tail]);
- if(params.password){
- var iv = crypto.randomBytes(16),
- key = crypto.pbkdf2Sync(params.password, iv, 1000000, 32, 'sha256'),
- cipher = crypto.createCipheriv('aes-256-ctr', key, iv);
- data = Buffer.concat([iv, cipher.update(data), cipher.final()]);
- }
- fs.writeFileSync('tmp_data.grey11', data);
- if(params.cover){
- spawn('convert',[params.cover,'-resize','1280x720^','-gravity','center','-crop','1280x720+0+0','+repage', '+level', '62.7451,100%', 'tmp_cvr_light.png']);
- spawn('convert',[params.cover,'-resize','1280x720^','-gravity','center','-crop','1280x720+0+0','+repage', '+level', '0,37.6471%', 'tmp_cvr_dark.png']);
- for (var i = 0; i < data.length/1800; i++) {
- fs.writeFileSync('tmp_data.grey', data.slice(1800*i,1800*i+1800));
- 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']);
- }
- 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']);
- fs.unlinkSync('tmp_cvr_light.png');
- fs.unlinkSync('tmp_cvr_dark.png');
- fs.unlinkSync('tmp_data.grey');
- for (var i = 0; i < data.length/1800; i++) {fs.unlinkSync('tmp_frame_'+i+'.png');}
- }else{
- fs.writeFileSync('tmp_data.grey', data);
- 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']);
- fs.unlinkSync('tmp_data.grey');
- }
- }else if(params.extract){
- 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']);
- var s = fs.statSync('tmp_data.grey');
- 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']);
- var data = fs.readFileSync('tmp_data.bilevel');
- if(params.password){
- var iv = data.slice(0, 16),
- key = crypto.pbkdf2Sync(params.password, iv, 1000000, 32, 'sha256'),
- cipher = crypto.createDecipheriv('aes-256-ctr', key, iv);
- data = Buffer.concat([cipher.update(data.slice(16)), cipher.final()]);
- }
- l = data[0]+(data[1]<<8)+(data[2]<<16)+data[3]*16777216;
- if(l+4 > data.length){console.log('invalid length');process.exit(1);}
- data = zlib.inflateSync(data.slice(4));
- fs.writeFileSync(params.input + '.unpacked', data);
- fs.unlinkSync('tmp_data.grey');
- fs.unlinkSync('tmp_data.bilevel');
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement