henry_flower (
henry_flower) wrote2019-03-07 09:26 pm
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Entry tags:
bandcamp downloader
$ wc -l bandcamp
37 bandcamp
На превеликий жаль, скрипта не містить ув собі криптомайнера, не показує рекламу та не тягне за собою копію кроміума.
Використовується так:
$ bandcamp u=https://redbeardwall.bandcamp.com/album/the-fight-needs-us-all -j4
Завантажить усі "безплатні" пісні альбома як:
$ tree Red* --noreport
Red_Beard_Wall__2019__The_Fight_Needs_Us_All
├── 1-Come_on_Down.mp3
├── 2-To_My_Queen.mp3
├── 3-Ode_to_Green.mp3
├── 4-Reverend.mp3
├── 5-The_Warming.mp3
├── 6-Reign_of_Ignorance.mp3
├── 7-Tell_Me_the_Future_of_Existence.mp3
└── 8-The_Fight_Needs_Us_All.mp3
Імена mp3 хфайлів не мають пробілів, тому що зе скрипта є мейкфейлом, який генерує іншого мейкфейла:
#!/usr/bin/make -f
$(if $(u),,$(error missing u= param))
SHELL := /bin/bash
t := $(shell mktemp -u tmp.XXXXXXXXXX.)
$(t)Makefile: $(t)script.js
node $< > $@
$(MAKE) -f $@
script.match = TralbumData
$(t)script.js: $(t)page.html
set -o pipefail; nokogiri -e 'puts $$_.css("script").find {|s| s.text["$(script.match)"]}.text' < $< |\
ruby -rrkelly -e 'puts RKelly::Parser.new.parse(STDIN.read).find {|n| n.is_a?(RKelly::Nodes::VarDeclNode) && n.name == "$(script.match)"}.to_ecma' |\
cat - <(echo "$$generator") > $@
export define generator :=
let q = s => s.replace(/[^\w,.]/g, '_')
let pad = (n, l) => ('0' + n).slice(-l)
let url = t => t.file && t.file['mp3-128']
let fname = t => out + '/' + pad(t.track_num, max) + '-' + q(t.title) + '.mp3'
let files = TralbumData.trackinfo.filter( v => url(v))
let year = new Date(TralbumData.album_release_date || 0).getUTCFullYear()
let max = files.reduce((a, c) => Math.max(a, c.track_num), 0).toString().length
let out = q(TralbumData.artist) + `__$${year}__` + q(TralbumData.current.title)
console.log('.PHONY: all\nall:', files.map(v => fname(v)).join ` `)
console.log(files.map( v => [fname(v)+':', '$$(mkdir)', `curl -sfL '$${url(v)}' > $$@`].join`\n\t`).join `\n`)
console.log('mkdir = @mkdir -p $$(dir $$@)')
console.log('.DELETE_ON_ERROR:')
endef
$(t)page.html:; curl -sfL '$(u)' > $@
.INTERMEDIATE: $(addprefix $(t), page.html script.js Makefile)
.DELETE_ON_ERROR:
Потребує gem install nokogiri rkelly-remix
та ноуда.