134 lines
4.0 KiB
JavaScript
Executable File
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);
|
|
});
|
|
}
|