Automatyczne pobieranie presetów ze strony Line6

Data publikacji: 2014-06-30 | Tagi:

Wszyscy muzycy i jednocześnie posiadacze cyfrowych procesorów dźwięku firmy Line6 mają możliwość pobierania wybranych presetów ze strony producenta. W mgnieniu oka można uzyskać brzmienie swojego ulubionego basisty/gitarzysty. Jednak pobieranie ustawień jest męczące - trzeba założyć konto, szukać, ściągać wybrane presety, zmieniać strony itp. Oto rozwiązanie pozwalające zautomatyzować ten proces i ściągnąć za jednym zamachem wszystkie pliki dla danej kategorii urządzeń.

Zacznijmy może od kodu:

# -*- coding: utf-8 -*-
import sys
import mechanize
import re
from bs4 import BeautifulSoup

tones_url = "http://line6.com/customtone/browse/basspodxt/"
download_url = "http://line6.com/customtone/tone/deliver/%s/"

vote_pattern = "\$\('#ratetone-%s'\)\..*?value:\s(\d),"

sys.stdout.write("Line 6 Downloader v1.0\n")
sys.stdout.flush()

br = mechanize.Browser()
br.addheaders = [("User-agent",
                  'Mozilla/5.0 (X11; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0 Iceweasel/11.0')]

br.open(tones_url)

html = br.response().read()
soup = BeautifulSoup(html)
tones_count = soup.find('span', {'id': 'tone-count'}).string
pagination = soup.find('div', {'id': 'ct_pagination'})

pages = pagination.find_all('a')
for page in pages:
    if page.string.strip() == "->|":
        max_page = int(page.attrs['href'].split('/')[-2])

file_index = open("index.info", "w")

sys.stdout.write("Pages found: %s.\n" % max_page)
sys.stdout.write("Tones: %s.\n" % tones_count)
sys.stdout.flush()

for page in range(1, max_page + 1):
    sys.stdout.write("Processing page: %s of %s " % (page, max_page))
    sys.stdout.flush()
    br.open("%s%s/" % (tones_url, page))
    html = br.response().read()
    soup = BeautifulSoup(html)
    table = soup.find('table', {'class': 'tone-list'})
    ids = table.find_all('a', {'class': 'login-modal'})
    tone_ids = []
    for id in ids:
        tone_ids.append(int(id.attrs['id'].split('-')[1]))
    
    for id in tone_ids:
        sys.stdout.write('.')
        sys.stdout.flush()
        row_main = table.find('tr', {'class': ' top listed_tone_%s' % id})
        if not row_main:
            row_main = table.find('tr', {'class': 'alt top listed_tone_%s' % id})
        row_sub = table.find('tr', {'class': ' bottom listed_tone_%s' % id})
        if not row_sub:
            row_sub = table.find('tr', {'class': 'alt bottom listed_tone_%s' % id})
        td_main = row_main.find_all('td')
        td_sub = row_sub.find_all('td')
        try:
            author = td_sub[0].string.strip()
        except AttributeError:
            author = ''

        try:
            pickup = td_sub[4].find('img').attrs['alt']
        except AttributeError:
            pickup = ''
        tone_data = {
            'device': td_main[0].find('img').attrs['title'],
            'tone_name': td_main[2].find('a').string.strip().encode('utf-8'),
            'guitarist': td_main[3].string or '',
            'song': td_main[4].string or '',
            'band': td_main[5].string or '',
            'amplifier': td_main[6].string or '',
            'style': td_main[7].string or '',
            'downloads': td_main[8].string or 0,
            'author': author,
            'date': td_sub[3].string,
            'pickup': pickup,
            'vote': "%s / 5" % re.findall(vote_pattern % id, html)[0],
        }
        l6t_file = br.open(download_url % id)
        l6t_file = l6t_file.read()
        file_id = open("%s.info" % id, "w")
        for key in tone_data.keys():
            file_id.write("%s: %s\n" % (key, tone_data[key]))
            file_index.write("%s: %s\n" % (key, tone_data[key]))
        file_id.write("file_id: %s\n" % id)
        file_index.write("file_id: %s\n" % id)
        file_index.write("\n---\n\n")
        file_id.close()
        file_l6t = open("%s.l6t" % id, "w")
        file_l6t.write(l6t_file)
        file_l6t.close()
    sys.stdout.write(' done\n')
    sys.stdout.flush()
file_index.close()

Wymagania to mechanize oraz beautifulsoup4.

Powyższy skrypt ściąga wszystkie presety dla sprzętu serii basspodxt do bieżącego katalogu. Pliki mają nazwę <id_pliku>.l6t. Dodatkowo program tworzy dla każdego presetu krótkie podsumowanie w pliku <id_pliku>.info: autor, nazwa, data dodania, ocena itp. Poza tym program tworzy jeden zbiorczy plik index.info, który zawiera wszystkie informacje o wszystkich ściąganych presetach w jednym miejscu.

Serię sprzętu określamy w zmiennej tones_url, a listę urli mamy tutaj.

Przykładowe urle:

http://line6.com/customtone/browse/podx3/ POD X3 Family
http://line6.com/customtone/browse/podxt/ POD xt Family
http://line6.com/customtone/browse/basspodxt/ Bass POD xt Family
http://line6.com/customtone/browse/podhd300/ POD HD300
...

Aby ściągnąć presety dla innych kategorii sprzętu należy podmienić w skrypcie zmienną tones_url.

Po uruchomieniu skrypt wyświetla krótkie podsumowanie, a następnie przechodzi do downloadu. Taka operacja może trochę potrwać np. dla serii Bass POD xt jest to około 50 minut.

Jako przykład zostawiam do ściągnięcia spakowaną bibliotekę tonów dla procesorów basowych, a sam kod jest dostępny również w repozytorium na bitbuckecie.


Oceń ten post:
Podziel się:

comments powered by Disqus

IT w obrazkach: