DashX-API / plugins /flixer.js
HerzaJ's picture
Update plugins/flixer.js
1536cdd verified
const puppeteer = require('puppeteer');
const scrapeFlixer = async (searchQuery) => {
const browser = await puppeteer.launch({
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-gpu'
]
});
const page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
const searchUrl = `https://flixer.sh/search?q=${encodeURIComponent(searchQuery)}`;
await page.goto(searchUrl, { waitUntil: 'networkidle0', timeout: 30000 });
await new Promise(resolve => setTimeout(resolve, 2000));
const searchResults = await page.evaluate(() => {
const results = [];
const images = document.querySelectorAll('img[alt]');
images.forEach(img => {
const link = img.closest('a');
if (link && img.alt) {
results.push({
title: img.alt,
image: img.src,
url: link.href
});
}
});
return results;
});
if (searchResults.length === 0) {
await browser.close();
throw new Error('No results found');
}
const movieUrl = searchResults[0].url;
await page.goto(movieUrl, { waitUntil: 'networkidle0', timeout: 30000 });
await new Promise(resolve => setTimeout(resolve, 3000));
const servers = await page.evaluate(() => {
const serverList = [];
const buttons = document.querySelectorAll('button');
buttons.forEach(btn => {
const nameEl = btn.querySelector('.font-medium');
const statusEl = btn.querySelector('.text-green-400');
if (nameEl && statusEl && statusEl.textContent.includes('AVAILABLE')) {
serverList.push({
name: nameEl.textContent.trim(),
available: true
});
}
});
return serverList;
});
let videoUrl = null;
page.on('response', async response => {
const url = response.url();
if (url.includes('.m3u8') || url.includes('.mp4') || url.includes('stream')) {
videoUrl = url;
}
});
for (const server of servers) {
try {
await page.evaluate((serverName) => {
const buttons = Array.from(document.querySelectorAll('button'));
const btn = buttons.find(b => {
const nameEl = b.querySelector('.font-medium');
return nameEl && nameEl.textContent.trim() === serverName;
});
if (btn) btn.click();
}, server.name);
await new Promise(resolve => setTimeout(resolve, 5000));
const currentVideoUrl = await page.evaluate(() => {
const video = document.querySelector('video');
return video ? video.src : null;
});
if (currentVideoUrl && !currentVideoUrl.startsWith('blob:')) {
videoUrl = currentVideoUrl;
break;
}
if (videoUrl && !videoUrl.startsWith('blob:')) {
break;
}
} catch (e) {
continue;
}
}
await browser.close();
return {
title: searchResults[0].title,
image: searchResults[0].image,
movieUrl: movieUrl,
servers: servers,
videoUrl: videoUrl,
allResults: searchResults
};
};
const handler = async (req, res) => {
try {
const { q } = req.query;
if (!q) {
return res.status(400).json({
success: false,
error: 'Missing required parameter: q'
});
}
const result = await scrapeFlixer(q);
res.json({
author: "Herza",
success: true,
msg: result
});
} catch (error) {
res.status(500).json({
success: false,
error: error.message
});
}
};
module.exports = {
name: 'Flixer Search',
description: 'Search and get video from Flixer',
type: 'GET',
routes: ['api/search/flixer'],
tags: ['search', 'movie', 'tools'],
parameters: ['q', 'key'],
enabled: true,
main: ['Downloader', 'Search'],
handler
};