
Мені не подобається ідея дивитись фільми в онайлні з поганим інтернет з'єднанням по причині лагів. Історія така, що я знайшов більш менш нормальний сайт з фільмами в українському дубляжі. Дослідив як працює плеєр і написав простий скрипт для завантаження відео.
Для порівнянння звичайний фільм з ДВД якістю важить 1.5Гіб на торрентах, а тут 500Мб і якість норм. Це влаштовує!
Алгоритм сервісу складається з декількох етапів: iframe лінка, плеєр всередині, кілька m3u файлів-плейлистів з різними параметрами якості компрессії відео і фінальний плейлист зі списком фрагментів відеофайлів.
Спочатку я робив все власноруч і потім за допомогою wget зробив простий bash loop який вантажив файли. І клеїв це добро через інший скрипт. Трохи згодом дізнався про функцію в ffmpeg по завантажені плейлиста і склейці відео автоматично! Простіше простого!
Наша задача заключається у пошуку кінцевого лінка на завантаження фрагментів. По-перше, ми маємо дістати URL атрибут з тегу IFRAME. Це можна досягти за допомогою команд hxnormalize, hxselect та hxwls з пакету html-xml-utils.
$ sudo apt install html-xml-utils
Блок div з iframe має наступний вигляд:
<div class="video-player-wrapper"> <iframe id="video-player" width="720" height="400" src="https://somewhere.web/1234" frameborder="0" allowfullscreen></iframe> </div>
створимо функцію щоб дістати посилання:
get_iframe_video_url() { echo $1 | wget -O- -i- --no-verbose | hxnormalize -x | hxselect -i "div.video-player-wrapper iframe" | hxwls }
Опісля ми маємо дістати URI плейлиста з сегментами. Він у js скрипті.
get_video_uri() { echo $1 | wget -O- -i- --no-verbose | grep -E -o 'file:"(.*)m3u8' | sed -n 's/file:"//p' | sed -n 's/index.m3u8//p' }
і останнє це склеїти всі сегменти за допомогою ffmpeg:
PLAYLIST="$VIDEO_URI/$QUALITY/index.m3u8" ffmpeg -i $PLAYLIST -c copy -bsf:a aac_adtstoasc "$DIRECTORY.mp4" -y
І'мя фінального файлу це остання частина посилання без розширення.
Приклад:
https://somewhere-onilne.web/movie/best-movie.html becomes best-movie.
get_directory_from_url() { echo $1 | sed 's#.*/##' } DIRECTORY=$(get_directory_from_url $URL); DIRECTORY="${DIRECTORY%.*}"
А ось перша ревізія скрипту і функція для створення списків на завантаження через wget і склейку через ffmpeg:
create_segments_file() { if test -f "$FILE_FFMPEG_LIST"; then rm $FILE_FFMPEG_LIST fi if test -f "$FILE_FFMPEG_LIST"; then rm $FILE_WGET_LIST fi # download movie playlist wget $VIDEO_URI/$QUALITY/index.m3u8 --output-document=pls.file --no-verbose LIST=$(grep segment pls.file) rm pls.file for f in $LIST; do echo "file '$DIRECTORY/$f'" >> $FILE_FFMPEG_LIST echo "$VIDEO_URI$QUALITY/$f" >> $FILE_WGET_LIST done echo "Saving files done." }
Тут gist: https://gist.github.com/onesixromcom/649a2b7ff95a78a5125b3994fbaec7aa