2022-02-20 15:49:21 +01:00
|
|
|
import Fuse from "fuse.js";
|
2022-02-17 21:48:35 +01:00
|
|
|
import { tempScraper } from "./list/temp";
|
2022-02-17 18:25:12 +01:00
|
|
|
import { theFlixScraper } from "./list/theflix";
|
2022-02-20 15:49:21 +01:00
|
|
|
import {
|
|
|
|
MWMassProviderOutput,
|
|
|
|
MWMedia,
|
|
|
|
MWMediaType,
|
|
|
|
MWPortableMedia,
|
|
|
|
MWQuery,
|
2022-02-20 16:45:46 +01:00
|
|
|
MWMediaStream,
|
2022-02-20 15:49:21 +01:00
|
|
|
} from "./types";
|
2022-02-17 18:25:12 +01:00
|
|
|
import { MWWrappedMediaProvider, WrapProvider } from "./wrapper";
|
2022-02-06 21:42:39 +01:00
|
|
|
export * from "./types";
|
2022-02-06 20:56:48 +01:00
|
|
|
|
2022-02-17 18:25:12 +01:00
|
|
|
const mediaProvidersUnchecked: MWWrappedMediaProvider[] = [
|
|
|
|
WrapProvider(theFlixScraper),
|
2022-02-17 21:48:35 +01:00
|
|
|
WrapProvider(tempScraper),
|
2022-02-17 18:25:12 +01:00
|
|
|
];
|
|
|
|
export const mediaProviders: MWWrappedMediaProvider[] =
|
|
|
|
mediaProvidersUnchecked.filter((v) => v.enabled);
|
2022-02-06 21:42:39 +01:00
|
|
|
|
2022-02-17 18:25:12 +01:00
|
|
|
/*
|
|
|
|
** Fetch all enabled providers for a specific type
|
|
|
|
*/
|
|
|
|
export function GetProvidersForType(type: MWMediaType) {
|
|
|
|
return mediaProviders.filter((v) => v.type.includes(type));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
** Call search on all providers that matches query type
|
|
|
|
*/
|
2022-02-20 15:49:21 +01:00
|
|
|
export async function SearchProviders(
|
|
|
|
query: MWQuery
|
|
|
|
): Promise<MWMassProviderOutput> {
|
|
|
|
const allQueries = GetProvidersForType(query.type).map<
|
|
|
|
Promise<{ media: MWMedia[]; success: boolean; id: string }>
|
|
|
|
>(async (provider) => {
|
2022-02-17 21:48:35 +01:00
|
|
|
try {
|
|
|
|
return {
|
|
|
|
media: await provider.searchForMedia(query),
|
|
|
|
success: true,
|
|
|
|
id: provider.id,
|
2022-02-20 15:49:21 +01:00
|
|
|
};
|
2022-02-17 21:48:35 +01:00
|
|
|
} catch (err) {
|
|
|
|
console.error(`Failed running provider ${provider.id}`, err, query);
|
|
|
|
return {
|
|
|
|
media: [],
|
|
|
|
success: false,
|
|
|
|
id: provider.id,
|
2022-02-20 15:49:21 +01:00
|
|
|
};
|
2022-02-17 21:48:35 +01:00
|
|
|
}
|
|
|
|
});
|
2022-02-06 21:42:39 +01:00
|
|
|
const allResults = await Promise.all(allQueries);
|
2022-02-20 15:49:21 +01:00
|
|
|
const providerResults = allResults.map((provider) => ({
|
|
|
|
success: provider.success,
|
|
|
|
id: provider.id,
|
|
|
|
}));
|
2022-02-17 21:48:35 +01:00
|
|
|
const output = {
|
|
|
|
results: allResults.flatMap((results) => results.media),
|
|
|
|
providers: providerResults,
|
|
|
|
stats: {
|
|
|
|
total: providerResults.length,
|
2022-02-20 15:49:21 +01:00
|
|
|
failed: providerResults.filter((v) => !v.success).length,
|
|
|
|
succeeded: providerResults.filter((v) => v.success).length,
|
2022-02-17 21:48:35 +01:00
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2022-02-20 15:49:21 +01:00
|
|
|
// sort results
|
|
|
|
const fuse = new Fuse(output.results, { threshold: 0.3, keys: ["title"] });
|
|
|
|
output.results = fuse.search(query.searchQuery).map((v) => v.item);
|
|
|
|
|
2022-02-17 21:48:35 +01:00
|
|
|
if (output.stats.total === output.stats.failed)
|
|
|
|
throw new Error("All Scrapers failed");
|
|
|
|
return output;
|
2022-02-17 18:25:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
** Get a provider by a id
|
|
|
|
*/
|
|
|
|
export function getProviderFromId(id: string) {
|
|
|
|
return mediaProviders.find((v) => v.id === id);
|
|
|
|
}
|
2022-02-06 21:42:39 +01:00
|
|
|
|
2022-02-17 18:25:12 +01:00
|
|
|
/*
|
|
|
|
** Turn media object into a portable media object
|
|
|
|
*/
|
|
|
|
export function convertMediaToPortable(media: MWMedia): MWPortableMedia {
|
|
|
|
return {
|
|
|
|
mediaId: media.mediaId,
|
|
|
|
providerId: media.providerId,
|
|
|
|
mediaType: media.mediaType,
|
|
|
|
episode: media.episode,
|
|
|
|
season: media.season,
|
|
|
|
};
|
2022-02-06 21:42:39 +01:00
|
|
|
}
|
|
|
|
|
2022-02-17 18:25:12 +01:00
|
|
|
/*
|
|
|
|
** Turn portable media into media object
|
|
|
|
*/
|
|
|
|
export async function convertPortableToMedia(
|
|
|
|
portable: MWPortableMedia
|
|
|
|
): Promise<MWMedia | undefined> {
|
|
|
|
const provider = getProviderFromId(portable.providerId);
|
|
|
|
return await provider?.getMediaFromPortable(portable);
|
2022-02-06 21:42:39 +01:00
|
|
|
}
|
2022-02-20 16:45:46 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
** find provider from portable and get stream from that provider
|
|
|
|
*/
|
|
|
|
export async function getStream(
|
|
|
|
media: MWPortableMedia
|
|
|
|
): Promise<MWMediaStream | undefined> {
|
|
|
|
const provider = getProviderFromId(media.providerId);
|
|
|
|
if (!provider) return undefined;
|
|
|
|
|
|
|
|
return await provider.getStream(media);
|
|
|
|
}
|