Как подписаться на ленту YouTube из командной строки Linux?

Вопрос или проблема

Я хочу подписаться на канал YouTube и автоматически загружать новые видео на свой компьютер с Linux.

Я знаю, что могу сделать это, например, с помощью Miro, но не буду смотреть видео в Miro, хочу выбирать качество и хотел бы запускать это как cronjob.

Это должно уметь:

  • определять, какие элементы ленты новые, и не загружать старые элементы
  • возобновлять (или хотя бы скачивать заново) неудачные/незавершенные загрузки из предыдущих сессий

Существуют ли какие-либо готовые решения для этого?

Если нет, то мне бы было достаточно (может даже предпочтительнее) просто иметь командную строку считывателя RSS, которая запоминает, какие элементы уже были, и записывает новые URL видео (например, http://www.youtube.com/watch?v=FodYFMaI4vQ&feature=youtube_gdata из http://gdata.youtube.com/feeds/api/users/tedxtalks/uploads) в файл.
Я мог бы затем выполнить остальное с помощью скрипта bash и youtube-dl.

Какие программы могли бы быть полезны для этой цели?

Наконец, я сделал это с помощью этого скрипта bash:

#!/bin/bash

conffile="$@"

if [ ! -f "$@" ] || [ 3 -ne $(wc -l "$@" | grep -o '^[0-9]*') ]; then
        echo "Этот скрипт записывает список новых ID видео в выходной файл."
        echo "Аргумент должен быть файлом, содержащим три строки:"
        echo "      строка 1: URL ленты"
        echo "      строка 2: Выходной файл"
        echo "      строка 3: Самый новый ID с последнего вызова программы. Оставьте пустым для первого запуска."

        exit 1
fi

mapfile -t < "$conffile"
url="${MAPFILE[0]}"
outfile="${MAPFILE[1]}"
lastid="${MAPFILE[2]}"

echo "Обрабатывается $id:"

allids=$(wget -q -O- "$url" | sed 's,href,\nhref,g' | sed -n -e "s,^.*href="http://www.youtube.com/watch?v=\([A-Za-z0-9_-]*\).*$,\1,p")

for id in $allids; do
    if [ "$lastid" == "$id" ]; then echo "Новых элементов не осталось." >&2; break; fi
    echo "$id"
    echo "Добавление $id" >&2
done | tac >> "$outfile"

newlastid=$(echo $allids | grep -o "^[A-Za-z0-9_-]*")

echo  "$url"       > "$conffile"
echo  "$outfile"   >> "$conffile"
echo  "$newlastid" >> "$conffile"

Он читает URL ленты, выходной файл и самое новое известное видео из файла конфигурации, а затем извлекает ID видео из ленты. Эти ID затем сравниваются с последним известным ID (самый новый элемент ленты в первую очередь). Элементы, новее этого, будут добавлены в выходные файлы (теперь самый старый элемент в первую очередь).

Вот пример файла конфигурации youtube_tedx.conf:

http://gdata.youtube.com/feeds/api/users/tedxtalks/uploads
~/Documents/Movies/tedx/list.all
VxKMeE-gTQY

Который будет использоваться вызовом ./get_new_youtube.sh youtube_tedx.conf.

Выходной файл (list.all) затем может быть обработан, например, с помощью youtube-dl с командой типа youtube-dl -tca list.all && rm list.all.

Ответ или решение

Существует множество способов автоматизировать процесс подписки на YouTube-канал и автоматической загрузки видео с помощью инструментов командной строки на Linux. Один из наиболее популярных и мощных инструментов для этой задачи — это youtube-dl, который позволяет скачивать видео с YouTube и других платформ. Однако, так как вы хотите интегрироваться с RSS-лентой и осуществлять загрузку в фоновом режиме с возможностью планирования задач через cron, подход должен быть комплексным, включающим несколько элементов.

Теория

Основной задачей является следующее:

  1. Получение RSS-ленты канала.
  2. Определение новых видео, которых не было в предыдущих загрузках.
  3. Загрузка этих новых видео в выбранном разрешении.
  4. Контроль закачек на предмет ошибок и автоматические перезапуски в случае неудач.

Для этого мы будем использовать wget для обработки RSS-ленты, скрипт на Bash для парсинга и youtube-dl для загрузки видеофайлов. Управление выполнением скрипта обеспечит Cron.

Пример

Как вы уже справедливо заметили, главное — это идентифицировать новые записи. Скрипт, который вы уже описали, делает большую часть этой работы. Позвольте предоставить расширенное объяснение и улучшение для полноты решения.

Шаги:

  1. Создание конфигурационного файла:

    В файле будет содержаться URL RSS-ленты, путь к файлу для записи ссылок на новые видео и идентификатор последнего загруженного видео.

    http://gdata.youtube.com/feeds/api/users/tedxtalks/uploads
    ~/Documents/Movies/tedx/list.all
    VxKMeE-gTQY
  2. Скрипт на Bash:

    Основной скрипт get_new_youtube.sh будет разбирать RSS-ленту, находить новые идентификаторы видео и добавлять их в ваш файл.

    #!/bin/bash
    
    conffile="$@"
    
    if [ ! -f "$@" ] || [ 3 -ne $(wc -l < "$@") ]; then
        echo "Этот скрипт записывает список новых идентификаторов видео в выходной файл."
        echo "Аргумент должен быть файлом, содержащим три строки:"
        echo "      строка 1: URL фида"
        echo "      строка 2: Выходной файл"
        echo "      строка 3: Последний ID из предыдущего вызова программы. Оставьте пустым для первого запуска."
    
        exit 1
    fi
    
    mapfile -t < "$conffile"
    url="${MAPFILE[0]}"
    outfile="${MAPFILE[1]}"
    lastid="${MAPFILE[2]}"
    
    echo "Обработка $url:"
    
    allids=$(wget -q -O- "$url" | sed 's,href,\nhref,g' | sed -n -e "s,^.*href=\"http://www.youtube.com/watch?v=\([A-Za-z0-9_-]*\).*$,\1,p")
    
    for id in $allids; do
        if [ "$lastid" == "$id" ]; then echo "Нет новых элементов." >&2; break; fi
        echo "$id"
        echo "Добавление $id" >&2
    done | tac >> "$outfile"
    
    newlastid=$(echo $allids | grep -o "^[A-Za-z0-9_-]*")
    
    echo "$url" > "$conffile"
    echo "$outfile" >> "$conffile"
    echo "$newlastid" >> "$conffile"
  3. Загрузка новых видео с помощью youtube-dl:

    Далее, файл list.all может передаваться в youtube-dl для автоматической загрузки видео. Это можно сделать, например, с помощью команды:

    youtube-dl -tca list.all && rm list.all

    Этот вызов обеспечит загрузку всех видео, ссылки на которые содержатся в list.all, после чего файл будет удален для предотвращения повторных загрузок.

  4. Автоматизация с помощью Cron:

    Для автоматизации выполнения этого сценария еженедельно или ежемесячно, можно настроить Cron. Отправьте скрипт в выполнение при каждом запуске Cron для обновления и загрузки новых видео:

    crontab -e

    Добавьте следующую строку, чтобы скрипт выполнялся ежедневно, например, в полночь:

    0 0 * * * /path/to/get_new_youtube.sh /path/to/youtube_tedx.conf

Применение

Этот метод позволяет полностью автоматизировать процесс подписки на YouTube-канал и загрузки новых видео на ваш локальный компьютер. Поскольку youtube-dl поддерживает различные форматы и параметры качества, можно легко выбрать желаемое качество загрузки, просто изменив параметры команды. Например, добавив -f best для загрузки видео в максимальном доступном качестве.

Итак, ваш Linux-сервер будет круглосуточно отслеживать обновления на YouTube-каналах, которые вы добавите в конфигурационные файлы, загружая новые видео автоматически и оптимально. Это особенно полезно для пользователей, которые предпочитают хранить архив видео или которым необходимо обрабатывать видео в автономном режиме.

Оцените материал
Добавить комментарий

Капча загружается...