eirtube/background/cache-reaper.js
2024-12-18 17:36:49 -06:00

105 lines
3.2 KiB
JavaScript
Executable File

const fs = require("fs")
const constants = require("../utils/constants")
const path = require("path")
const cacheManager = require("../eirtubeMods/cache-manager")
let maxVideoCacheSize = constants.server_setup.video_cache_max_size
let targetVideoCacheSize = 0.75 * maxVideoCacheSize;
let maxJsonCacheSize = constants.server_setup.cache_json_max_size
let targetJsonCacheSize = 0.75 * maxJsonCacheSize;
function scanFolder(folder) {
let totalSize = 0
let files = []
for (let file of fs.readdirSync(folder)) {
if (!fs.existsSync(path.join(folder, file)))
continue
let stats = fs.lstatSync(path.join(folder, file))
if (stats.isDirectory())
continue
files.push({name: file, size: stats.size, age: stats.atimeMs})
totalSize += stats.size
}
return { totalSize, files }
}
let scanCachesTimeout
function scanCaches() {
// Video cache
let vidCacheData = scanFolder(constants.server_setup.video_dl_path)
vidCacheData.files = vidCacheData.files.filter(f => {
const nameInQueue = f.name.split(".mp4")[0].replace("-temp", "").replace("-audio", "")
const dlStatus = cacheManager.read("download")[nameInQueue]
return (dlStatus == undefined || dlStatus != 2)
})
if (vidCacheData.totalSize > maxVideoCacheSize) {
// vidCacheData.files = vidCacheData.files.sort((a, b) => b.size - a.size)
// vidCacheData.files = vidCacheData.files.sort((a, b) => (b.size - b.age) - (a.size - a.age)) //vidCacheData.files = vidCacheData.files.sort((a, b) => b.age - a.age)
vidCacheData.files = vidCacheData.files.sort((a, b) => a.age - b.age)
let i = 0;
let filesToRemove = []
while (vidCacheData.totalSize >= targetVideoCacheSize) {
let file = vidCacheData.files[i];
filesToRemove.push(path.join(constants.server_setup.video_dl_path, file.name));
vidCacheData.totalSize -= file.size
i++;
}
console.log(`Removing ${filesToRemove.length} files from video cache:`);
console.log(filesToRemove);
for (let file of filesToRemove)
fs.unlinkSync(file)
}
// Json cache files
let jsonCacheData = scanFolder(constants.server_setup.json_cache_path)
if (jsonCacheData.totalSize > maxJsonCacheSize) {
jsonCacheData.files = jsonCacheData.files.sort((a, b) => b.size - a.size)
let i = 0;
let cachesToClear = []
while (jsonCacheData.totalSize >= targetJsonCacheSize) {
let file = jsonCacheData.files[i];
cachesToClear.push(path.join(constants.server_setup.json_cache_path, file.name));
jsonCacheData.totalSize -= file.size
i++;
}
console.log(`Emptying ${cachesToClear.length} json files in json cache:`);
console.log(cachesToClear);
for (let cache of cachesToClear)
cacheManager.clean(cache)
}
// Repeat cleanup later
clearTimeout(scanCachesTimeout)
scanCachesTimeout = setTimeout(scanCaches, constants.server_setup.time_between_cache_cleanup)
}
scanCaches()
// Clear ogg cache on startup
for (let file of fs.readdirSync(constants.server_setup.ogg_dl_path)) {
if (!fs.existsSync(path.join(constants.server_setup.ogg_dl_path, file)))
continue
let stats = fs.lstatSync(path.join(constants.server_setup.ogg_dl_path, file))
if (stats.isDirectory())
continue
if (file.endsWith(".ogg"))
fs.unlinkSync(path.join(constants.server_setup.ogg_dl_path, file))
}
module.exports = {
scanCaches
}