Блог им. empenoso
Я знаю что тема написания скрипта для скачивания видео с Ютуба не тема Смартлаба, но я захотел посмотреть интервью с Тимофеем Мартыновым через телевизор и вот во что это вылилось: как за 6 промтов к ChatGPT создать Python скрипт, скачивающий видео с YouTube для просмотра на телевизоре через медиа центр Kodi.
Последние месяцы Ютуб работает с перебоями: через сеть мобильного оператора вроде работает, но при подключении к сети проводного интернет-провайдера чаще всего ничего посмотреть нельзя, хотя в новостях что-то промелькнуло насчёт возобновления работы, но лично у меня ничего не поменялось.
Я использую свободный медиацентр Kodi для просмотра своей коллекции фильмов и сериалов, создавая домашний кинотеатр без ежемесячной абонентской платы. Это достигается за счёт того, что все файлы уже хранятся на собственном сетевом хранилище с локальным доступом или записаны прямо в памяти Kodi, который может быть установлен практически на любой платформе.
Раньше на Kodi можно было напрямую отправить YouTube ссылку и посмотреть любое видео. С августа 2024 года этот вариант больше не работает. Короткие видео можно посмотреть с телефона, но вот длинные интервью или подкасты так смотреть или слушать неудобно. К тому же телевизором можно управлять через Алису — она подключена к Home Assistant.
Конечно, чтобы скачать видео с Ютуба существует множество программ, но скачивается только сам видео файл и он будет отображаться в базе Kodi без обложки и описания. Вручную создавать обложку и описание и тратить на это своё время не вариант — зачем?
Разбираюсь как за 6 промтов к ChatGPT создать Python скрипт, скачивающий видео с YouTube и генерирующий описание и фанарт для Kodi.
Статья получилась длинная, потому что полностью приведены запросы и ответы, поэтому сделал содержание:
Промт №1: предлагаемая библиотека pytube не работает
Промт №2: предлагаемая библиотека yt-dlp требует аутентификацию для скачивания
Промт №3: ошибки в коде
Промт №4: видео и звуковая дорожка по отдельности
Промт №5: Kodi не распознаёт описания в .nfo файле
Промт №6: заработало
Итоговый вариант на GitHub
<code>Действуй как опытный программист Python. Напиши скрипт, который будет скачивать видео с сервиса Ютуб в максимальном качестве. На входе ссылка например "<iframe width="560" height="315" src="https://www.youtube.com/embed/_lvcEUi1MtE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>". На выходе .mkv файл. Дополнительно сгенерируй .nfo файл описания этого видео используя данные заголовка, описания и обложки видео. .nfo файл нужен чтобы загрузить эти данные в базу Kodi. Добавляй все комментарии на русском языке, продолжайте со мной общение на английском.</code>
Вот скрипт Python, использующий библиотеку pytube для загрузки видео YouTube в максимальном качестве и создания файла .nfo с метаданными для Kodi. Для работы с видео YouTube вам нужно будет установить pytube:
pip install pytube
По запросу в сценарий включены комментарии на русском языке:
Объяснение кода
Дайте мне знать, если вам нужны улучшения или объяснения!
<code>Эта библиотека не работает и возвращает ошибку:</code>
Ошибка, с которой вы столкнулись, указывает на то, что библиотека pytube вышла из строя из-за изменения API YouTube или структуры потоковой передачи, что является распространенной проблемой для библиотек, полагающихся на обратную разработку внутренних механизмов YouTube. Вот почему такие библиотеки часто ломаются, пока их сопровождающие не обновят их.
Альтернативное, надежное решение — использовать yt-dlp, мощный и активно поддерживаемый форк youtube-dl. Он хорошо подходит для загрузки видео с YouTube и других платформ. Вот как это реализовать:
Шаги:
pip install yt-dlp
Ниже приведен обновленный скрипт, использующий yt-dlp для загрузки видео в максимальном качестве и создания файла .nfo:
Основные характеристики:
Основные характеристики:
Почему yt-dlp?
Запустите скрипт и дайте мне знать, как он работает!
<code>Какая-то ошибка - что мне сделать?</code>
Ошибка указывает на то, что YouTube требует дополнительной проверки (например, входа в систему) для загрузки видео. Обычно это происходит, когда:
Ошибка указывает на то, что YouTube требует дополнительной проверки (например, входа в систему) для загрузки видео. Обычно это происходит, когда:
Чтобы решить эту проблему, вам необходимо предоставить аутентифицированные файлы cookie для yt-dlp, что обходит эти ограничения.
Решение: Используйте файлы cookie браузера
Обновите скрипт, чтобы передать файл cookie в yt-dlp:
Вызовите функцию, указав путь к файлу cookie:
Примечания
Сообщите мне, если это решит вашу проблему!
<code>Приведи пожалуйста полный файл ответа. Нет ошибки, но и нет загруженного видео:</code>
Ваш скрипт выглядит хорошо структурированным, но, похоже, в нем не хватает нескольких критических моментов для обеспечения правильной работы:
Ваш скрипт выглядит хорошо структурированным, но, похоже, в нем не хватает нескольких критических моментов для обеспечения правильной работы:
Вот исправленная и улучшенная версия скрипта:
Полный скрипт с корректировками
Ключевые улучшения
Дополнительные примечания
Дайте мне знать, если вам нужны дополнительные разъяснения!
<code>У меня скачалось отдельно видео и отдельно звуковая дорожка:</code>
Проблема возникает из-за предупреждения о том, что ffmpeg не установлен. Без ffmpeg yt-dlp не может объединить отдельные видео- и аудиодорожки в один файл, что приводит к отдельным загрузкам для видео- и аудиопотоков.
Проблема возникает из-за предупреждения о том, что ffmpeg не установлен. Без ffmpeg yt-dlp не может объединить отдельные видео- и аудиодорожки в один файл, что приводит к отдельным загрузкам для видео- и аудиопотоков.
Вот как решить проблему:
Шаги по устранению проблемы
sudo apt updatesudo apt install ffmpeg
brew install ffmpeg
ffmpeg -version
yt-dlp -f bestvideo+bestaudio --merge-output-format mkv -o "./downloads/%(title)s.%(ext)s"
Если вы уже загрузили видео- и аудиодорожки, вы можете объединить их вручную с помощью ffmpeg. Выполните следующую команду в терминале (при необходимости измените пути к файлам):
ffmpeg -i video.mp4 -i audio.m4a -c:v copy -c:a aac output.mkv
Замените video.mp4 и audio.m4a на фактические имена файлов ваших видео- и аудиодорожек.
Следующие шаги в вашем скрипте
После того, как вы убедитесь, что ffmpeg установлен:
Дайте мне знать, если вам нужна помощь с установкой или тестированием!
<code>Спасибо, всё заработало, но Kodi не распознаёт описания. Для того чтобы Kodi распознавал обложку файл должен заканчиваться -fanart.jpg, а сейчас .info.jpg. Для того чтобы Kodi распознавал описание файл должен заканчиваться .nfo, а сейчас .info.nfo. Вот выходные данные скрипта:</code>
Чтобы обеспечить совместимость с Kodi, нам нужно настроить скрипт так, чтобы изображение обложки и имена файлов .nfo соответствовали соглашениям Kodi. Вот обновленная версия скрипта:
Обновленный скрипт
Ключевые изменения
Пример вывода
После запуска скрипта вы должны увидеть:
[Объединение] Объединение форматов в «downloads\One Track Mind — I Like You.mkv» Удаление исходного файла downloads\One Track Mind — I Like You.f134.mp4 (передайте -k для сохранения) Удаление исходного файла downloads\One Track Mind — I Like You.f140.m4a (передайте -k для сохранения) Видео успешно загружено. Обложка сохранена: downloads\One Track Mind — I Like You-poster.jpg Файл .nfo успешно создан: downloads\One Track Mind — I Like You.nfo
Теперь Kodi должен распознать как метаданные видео, так и обложку.
Выложил итоговый рабочий вариант на Гитхаб:
https://github.com/empenoso/YouTube-to-Kodi/
Всего за 6 запросов и примерно полчаса времени можно сгенерировать рабочий код, не особенно вдаваясь в детали работы скрипта.
Автор:Михаил Шардин
25 ноября 2024 г.