70 lines
1.9 KiB
JavaScript
Executable File
70 lines
1.9 KiB
JavaScript
Executable File
const fs = require('fs');
|
|
const path = require('path');
|
|
const util = require('./lib/util');
|
|
const ffmpeg = require('fluent-ffmpeg');
|
|
|
|
let roomVidPath = `/var/hypnoadmin/media/videos/ALttP/my-vids/room-vids`;
|
|
|
|
const getAllFiles = dir =>
|
|
fs.readdirSync(dir).reduce((files, file) => {
|
|
const name = path.join(dir, file);
|
|
const isDirectory = fs.statSync(name).isDirectory();
|
|
return isDirectory ? [...files, ...getAllFiles(name)] : [...files, name];
|
|
}, []);
|
|
|
|
let roomVidFiles = getAllFiles(roomVidPath);
|
|
|
|
populateDatabase();
|
|
|
|
async function populateDatabase() {
|
|
let database = [];
|
|
await util.asyncForEach(roomVidFiles, async (file, index) => {
|
|
// ignore anything that's not an mp4
|
|
let shortPath = file.replace(roomVidPath, '');
|
|
if (!/\.mp4$/.test(shortPath)) {
|
|
return;
|
|
}
|
|
|
|
let entry = {
|
|
id: index+1,
|
|
shortPath: shortPath,
|
|
winPath: shortPath.replace(/\//g, '\\')
|
|
};
|
|
|
|
// chop up the short path and extract metadata
|
|
let matches = shortPath.match(/^\/([0-9]{2})-([a-z]+)\/([0-9]{2})-(.+)\.mp4/);
|
|
if (matches) {
|
|
entry.dungeonId = matches[1];
|
|
entry.dungeonName = matches[2];
|
|
entry.roomId = matches[3];
|
|
entry.roomName = matches[4];
|
|
}
|
|
|
|
// @TODO support some other paths / structures
|
|
|
|
entry.videoData = await getVideoMetadata(file);
|
|
database.push(entry);
|
|
console.log('added entry', entry);
|
|
});
|
|
|
|
fs.writeFile('conf/rooms.json', JSON.stringify(database), 'utf8', () => {console.log('done')});
|
|
}
|
|
|
|
function getVideoMetadata(videoPath) {
|
|
return new Promise((resolve, reject) => {
|
|
ffmpeg.ffprobe(videoPath, (err, metadata) => {
|
|
// find the video stream
|
|
let stream = metadata.streams.find(e => e.codec_type === "video");
|
|
if (!stream) {
|
|
resolve(false);
|
|
}
|
|
|
|
resolve({
|
|
width: stream.width,
|
|
height: stream.height,
|
|
fps: parseInt(stream.r_frame_rate.replace('/1', '')),
|
|
length: stream.duration
|
|
});
|
|
});
|
|
});
|
|
} |