You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.1 KiB

import { TrendingVideo } from "./typings/trending";
import InvidiousAdapter from "./adapters/invidious";
import PipedAdapter from "./adapters/piped";
import Adapter, { ApiType } from "./adapters";
export interface RemoteApi {
type: ApiType;
baseUrl: string;
score: number;
}
export default class Client {
private apis: RemoteApi[];
private adapters: Adapter[] = [InvidiousAdapter, PipedAdapter];
constructor(
apis: {
type: ApiType;
baseUrl: string;
}[]
) {
this.apis = apis.map((api) => ({ ...api, score: 0 }));
}
private getAdapterForApiType(apiType: ApiType): Adapter {
const adapter = this.adapters.find((adapter) => adapter.apiType == apiType);
if (adapter === undefined)
throw new Error(`Could not find an adapter with api type ${apiType}`);
return adapter;
}
private getBestApi(): RemoteApi {
const randomIndex = Math.floor(Math.random() * this.apis.length);
return this.apis[randomIndex];
}
public async getTrending(region: string): Promise<TrendingVideo[]> {
const api = this.getBestApi();
const adapter = this.getAdapterForApiType(api.type);
return await adapter.connect(api.baseUrl).getTrending(region);
}
}