Xavior524/instatube-snatchinator
0
1require('dotenv').config();2const express = require('express');3const cors = require('cors');4const axios = require('axios');5const ytdl = require('ytdl-core');6const { IgApiClient } = require('instagram-private-api');7const ffmpeg = require('fluent-ffmpeg');8const fs = require('fs');9const path = require('path');10 11const app = express();12const PORT = process.env.PORT || 3000;13 14// Middleware15app.use(cors());16app.use(express.json());17app.use(express.static('public'));18 19// YouTube Download Endpoint20app.post('/api/youtube/download', async (req, res) => {21 try {22 const { url, format } = req.body;23 24 if (!ytdl.validateURL(url)) {25 return res.status(400).json({ error: 'Invalid YouTube URL' });26 }27 28 const videoId = ytdl.getURLVideoID(url);29 const info = await ytdl.getInfo(url);30 31 if (format === 'mp3') {32 // Audio download33 const audioStream = ytdl(url, { quality: 'highestaudio' });34 const outputPath = path.join(__dirname, 'downloads', `${videoId}.mp3`);35 36 ffmpeg(audioStream)37 .audioBitrate(128)38 .save(outputPath)39 .on('end', () => {40 res.download(outputPath, `${info.videoDetails.title}.mp3`, () => {41 fs.unlinkSync(outputPath);42 });43 });44 } else {45 // Video download46 const videoStream = ytdl(url, { quality: 'highest' });47 res.header('Content-Disposition', `attachment; filename="${info.videoDetails.title}.mp4"`);48 videoStream.pipe(res);49 }50 } catch (error) {51 console.error('YouTube download error:', error);52 res.status(500).json({ error: 'Failed to download YouTube content' });53 }54});55 56// Instagram Download Endpoint57app.post('/api/instagram/download', async (req, res) => {58 try {59 const { url } = req.body;60 const ig = new IgApiClient();61 62 // You would need to add Instagram login credentials in .env63 ig.state.generateDevice(process.env.IG_USERNAME);64 await ig.account.login(process.env.IG_USERNAME, process.env.IG_PASSWORD);65 66 const postId = url.split('/')[4];67 const mediaInfo = await ig.media.info(postId);68 const mediaUrl = mediaInfo.items[0].video_versions?.[0]?.url || 69 mediaInfo.items[0].image_versions2?.candidates?.[0]?.url;70 71 if (!mediaUrl) {72 return res.status(400).json({ error: 'No media found in this post' });73 }74 75 const response = await axios.get(mediaUrl, { responseType: 'stream' });76 res.header('Content-Disposition', 'attachment; filename="instagram_media.mp4"');77 response.data.pipe(res);78 } catch (error) {79 console.error('Instagram download error:', error);80 res.status(500).json({ error: 'Failed to download Instagram content' });81 }82});83 84// Start server85app.listen(PORT, () => {86 console.log(`Server running on http://localhost:${PORT}`);87});