mirror of
https://gitlab.com/vyla-entertainment/sdk.git
synced 2026-11-12 21:27:28 -05:00
103 lines
3.0 KiB
JavaScript
103 lines
3.0 KiB
JavaScript
import { USER_AGENT } from '../utils/helpers.js';
|
|
|
|
const API_BASE = 'https://api.youplex.site';
|
|
|
|
const PROVIDERS = [
|
|
'taroflix',
|
|
'cinemaos',
|
|
'cno',
|
|
'cinejoy',
|
|
'oneshows',
|
|
'cinecat',
|
|
'pressplayz',
|
|
'arrowtv',
|
|
'rivestream',
|
|
'kaizoku',
|
|
'chillflix',
|
|
'zetmoon',
|
|
'vidcore',
|
|
];
|
|
|
|
const PLAYBACK_HEADERS = {
|
|
'User-Agent': USER_AGENT,
|
|
};
|
|
|
|
function buildQuery(id, isTv, s, e, provider) {
|
|
const q = new URLSearchParams({
|
|
id: String(id),
|
|
type: isTv ? 'tv' : 'movie',
|
|
provider,
|
|
});
|
|
if (isTv) {
|
|
q.set('s', String(s));
|
|
q.set('e', String(e));
|
|
}
|
|
return q;
|
|
}
|
|
|
|
function normalizeQuality(q) {
|
|
if (!q || q === 'Auto') return 'Auto';
|
|
const str = String(q).trim();
|
|
return /^\d+$/.test(str) ? `${str}p` : str;
|
|
}
|
|
|
|
export async function getStream(args) {
|
|
const { id, s, e, config } = args || {};
|
|
if (!id) return null;
|
|
|
|
const isTv = s != null && e != null;
|
|
const providers = config?.provider ? [config.provider, ...PROVIDERS.filter(p => p !== config.provider)] : PROVIDERS;
|
|
|
|
for (const provider of providers) {
|
|
try {
|
|
const url = `${API_BASE}/scrape?${buildQuery(id, isTv, s, e, provider).toString()}`;
|
|
const res = await fetch(url, {
|
|
headers: { Accept: 'application/json', 'User-Agent': USER_AGENT },
|
|
signal: AbortSignal.timeout(config?.timeout || 25000),
|
|
});
|
|
|
|
if (!res.ok) continue;
|
|
|
|
const data = await res.json();
|
|
if (!data || data.success !== true) continue;
|
|
|
|
const allUrls = [];
|
|
const seen = new Set();
|
|
|
|
if (Array.isArray(data.sources) && data.sources.length > 0) {
|
|
for (const src of data.sources) {
|
|
if (!src?.url || seen.has(src.url)) continue;
|
|
seen.add(src.url);
|
|
allUrls.push({
|
|
url: src.url,
|
|
server: `YouPlex - ${src.name || provider}`,
|
|
quality: normalizeQuality(src.quality),
|
|
type: src.url.includes('.m3u8') ? 'hls' : src.url.includes('.mpd') ? 'dash' : 'mp4',
|
|
headers: PLAYBACK_HEADERS,
|
|
});
|
|
}
|
|
} else if (typeof data.url === 'string' && data.url.startsWith('http')) {
|
|
seen.add(data.url);
|
|
allUrls.push({
|
|
url: data.url,
|
|
server: `YouPlex - ${provider}`,
|
|
quality: 'Auto',
|
|
type: data.url.includes('.m3u8') ? 'hls' : data.url.includes('.mpd') ? 'dash' : 'mp4',
|
|
headers: PLAYBACK_HEADERS,
|
|
});
|
|
}
|
|
|
|
if (!allUrls.length) continue;
|
|
|
|
return {
|
|
url: allUrls[0].url,
|
|
headers: allUrls[0].headers,
|
|
allUrls,
|
|
};
|
|
} catch {
|
|
continue;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
} |