nepovednik/nepovednik.js

134 lines
4.0 KiB
JavaScript
Executable File

#!/usr/bin/node
const videiDir = 'vide-i/';
const fs = require('fs');
const ffmpeg = require("fluent-ffmpeg");
const MersenneTwister = require("mersenne-twister");
const exec = require('child_process').exec;
if (process.argv.length != 3) {
console.log("Podaj mi stevilo trejlerja kot argument (samo eno.)");
process.exit(1);
}
/****
Parametri za generiranje!
*/
const dolzinaT = 30; // Dolzina celega trejlerja v sekundah
const kaderMin = 2; // Dolzina kadra (min)
const kaderMax = 7; // Dolzina kadra (max)
/*************************************************************************/
const stTrejlerja = parseInt(process.argv[2]);
function toHHMMSS(cas) {
var dec = parseFloat((cas % 1).toFixed(2));
var sec_num = parseInt(cas - dec, 10); // don't forget the second param
var hours = Math.floor(sec_num / 3600);
var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
var seconds = sec_num - (hours * 3600) - (minutes * 60);
if (hours < 10) {hours = "0"+hours;}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+(seconds+dec);}
return hours+':'+minutes+':'+seconds;
}
console.log("generiram!...");
console.log(stTrejlerja);
let najava = './nepovedi/najava' + stTrejlerja;
fs.closeSync(fs.openSync(najava, 'w'));
const generator = new MersenneTwister(stTrejlerja);
let videi = [];
let stevec = 0;
fs.readdirSync(videiDir).map(file => {
ffmpeg.ffprobe(videiDir + file, (err, metadata) => {
videi.push({
name: file.substr(0, file.length - 3),
path: videiDir + file,
length: metadata.streams[0].duration
});
if (videi.length === stevec) {
razsekaj(videi);
}
});
stevec += 1;
});
function imeKosa(st) {
return stTrejlerja + '_' + st + '.webm';
}
let dolzina = 0;
let stKosov = 1;
function razsekaj(videi) {
// Najprej posortiram, da so predvidljivi trejlerji
videi.sort((a, b) => a.name.localeCompare(b.name));
let stKoncanih = 0;
while(dolzina < dolzinaT) {
let trenutniV = videi[generator.random_int() % videi.length];
let zacetek = parseFloat((generator.random() * trenutniV.length).toFixed(2));
let trajanje = parseFloat((kaderMin + (generator.random() * (kaderMax - kaderMin))).toFixed(2));
let konec = zacetek + trajanje;
if (konec > trenutniV.length) {
trajanje = parseFloat((trenutniV.length - zacetek).toFixed(2));
}
let cmd = "ffmpeg -y -ss " + toHHMMSS(zacetek) + " -i " + trenutniV.path.replace(/([\s()&])/g, "\\$1") + " -t " + toHHMMSS(trajanje) + " -vcodec libvpx -cpu-used -5 -deadline realtime -acodec libvorbis -max_muxing_queue_size 400 ./kosi/" + imeKosa(stKosov);
exec(cmd, function (error, stdout, stderr) {
if (error !== null) {
console.log("Napaka!", error);
console.log(stderr);
process.exit(1);
}
stKoncanih += 1;
if ((dolzina > dolzinaT) && (stKoncanih === (stKosov - 1))) {
console.log("konvertirani vsi.");
console.log("polna dolzina: " + dolzina);
console.log("dajmo jih zlepit. (" + (stKosov - 1) + ")");
zlepi();
}
});
dolzina += trajanje;
stKosov += 1;
}
}
function zlepi() {
let cmd = 'mkvmerge -o ./nepovedi/' + stTrejlerja + '.webm ./kosi/' + imeKosa(1);
for (let i = 2; i < stKosov; i++) {
cmd += ' + ./kosi/' + imeKosa(i);
}
exec(cmd, function (error, stdout, stderr) {
if (error !== null) {
console.log("problem pri lepljenju.");
console.log(error);
console.log(stdout);
console.log(stderr);
process.exit(1);
}
console.log("Koncano!");
for(let j = 1; j < stKosov; j++) {
//fs.unlinkSync('./kosi/' + imeKosa(j));
}
fs.unlinkSync(najava);
process.exit(0);
});
}