CoolFace
Apppublic

Xavior524/instatube-snatchinator

sourceHugging Faceupdated 11mo agoView on Hugging Face
0likes
server.js87 linesDownload Raw Back to root
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});