// index.js const express = require("express"); const puppeteer = require("puppeteer"); const app = express(); app.use(express.json()); // Example: /api/episode?anime=naruto&episode=1&dub=sub app.get("/api/episode", async (req, res) => { const { anime, episode, dub } = req.query; if (!anime || !episode) { return res.status(400).json({ error: "anime and episode required" }); } let browser; try { browser = await puppeteer.launch({ headless: true, args: ["--no-sandbox", "--disable-setuid-sandbox"] }); const page = await browser.newPage(); // Navigate to HiAnime episode page // Adjust the URL pattern to match the HiAnime site const url = `https://hianime.tv/${anime}-episode-${episode}`; await page.goto(url, { waitUntil: "networkidle2" }); // Example: grab the first video source URL const streamUrl = await page.evaluate(() => { const video = document.querySelector("video source"); return video ? video.src : null; }); if (!streamUrl) { return res.status(404).json({ error: "Stream URL not found" }); } return res.json({ anime, episode, dub: dub || "sub", streamUrl }); } catch (err) { console.error(err); return res.status(500).json({ error: "Failed to scrape episode" }); } finally { if (browser) await browser.close(); } }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => console.log(`HF Space scraper running on port ${PORT}`));