nepovednik/nepovednik.js

205 lines
6.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;
function readFolder (path) {
fs.readdirSync(path).map(file => {
//console.log(file);
if (fs.lstatSync(path + file).isFile()) {
ffmpeg.ffprobe(path + file, (err, metadata) => {
videi.push({
name: file.substr(0, file.length - 3),
path: path + file,
length: metadata.streams[0].duration
});
if (videi.length === stevec) {
razsekaj(videi);
}
});
stevec += 1;
} else {
readFolder(path + file + '/');
}
});
}
readFolder(videiDir);
function imeKosa(st, apple = false) {
let ext = '.webm';
if (apple) {
ext = '.mp4';
}
return stTrejlerja + '_' + st + ext;
}
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 -vf scale=1280:720 -ac 1 -acodec libvorbis -ab 192k -ar 44100 -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)*2)) {
console.log("konvertirani vsi.");
console.log("polna dolzina: " + dolzina);
console.log("dajmo jih zlepit. (" + (stKosov - 1) + ")");
zlepi();
}
});
let cmd_apple = "ffmpeg -y -ss " + toHHMMSS(zacetek) + " -i " + trenutniV.path.replace(/([\s()&'])/g, "\\$1") + " -t " + toHHMMSS(trajanje) + " -vcodec libx264 -b 850k -vf scale=1280:720 -acodec aac -ar 44100 -ab 128k ./kosi/" + imeKosa(stKosov, true);
//console.log(cmd_apple);
exec(cmd_apple, 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)*2)) {
console.log("konvertirani vsi.");
console.log("polna dolzina: " + dolzina);
console.log("dajmo jih zlepit. (" + (stKosov - 1) + ")");
zlepi();
}
});
dolzina += trajanje;
stKosov += 1;
}
}
function zlepi() {
let lepila = 2;
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));
}
lepila -= 1;
if (lepila == 0) {
fs.unlinkSync(najava);
process.exit(0);
}
});
let cmd_apple = 'MP4Box -force-cat -add ./kosi/' + imeKosa(1, true);
for (let i = 2; i < stKosov; i++) {
cmd_apple += ' -cat ./kosi/' + imeKosa(i, true);
}
cmd_apple += ' -new ./nepovedi/' + stTrejlerja + '.mp4';
exec(cmd_apple, 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, true));
}
lepila -= 1;
if (lepila == 0) {
fs.unlinkSync(najava);
process.exit(0);
}
});
}