Files
sdk/src/sources/rivo.js

59 lines
1.8 KiB
JavaScript

import { fetchJson } from '../utils/helpers.js';
const BASE_URL = 'https://f.rivo.st';
export async function getStream(args) {
const { id, s, e } = args || {};
const isTv = s != null && e != null;
const basePath = isTv
? `${BASE_URL}/api/source/tv/${id}?s=${s}&e=${e}`
: `${BASE_URL}/api/source/movie/${id}`;
const headers = {
Accept: '*/*',
Referer: `${BASE_URL}/`,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
};
const serverIndices = Array.from({ length: 26 }, (_, i) => i + 1);
const delimiter = basePath.includes('?') ? '&' : '?';
const responses = await Promise.allSettled(
serverIndices.map(serverNum =>
fetchJson(`${basePath}${delimiter}server=${serverNum}`, { headers })
.catch(() => null)
)
);
const allUrls = [];
for (const res of responses) {
if (res.status !== 'fulfilled' || !res.value) continue;
const data = res.value;
if (Array.isArray(data.sources)) {
for (const src of data.sources) {
if (src?.url) {
allUrls.push({
url: src.url,
server: `Rivo - ${data.server || src.subProvider || 'Server'}`,
quality: src.quality || 'Auto',
type: src.kind || (src.url.includes('.m3u8') ? 'hls' : 'mp4'),
headers: {
Referer: `${BASE_URL}/`,
Origin: BASE_URL,
},
});
}
}
}
}
if (!allUrls.length) return null;
return {
url: allUrls[0].url,
headers: allUrls[0].headers,
allUrls,
};
}