mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2024-09-19 20:51:28 +02:00
fully typed updown response
This commit is contained in:
parent
36a5bc105b
commit
20d538b6e9
3 changed files with 86 additions and 27 deletions
|
@ -7,8 +7,7 @@ This file should not be shipped with the extension
|
||||||
/*
|
/*
|
||||||
Criteria for inclusion:
|
Criteria for inclusion:
|
||||||
Invidious
|
Invidious
|
||||||
- 30d uptime >= 90%
|
- uptime >= 80%
|
||||||
- available for at least 80/90 days
|
|
||||||
- must have been up for at least 90 days
|
- must have been up for at least 90 days
|
||||||
- HTTPS only
|
- HTTPS only
|
||||||
- url includes name (this is to avoid redirects)
|
- url includes name (this is to avoid redirects)
|
||||||
|
|
|
@ -1,27 +1,34 @@
|
||||||
import { InvidiousInstance, instanceMap } from "./invidiousType"
|
import { InvidiousInstance, monitor } from "./invidiousType"
|
||||||
|
|
||||||
import * as data from "../ci/invidious_instances.json";
|
import * as data from "../ci/invidious_instances.json";
|
||||||
|
|
||||||
// only https servers
|
// only https servers
|
||||||
const mapped: instanceMap = (data as InvidiousInstance[])
|
const mapped = (data as InvidiousInstance[])
|
||||||
.filter((i) => i[1]?.type === "https")
|
.filter((i) =>
|
||||||
|
i[1]?.type === "https"
|
||||||
|
&& i[1]?.monitor?.enabled
|
||||||
|
)
|
||||||
.map((instance) => {
|
.map((instance) => {
|
||||||
|
const monitor = instance[1].monitor as monitor;
|
||||||
return {
|
return {
|
||||||
name: instance[0],
|
name: instance[0],
|
||||||
url: instance[1].uri,
|
url: instance[1].uri,
|
||||||
uptime: instance[1].monitor?.uptime || 0,
|
uptime: monitor.uptime || 0,
|
||||||
down: instance[1].monitor?.down ?? false
|
down: monitor.down ?? false,
|
||||||
|
created_at: monitor.created_at,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// reliability and sanity checks
|
// reliability and sanity checks
|
||||||
const reliableCheck = mapped
|
const reliableCheck = mapped
|
||||||
.filter(instance => {
|
.filter(instance => {
|
||||||
return instance.uptime > 80 && !instance.down;
|
const uptime = instance.uptime > 80 && !instance.down;
|
||||||
|
const nameIncluded = instance.url.includes(instance.name);
|
||||||
|
const ninetyDays = 90 * 24 * 60 * 60 * 1000;
|
||||||
|
const ninetyDaysAgo = new Date(Date.now() - ninetyDays);
|
||||||
|
const createdAt = new Date(instance.created_at).getTime() < ninetyDaysAgo.getTime();
|
||||||
|
return uptime && nameIncluded && createdAt;
|
||||||
})
|
})
|
||||||
// url includes name
|
|
||||||
.filter(instance => instance.url.includes(instance.name));
|
|
||||||
|
|
||||||
export function getInvidiousList(): string[] {
|
export const getInvidiousList = (): string[] =>
|
||||||
return reliableCheck.map(instance => instance.name).sort()
|
reliableCheck.map(instance => instance.name).sort()
|
||||||
}
|
|
|
@ -1,19 +1,72 @@
|
||||||
|
|
||||||
export type instanceMap = {
|
|
||||||
name: string;
|
|
||||||
url: string;
|
|
||||||
uptime: number;
|
|
||||||
down: boolean;
|
|
||||||
}[]
|
|
||||||
|
|
||||||
export type InvidiousInstance = [
|
export type InvidiousInstance = [
|
||||||
string,
|
string,
|
||||||
{
|
{
|
||||||
uri: string;
|
flag: string;
|
||||||
|
region: string;
|
||||||
|
stats: null | ivStats;
|
||||||
|
cors: null | boolean;
|
||||||
|
api: null | boolean;
|
||||||
type: "https" | "http" | "onion" | "i2p";
|
type: "https" | "http" | "onion" | "i2p";
|
||||||
monitor: null | {
|
uri: string;
|
||||||
uptime: number;
|
monitor: null | monitor;
|
||||||
down: boolean;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
export type monitor = {
|
||||||
|
token: string;
|
||||||
|
url: string;
|
||||||
|
alias: string;
|
||||||
|
last_status: number;
|
||||||
|
uptime: number;
|
||||||
|
down: boolean;
|
||||||
|
down_since: null | string;
|
||||||
|
up_since: null | string;
|
||||||
|
error: null | string;
|
||||||
|
period: number;
|
||||||
|
apdex_t: number;
|
||||||
|
string_match: string;
|
||||||
|
enabled: boolean;
|
||||||
|
published: boolean;
|
||||||
|
disabled_locations: string[];
|
||||||
|
recipients: string[];
|
||||||
|
last_check_at: string;
|
||||||
|
next_check_at: string;
|
||||||
|
created_at: string;
|
||||||
|
mute_until: null | string;
|
||||||
|
favicon_url: string;
|
||||||
|
custom_headers: Record<string, string>;
|
||||||
|
http_verb: string;
|
||||||
|
http_body: string;
|
||||||
|
ssl: {
|
||||||
|
tested_at: string;
|
||||||
|
expires_at: string;
|
||||||
|
valid: boolean;
|
||||||
|
error: null | string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ivStats = {
|
||||||
|
version: string;
|
||||||
|
software: {
|
||||||
|
name: "invidious" | string;
|
||||||
|
version: string;
|
||||||
|
branch: "master" | string;
|
||||||
|
};
|
||||||
|
openRegistrations: boolean;
|
||||||
|
usage: {
|
||||||
|
users: {
|
||||||
|
total: number;
|
||||||
|
activeHalfyear: number;
|
||||||
|
activeMonth: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
metadata: {
|
||||||
|
updatedAt: number;
|
||||||
|
lastChannelRefreshedAt: number;
|
||||||
|
};
|
||||||
|
playback: {
|
||||||
|
totalRequests: number;
|
||||||
|
successfulRequests: number;
|
||||||
|
ratio: number;
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in a new issue