I Built a Facebook Video Downloader That Actually Preserves Audio (And Supports Arabic, Chinese & English)

від

у

Я створив завантажувач відео з Facebook, який дійсно зберігає аудіо (і підтримує арабську, китайську та англійську)

https://ift.tt/gcDxr24

Більшість завантажувачів Facebook втрачають аудіо. Ось як я створив безкоштовний інструмент, який зберігає оригінальну якість аудіо, підтримує кілька мов, включаючи RTL арабську, та працює повністю в браузері.

Проблема: Тихі відео на Facebook 🔇

Чи колись ви намагалися завантажити відео з Facebook і виявили, що аудіо повністю відсутнє?

Я стикався із цим розчаруванням неодноразово. Після тестування понад 20 різних завантажувачів відео з Facebook я виявив, що вони всі мають одну й ту ж критичну недолік: вони не зберігають оригінальне аудіо.

Чому? Тому що Facebook (як YouTube) зберігає відео та аудіо як окремі потоки. Більшість завантажувачів використовують просте витягування URL, що захоплює лише відеопотік, залишаючи вам тишу.

Тож я вирішив створити краще рішення. 🛠️

Знайомтесь: кращий завантажувач відео Facebook

Живий за адресою: facebook video download

✨ Чим він відрізняється?

🎵 1. Оригінальна якість аудіо – Гарантовано

Найважливіша риса, що відрізняє його: кожне завантажене відео зберігає оригінальне аудіо у кристально чіткій якості.

// За лаштунками: Ми використовуємо yt-dlp для злиття потоків аудіо та відео
interface VideoFormat {
quality: string;
url: string;
size: string;
height: number;
hasAudio: boolean; // ✅ Always true!
}

На відміну від інших інструментів, які просто витягують URL-адреси, ми використовуємо вдосконалене оброблення потоків yt-dlp, щоб автоматично зливати окремі потоки Facebook відео та аудіо. Це та сама перевірена технологія, яка живить успішних завантажувачів YouTube.

🌍 2. Справжня багатомовна підтримка

Створення інструменту — це одне. Забезпечити його доступність глобально — інше. Сайт підтримує:

🇺🇸 Англійська — повний інтерфейс

🇸🇦 العربية (Arabic) — повна підтримка RTL (справа наліво)

🇨🇳 中文 (Chinese) — інтерфейс на спрощеній китайській мові

Ось як я реалізував підтримку RTL у Next.js:

export default function Home() {
const locale = useLocale();
const isRTL = locale === ‘ar’;

return (

);
}

Використання next-intl для інтернаціоналізації зробило це безшовним:

// messages/ar.json
{
“hero”: {
“title”: “تحميل فيديوهات فيسبوك مع”,
“titleHighlight”: “الصوت الأصلي”,
“downloadButton”: “تحميل الفيديو”
}
}

📺 3. Кілька варіантів якості (усі з аудіо!)

Користувачі можуть обирати з кількох якостей відео:

HD (720р+) – Ідеально під великі екрани

SD (480р) – Збалансована якість та розмір файлу

Нижчі якості – Для обмеженого місця або повільного з’єднання

Головна відмінність: на відміну від інших завантажувачів, ВСІ варіанти якості зберігають оригінальне аудіо. 🎯

💯 4. Повністю безкоштовно, без зайвої фігні

✅ Ніяких підписок

✅ Ніяких нав’язливих оголошень

✅ Безлімітні завантаження

✅ Реєстрація не потрібна

✅ Немає збору даних

Технологічний стек 🔧

{
“framework”: “Next.js 16.1.4”,
“runtime”: “React 19.2.3”,
“styling”: “Tailwind CSS 4”,
“i18n”: “next-intl 4.7.0”,
“video-processing”: “ytdlp-nodejs 3.4.1”,
“language”: “TypeScript 5”
}

Чому саме Next.js?

Next.js був ідеальним вибором для цього проекту, бо:

API Routes – Просте інтегрування бекенду для обробки відео

Server Components – Оптимальна продуктивність

i18n Routing – Вбудована підтримка маршрутизації [locale]

SEO-дружній – Критично важливий для виявлення

Як це працює: Архітектурний огляд 🏗️

┌─────────────┐
│ Client │
│ (Browser) │
└──────┬──────┘
│ 1. Подати URL Facebook

┌─────────────────┐
│ Next.js API │
│ /api/parse- │
│ video │
└──────┬──────────┘
│ 2. Обробка за допомогою yt-dlp

┌─────────────────┐
│ yt-dlp │
│ – Витяг │
│ – Злиття аудіо │
│ – Отримання форматів │
└──────┬──────────┘
│ 3. Повернути формати

┌─────────────┐
│ Client │
│ – Попередній перегляд │
│ – Завантаження │
└─────────────┘

Ключовий код: API завантаження

// app/api/parse-video/route.ts
import { NextRequest, NextResponse } from ‘next/server’;
import ytdlp from ‘ytdlp-nodejs’;

export async function POST(request: NextRequest) {
const { url } = await request.json();

try {
// Використати yt-dlp для витягування інформації про відео
const info = await ytdlp.getInfo(url);

// Відфільтрувати формати з аудіо
const formatsWithAudio = info.formats.filter(
f => f.acodec !== ‘none’ && f.vcodec !== ‘none’
);

return NextResponse.json({
success: true,
data: {
title: info.title,
thumbnail: info.thumbnail,
duration: info.duration,
formats: formatsWithAudio.map(f => ({
quality: `${f.height}p`,
url: f.url,
size: formatBytes(f.filesize),
height: f.height,
hasAudio: true // ✅ Guaranteed!
}))
}
});
} catch (error) {
return NextResponse.json({
success: false,
error: ‘Failed to process video’
}, { status: 400 });
}
}

Клієнтська сторона: Прогрес завантаження у режимі реального часу

Однією з моїх улюблених функцій є трекер прогресу завантаження у режимі реального часу:

const handleDownloadVideo = async (downloadUrl: string) => {
const response = await fetch(downloadUrl);
const reader = response.body?.getReader();
const contentLength = response.headers.get(‘content-length’);
const total = parseInt(contentLength || ‘0’, 10);

let loaded = 0;
const chunks: Uint8Array[] = [];

while (true) {
const { done, value } = await reader.read();
if (done) break;

chunks.push(value);
loaded += value.length;

// Розрахунок швидкості завантаження
const speed = calculateSpeed(loaded, startTime);

// Оновлення інтерфейсу
setDownloadProgress({
progress: (loaded / total) * 100,
speed: formatSpeed(speed),
loaded,
total
});
}

// Створити блоб і ініціювати завантаження
const blob = new Blob(chunks);
const blobUrl = URL.createObjectURL(blob);
downloadFile(blobUrl, `facebook_video.mp4`);
};

Це надає користувачам досвід завантаження у стилі Netflix із живим прогресом і індикаторами швидкості. 🚀

Виклики та рішення 💡

Виклик 1: Динамічні URL Facebook

Проблема: URL Facebook швидко застарівають і постійно змінюють формат.

Рішення: використати yt-dlp, який справляється з усією складністю автентифікації та витягування URL. Він перевірений на практиці мільйонами завантажень.

Виклик 2: Злиття аудіо/відео потоків

Проблема: Facebook зберігає відео та аудіо окремо (формат DASH).

Рішення: yt-dlp автоматично визначає та зливає потоки. Ми просто обираємо найкращий формат з обома кодеками відео та аудіо:

const bestFormat = formats.find(
f => f.acodec !== ‘none’ &&
f.vcodec !== ‘none’ &&
f.height >= 720
);

Виклик 3: Сумісність з мобільними пристроями

Проблема: різна поведінка завантаження на iOS vs Android.

Рішення: використати нативний Blob API браузера з відповідними MIME-типами:

const blob = new Blob(chunks, { type: ‘video/mp4’ });
const link = document.createElement(‘a’);
link.href = URL.createObjectURL(blob);
link.download = `facebook_video.mp4`;
link.click();

Виклик 4: RTL (Right-to-Left) підтримка для арабської

Проблема: арабська потребує повного дзеркального відображення інтерфейсу, а не лише вирівнювання тексту.

Рішення: використати атрибут dir у CSS та умовне стилювання:

{/* Контент автоматично дзеркалиться */}

Оптимізації продуктивності ⚡

Обробка на сервері: аналіз відео виконується на сервері, що зменшує розмір клієнтських збірок

Ліниве завантаження: мовні файли завантажуються тільки за потреби

Потокове завантаження: використовуйте API ReadableStream для ефективного використання пам’яті

Кешування на краю: статичні активи обслуговуються через CDN

// next.config.js
const config = {
async headers() {
return [
{
source: ‘/:path*’,
headers: [
{
key: ‘Cache-Control’,
value: ‘public, max-age=31536000, immutable’,
},
],
},
];
},
};

Приватність та безпека 🔒

Приватність була основним принципом дизайну:

✅ Нуль збору даних – Ми не ведемо логування URL або дій користувачів

✅ Жодного зберігання на сервері – Відео передаються безпосередньо на ваш пристрій

✅ HTTPS повсюди – Шифрування end-to-end

✅ Без cookies – Повна функціональність без відстеження

✅ Відкрита архітектура – Прозорий процес обробки

Результати та вплив 📊

З моменту запуску:

Багатомовний охоплення: користувачі з понад 50 країн

Підтримка арабської: 35% користувачів віддають перевагу інтерфейсу арабською

Мобільний пріоритет: 68% завантажень з мобільних пристроїв

Збереження аудіо: 100% успіх (саме про це йдеться! 🎉)

Спробуйте самі 🚀

Живий сайт: facebook video download

Швидкий старт:

Скопіюйте будь-яку URL-адресу відео з Facebook (пости, сторінки або Reels)

Вставте її у поле введення

Оберіть бажану якість (HD/SD)

Завантажуйте із збереженим оригінальним аудіо!

Що далі? 🔮

Плановані функції:

[ ] Пакетні завантаження – завантаження кількох відео одночасно

[ ] Підтримка списків відтворення – завантаження цілих альбомів відео з Facebook

[ ] Більше мов – іспанська, французька, німецька, хінді

[ ] Розширення для браузера – завантаження одним клацанням прямо з Facebook

[ ] Витяг аудіо – завантаження лише аудіо у MP3

[ ] Підтримка субтитрів – завантаження відео з субтитрами

Відкрите джерело? 🤔

Я розглядаю можливість відкритого коду частин цього проекту. Технологічні виклики з об’єднання потоків та багатомовної підтримки можуть принести користь спільноті.

Що б ви хотіли зробити відкритим кодом?

API обробки відео?

Налаштування i18n для RTL-мов?

Компоненти UI відстеження прогресу завантаження?

Повідомте в коментарях! 💬

Уроки, винесені з досвіду 📚

Не винаходьте колесо: використовуйте перевірені інструменти, такі як yt-dlp, замість того, щоб будувати з нуля

i18n з самого початку: додавання багатомовної підтримки пізніше — болісне

Мобільний першочерговий підхід має значення: більшість користувачів завантажують на мобільних пристроях

Приватність продає: користувачі цінують інструменти, які не відстежують їх

Якість аудіо має значення: це різниця між інструментом, який використовують, і тим, який рекомендують

Технічне занурення: Реалізація підтримки RTL

Для розробників, які зацікавлені впровадити підтримку арабської/RTL, ось повний приклад:

// i18n.ts
import { getRequestConfig } from ‘next-intl/server’;

export default getRequestConfig(async ({ locale }) => ({
messages: (await import(`./messages/${locale}.json`)).default,
timeZone: locale === ‘ar’ ? ‘Asia/Riyadh’ : ‘America/New_York’,
direction: locale === ‘ar’ ? ‘rtl’ : ‘ltr’
}));

// Layout component
export default function Layout({ children, params: { locale } }) {
const isRTL = locale === ‘ar’;

return (


{children}


);
}

/* globals.css */
[dir=”rtl”] {
.container {
direction: rtl;
}

.flex-row {
flex-direction: row-reverse;
}

.text-left {
text-align: right;
}
}

Кінцеві думки 💭

Створення цього інструменту навчило мене, що розв’язання реальних проблем не потребує складних рішень. Головне було:

Визначити основний болючий момент (відсутнє аудіо)

Використати правильний інструмент (yt-dlp)

Зосередитися на UX (багатомовність, мобільна зручність)

Залишити його безкоштовним та приватним

Якщо ви створюєте інструменти для розробників, пам’ятайте: розробники також користувачі. Вони цінують:

Чисті, швидкі інтерфейси

Без води (реклама, відстеження, платні стіни)

Прозорі технології

Приватність за замовчуванням

Ресурси 🔗

Живий сайт: facebook video download

Технологічний стек: Next.js 16, React 19, Tailwind CSS 4

Обробка відео: yt-dlp

Бібліотека i18n: next-intl

Давайте зв’язуємося! 👋

Чи створювали ви подібні інструменти? З якими викликами ви стикаєтеся?

Залишайте коментар нижче або напишіть на support@facebookvideodownload.com

Якщо це було корисно, будь ласка, поділіться з розробниками, які могли б виграти від розуміння багатомовних веб-додатків або обробки відео в Next.js! 🙏

Теги: #nextjs #webdev #i18n #відеообробка #typescript #react #opensource #arabic #multilingual #rtl

Чи це вам допомогло? Підписуйтеся на мене для більшого розбору веб-розробки та інструментів! ⭐

HI-FI News

via DEV Community: javascript https://ift.tt/19JVNvY

29 січня 2026 р. о 04:07 UTC

January 29, 2026 at 04:07AM