Пишем решение для скачивания видео с YouTube одной кнопкой

В прошлом моём посте выяснилось что не у всех котанов работает расширение Savefrom.net:

Да, мне не удобно качать видосы через Кобальт или подобные проги

Надо копировать ссылку видео, открывать программу или приложение, вставлять ссылку и только потом нажимать кнопку скачать. Это долго, а я уважаю своё время!

Поэтому я решила написать своё решение для скачивания видосиков с Youtube одной кнопкой. Будем использовать "мегапрогу" yt-dlp.

Для неайтишников надо наверно объяснить в чём будет сложность. Вот есть браузер, он работает в изолированной защищенной среде и из него напрямую нельзя запустить программу. А нам как то надо будет передавать ссылку на скачивание в yt-dlp. Без костылей никак.

Пишем решение для скачивания видео с YouTube одной кнопкой

Кстати уже готовое решение на её основе было описано на Реддит семь месяцев назад.

Стороннее решение с Reddit

Оно актуально только для Firefox и требует Python для работы. В нём в реестр Windows добавляется манифест, добавляющий расширение в список доверенных и позволяющий запускать питоновский скрипт. Этот скрипт позволяет запускать любой код в командной строке!!!
В общем делайте на свой страх и риск.

Инструкция:

1. Устанавливаем расширение:

2. Устанавливаем Python, если его нет:

3. Открываем настройки расширения Open With и выполняем инструкцию по завершению установки:

Пишем решение для скачивания видео с YouTube одной кнопкой

Для удобства создайте директорию D:\Program Files\yt-dlp (можно в любую другую). В неё скачайте скрипт open_with_windows.py.
Создайте здесь же файл install.bat с кодом:

python "D:\Program Files\yt-dlp\open_with_windows.py" install pause

Запустите его с правами администратора (без них скрипт не сможет добавить запись в реестр). Проверьте установки в настройках расширения.

4. Поскольку Open With - это расширение разработанное для проверки сайтов, то предполагалось что Вы добавите пути для всех браузеров.
В настройках расширения Open With нажмите "Добавить браузер".
Назовите его "360p", а команду введите так:

yt-dlp -o "G:\downloads\%(title)s.%(ext)s" -f "bestvideo[height<=360]+bestaudio" --no-playlist "%s"

где "G:\downloads" - Ваша директория для скачанных видео.
Данная команда запустит yt-dlp, который скачает аудио и видео лучшего качества высотой 360p. И объединит их в один файл при наличии у вас программы FFmpeg.

Почитать про параметры yt-dlp можно здесь:

По аналогии с "360p" добавьте свои форматы для скачивания.

5. Скопируйте в D:\Program Files\yt-dlp yt-dlp.exe, бинарник который будет скачивать видео с YouTube

6. Проверяем работу. Вынесите значок Open With на панель инструментов и находясь на youtube.com можно вызывать команды из выпадающего меню. При нажатии должно появится окно с логом скачивания видео.

Видео ускорено в 3 раза

Повторюсь что это расширение позволяет запускать любой код в командной строке! Есть ненулевая вероятность что злоумышленники смогут воспользоваться эти расширением.
По идее можно доработать код open_with_windows.py, в котором вызывается команды, чтобы в нём запускался исключительно yt-dlp.exe. Но...

Пишем решение для скачивания видео с YouTube одной кнопкой

В общем мне это решение не нравиться, т.к. только FF и оно перманентно даёт +100 очков к моей паранойи. На фиг его. Я написала свой "костыль".

Моё решение:

1. Скачиваем и устанавливаем NodeJS

2. Создаём директорию D:\Program Files\yt-dlp. Можно и другую, но тогда изменяйте путь к папке в дальнейших шагах.

3. Скачиваем yt-dlp.exe в D:\Program Files\yt-dlp

4. Опционально но строгорекомендуемо скачать и установить FFmpeg. Это программа будет объединять видео и аудио файлы в один контейнер. Без него скачанные видео и аудио будут в отдельных файлах.

5. В D:\Program Files\yt-dlp создаём файл yt-dlp.js с кодом

const Child_process=require('child_process'); const Path = require('path'); const Querystring = require('querystring'); const download_dir = 'G:\\downloads'; //директория для скачанных видео main(); async function main() { let query_format; let query_url; const decoded_params = Querystring.parse(decodeURI(process.argv[2]).substring(7)); ///.substr(7) для обрезки "yt-dlp:" query_format = decoded_params.format; query_url = decoded_params.url; console.log(query_format); console.log(query_url); if (!query_format || !query_url) process.exit(); let params_quality; switch (query_format) { case '360p' : params_quality = "bestvideo[height<=360]+bestaudio"; break; case '720p' : params_quality = "bestvideo[height<=720]+bestaudio"; break; case '1080p' : params_quality = "bestvideo[height<=1080]+bestaudio"; break; default: process.exit(); } const exec_params = []; exec_params.push(`-o "${Path.join(download_dir, '%(title)s.mp4')}"`); //путь до выходного файла exec_params.push(`-f "${params_quality}"`); //формат exec_params.push(`--no-playlist`); //только одиночные видео exec_params.push(`--merge-output-format mp4`); //контейнер для слитых видео+аудио exec_params.push(`"${query_url}"`); //ссылка ролика const process_ = Child_process.exec(`"${Path.join(__dirname, 'yt-dlp.exe')}" ${exec_params.join(' ')}`, (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`); } }) process_.stdout.on('data', function(data) { console.log(data); }); }

Замените в коде директории для скачанных видео на свою.
Как можно догадаться мы будем скачивать видео запуская команды вида:

node "D:\Program Files\yt-dlp​\yt-dlp.js" "yt-dlp:360p__https://www.youtube.com/watch?v=BsScWWJRBlg"

6. Создайте и запустите файл yt-dlp.reg для слияние с реестром

Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\yt-dlp] "URL Protocol"="" [HKEY_CLASSES_ROOT\yt-dlp\shell] [HKEY_CLASSES_ROOT\yt-dlp\shell\open] [HKEY_CLASSES_ROOT\yt-dlp\shell\open\command] @=\"D:\Program Files\nodejs\node.exe\" \"D:\Program Files\yt-dlp\yt-dlp.js\" \"%1\"

Замените "D:\Program Files\nodejs\node.exe" на свой путь до node.exe
Это создаст новый "класс" yt-dlp в реестре Вашей ОС.

Проверьте. Откройте ссылку в браузере:

yt-dlp:360p__https://www.youtube.com/watch?v=dQw4w9WgXcQ

Должно запуститься окно с логом работы yt-dlp

7. Устанавливаем в браузере UserScript для кнопочек на скачивание

// ==UserScript== // @name Yt-dlt Youtube Downloader // @namespace ¯\_(ツ)_/¯ // @include http://www.youtube.com/watch?* // @include http://youtube.com/watch?* // @include https://www.youtube.com/watch?* // @include https://youtube.com/watch?* // @require https://unpkg.com/default-passive-events // @version 0.1.0 // @author ¯\_(ツ)_/¯ // @description ¯\_(ツ)_/¯ // @grant GM.xmlHttpRequest // @connect youtube.com // @grant GM_addStyle // @run-at document-end // ==/UserScript== (() => { const formats = ['360p', '720p', '1080p', '360p+yandex', '720p+yandex']; //var video_id = window.location.href.match(/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/gi)[1]; const ytdlp_block__div = document.createElement('div'); ytdlp_block__div.style = `position: relative;`; const btn = document.createElement('p'); btn.innerText = 'Скачать'; btn.style = `display:block; margin:3px; padding:4px; background:#00cc00; border-radius:4px; color: #fff; text-decoration: none; font-size: 15px;`; ytdlp_block__div.appendChild(btn); const ytdlp_block__div__inner = document.createElement('div'); ytdlp_block__div__inner.style = 'display:none; position: absolute; z-index: 2;'; ytdlp_block__div.appendChild(ytdlp_block__div__inner); ytdlp_block__div.addEventListener('mouseenter',()=>{ ytdlp_block__div__inner.style.display = 'block'; }); ytdlp_block__div.addEventListener('mouseleave',()=>{ ytdlp_block__div__inner.style.display = 'none'; }); function ytdlp_block__create() { const btns=[]; formats.forEach((format)=>{ const btn = document.createElement('a'); btn.innerText = format; btn.target = '_blank'; btn.style = `display:block; margin:3px; padding:4px; background:#00cc00; border-radius:4px; color: #fff; text-decoration: none; font-size: 15px;`; btn.href = `yt-dlp:format=${format}&url=${window.location.href}`; btn.addEventListener('click', (event)=>{ event.preventDefault(); const new_win = window.open(encodeURI(event.target.href)); setTimeout(()=>{new_win.close()}, 0); }, {once: true}) btns.push(btn); }) ytdlp_block__div__inner.replaceChildren(...btns); } function yt_navigate_finished(event) { function block__add_try() { let container = document.querySelector('#above-the-fold #actions'); if (!container) return; ytdlp_block__create(); container.appendChild(ytdlp_block__div); clearInterval(check_timer); } const check_timer = setInterval(block__add_try, 200); } (function () { "use strict"; window.addEventListener("yt-navigate-finish", yt_navigate_finished, true); yt_navigate_finished(); })(); })();

8. Проверяем.

UserScript проверен на работу в ViolentMonkey FF и TamperMonkey Chrome.

yt-dlp.js и UserScript можно дорабатывать с учётом Ваших потребностей.

104
26
7
5
5
1
201 комментарий