ytdl-server/metalist.js

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};