Bandcamp Downloader (PoC)

Hello, Il est rare que je me lance dans ce genre d’outils, mais là, c’était à la limite du supportable pour moi. En effet depuis quelques temps beaucoup de groupes qu’ils soient amateurs ou non déposent leur musique sur le site bandcamp.com. Le principe du site est plutôt cool car, il permet un streaming qui marche bien mieux que celui de myspace, un design pas trop mal et surtout la vente d’albums assez facilement. Donc jusque là rien de bien méchant à déclarer.

Maintenant on va passer aux détails qui craignent. Comme ma curiosité m’y a poussé cet après-midi, j’ai décidé de voir un peu à quoi ressembler le fonctionnement du streaming sur ce site, donc ni une ni deux, je commence par regarder dans les sources de la page et là… STUPEUR, on commence par tomber sur ça :

album_title : "Jerk Alert !",
artist : "Maladroit",
linkback : "http://guerillaasso.bandcamp.com/album/jerk-alert",
download_base : "http://popplers5.bandcamp.com/"

cela aurait pu s’arrêter ici, mais non :

trackinfo : [{
         "duration":14.76,
         "track_num":1,
         "has_info":null,
         "has_free_download":false,
         "unreleased_track":false,
         "title":"jerk alert !",
         "download_tooltip":"",
         "is_downloadable":null,
         "has_lyrics":false,
         "streaming":1,
         "is_draft":false,
         "title_link":"\/track\/jerk-alert","id":3922077991,
         "sizeof_lyrics":0,
         "album_preorder":false,
         "file":"http:\/\/popplers5.bandcamp.com\/download\/track?enc=mp3-128&fsig=1c88b87e8075008419db016dc9d3ecc6&id=3922077991&stream=1&ts=1330286400.0"
         },...]

Oui vous avez bien vu ! On peut donc retrouver directement dans les sources le lien vers le fichier… Je pense honnêtement que c’est du foutage de gueule, quand on se permet de prendre 10% des revenus de l’artiste et que l’on n’est même pas capable de lui fournir un service un minimum protégé… La touche ironique c’est aussi ça :

// For the curious:
// http://bandcamp.com/faq#steal

Un petit commentaire placé dans les sources nous redirigeant vers une ancre de la FAQ, nous expliquant que le téléchargement peut être une aubaine pour l’artiste blablabla… Alors, pour cette remarque je dis pourquoi pas, mais celà ne devrait-il pas être à l’artiste de décider ? Enfin quoi qu’il en soit, marchons dans leur jeu, soyons une aubaine et téléchargeons :

import httplib2
from mutagen.mp3 import EasyMP3
import json, re, sys

class BandCampDownloader:

    def __init__(self):
        print "BandCamp Downloader\n"

    def getTracks(self, url):
        try:
            http = httplib2.Http()
            resp, content = http.request(url)

            r = re.search("artist : \"(.*?)\"", content)
            if r:
                artist = r.group(1)
                print "Artist : %s" % artist

            r = re.search("album_title : \"(.*?)\"", content)
            if r:
                album = r.group(1)
                print "Album : %s" % album

            r = re.search("trackinfo : \[(.*?)\]", content)
            if r:
                print "\nTracks were found"
                tracksInfos = '['+r.group(1)+']'
                tracks = json.loads(tracksInfos)

                for i, track in enumerate(tracks):
                    print track['file'],'   :', track['title']
                    resp, content = http.request(track['file'])
                    title = track['title'].replace('/','|')
                    file = open(title+'.mp3', 'w')
                    file.write(content)
                    file.close()
                    print " [+] File Donwloaded"
                    song = EasyMP3(title+'.mp3')
                    song['tracknumber'] = str(i+1)
                    song['title'] = track['title']
                    song['artist'] = artist
                    song['album'] = album
                    song.save()
                    print " [+] ID3Tag Done"

            else:
                print "No track founded... Are you sure of the URL ?"
        except httplib2.RelativeURIError:
            url = "http://"+url
            self.getTracks(url)


def usage():
    print '[i] usage: %s bandcampAlbumURL' % sys.argv[0]
    print '[i]'
    print '[i] + For example to download Demo\'s album from Poesie Zero (great band):'
    print '[i]'
    print '[i]  $ %s http://poesiezero.bandcamp.com/album/demo' % sys.argv[0]
    print ''


if __name__ == '__main__':
    bcd = BandCampDownloader()
    if len(sys.argv[1:]) != 0:
        bcd.getTracks(sys.argv[1])
    else:
        usage()

Ce script peut bien sûr être largement amélioré, mais pour le peu qu’il a à faire ça fonctionne pas trop mal. Bien sûr c’est copyleft donc amusez vous :D

Sur ce, bonne soirée !