Spaces:
Running
Running
| // 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}`)); |