Важный
Активная разработка этого репозитория приостановлена с 14 июля 2023 г. Хотя в некоторых сценариях он все еще может работать, имейте в виду, что поддержка теперь осуществляется исключительно сообществом, а PR в настоящее время не объединяются с репозиторием. Для получения постоянных обновлений мы рекомендуем вам изучить такие форки, как @distube/ytdl-core. Мы можем вернуться к разработке в будущем. Спасибо за ваш интерес и длительную поддержку!
С уважением, TFAN, 13 августа 2024 г.
Еще один модуль загрузки YouTube. Написан только с использованием Javascript и дружественного к узлам интерфейса потоковой передачи.
Вы можете связаться с нами для поддержки на нашем чат-сервере
const fs = require('fs');const ytdl = require('ytdl-core'); // TypeScript: импортируем ytdl из 'ytdl-core'; с --esModuleInterop// TypeScript: импортировать * как ytdl из 'ytdl-core'; с --allowSyntheticDefaultImports// TypeScript: import ytdl = require('ytdl-core'); ни с одним из вышеперечисленных ytdl('http://www.youtube.com/watch?v=aqz-KE-bpKQ') .pipe(fs.createWriteStream('video.mp4'));
Попытка загрузить видео с указанного URL-адреса. Возвращает читаемый поток. options
могут иметь следующее, в дополнение к любой опции getInfo()
и опции chooseFormat()
.
range
— диапазон байтов в форме {start: INT, end: INT}
, который указывает часть файла для загрузки, т. е. {начало: 10355705, конец: 12452856}. Не поддерживается в сегментированных форматах (DASH MPD, m3u8).
При этом загружается часть файла, а не отдельно смонтированное видео.
begin
- Во сколько в видео начать. Поддерживает форматы 00:00:00.000
, 0ms, 0s, 0m, 0h
или количество миллисекунд. Пример: 1:30
, 05:10.123
, 10m30s
.
Для живых видео это также принимает метку времени Unix или объект Date и по умолчанию имеет значение Date.now()
.
Этот вариант не очень надежен для видео, не связанных с прямой трансляцией, см. № 129 и № 219.
liveBuffer
— сколько времени буфер использовать для живого видео в миллисекундах. По умолчанию — 20000
.
highWaterMark
— какая часть видео загружается в буфер в память. Дополнительную информацию см. в документации узла. По умолчанию 512 КБ.
dlChunkSize
— если выбран формат только видео или только аудио, загрузка разделяется на несколько частей, чтобы избежать регулирования. Эта опция определяет размер каждого фрагмента в байтах. Установка значения 0 отключает фрагментирование. По умолчанию 10 МБ.
IPv6Block
— блок IPv6 для ротации, альтернатива использованию прокси. Читать далее. По умолчанию undefined
.
ytdl.videoInfo
— Информация.
ytdl.videoFormat
— формат видео.
Генерируется при получении info
о видео вместе с выбранным форматом для загрузки.
number
— длина фрагмента в байтах или номер сегмента.
number
— общее количество загруженных байтов или сегментов.
number
— общее количество байтов или сегментов.
Генерируется всякий раз, когда получен новый фрагмент. Передает значения, описывающие ход загрузки.
Все события miniget пересылаются и их можно прослушивать из возвращенного потока.
Вызов, чтобы прервать и остановить загрузку видео.
Используйте это, если вы хотите получить только метаинформацию из видео.
Получает метаинформацию из видео. Включает дополнительные форматы и готовый к загрузке расшифрованный URL-адрес. Это то, что функция ytdl()
использует внутри себя.
options
могут иметь следующее
requestOptions
— все, что можно объединить с параметрами запроса, с которыми вызывается минигет, например headers
.
requestCallback
– предоставить функцию обратного вызова, которая получает объекты потока запросов мини-get, используемые при получении метаинформации.
lang
— двухсимвольный символ языка. По умолчанию — en
.
Получив метаданные из видео с помощью функции ytdl.getInfo
, вы можете передать эту информацию вместе с другими параметрами в эту функцию.
Может использоваться, если вы хотите выбрать формат самостоятельно. Выдает ошибку, если не удается найти подходящий формат.
options
могут иметь следующее
quality
- качество видео для загрузки. Может быть значением itag, списком значений itag или одной из следующих строк: highest
/самый lowest
/самый highestaudio
/ lowestaudio
/ highestvideo
/ lowestvideo
. highestaudio
/ lowestaudio
пытаются минимизировать битрейт видео для одинаково хороших аудиоформатов, тогда как highestvideo
/ lowestvideo
пытаются минимизировать звук соответственно. По умолчанию установлено highest
, при котором предпочтение отдается форматам, содержащим как видео, так и аудио.
Типичные форматы видео будут отсортированы по quality: 'highest'
itag container quality codecs bitrate audio bitrate 18 mp4 360p avc1.42001E, mp4a.40.2 696.66KB 96KB 137 mp4 1080p avc1.640028 4.53MB 248 webm 1080p vp9 2.52MB 136 mp4 720p avc1.4d4016 2.2MB 247 webm 720p vp9 1.44MB 135 mp4 480p avc1.4d4014 1.1MB 134 mp4 360p avc1.4d401e 593.26KB 140 mp4 mp4a.40.2 128KB
Формат 18 с разрешением 360p будет выбран первым, поскольку это формат высочайшего качества как для видео, так и для аудио. Если вам нужен формат более высокого качества с видео и аудио, см. раздел об обработке отдельных потоков.
filter
— используется для фильтрации списка форматов на выбор. Может быть audioandvideo
или videoandaudio
для фильтрации форматов, содержащих как видео, так и аудио, video
для фильтрации форматов, содержащих видео, или videoonly
для форматов, содержащих видео и без дополнительной звуковой дорожки. Также может быть audio
или audioonly
. Вы можете указать функцию фильтрации, которая вызывается для каждого доступного формата. Эта функция получает объект format
в качестве первого аргумента и должна возвращать true, если формат предпочтителен.
// Пример с пользовательской функцией function.ytdl(url, { filter: format => format.container === 'mp4' })
format
— в основном используется для загрузки определенных видео- или аудиопотоков. Это может быть определенный объект format
, возвращаемый из getInfo
.
При указании этой опции параметры filter
и quality
будут игнорироваться, поскольку формат указан явно.
// Пример выбора формата видео.let info = await ytdl.getInfo(videoID);let format = ytdl.chooseFormat(info.formats, {quality: '134' });console.log('Формат найден!', формат);
Если вы хотите работать только с некоторыми форматами, вы можете использовать опцию filter
выше.
// Пример фильтрации форматов только для аудио.let info = await ytdl.getInfo(videoID);let audioFormats = ytdl.filterFormats(info.formats, 'audioonly');console.log('Форматы только со звуком: ' + аудиоформаты.длина);
Возвращает true, если данная строка соответствует формату идентификатора YouTube.
Возвращает true, если удалось проанализировать действительный идентификатор видео.
Возвращает идентификатор видео из URL-адреса YouTube. Выдает ошибку, если не удается проанализировать идентификатор.
То же, что и вышеописанный ytdl.getURLVideoID()
, но его можно вызвать напрямую с идентификатором видео, и в этом случае он возвращает его. Это то, что ytdl использует внутри себя. Выдает ошибку, если не удается проанализировать идентификатор.
Строка версии взята непосредственно из package.json.
ytdl не может загружать видео, которые относятся к следующим категориям:
Региональные ограничения (требуется прокси)
Частный (если у вас есть доступ, требуются файлы cookie)
Прокат (если у вас есть доступ, требуются файлы cookie)
Контент YouTube Premium (при наличии доступа требуются файлы cookie)
В настоящее время поддерживаются только прямые трансляции HLS. Другие форматы будут отфильтрованы в ytdl.chooseFormats.
Созданные ссылки для скачивания действительны в течение 6 часов и могут быть загружены только с одного и того же IP-адреса.
При выполнении слишком большого количества запросов YouTube может заблокироваться. Это приведет к тому, что ваши запросы будут отклонены с кодом HTTP-StatusCode 429. Следующие шаги могут вам помочь:
Обновите ytdl-core до последней версии
Используйте прокси (пример можно найти здесь)
Расширьте идею прокси, чередуя (IPv6-)адреса
прочитайте это для получения дополнительной информации об этом
Используйте файлы cookie (пример можно найти здесь)
чтобы это вступило в силу, вам нужно СНАЧАЛА дождаться истечения текущего лимита скорости.
Подождите (обычно это проходит в течение нескольких дней)
Для задач с интенсивным количеством запросов может быть полезно распределить ваши запросы по нескольким исходным IP-адресам. Изменение исходного IP-адреса, который вы используете, аналогично использованию прокси-сервера, за исключением обхода ограничений, таких как блокировка региона. Большее количество IP-адресов приводит к меньшему количеству запросов на один IP-адрес и, следовательно, увеличивает ваш лимит скорости. Поскольку адреса IPv4 являются ограниченным ресурсом, мы советуем использовать IPv6.
Использование блока IPv6 по сути означает получение миллионов адресов IPv6 по вашему запросу. В блоке IPv6 /64 (который обычно представляет собой блок, предоставляемый одному дому) содержится 18 446 744 073 709 551 616 уникальных адресов IPv6. Это позволит вам делать каждый запрос с другим адресом IPv6.
Несмотря на то, что использование IP-блока помогает избежать ограничений скорости, вам необходимо настроить хост-систему на прием HTTP-трафика от каждого сообщения в IP-блоке. Мы не можем помочь вам с настройкой какого-либо конкретного хоста/хостинг-провайдера, но поиск в Интернете, скорее всего, поможет.
Обычно видео 1080p или выше не содержат закодированного звука. Аудио необходимо загрузить отдельно и объединить через библиотеку кодирования. ffmpeg
— наиболее широко используемый инструмент, в котором доступно множество модулей Node.js. Используйте объекты format
, возвращаемые из ytdl.getInfo
, для загрузки определенных потоков и их объединения в соответствии с вашими потребностями. Посмотрите example/ffmpeg.js, чтобы увидеть пример этого.
YouTube постоянно обновляет свой сайт, и это не редкость, когда он перестает работать. Если у вас это не работает и вы используете последнюю версию, не стесняйтесь открыть проблему. Обязательно проверьте, нет ли уже одного с такой же ошибкой.
Запустите тесты по адресу test/irl-test.js
чтобы убедиться, что это действительно проблема с ytdl-core.
npm run test:irl
Эти тесты не издеваются, они пытаются начать загрузку нескольких видео. Если это не помогло, то пришло время отладки. Если ошибка, которую вы получаете, связана с расшифровкой подписи, проверьте lib/sig.js
. В противном случае ошибка, скорее всего, произойдет в lib/info.js
.
npm установить ytdl-core@latest
Или для пользователей Yarn:
пряжа добавить ytdl-core@latest
Убедитесь, что вы устанавливаете последнюю версию ytdl-core, чтобы быть в курсе последних исправлений.
Если вы используете бота или приложение, использующее ytdl-core, например ytdl-core-discord или discord-player, это может зависеть от более старой версии. Чтобы обновить версию ytdl-core, эта библиотека должна обновить свой файл package.json
. Вы не можете просто изменить версию package.json
вашего проекта, приложение по-прежнему будет использовать свою старую версию ytdl-core.
Посмотрите в их репозитории, есть ли у них уже активный запрос на включение, который обновляет ytdl-core. Если они этого не сделают, откройте проблему с просьбой обновить ytdl-core или, что еще лучше, разветвите проект и отправьте запрос на включение обновленной версии.
Пока вы ждете объединения запросов на включение, вы можете указать на его ветку в вашем package.json
"ytdl-core-discord": "amishshah/ytdl-core-discord#dependentabot/npm_and_yarn/ytdl-core-2.0.1"
Проблема использования устаревшей версии ytdl-core стала настолько распространенной, что ytdl-core теперь проверяет наличие обновлений во время выполнения и каждые 12 часов. Если он обнаружит обновление, он выведет на консоль предупреждение с предложением обновиться. Из-за особенностей этой библиотеки важно всегда использовать последнюю версию, поскольку YouTube продолжает обновляться.
Если вы хотите отключить эту проверку обновлений, вы можете сделать это, указав переменную env YTDL_NO_UPDATE
.
env YTDL_NO_UPDATE=1 node myapp.js
ytdl — это оболочка CLI.
pully — еще одна оболочка CLI, предназначенная для форматов высокого качества.
ytsr — результаты поиска видео на YouTube.
ytpl — плейлист YouTube и преобразователь каналов.
Тесты написаны с помощью mocha
НПМ-тест