henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2019-03-07 09:26 pm
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 та ноуда.