From 9503b662df219c058d25684d6e17f24748d6aad9 Mon Sep 17 00:00:00 2001 From: aka paul <50n50@noreply.localhost> Date: Thu, 23 Oct 2025 13:43:25 +0000 Subject: [PATCH] Update vidfast/vidfast.js --- vidfast/vidfast.js | 87 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 11 deletions(-) diff --git a/vidfast/vidfast.js b/vidfast/vidfast.js index 54aa72b..5804590 100644 --- a/vidfast/vidfast.js +++ b/vidfast/vidfast.js @@ -208,9 +208,9 @@ async function extractStreamUrl(ID) { const final = { streams, - subtitles: "None" + subtitles: streamResponse.subtitles || "None" }; - + console.log(JSON.stringify(final)); return JSON.stringify(final); } else if (ID.includes('tv')) { const parts = ID.split('/'); @@ -241,9 +241,9 @@ async function extractStreamUrl(ID) { const final = { streams, - subtitles: "None" + subtitles: streamResponse.subtitles || "None" }; - + console.log(JSON.stringify(final)); return JSON.stringify(final); } } @@ -401,11 +401,19 @@ async function ilovefeet(imdbId, isSeries = false, season = null, episode = null const format = data.url.includes('.m3u8') ? 'm3u8' : data.url.includes('.mpd') ? 'mpd' : 'unknown'; - if (preferredFormat === 'm3u8' && format === 'm3u8') { - return { index, server, success: true, format, data, preferred: true }; + const hasEnglishSubs = data.tracks && Array.isArray(data.tracks) && + data.tracks.some(track => track.label && track.label.toLowerCase().includes('english') && track.file); + + + if (preferredFormat === 'm3u8' && format === 'm3u8' && hasEnglishSubs) { + return { index, server, success: true, format, data, preferred: true, hasSubtitles: true }; } - return { index, server, success: true, format, data, preferred: false }; + if (preferredFormat === 'm3u8' && format === 'm3u8') { + return { index, server, success: true, format, data, preferred: true, hasSubtitles: false }; + } + + return { index, server, success: true, format, data, preferred: false, hasSubtitles: hasEnglishSubs }; } catch (error) { throw new Error(`Server ${index} failed: ${error.message}`); @@ -418,9 +426,48 @@ async function ilovefeet(imdbId, isSeries = false, season = null, episode = null if (preferredFormat === 'm3u8') { const serverPromises = serverList.map((serverObj, index) => testServer(serverObj, index)); - selectedServer = await Promise.any(serverPromises); + const raceForSubtitles = new Promise((resolve, reject) => { + let completedCount = 0; + let firstWorkingServer = null; + + serverPromises.forEach(promise => { + promise.then(result => { + completedCount++; + + if (result.hasSubtitles) { + console.log(`Found server ${result.index} with subtitles, stopping other requests`); + resolve(result); + return; + } + + if (!firstWorkingServer && result.format === 'm3u8') { + firstWorkingServer = result; + } + + if (completedCount === serverPromises.length) { + if (firstWorkingServer) { + console.log(`No servers with subtitles found, using fallback server ${firstWorkingServer.index}`); + resolve(firstWorkingServer); + } else { + reject(new Error('No working m3u8 servers found')); + } + } + }).catch(() => { + completedCount++; + + if (completedCount === serverPromises.length) { + if (firstWorkingServer) { + console.log(`No servers with subtitles found, using fallback server ${firstWorkingServer.index}`); + resolve(firstWorkingServer); + } else { + reject(new Error('No working m3u8 servers found')); + } + } + }); + }); + }); - console.log(`Found working server ${selectedServer.index} with format ${selectedServer.format}`); + selectedServer = await raceForSubtitles; } else { const serverPromises = serverList.map((serverObj, index) => testServer(serverObj, index)); @@ -429,7 +476,7 @@ async function ilovefeet(imdbId, isSeries = false, season = null, episode = null console.log(`Found working server ${selectedServer.index} with format ${selectedServer.format}`); } } catch (error) { - console.log('All servers failed:', error); + console.log('All servers failed:'+ error); throw new Error('No working servers found'); } @@ -438,16 +485,34 @@ async function ilovefeet(imdbId, isSeries = false, season = null, episode = null if (preferredFormat === 'm3u8' && selectedServer.format === 'mpd') { selectedServer.data.url = selectedServer.data.url.replace('.mpd', '.m3u8'); selectedServer.format = 'm3u8'; - console.log('Converted MPD URL to M3U8'); } let finalUrl = selectedServer.data.url; + let englishSubtitles = null; + try { + if (selectedServer.data.tracks && Array.isArray(selectedServer.data.tracks)) { + const englishTrack = selectedServer.data.tracks.find(track => + track.label && track.label.toLowerCase().includes('english') && track.file + ); + if (englishTrack) { + englishSubtitles = englishTrack.file; + } else { + console.log('No English subtitle track found in tracks array'); + } + } else { + console.log('No tracks array found in server response'); + } + } catch (error) { + console.log('Error extracting subtitles:'+ error); + } + return { url: selectedServer.data.url, originalUrl: selectedServer.data.url, referer: "https://vidfast.pro/", format: selectedServer.format, + subtitles: englishSubtitles, fullData: selectedServer.data, serverStats: { total: serverList.length,