video-duration
Version:
Get total video duration in console
75 lines (66 loc) • 1.88 kB
JavaScript
;
const { getVideoDurationInSeconds } = require('get-video-duration');
const fs = require('fs');
const path = require('path');
const getFiles = require('./getfiles');
const wrench = require('wrench');
const VIDEO_EXTS = ['.mkv', '.mp4', '.avi', '.mov'];
async function getDirDuration(dir) {
if (fs.statSync(dir).isFile()) {
if (!VIDEO_EXTS.includes(path.extname(dir))) {
return 0;
}
try {
const duration = await getVideoDurationInSeconds(dir);
return duration;
} catch (err) {
return 0;
}
}
const files = wrench
.readdirSyncRecursive(dir)
.filter(filename => VIDEO_EXTS.includes(path.extname(filename)));
// const files = await getFiles(dir);
let total = 0;
for (let i = 0; i < files.length; i++) {
const file = path.resolve(dir, files[i]);
try {
const duration = await getVideoDurationInSeconds(file);
total += duration;
} catch (err) {}
}
return total;
}
function pad(count) {
let s = count + '';
if (s.length === 1) {
s = `0${s}`;
}
return s;
}
function formatSeconds(count) {
const hours = Math.floor(count / 60 / 60);
count = count - hours * 60 * 60;
const minutes = Math.floor(count / 60);
count = count - minutes * 60;
const seconds = Math.floor(count);
return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
}
async function run(dir) {
const dirs = fs
.readdirSync(dir)
.sort((a, b) => {
return parseInt(a) > parseInt(b) ? 1 : -1;
})
.filter(
dir =>
fs.statSync(dir).isDirectory() || VIDEO_EXTS.includes(path.extname(dir))
);
for (let i = 0; i < dirs.length; i++) {
const name = dirs[i];
const dirname = path.resolve(dir, name);
const duration = await getDirDuration(dirname);
console.log(path.basename(name), ' --- ', formatSeconds(duration));
}
}
module.exports = run;