/
streamlive
/
embedstream
Обзор
Документация
Войти
/
streamlive
/
embedstream
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
server.js
119 строк
4 KB
TwixoffStudio
Create: package.json, .gitkeep, parser.js, store.js, embed.ejs, error.ejs, index.ejs, .env.example, .gitignore, LICENSE, README.md, server.js
10 авг 2026, 11:06
Верифицирован
10 авг 2026, 11:06
6adfd59
Код
Авторство
О чём код?
/** * EmbedStream — Node.js server * Production-ready OG / embed generator for any video link */ require('dotenv').config(); const express = require('express'); const cors = require('cors'); const path = require('path'); const { parseUrl } = require('./lib/parser'); const store = require('./lib/store'); const app = express(); const PORT = process.env.PORT || 3000; const BASE_URL = process.env.BASE_URL || `http://localhost:${PORT}`; app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views')); app.use(cors()); app.use(express.json({ limit: '1mb' })); app.use(express.urlencoded({ extended: true })); app.use(express.static(path.join(__dirname, 'public'))); // ─── Landing ─────────────────────────────────────────────── app.get('/', (req, res) => { res.render('index', { baseUrl: BASE_URL, title: 'EmbedStream — чистый плеер для любого видео', }); }); // ─── API: parse & create embed ───────────────────────────── app.post('/api/parse', async (req, res) => { try { const { url } = req.body; if (!url || typeof url !== 'string' || url.length < 5) { return res.status(400).json({ error: 'Укажите корректную ссылку' }); } const meta = await parseUrl(url); const record = store.create(meta); const embedPage = `${BASE_URL}/embed/${record.id}`; const iframe = `<iframe src="${embedPage}" width="100%" height="100%" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen style="aspect-ratio:16/9;border:none;border-radius:12px;"></iframe>`; res.json({ ok: true, id: record.id, embedUrl: embedPage, iframe, meta: { title: record.title, description: record.description, image: record.image, tags: record.tags, platform: record.platform, restricted: record.restricted, siteName: record.siteName, originalUrl: record.url, }, }); } catch (err) { console.error('Parse error:', err.message); res.status(500).json({ error: err.message || 'Не удалось обработать ссылку', details: process.env.NODE_ENV === 'development' ? err.stack : undefined, }); } }); // ─── API: get meta by id ─────────────────────────────────── app.get('/api/meta/:id', (req, res) => { const rec = store.get(req.params.id); if (!rec) return res.status(404).json({ error: 'Не найдено' }); res.json(rec); }); // ─── Embed player page (for browser source / iframe) ─────── app.get('/embed/:id', (req, res) => { const rec = store.get(req.params.id); if (!rec) { return res.status(404).render('error', { message: 'Embed не найден', baseUrl: BASE_URL, }); } res.render('embed', { record: rec, baseUrl: BASE_URL, autoplay: req.query.autoplay === '1' || req.query.autoplay === 'true', muted: req.query.muted !== '0', }); }); // ─── Health ──────────────────────────────────────────────── app.get('/health', (req, res) => { res.json({ status: 'ok', time: new Date().toISOString() }); }); // ─── 404 ─────────────────────────────────────────────────── app.use((req, res) => { res.status(404).render('error', { message: 'Страница не найдена', baseUrl: BASE_URL, }); }); // ─── Error handler ───────────────────────────────────────── app.use((err, req, res, next) => { console.error(err); res.status(500).json({ error: 'Internal Server Error' }); }); app.listen(PORT, () => { console.log(`\n EmbedStream running at ${BASE_URL}`); console.log(` PORT=${PORT}\n`); });