Готовимся к весне

Качаем музыку для воркаутов

Скоро открытие страйкбольного сезона. А я за зиму распух и на меня не налезает бронежилет. Стал эдакий “рядовой фисташка”. Купил абонемент в X-Fit, взял классного персонального тренера… Но чтобы занятия были эффективны нужна музыка. Где ее взять быстро и налить плеер?

По запросу “free workout motivation music” нашел сайт c оной. Нет времени разбираться что там, работы много. Нужно все это залить в мой sony walkman nwz. Его прелесть в том, что он водонепроницаемый и с ним можно плавать в бассейне.

Первым делом открываем консоль и пишем код для сбора ссылок на странице:

{
let links = [];
    $('.playlist-btn-down.no-ajaxy')
.map(function(){
links.push(this.href)
});
    console.log(links.join('\n'));
}

Сохраняем все ссылки в файл list.txt. Если не хотим сохранять вручную, копируя ссылки из консоли, можем написать функцию для скачивания:

const save = (data, filename) => {
if(!data) return console.log('No data to save');
if(!filename) filename = 'chrome.txt';
if(typeof data === "object") data = JSON.stringify(data, void 0, 4);

let blob = new Blob([data], {type: 'text/plain'}),
e = document.createEvent('MouseEvents'),
a = document.createElement('a');

a.download = filename;
a.href = window.URL.createObjectURL(blob);
a.dataset.downloadurl = ['text/plain', a.download, a.href].join(':');

e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
a.dispatchEvent(e);
};

Вместо

console.log(links.join('\n'));

пишем

save(links.join('\n'), 'list.txt');

Тогда браузер сам предложит нам загрузить полученные данные.

Далее пишем простой баш скрипт:

#!/bin/bash
i=1
list=$(cat list.txt)
for url in $list
do
n=$(printf "%03d\n" $i) # числа вида 001, 012, 121
wget $url -O ./wget/m$n.mp3
((i = i + 1))
done

Все. Запускаем и идем работать. Через часик другой плеер будет полон всякой музыки для воркаутов =)

Почему не стал все делать wget’ом? Можно же было получить страницу и распарсить ее. Можно… Но я сделал как было быстрее. На все про все 10 минут и не более. Если бы файлы для скачивания имели расширение mp3, то вся суть закачки сводилась бы к 1й строке в bash:

wget -c -A '*.mp3' -r -l 1 -nd http://example.org/musics/

Но на том сайте, откуда брал я, нет расширений, а есть скрипты, которые отдают музыку по ID. Так что такой вариант не прокатил бы. Так же при загрузке в качестве имени по дефолту подставлялся URL загрузчика, а это не гуд. В итоге пришлось имена назначать самому.