Есть такая задача:
Скачать все видео с сервера YOUTUBE к себе в систему за раз (в один клик), но не просто, а с привязкой названия urls этих роликов к именам скачиваемых файлов. И на выходе необходимо иметь на своей стороне все видеофайлы с определённого YOUTUBE канала/плейлиста + информацию по каждому из этих файлов - его имя и url.
К пример, у вас есть свой сайт/ресурс и на его страницах встроены видео не через прямые ссылки своего сервера (когда файлы хранятся на вашем хостинге), а путем интеграции внешних urls через iframe или другой сторонний сервис (fv player и т.п.) в код вашей страницы.
Т.е., есть зависимость от сервера, где хранятся ваши видеоролики, и есть необходимость все их скачать оттуда и перезолить к себе на хостинг (для трансляции их уже со своего «дома») с последующим переименованием в базе данных своего сайта действующих urls на новые, по привязке ссылок YOUTUBE = название скаченного файла.
В силу возможной блокировки YOUTUBE сервиса, для определенных стран постсоветского пространства, данный парсер (скрипт) для некоторых может быть актуален.
Решим данную задачу с помощью серверного языка программирования php и некоторого функционала js.
Итак, Let's go.
Допустим необходимо скачать все видео с канала -https://www.youtube.com/@EnglishEasyPractice/videos
Переходим на страницу данного канала.
Нам понадобится 2-а скрипта на js.
1-ый - поможет нам через консоль браузера в начале раскрыть всю страницу со всеми роликами, путем автоматической и постепенной вертикальной прокрутки полосы браузера до её конца (чтобы весь DOM код был отображен на странице по мере подгрузки видео).
2-ой - уже непосредственно поможет в самой консоли браузера спарсить (вывести) названия всех urls, title и другую вспомогательную информацию, содержащуюся в коде по каждому видео.
Переходим в консоль разработчика нашего браузера(Google Chome).
Вставляем в консоль 1-ый скрипт и жмем Enter.
После завершения работы 1-го скрипта (когда вся страница раскроется), вставляем в консоль 2-ой скрипт и жмём Enter.
После проделанных процедур копируем из консоли весь выданный код и вставляем в обычный Excel файл.
Имеем следующее.
Excel файл имеет структуру с необходимыми нам полями – название ролика (title) и url видео.
Сохраняем xlsx себе на компьютер под любым названием.
Теперь переходим к написанию php скрипта, который и должен решить нашу задачу.
Всё будет реализовано в двух созданных php файлах:
- test_youtube.php
- video-downloader.php
Содержание файла test_youtube.php
Содержание файла video-downloader.php
Что описывает весь этот код
В test_youtube.php создаем форму html, с помощью которой вначале будем загружать наш файл xlsx на сервер, и кнопку «Скачать всё сразу», кликнув по которой будет осуществляться закачка всего списка спарсенных и выведенных на этой же станице urls.
Т.е. изначально нам необходимо будет загрузить наш файл xlsx на сервер, где и будет происходить работа с ним.
При загрузке файла на сервер скрипт предварительно провалидирует его на безопасность (название, расширения, формат загрузки) после чего с помощью подключенной внешней библиотеки PHPExcel распарсит и преобразует в массив такого плана.
Библиотеку PHPExcel подключим через require_once 'phpexcel/Classes/PHPExcel.php'.
Т.к. у нас установлена версия php 7.4, а более свежая и поддерживаемая библиотека PHPExcel работает начиная с php 8.0, поэтому не будем заморачиваться, а скачаем немного устаревшую версию из архива репозитория и подключим её через require_once, а не через composer. В данном случае это не принципиально.
Далее, с помощью API YOUTUBE и библиотеки php curl (для взаимодействия с API), а так же цикла foreach, переберём все urls нашего массива и сгенерируем списком на станице (всё в том же файле test_youtube.php ) необходимые ссылки для загрузки (скачивания) видеороликов.
Каждой ссылке присвоим get параметр urln, значение которого и будет обзывать (присваивать наименование) соответствующего файла для скачки. Назовем их, как идентифицируются все стандартные ссылки любого ролика на youtube в виде префикса после знака =.
После того, как ссылки сгенерированы и выведены на странице, клик по любой их них будет передавать get запросом наши данные 2-ому скрипту video-downloader.php, который уже непосредственно с помощью создаваемого http-заголовка и функции readfile будет считывать файл и записывать его в буфер вывода (загрузки).
Так как мы хотим, чтобы закачка видеороликов осуществлять не по одному (путём клика по каждой ссылке), а одним кликом и всех сразу, напишем js функцию download_everybody() в нашем исходном файле(test_youtube.php), которая будет привязана к событию клика нашей кнопки «Скачать все сразу».
Данный скрипт просто пробежится по списку всех видеороликов в DOM страницы, с интервалом в 5 секунд (в целях предосторожности возможной блокировки, как YOUTUBE, так и своего хостинга, из-за единовременной отправки большого количества запросов с одного IP), осуществляя клик по каждой их них, тем самыми отправляя её на загрузку.
В итоге все наши файлы по мере закачки окажутся в необходимой для нас папке, указанной через настройки браузера для загрузки файлов по умолчанию.
Чтобы браузер «не лёг», желательно всё-таки делить исходный xlsx файл на несколько и загружать их в несколько этапов, чтобы не забить оперативную память системы, а так же обезопаситься от возможной блокировки, из-за большого количества единовременных обращений к серверу с одного IP. Так же, необходимо учесть и квоту YOUTUBE на использование для этих целей своего API по выданному ключу. Как получить ключ для API YOUTUBE, в сети информации хватает.
В итоге, с помощью данного скрипт, мы можем загрузить/скачать все файлы с любого youtube канала/плейлиста, присвоив им уникальные названия (скачиваемых файлов), и тем самым получить необходимую привязку url youtube-ролика = название скачиваемого файла, что в дальнейшем при необходимости может упростить задачу переименования youtube-ссылок в базе дынных своего сайта на новые.