55 lines
1.3 KiB
JavaScript
55 lines
1.3 KiB
JavaScript
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}; |