Mikhail Voronin

Как сохранить все видео с канала YouTube

     

 Оффтоп

1. Открыть страницу канала (www.youtube.com/channel/xxxxxx/videos) и раскрыть список видео полностью. Эту страницу надо сохранить.
2. Далее, с сохраненной страницы надо извлечь ссылки на видео.
  1. $ sed -ne 's/.*\(http.*watch[^"]*\).*/\1/p' < channel.html > urls.txt
Этот файл надо отредактировать, потому что туда попадают лишние строки.
3. Скачать страницы с видео, используя список ссылок.
  1. $ wget -i urls.txt
Можно проверить, что все страницы скачались, подсчитав количество ссылок и количество файлов.
  1. $ wc -l urls.txt
  2. 556 urls.txt
  3. $ find . -maxdepth 1 -type f | wc -l
  4. 556
4. Переместить файлы в отдельную папку и переименовать.
  1. mkdir html
  2. for f in `ls watch*`; do mv $f html; done
  3. i=0
  4. for f in `ls`; do mv $f $i; let "i=$i+1"; done
5. Выделить из файла строку со прямыми ссылками на видео.
  1. $ for f in `ls`; do sed -ne 's/.*adaptive_fmts":\("[^"]*\)".*/\1/p' < $f > $f.url; done
6. Декодировать содержимое файлов.
Ссылки в этих новых файлах хранятся в так называемом URLEncode формате. Надо раскодировать эти ссылки.
  1. $ alias urldecode='python -c "import urllib, sys; print urllib.unquote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"'
  2. $ for f in `ls`; do urldecode < $f > $f.decode; done
7. Получить прямые ссылки на видео.
Мы почти у цели. В каждом файле хранится несколько ссылок, каждая ведет к файлу в определенном формате и разрешении. Выделить нужный формат и разрешение не так просто. Кроме того, нужно ещё очистить ссылки от мусора. Надо детально разбирать список параметров в ссылка. И скорее всего придется писать какой-то более сложный скрипт - простым sed вряд ли получится обойтись. А пока есть такое половинчатое решение:
  1. $ sed -ne 's/.*\(https:.*type=video\/mp4\).*/\1/p' < 1.url.decode > 1.url.mp4type
  2. $ sed -i 's/\\u.*//' 1.url.mp4type
8. Собрать все ссылки в одном файле.
  1. $ for f in `ls *.mp4type`; do cat $f >> urls-mp4.txt; done
9. Скачать все видео
  1. $ wget -i urls-mp4.txt