Files
SponsorBlock/ci/invidiousCI.ts
2023-07-06 18:25:50 -04:00

56 lines
1.7 KiB
TypeScript

/*
This file is only ran by GitHub Actions in order to populate the Invidious instances list
This file should not be shipped with the extension
*/
import { writeFile, existsSync } from "fs"
import { join } from "path"
import { InvidiousInstance, instanceMap } from "./invidiousType"
// import file from https://api.invidious.io/instances.json
if (!existsSync(join(__dirname, "data.json"))) {
process.exit(1);
}
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
import * as data from "../ci/data.json";
// static non-invidious instances
const staticInstances = ["www.youtubekids.com"];
// only https servers
const mapped: instanceMap = data
.filter((i: InvidiousInstance) => i[1]?.type === "https")
.map((instance: InvidiousInstance) => {
return {
name: instance[0],
url: instance[1].uri,
dailyRatios: instance[1].monitor.dailyRatios,
thirtyDayUptime: instance[1]?.monitor["30dRatio"].ratio,
}
});
// reliability and sanity checks
const reliableCheck = mapped
.filter((instance) => {
// 30d uptime >= 90%
const thirtyDayUptime = Number(instance.thirtyDayUptime) >= 90;
// available for at least 80/90 days
const dailyRatioCheck = instance.dailyRatios.filter(status => status.label !== "black");
return thirtyDayUptime && dailyRatioCheck.length >= 80;
})
// url includes name
.filter((instance) => instance.url.includes(instance.name));
// finally map to array
const result: string[] = reliableCheck.map((instance) => instance.name).sort();
writeFile(
join(__dirname, "./invidiouslist.json"),
JSON.stringify([...staticInstances, ...result]),
(err) => {
if (err) return console.log(err);
}
);