var getVideoLength = v => require('video-length')(v, {bin: "mediainfo"}); var fs = require("fs"); var cached = {}; async function getList() { if (!cached.list || Date.now() - cached.list.time > 30000) { var list = await generateList(); cached.time = Date.now(); cached.list = list; return list; } return cached.list; } async function generateList() { var files = fs.readdirSync("videos"); var list = await Promise.all(files.map(async name => { var filepath = `videos/${name}`; var metapath = `./metadata/${name}.json`; try { var metadata = require(metapath); } catch (error) { var metadata = {}; try { metadata.duration = await getVideoLength(filepath); } catch(error) {console.error(error.message)}; fs.writeFileSync(metapath, JSON.stringify(metadata)); } var {mtime, size} = fs.statSync(filepath); return {name, mtime, size, duration: metadata.duration}; })); var aliases = fs.readdirSync("aliases").map(alias => [alias, fs.readFileSync(`aliases/${alias}`,"utf8")]); for (let [alias, target] of aliases) { let item = list.find(f => f.name == target); if (item) { item.aliases ||= []; item.aliases.push(alias); } } list = list.sort((a,b) => a.mtime - b.mtime); return list; } function uncacheList() { cached = {}; } module.exports = {getList, generateList, uncacheList};