|
const express = require('express'); |
|
const axios = require('axios'); |
|
const crypto = require('crypto'); |
|
const cheerio = require('cheerio'); |
|
|
|
const app = express(); |
|
const PORT = 7860; |
|
|
|
|
|
const cors = require('cors'); |
|
app.use(cors()); |
|
|
|
app.get('/anime/:title/:episode', async (req, res) => { |
|
const animeTitle = req.params.title; |
|
const episodeNumber = req.params.episode; |
|
|
|
console.log(`Requested: ${animeTitle} Episode ${episodeNumber}`); |
|
|
|
try { |
|
const episodeData = await searchGogoanime(animeTitle, episodeNumber); |
|
res.json(episodeData); |
|
} catch (error) { |
|
res.status(500).json({ error: "Failed to fetch episode data", details: error.message }); |
|
} |
|
}); |
|
|
|
async function searchGogoanime(animeTitle, episodeNumber) { |
|
try { |
|
console.log(`Searching for: ${animeTitle} Episode ${episodeNumber}`); |
|
|
|
|
|
const searchUrl = `https://www31.gogoanimes.fi/search?keyword=${encodeURIComponent(animeTitle)}`; |
|
const searchResponse = await axios.get(searchUrl); |
|
const $ = cheerio.load(searchResponse.data); |
|
|
|
|
|
const firstResult = $('.items li a').first(); |
|
const animeSlug = firstResult.attr('href')?.split('/')[2]; |
|
if (!animeSlug) throw new Error("Anime not found"); |
|
|
|
console.log(`Anime Found: ${animeTitle} (${animeSlug})`); |
|
|
|
|
|
const episodeUrl = `https://www31.gogoanimes.fi/${animeSlug}-episode-${episodeNumber}`; |
|
console.log(`Episode URL: ${episodeUrl}`); |
|
|
|
return { |
|
anime: animeTitle, |
|
episode: episodeNumber, |
|
owner: "Reiker", |
|
episodeUrl: episodeUrl |
|
}; |
|
} catch (error) { |
|
throw new Error("Error searching Gogoanime: " + error.message); |
|
} |
|
} |
|
|
|
const urlMap = new Map(); |
|
|
|
app.get('/q', (req, res) => { |
|
const filemoonUrl = req.query.q; |
|
|
|
if (!filemoonUrl || !filemoonUrl.startsWith('https://filemoon.')) { |
|
return res.status(400).json({ error: 'Invalid or missing Filemoon URL.' }); |
|
} |
|
|
|
|
|
const randomPath = crypto.randomBytes(8).toString('hex'); |
|
|
|
urlMap.set(randomPath, filemoonUrl); |
|
const fullUrl = `${req.protocol}://${req.get('host')}/vid/${randomPath}`; |
|
|
|
res.json({ url: fullUrl }); |
|
}); |
|
|
|
|
|
app.get('/vid/:id', (req, res) => { |
|
const filemoonUrl = urlMap.get(req.params.id); |
|
|
|
if (!filemoonUrl) { |
|
return res.status(404).send('Not found'); |
|
} |
|
|
|
|
|
const embedUrl = filemoonUrl.replace('/s/', '/e/'); |
|
|
|
res.send(` |
|
<!DOCTYPE html> |
|
<html> |
|
<head> |
|
<title>Filemoon Embed</title> |
|
<style> |
|
body, html { |
|
margin: 0; |
|
padding: 0; |
|
height: 100%; |
|
background-color: #000; |
|
} |
|
iframe { |
|
width: 100%; |
|
height: 100%; |
|
border: none; |
|
} |
|
</style> |
|
</head> |
|
<body> |
|
<iframe src="${embedUrl}" allowfullscreen></iframe> |
|
</body> |
|
</html> |
|
`); |
|
}); |
|
|
|
|
|
app.listen(PORT, () => console.log(`Server running on http://localhost:${PORT}`)); |