Як я створив зручний медіа-завантажувач для Mac та Windows і переміг проблему з кодеками QuickTime

💡 Усі статті, обговорення, новини про Python — в одному місці. Приєднуйтесь до Python спільноти!

Кожен із нас час від часу стикається з потребою завантажити відео — лекцію з YouTube у дорогу, референс із Instagram Reels для роботи, звук для монтажу чи ролик із TikTok без водяного знака.

Що ми зазвичай робимо? Йдемо в гугл і відкриваємо перший-ліпший онлайн-сервіс. А там:

  1. Тонни сміття та реклами: банери сумнівних казино, агресивні спливаючі вікна (pop-ups), редіректи та ризик підхопити малварь.
  2. Обмеження та пейволи: «купіть Premium за $9.99/міс, щоб завантажити вище 720p».
  3. Консольний yt-dlp: потужний інструмент, але не всім зручно щоразу відкривати термінал і згадувати потрібні прапорці командного рядка (особливо друзям-гуманітаріям або колегам-дизайнерам).
  4. Важкі Electron-додатки: програми, які важать 400+ МБ і споживають пів гігабайта оперативки заради простого викачування відео.

Хотілося чогось легкого, красивого, безпечного і щоб працювало за принципом «1 клік — і готово».

⚙️ Що під капотом

Я обрав зв’язку Python + yt-dlp + FFmpeg + QuickJS:

  • Автоматичний буфер обміну: програма сама бачить скопійоване посилання при запуску — достатньо просто натиснути Enter.
  • Вибір аудіодоріжки: для YouTube-відео утиліта автоматично парсить доступні мовні доріжки, тож можна завантажити ролик одразу з українським дубляжем.
  • Нативні сповіщення системи: macOS Notification Center та Windows Tray Notifications сигналізують, коли файл завантажено в папку Downloads.
  • Жодного Electron: мінімалістичний та швидкий CLI/TUI інтерфейс з фірмовою кольоровою естетикою.

🍏 Головний челендж: чому QuickTime на Mac відмовлявся відкривати файли

З YouTube усе працювало ідеально: завантажувач брав найкраще відео та аудіо й зшивав їх через FFmpeg у звичний H.264/AAC.

Але коли ми почали тестувати Instagram Reels та TikTok, виліз неприємний баг: на Mac завантажені файли не відкривалися в QuickTime Player та через пробіл (QuickLook). macOS видавала помилку: «Цей файл не підтримується QuickTime».

У чому виявилася причина:

  1. Instagram та TikTok віддають уже готовий файл .mp4.
  2. Стандартний параметр yt-dlp --recode-video mp4 має оптимізацію: якщо вхідний файл уже має розширення .mp4, він просто пропускає обробку FFmpeg («already is in target format mp4»).
  3. Але що всередині цього MP4? Перевірка через ffmpeg -i показала, що Meta та TikTok масово стискають відео сучасними кодеками VP9 (vp09) або AV1 (av01), та ще й без faststart (moov atom записано в кінці файлу).
  4. QuickTime Player на macOS історично не підтримує VP9/AV1 всередині MP4 контейнера.

Як це було вирішено:

Я реалізував модуль постобробки:

# Автоматична перевірка кодеків та стандартизація під Apple QuickTime
probe = probe_media(filepath)
if probe["vcodec«] not in [«h264», «avc1»] or probe["pix_fmt«] != «yuv420p» or probe["acodec«] not in [«aac», «mp3»]:
# Перекодування в Apple H.264 (yuv420p) + AAC 192k + faststart moov atom
convert_to_quicktime_h264(filepath)
else:
# Якщо це вже чистий H.264 — миттєвий безвтратний ремукс (+faststart) за 0.05 сек
remux_faststart(filepath)

Тепер 100% завантажених відео відкриваються на Mac нативно, миттєво стартують через пробіл та імпортуються у Final Cut чи DaVinci Resolve без жодних сторонніх плеєрів.

📦 Як запаковано проєкт

  • Для macOS: зібрано .app бандл з усіма залежностями всередині, підписаний кодом, плюс додано .command скрипт швидкого запуску для обходу карантинних міток Gatekeeper при завантаженні з браузера.
  • Для Windows: портативна збірка з вбудованим ізольованим Python-середовищем та ffmpeg.exe (працює без необхідності встановлювати Python у систему).
  • Сайт: легкий двомовний лендінг на Firebase Hosting.

🔗 Де спробувати та як підтримати

Програма повністю безкоштовна, без реклами і збиралася «як для себе». Але якщо раптом захочете підтримати — на сайті є банка)

Буду дуже вдячний за тест, конструктивний фідбек, багрепорти та ідеї щодо нових фіч у коментарях!

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Гарна спроба, товаріщ полковник ФСБ, але ніт. :-D

На сайті вказано Open Source, але посилання на сорси я так і не знайшов.

Чувак — анонім з одгним постом. По стилю, схоже, той же самий мамкін хакер, який букваль місяць тому тут викладав таке ж саме вірусне смиття :)

Перепрошую, як тільки доберусь до компа все відкрию.

Як буду біля пк відкрию перепрошую

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

Корисна штука, дякую. Одна порада з власних граблів, якщо ви ffmpeg кладете в збірку: зафіксуйте його версію і не тягніть «останній». У ffmpeg 9 викинули -vsync (тепер -fps_mode), і в нас через це мовчки посипались скрипти, які роками працювали — портативна збірка з оновленим ffmpeg.exe зламається так само, а користувач побачить лише «щось пішло не так». Ще дрібниця по вашому ж кейсу: коли кодек уже h264, окрім ремуксу з +faststart варто примусово чистити нестандартний pix_fmt (yuvj420p з деяких джерел) — Final Cut його ковтає, а QuickLook знову малює чорний прев’ю.

Дуже дякую за відгук та пораду. Вже додав перевірку колірного діапазону в probe: тепер, якщо прилітає yuvj* або pc-range, відео примусово нормалізується через scale=in_range=auto:out_range=limited,format=yuv420p з правильними BT.709 NCLX тегами (-color_range tv -colorspace bt709).
Збірки на сайті вже оновив. Ще раз спасибі за допомогу зробити інструмент якіснішим! 🤝

Оце ти прям круто підготувався! Цілих два акаунта зарегав і з першого навіть пару каментів написав, щоб тут зробити вигляд, що хтось це вірусне лайно поставив і спробував :-D

подивітся будь ласка сайт там уже є відкритий код