Вопрос или проблема
Я хочу подписаться на канал 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, подход должен быть комплексным, включающим несколько элементов.
Теория
Основной задачей является следующее:
- Получение RSS-ленты канала.
- Определение новых видео, которых не было в предыдущих загрузках.
- Загрузка этих новых видео в выбранном разрешении.
- Контроль закачек на предмет ошибок и автоматические перезапуски в случае неудач.
Для этого мы будем использовать wget
для обработки RSS-ленты, скрипт на Bash для парсинга и youtube-dl
для загрузки видеофайлов. Управление выполнением скрипта обеспечит Cron.
Пример
Как вы уже справедливо заметили, главное — это идентифицировать новые записи. Скрипт, который вы уже описали, делает большую часть этой работы. Позвольте предоставить расширенное объяснение и улучшение для полноты решения.
Шаги:
-
Создание конфигурационного файла:
В файле будет содержаться URL RSS-ленты, путь к файлу для записи ссылок на новые видео и идентификатор последнего загруженного видео.
http://gdata.youtube.com/feeds/api/users/tedxtalks/uploads ~/Documents/Movies/tedx/list.all VxKMeE-gTQY
-
Скрипт на 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"
-
Загрузка новых видео с помощью
youtube-dl
:Далее, файл
list.all
может передаваться вyoutube-dl
для автоматической загрузки видео. Это можно сделать, например, с помощью команды:youtube-dl -tca list.all && rm list.all
Этот вызов обеспечит загрузку всех видео, ссылки на которые содержатся в
list.all
, после чего файл будет удален для предотвращения повторных загрузок. -
Автоматизация с помощью 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-каналах, которые вы добавите в конфигурационные файлы, загружая новые видео автоматически и оптимально. Это особенно полезно для пользователей, которые предпочитают хранить архив видео или которым необходимо обрабатывать видео в автономном режиме.