cda2mpc

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')