惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
B
Blog
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Jina AI
Jina AI
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
L
LangChain Blog
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
Y
Y Combinator Blog
F
Fortinet All Blogs
H
Help Net Security
B
Blog RSS Feed
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Разбор архитектуры Reddit: Как создать высокопроизводител...
yqqwe · 2026-05-14 · via DEV Community

yqqwe

Для обычного пользователя загрузка видео из интернета кажется тривиальной задачей: найти ссылку на .mp4 и сохранить файл. Однако для разработчиков, работающих с такими гигантами, как Reddit, реальность оказывается гораздо сложнее.
Reddit использует современные технологии адаптивного вещания, такие как MPEG-DASH и HLS, которые динамически фрагментируют контент. В этой статье мы разберем технические вызовы, с которыми мы столкнулись при создании Reddit Video Downloader, и способы их решения с помощью Node.js, WebAssembly и реверс-инжиниринга сетевых протоколов.

1. Проблема: Почему видео с Reddit часто «немые»?

Если вы попробуете проанализировать сетевой трафик видео на Reddit через DevTools, вы заметите, что единого видеофайла не существует. Вместо этого браузер загружает сотни мелких сегментов (.m4s или .ts).
1.1 Разделение потоков (Split Streams)
Reddit использует архитектуру раздельных потоков для видео и аудио:
• Video Track: Содержит только визуальный ряд в различных разрешениях (1080p, 720p, 480p и т.д.), но полностью лишен звука.
• Audio Track: Отдельный независимый поток с аудиоданными.
Техническая сложность: Просто скачав URL видеопотока, вы получите «немое кино». Чтобы предоставить пользователю полноценный файл, загрузчик должен извлечь оба потока, синхронизировать их и объединить (мультиплексировать) в единый контейнер.

2. Извлечение метаданных и манифестов

Первым шагом к автоматизации загрузки является поиск «источника истины» — файлов манифеста (.mpd для DASH или .m3u8 для HLS).
2.1 Использование JSON-эндпоинтов Reddit
Одной из самых удобных для разработчиков особенностей Reddit является его JSON-интерфейс. Добавив .json к любому URL поста, мы получаем доступ к структурированному дереву данных.
• Целевой узел: data.children[0].data.secure_media.reddit_video
• Ключевые поля: Мы извлекаем dash_url для DASH-манифеста или fallback_url для упрощенного стриминга.
2.2 Обход ошибки 403 Forbidden
CDN Reddit (v.redd.it) защищен проверками заголовков. Обычные запросы через fetch часто отклоняются, если заголовок User-Agent не является доверенным или отсутствует заголовок Referer. Наш бэкенд реализует уровень эмуляции заголовков, который имитирует среду реального браузера, обеспечивая стабильное извлечение ссылок.

3. Архитектура: Трансмультиплексирование на стороне клиента с FFmpeg.wasm

Традиционные загрузчики отправляют потоки на сервер, объединяют их с помощью FFmpeg и передают готовый файл пользователю. Это неэффективно и дорого с точки зрения инфраструктуры.
3.1 Мощь WebAssembly
В нашем инструменте на https://twittervideodownloaderx.com/reddit_downloader_ru мы перенесли тяжелую обработку в браузер пользователя с помощью FFmpeg.wasm.
• Lossless Transmuxing: Мы используем флаг -c copy. Это означает, что мы не перекодируем видео (что заняло бы много времени и снизило качество), а просто переносим пакеты из двух контейнеров в один .mp4.
• Конфиденциальность по умолчанию: Поскольку объединение происходит в оперативной памяти браузера пользователя, видеоконтент никогда не касается наших дисков.
• Отсутствие задержек: Нет необходимости тратить время на загрузку готового файла с сервера — он генерируется локально и сохраняется мгновенно.

4. Решение проблемы CORS (Cross-Origin Resource Sharing)

Политика безопасности браузера запрещает скрипту на одном домене напрямую скачивать бинарные данные с домена v.redd.it.
4.1 Прозрачный стриминг-прокси
Мы спроектировали высокопроизводительный Node.js Proxy:

  1. Клиент отправляет запросы на сегменты видео/аудио через наш прокси.
  2. Прокси удаляет ограничивающие CORS-заголовки CDN Reddit.
  3. Прокси добавляет заголовок Access-Control-Allow-Origin: *.
  4. Данные передаются обратно клиенту через ReadableStream. Такой подход гарантирует, что использование оперативной памяти нашим сервером остается минимальным, независимо от размера видео.

5. Параллельная загрузка сегментов (Async Concurrency)

Видео в форматах DASH/HLS состоят из сотен фрагментов. Последовательная загрузка каждого фрагмента создает узкое место. Мы внедрили асинхронный пул обещаний (Promise Pool):
JavaScript
// Концептуальный пример параллельной загрузки сегментов
async function downloadInParallel(urls, concurrencyLimit) {
const results = [];
const pool = new PromisePool(urls, concurrencyLimit); // например, 10 потоков
await pool.start(async (url) => {
const segment = await fetchWithRetry(url);
results.push(segment);
});
return results;
}
Благодаря параллелизации запросов мы достигаем скорости загрузки, которая ограничена только пропускной способностью канала пользователя, а не задержками протокола.

6. Заключение: Инженерия для удобства пользователя

Создание загрузчика для Reddit — это не просто написание скрипта для парсинга ссылок. Это упражнение в современной веб-архитектуре, требующее баланса между проксированием на стороне сервера и обработкой данных на стороне клиента с помощью WebAssembly.
Если вы ищете инструмент, который работает быстро, уважает вашу приватность и выдает идеальное качество 1080p со звуком, попробуйте наше решение: 👉 Reddit Video Downloader (Русская версия)
Технические преимущества:
• Оригинальное качество: Никакого сжатия, копия оригинального потока 1:1.
• Поддержка DASH/HLS: Полная совместимость со всеми типами стриминга Reddit.
• Кроссплатформенность: Работает на мобильных устройствах и ПК без установки приложений.
Буду рад обсудить технические детали в комментариях! Использовали ли вы FFmpeg.wasm в своих проектах для манипуляции медиа в браузере?

Tags: #JavaScript #WebDev #NodeJS #WebAssembly #FFmpeg #Reddit #Streaming #Architecture