86 lines
2.1 KiB
TypeScript
86 lines
2.1 KiB
TypeScript
import type { ServiceConfig } from '$lib/config';
|
|
import type { ServiceHandler } from '../service';
|
|
|
|
interface Status {
|
|
warnings: number;
|
|
errors: number;
|
|
}
|
|
|
|
function buildStatus(statuses: any[]): Status {
|
|
let warnings = 0;
|
|
let errors = 0;
|
|
for (const status of statuses) {
|
|
switch (status.type) {
|
|
case 'warning':
|
|
warnings += 1;
|
|
break;
|
|
case 'error':
|
|
errors += 1;
|
|
break;
|
|
}
|
|
}
|
|
return { warnings, errors };
|
|
}
|
|
|
|
interface Queue {
|
|
nextDate?: Date;
|
|
total: number;
|
|
}
|
|
function recordEstimatedCompletionTime(record: any): number {
|
|
if (record.estimatedCompletionTime == undefined) {
|
|
return Infinity;
|
|
}
|
|
return new Date(record.estimatedCompletionTime).getTime();
|
|
}
|
|
|
|
function buildQueue(queue: any): Queue {
|
|
if (queue?.records?.length === 0) {
|
|
return { total: 0 };
|
|
}
|
|
let nextTime: number = recordEstimatedCompletionTime(queue.records[0]);
|
|
for (let i = 1; i < queue.records.length; i++) {
|
|
const recordTime = recordEstimatedCompletionTime(queue.records[i]);
|
|
if (recordTime < nextTime) {
|
|
nextTime = recordTime;
|
|
}
|
|
}
|
|
|
|
return {
|
|
total: queue.records.length,
|
|
nextDate: nextTime != Infinity ? new Date(nextTime) : undefined
|
|
};
|
|
}
|
|
|
|
export const handle: ServiceHandler = async (config: ServiceConfig) => {
|
|
const res = {
|
|
logo: 'https://cdn.rawgit.com/Sonarr/Sonarr/develop/Logo/Sonarr.svg',
|
|
subtitle: 'TV Show tracker'
|
|
};
|
|
|
|
const params = '?apikey=' + config.api_key;
|
|
|
|
const requests = [
|
|
fetch(config.url + '/api/v3/health' + params),
|
|
fetch(config.url + '/api/v3/queue' + params + '&includeUnknownSeriesItems=true')
|
|
];
|
|
|
|
const [health, queue] = await Promise.allSettled(requests);
|
|
res.status = 'online';
|
|
|
|
if (health.status != 'fulfilled') {
|
|
console.warn("Could not fetch '" + config.url + "' status: " + health.value);
|
|
res.status = 'offline';
|
|
} else if (health.value.ok == true) {
|
|
res.health = buildStatus(await health.value.json());
|
|
}
|
|
|
|
if (queue.status != 'fulfilled') {
|
|
console.warn("Could not fetch '" + config.url + "' queue: " + queue.value);
|
|
res.status = 'offline';
|
|
} else if (queue.value.ok == true) {
|
|
res.queue = buildQueue(await queue.value.json());
|
|
}
|
|
|
|
return res;
|
|
};
|