Моя перша стаття була про завантаження фільмів зі сторінки за допомогою парсингу та виконання всього в bash. Цього разу завдання має бути складнішим. Нам потрібно завантажити фільми зі списку відтворення, який завантажується за допомогою ajax.
Перше завдання — знайти та перевірити, як список епізодів відображається на сторінці. Я перевірив ajax-запит консолі браузера та знайшов PLAYLIST_ID у вихідному коді сторінки.
<div class="playlists-ajaxed" data-playlist_id="666"></div>
Отже, нам слід завантажити сторінку та отримати з неї лише ідентифікатор.
get_list_id() {
echo $1 |
wget -O- -i- --no-verbose |
hxnormalize -x |
sed -n 's/.*data-playlist_id="\([^"]\+\).*/\1/p'
}Мені було дуже цікаво, як працює ця гарна функція!
Далі нам потрібно зробити запит до користувацького URL-адреси та отримати результат у форматі JSON.
get_json_list() {
echo "https://somewebsite.com/ajax/playlists.php?playlist_id=$1" |
wget -O- -i- --no-verbose |
jq -r .response | # get value by response key
hxnormalize -x | # normalize html
hxselect -i "li[data-id=\"0_0\"]" | # select videos only from first player
sed 's/data-file/href/g' | #replacements to make hxwls work
sed 's/<li /<a /g' | #replacements to make hxwls work
hxwls
}Цікаво, що у відповіді JSON є ключ "response", який містить теги html! Ах, старі добрі часи jquery...
Щоб отримати правильні дані з JSON, я використовую програму "jq". jq - це легкий та гнучкий JSON-процесор командного рядка. https://stedolan.github.io/jq/
У html є ДВА списки відтворення, тому я вибрав елементи li лише для першого. Чудово, що всі вони мають однаковий атрибут data-id в елементі li. hxselect -i "li[data-id=\"0_0\"]".
Щоб остання команда працювала - hxwls, яка буде аналізувати HTML для посилань, я просто замінюю атрибут data-href в елементі li на href та "<li" на "<a". Працює ідеально.
У результаті у мене є змінна зі списком URL-адрес, яку можна обробляти, як у попередньому скрипті.
IFRAMES_LIST=$(get_json_list $PLAYLIST_ID)
if [ -z "$IFRAMES_LIST" ]; then
echo "No iframes found. exit"
exit
fi
for iframe in $IFRAMES_LIST;
do
VIDEO_URI=$(get_video_uri $iframe)
FILENAME=$(get_filename_from_url $VIDEO_URI)
PLAYLIST="$VIDEO_URI$QUALITY/index.m3u8"
ffmpeg -i $PLAYLIST -c copy -bsf:a aac_adtstoasc "$FILENAME.mp4" -y
doneНовий завантажувач для PRmovies доступний! Перегляньте статтю https://16rom.com/en/blog/prmovies-download-locally