/* 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); } );