mirror of
https://github.com/Inside4ndroid/TMDB-Embed-API.git
synced 2026-10-22 09:35:11 +00:00
Add new providers for streaming services and utility functions
- Implement StreamFlix provider for fetching movie and episode streams. - Add VaPlayer provider to retrieve streaming URLs for movies and TV shows. - Introduce ZXCStreams provider for accessing various streaming links. - Create utility functions for fetching episode counts from Cinemeta. - Develop a title matching system for improved search results. - Implement TMDB title to IMDB ID resolution for better integration with TMDB API.
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
const { resolveImdbId } = require('../utils/tmdb');
|
||||
|
||||
const STREAM_API = 'https://streamdata.vaplayer.ru/api.php';
|
||||
const PLAYER_ORIGIN = 'https://nextgencloudfabric.com';
|
||||
const USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';
|
||||
|
||||
async function fetchStreamUrls(imdb, type, season, episode) {
|
||||
const params = new URLSearchParams({ imdb, type });
|
||||
if (type === 'tv' && season != null && episode != null) {
|
||||
params.set('season', String(season));
|
||||
params.set('episode', String(episode));
|
||||
}
|
||||
|
||||
const url = `${STREAM_API}?${params.toString()}`;
|
||||
const referer = type === 'tv'
|
||||
? `${PLAYER_ORIGIN}/embed/tv/${imdb}/${season}/${episode}`
|
||||
: `${PLAYER_ORIGIN}/embed/movie/${imdb}`;
|
||||
|
||||
try {
|
||||
const controller = new AbortController();
|
||||
const timer = setTimeout(() => controller.abort(), 12000);
|
||||
|
||||
const resp = await fetch(url, {
|
||||
signal: controller.signal,
|
||||
headers: {
|
||||
'User-Agent': USER_AGENT,
|
||||
'Referer': referer,
|
||||
'Origin': PLAYER_ORIGIN
|
||||
}
|
||||
});
|
||||
clearTimeout(timer);
|
||||
|
||||
if (!resp.ok) {
|
||||
throw new Error(`VaPlayer API HTTP ${resp.status}`);
|
||||
}
|
||||
|
||||
const json = await resp.json();
|
||||
if (json.status_code !== '200' && json.status_code !== 200) {
|
||||
throw new Error(`VaPlayer API error: ${json.error || `status_code=${json.status_code}`}`);
|
||||
}
|
||||
|
||||
return (json.data && json.data.stream_urls) || [];
|
||||
} catch (err) {
|
||||
console.warn(`[VaPlayer] fetch failed for ${imdb}: ${err.message}`);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
function toStreams(streamUrls, labelSuffix = '') {
|
||||
return streamUrls.map((url, i) => ({
|
||||
name: 'VaPlayer',
|
||||
title: `VaPlayer${labelSuffix ? ` ${labelSuffix}` : ''} · HLS ${i + 1}`,
|
||||
url,
|
||||
quality: 'Auto',
|
||||
provider: 'VaPlayer',
|
||||
headers: {
|
||||
'Referer': `${PLAYER_ORIGIN}/`,
|
||||
'Origin': PLAYER_ORIGIN,
|
||||
'User-Agent': USER_AGENT
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
async function getVaplayerStreams(tmdbId, mediaType = 'movie', seasonNum = null, episodeNum = null) {
|
||||
console.log(`[VaPlayer] Fetching streams for TMDB ID: ${tmdbId}, Type: ${mediaType}`);
|
||||
|
||||
try {
|
||||
const imdbId = await resolveImdbId(mediaType === 'tv' ? 'tv' : 'movie', tmdbId);
|
||||
if (!imdbId || !imdbId.startsWith('tt')) {
|
||||
console.log(`[VaPlayer] No IMDB ID resolved for TMDB ${tmdbId}`);
|
||||
return [];
|
||||
}
|
||||
|
||||
const urls = mediaType === 'tv' && seasonNum !== null && episodeNum !== null
|
||||
? await fetchStreamUrls(imdbId, 'tv', seasonNum, episodeNum)
|
||||
: await fetchStreamUrls(imdbId, 'movie');
|
||||
|
||||
const streams = toStreams(urls, mediaType === 'tv' ? `S${seasonNum}E${episodeNum}` : '');
|
||||
console.log(`[VaPlayer] Got ${streams.length} stream(s) for ${imdbId}`);
|
||||
return streams;
|
||||
} catch (err) {
|
||||
console.error(`[VaPlayer] Error: ${err.message}`);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { getVaplayerStreams };
|
||||
Reference in New Issue
Block a user