Надіслав: Admin , дата:

Моя перша стаття була про завантаження фільмів зі сторінки за допомогою парсингу та виконання всього в 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