Parę dni temu postanowiłem zgrać moją skromną kolekcję płyt audio do formatu MPC. Nie chcąc marnować czasu (i zaśmiecać systemu zbędnym softem), postanowiłem napisać sobie mały i prosty skrycik w Python’ie. Założenia
- prostota
- automatyczność (wkładam płytę odpalam skrypt i zapominam … ;))
- zapis wyjściowych plików w pewnym ustalonym schemacie katalogów (wykonawca, nazwa albumu i utworu pisana camel case’em dodatkowo nazwa utworu poprzedzona jego numerem oraz praw dostępu: 400 (dla utworów_ i 500 (albumu))
- automatyczne pobieranie informacji o utworach bez konieczności ich przepisywania (tj. wykorzystanie CDDB, a konkretnie cddb-py)
Oto efekt (należy pamiętać żeby podmienić baseDir !):
#! /usr/bin/python """ cda2mpc, Copyrighted, 2009 Ripps directly from CD audio to musepack (mpc) format. Developed by Dariusz Luksza License: GPL v2 """ import CDDB, DiscID, re from sys import stdout from string import capitalize from os import chmod, makedirs as mkdir from subprocess import Popen, PIPE, call baseDir = '/home/lock/muzyka/' def camelCase(value): return "".join([capitalize(w) for w in re.split(re.compile("[ _]?"), value)]) print 'Getting CDDB info ...', stdout.flush() cdrom = DiscID.open() discId = DiscID.disc_id(cdrom) (queryStatus, queryInfo) = CDDB.query(discId) if isinstance(queryInfo, list): queryInfo = queryInfo[0] (readStatus, readInfo) = CDDB.read(queryInfo['category'], queryInfo['disc_id']) album = queryInfo['title'] splitAt = album.index('/') artist = album[:splitAt - 1] album = album[splitAt + 2:] print ' DONE.' print 'Starting to encoding:', artist, '-', album saveDir = baseDir + camelCase(artist) + '/' + camelCase(album) + '/' try: mkdir(saveDir, 0700) except OSError: pass for i in range(discId[1]): title = readInfo['TTITLE' + `i`] wavTrack = saveDir + 'track.wav' fileName = saveDir + `i + 1` + '-' +camelCase(title) + '.mpc' print '\tEncode track:', title , ' (', `i+1`, '/', discId[1], ')' print '\t\tStage 1 (wave) ...', stdout.flush() p = Popen(['cdparanoia', '-q', `i + 1`, wavTrack], stdout=PIPE) p.wait() if p.returncode is not 0: print ' ERROR!!' continue print ' DONE.' print '\t\tStage 2 (mpc) ...', stdout.flush() mpcCmd = ['mppenc', '--deleteinput', '--xtreme', '--silent', '--artist', artist, '--album', album, '--title', title, wavTrack, fileName] p = Popen(mpcCmd, stdout=PIPE, stderr=PIPE) p.wait() if p.returncode is not 0: print ' ERROR!' continue chmod(fileName, 0400) print " DONE.\n\tCOMPLETED." chmod(saveDir, 500) print 'COMPLETED.' call('eject') |