Files
2026-09-15 21:56:10 +02:00

57 lines
2.0 KiB
TypeScript

import { ISource, SearchResult, SelectionData, ContentLinks, MediaType } from '../../src/types/source.js';
import { FlixArtAPI } from './api.js';
export class FlixartSource implements ISource {
name = 'flixart';
displayName = 'FlixArt';
async search(query: string, mediaType?: MediaType): Promise<SearchResult[]> {
return FlixArtAPI.search(query, mediaType);
}
async getTrending(mediaType: MediaType): Promise<SearchResult[]> {
const type = mediaType === 'series' ? 'series' : 'movie';
return FlixArtAPI.getTrending(type);
}
async getRecent(): Promise<SearchResult[]> {
return this.getTrending('movie');
}
async getSelection(identifier: string, type?: string, seasonValue?: string | number): Promise<SelectionData> {
return FlixArtAPI.getSelection(identifier);
}
async getContentLinks(identifier: string, season?: number): Promise<ContentLinks> {
return FlixArtAPI.getContentLinks(identifier, season);
}
async healthCheck(): Promise<boolean> {
try {
const results = await this.getTrending('movie');
return results.length > 0;
} catch (e: any) {
console.error(`[FlixArt] Healthcheck failed: ${e.message}`);
return false;
}
}
// Custom resolveLink that returns a Turnstile challenge instead of just the URL
// Actually, Agora's activeSource.resolveLink only accepts string.
// We will change ISource resolveLink to allow returning an object.
async resolveLink(linkId: string, extraData?: any): Promise<any> {
const [url] = linkId.split('|');
// FlixArt requires a Cloudflare Turnstile challenge which cannot be resolved on localhost.
// We directly return the manual redirection challenge.
return {
captcha: 'turnstile',
url: url,
sourceName: 'FlixArt'
};
}
}
// Auto-registration
import { sourceRegistry } from '../../src/core/registry.js';
sourceRegistry.register(new FlixartSource());