Python · 02.05.2025

Теперь и на Python

Про yt-dlp я уже написал целую кучу постов, включая небольшое исследование. Все посты про сабж можно найти по тегу.

Вашему вниманию очередной пост с переписыванием собственных скриптов, в связи с переходом на Linux. В принципе, никто не мешает использовать скрипт из этого поста и в окошках, если разместить рядом утилиту ffmpeg.

Скрипт сегодняшнего вечера — getvideo.py — осуществляет взаимодействие с утилитой yt-dlp. Конечно, только при условии её наличия в системе. Кроме самой утилиты необходима и хорошо знакомая нам программа ffmpeg, которая будет отвечать за слияние аудио и видео потоков в один итоговой медиафайл.

Код скрипта getvideo.py:

#!/usr/bin/python

import subprocess
import argparse
import shutil
import sys

# Заголовок скрипта
title="Скачивание видео с помощью yt-dlp"

# Команда yt-dlp
command="yt-dlp"

# Проверка доступности команды в системе
def is_command_available(command):
    return shutil.which(command) is not None

# Скачивание видео
def download_video(url):
    format_option = "-f bestvideo[height<=1080][ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best"
    merge_format = "--merge-output-format"
    output_path = "-o %(title)s.%(ext)s"
    try:
        subprocess.run([command, format_option, merge_format, 'mp4', url, output_path], check=True)
    except subprocess.CalledProcessError as e:
        print(f"Ошибка: {e}")

# Скачивание видео списком
def download_video_from_list(url_list):
    format_option = "-f bestvideo[height<=1080][ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best"
    merge_format = "--merge-output-format"
    output_path = "-o %(title)s.%(ext)s"
    try:
        subprocess.run([command, format_option, merge_format, 'mp4', '-a', url_list, output_path], check=True)
    except subprocess.CalledProcessError as e:
        print(f"Ошибка: {e}")

# Основная функция
def main():
    parser = argparse.ArgumentParser(description=title)
    parser.add_argument('--url', type=str, help='URL для скачивания видео.')
    parser.add_argument('--list', type=str, help='Путь к файлу со списком URL для скачивания.')
    args = parser.parse_args()
    if not is_command_available(command):
        print(f"Ошибка: {command} не установлен. Установите его и попробуйте снова.")
        sys.exit(1)
    if args.url and args.list:
        print("Ошибка: нельзя использовать одновременно параметры --url и --list.")
        sys.exit(1)
    if args.url:
        download_video(args.url)
    if args.list:
        download_video_from_list(args.list)

# Точка входа
if __name__ == "__main__":
    main()

Интерпретатор уже объявлен в коде скрипта и всё, что нужно — сделать его исполняемым:

sudo chmod +x getvideo.py

Вот так можно передать скрипту отдельную ссылку:

getvideo.py --url http://.../

А так можно осуществить пакетную передачу ссылок из простого линклиста:

getvideo.py --list list.txt

Линклист может быть любым файлом, содержащим простой текст. Даже стиль переноса строк в файле совершенно не важен.