Скачать весь свой плейлист Вконтакте

Loady

Что делать если хочется скачать всю музыку из ВК на своей странице, даже если её очень много? (например over +1000 треков). Набросал скрипт на js, данный способ требует времени, но подойдёт для тех кто хочет запустить этот процесс в фоне, при этом не отвлекаясь от сёрфинга интернета и своих дел. Понадобится только браузер Chrome (Chromium).

Первым делом идём скачиваем расширение для браузера хром здесь. Всё что оно делает, это выводит новую кнопку для скачивания трека, но не предоставляет функционал для выкачивания всех треков (нет волшебной галочки «скачать все»). Не проблема. Переходим в свою Музыку, открываем инспектор кода (в хроме F12 клавиша), переходим на вкладку Console, вставляем код ниже и нажимаем клавишу Enter:

function getAllTracks(positionStart) {
    let height = 600;
    let step = 50; // выше - быстрее скрол, лучше не делать большой
    let scrollInterval = 0;

    const transformToArray = function (selector) {
        let buf = [];
        [].forEach.call(selector, function (el) {
            buf.push(el);
        });
        return buf;
    };

    function scrollToEndPage() {
        window.scrollTo(0, height);
        step++;
        height += step;
    }

    function downloadTracks() {
        clearInterval(scrollInterval);
        window.scrollTo(0, 0);
        var time = 3000;
        transformToArray(
            document.querySelectorAll('.mtz-vk-btn-icon')
        ).slice(positionStart)
            .forEach(function (value) {
                setTimeout(function () {
                    value.click();
                }, time);
                // задержка 10 сек... регулируйте в зависимости от скорости интернета
                time += 10000;
            });
    }

    function tryDownloadTracks() {
        if (height < document.body.scrollHeight) {
            scrollToEndPage();
        } else {
            downloadTracks();
        }
    }

    scrollInterval = setInterval(tryDownloadTracks, 30);
}

getAllTracks(0);

После этого начнётся процесс загрузки всех ваших треков. Страница переместится в самый низ, преодолевая lazyload загрузку треков, тем самым собирая все ваши треки вместе и начнёт загрузку, делая паузу в 10 секунд между скачиваниями (данную вкладку нельзя закрывать и уходить со страницы музыки на этой вкладке, пока не загрузится вся музыка). Останется только ждать, когда все треки загрузятся, а тем временем можно перейти в новую вкладку и работать оттуда. 10 секундная пауза вычислена экспериментальным путём, но при желании вы можете редактировать скрипт (только не делайте слишком малые значения, а то можно «повесить» браузер).

Если в последнюю строчку в коде передать другое число вместо 0, то скрипт начнет скачивание именно с этого трека по счету. Например, скачали 99 файлов и случайно закрыли/перезагрузили вкладку, поэтому чтобы заново всё не качать, в последней строке в коде передаём 100, — getAllTracks(100); (начать скачивать с 100го файла включительно). И снова запускаем весь скрипт в консоли.

Протестировано в браузере Chrome, полёт нормальный, я пока писал эту заметку, моя музыка уже почти вся загрузилась. В других браузерах (если у них есть доступ к расширению loady) тоже должно отработать.

download vk music

Удалить дубли треков в каталоге, после скачивания, можно одной командой:

find . -type f -regex '.*([0-9])\.mp3' -exec rm -rf {} \;

VK MP3 Dowloader

Устанавливаем расширение. Отличие от предыдущего расширения небольшие, — здесь появляются новые кнопки справа, по нажатию на которые открывается модальное окно с кнопкой скачивания.

vk-mp3-downloader

При тестировании скачивания я заметил, что если уйти из вкладки скачивания в том же браузере (хром/хромиум) в другую вкладку/окно браузера, то не обновляется модальное окно во вкладке скачивания и, как следствие, загружается один и тот же трек. Если работать в другом браузере или просто свернуть окно и работать в других приложениях ОС, то всё проходит нормально. Так что по возможности оставайтесь в браузере на данной вкладке или переходим в новый браузер (например Mozilla) и оттуда работаем.
(function () {
    const transformToArray = function (selector) {
        let buf = [];
        [].forEach.call(selector, function (el) {
            buf.push(el);
        });
        return buf;
    };

    const getAllTracks = function (positionStart) {
        let height = 600;
        let step = 50;
        let scrollInterval = 0;

        const scrollToEndPage = function scrollToEndPage() {
            window.scrollTo(0, height);
            step++;
            height += step;
        };

        const downloadTracks = function downloadTracks() {
            clearInterval(scrollInterval);
            window.scrollTo(0, 0);
            let time = 3000;
            transformToArray(document.querySelectorAll('.fngfng'))
                .slice(positionStart)
                .forEach(function (value) {
                    setTimeout(function () {
                        value.click();
                        document.getElementById('download').click();
                    }, time);
                    time += 10000; // задержка 10 сек...
                });
        };

        const tryDownloadTracks = function tryDownloadTracks() {
            if (height < document.body.scrollHeight) {
                scrollToEndPage();
            } else {
                downloadTracks();
            }
        };

        scrollInterval = setInterval(tryDownloadTracks, 30);
    };

    getAllTracks(0); // c какого трека скачивать?
})();


Похожие заметки:

Корзина на сайте — часть 2

В статье рассказывается как c помощью simpleCart.js делать такие вещи:

  • Выводить товары в том виде, в котором вам надо
  • Обрабатывать переданные товары и возвращать результат
  • Делать дальнейшие операции с заказом

Открыть здесь

Корзина на сайте — часть 1

В статье рассказывается как создать JavaScript корзину на сайте с помощью плагина simpleCart.js

Открыть здесь

Скрипт динамической ширины

Скрипт для равномерного распределения блоков по ширине родительского контейнера. В качестве контейнера может выступать любой блок как определенной ширины, так и неопределенной, вплоть до body. Что умеет?

  • Нарезать блоки на одинаковую ширину в зависимости от заданного количества колонок
  • Генерировать нужное количество колонок
  • Проставлять clearfix после оканчивающей ряд колонки, чтобы вовремя отменить обтекание
  • Удалять лишние clearfix

Открыть здесь


Перед тем как писать комментарии, рекомендую ознакомиться:

Markdown синтаксис »

Оформление кода »

Нужна аватарка »

Комментарии