// index.js const express = require('express'); const ytSearch = require('yt-search'); const { exec } = require('child_process'); const fs = require('fs'); const path = require('path'); const cors = require('cors'); const app = express(); const port = 4286; //use cors app.use(cors()); // Middleware to parse JSON app.use(express.json()); // Search endpoint using yt-search app.get('/search', async (req, res) => { const query = req.query.q; if (!query) { return res.status(400).json({ error: 'Query parameter "q" is required.' }); } try { const result = await ytSearch(query); const videos = result.videos.slice(0, 1000); // Get up to 1000 videos // Format videos for response const formattedVideos = videos.map(v => { const views = String(v.views).padStart(10, ' '); return { views: views, title: v.title, timestamp: v.timestamp, author: v.author.name, url: v.url }; }); res.json(formattedVideos); } catch (error) { res.status(500).json({ error: 'An error occurred while searching for videos.' }); } }); function getRandomHex() { // Generate a random integer between 100 and 99999 const randomNumber = Math.floor(Math.random() * (99999 - 100 + 1)) + 100; // Convert the number to a hexadecimal string and return it return randomNumber.toString(16); } // Video download endpoint app.get('/download', (req, res) => { const videoUrl = req.query.url; if (!videoUrl) { console.error('Error: Query parameter "url" is required.'); return res.status(400).json({ error: 'Query parameter "url" is required.' }); } // Set the output file path var outputPath = path.join('/tmp/downloads', `${getRandomHex()}`); // Create /tmp/downloads directory if it doesn't exist try { fs.mkdirSync(path.join('/tmp/downloads'), { recursive: true }); } catch (err) { console.error('Error creating directory:', err); return res.status(500).json({ error: 'Failed to create download directory.', details: err.message }); } // Use yt-dlp to download the video exec(`yt-dlp -o "${outputPath}" "${videoUrl}"`, (error, stdout, stderr) => { if (error) { console.error('Error executing yt-dlp:', stderr); return res.status(500).json({ error: 'An error occurred while downloading the video.', details: stderr }); } console.log('yt-dlp output:', stdout); const downloadedFilePath = `${outputPath}.webm`; console.log('Downloaded file path:', downloadedFilePath); if (!downloadedFilePath || !fs.existsSync(downloadedFilePath)) { console.log(`${downloadedFilePath}`) console.error('Error: Downloaded file not found or invalid path.'); return res.status(500).json({ error: 'Downloaded file not found or invalid path.' }); } // Send the file res.download(downloadedFilePath, (err) => { if (err) { console.error('Error sending the file:', err); return res.status(500).json({ error: 'Failed to send the file.', details: err.message }); } // Optionally, delete the file after sending it fs.unlink(downloadedFilePath, (err) => { if (err) { console.error('Failed to delete the file:', err); } }); }); }); }); app.listen(port, () => { console.log(`Server running at http://localhost:${port}`); });