# Copyright (c) 2004-5 Marek Hnilica. All rights reserved. # Module that converts between file formats. # Distributed under GPL version 2, or (at your option) later import ID3V2,ID3,AllTag,os.path,os,re,string,popen2 # check for mplayer. Version 1.0pre7 makes -aofile obsolete, while older versions cannot cope with -ao pcm:file global UseNewMplayer UseNewMplayer=0 GetVersion=popen2.popen3('mplayer -aofile')[0].read() if string.count(GetVersion,'Use -ao pcm:file= instead.'): UseNewMplayer=1 class ConversionError: def __init__(self, err): self.err=err def __str__(self): return self.err def CV(v1,v2): if len(v1)>len(v2): return v1 else: return v2 def convert(filename,delete=1,desired='ogg',flags=''): if not os.path.exists(filename): raise ConversionError,'File does not exist' if not os.access('.',6): raise ConversionError,'Can not add entry to directory' if not (desired=='ogg' or desired=='mp3' or desired=='wav'): raise ConversionError('Wrong desired format.') Pattern=re.compile(".[mM][pP]3") if Pattern.search(filename[-4:]): WavName=filename[:-4]+'.convert.wav' FileType='mp3' Pattern=re.compile(".[oO][gG][gG]") if Pattern.search(filename[-4:]): WavName=filename[:-4]+'.convert.wav' FileType='ogg' Pattern=re.compile(".[wW][mM][aA]") if Pattern.search(filename[-4:]): WavName=filename[:-4]+'.convert.wav' FileType='wma' if UseNewMplayer: ExecuteString='mplayer '+'"'+filename+'" -ao pcm:file="'+WavName+'" 1>/dev/null 2>&1' else: ExecuteString='mplayer -ao pcm -aofile "'+WavName+'" "'+filename+'" 1>/dev/null 2>&1' os.system(ExecuteString) if not os.path.exists(WavName) or os.path.getsize(WavName)<=44: try: os.remove(WavName) except: pass raise ConversionError('Mplayer was unable to decode file. Do you have appropriate codecs installed?') if desired=='mp3': ID1=ID3.ID3(filename) ID2=ID3V2.ID3v2(filename) for i in ID2.TagList.keys(): if len(ID2.TagList[i])>0: if ord(ID2.TagList[i][0])==0: ID2.TagList[i]=ID2.TagList[i][1:] if flags=='': flags='-h -b 192 -m j' MpegFileName=string.replace(WavName,'.convert.wav','.mp3.test') ExecuteString='lame '+flags+' "'+WavName+'" "'+MpegFileName+'" 1>/dev/null 2>&1' os.system(ExecuteString) if not os.path.exists(MpegFileName): raise ConversionError('Lame was not able to create file. Check your permissions/settings') NullSize=0 if os.path.getsize(MpegFileName)==0: NullSize=1 os.remove(MpegFileName) if delete: try: os.remove(WavName) except: raise ConversionError('Unable to delete temporary file %s'%filename) if not NullSize: if string.find(string.lower(filename),'.mp3')!=-1: NewID1=ID3.ID3(MpegFileName) NewID1.title=ID1.title NewID1.artist=ID1.artist NewID1.album=ID1.album NewID1.year=ID1.year NewID1.genre=ID1.genre NewID1.comment=ID1.comment NewID1.track=ID1.track NewID1.write() NewID2=ID3V2.ID3v2(MpegFileName) NewID2.WriteTag(ID2.TagList) else: NewTag=AllTag.Tag(filename) AllTag.WriteTag(MpegFileName,NewTag.Dict) FinalName=MpegFileName[:-5] os.rename(MpegFileName,FinalName) else: Sentence='Lame was unable to encode file.\nTry VBR without limits as it should always work.' if FileType=='mp3': Sentence+='\nSource file has not been altered.' raise ConversionError(Sentence) if desired=='ogg': if flags=='': flags='-q 4' OggVorbisFileName=string.replace(WavName,'.convert.wav','.ogg.test') ExecuteString='oggenc '+flags+' "'+WavName+'" -o "'+OggVorbisFileName+'" 1>/dev/null 2>&1' os.system(ExecuteString) if not os.path.exists(OggVorbisFileName): raise ConversionError('Oggenc was not able to create file. Check your permissions.') NullSize=0 if os.path.getsize(OggVorbisFileName)==0: NullSize=1 os.remove(OggVorbisFileName) if delete: try: os.remove(WavName) except: raise ConversionError('Unable to delete temporary file %s'%filename) if not NullSize: NewTag=AllTag.Tag(filename) AllTag.WriteTag(OggVorbisFileName,NewTag.Dict) FinalName=OggVorbisFileName[:-5] os.rename(OggVorbisFileName,FinalName) else: Sentence='oggenc was unable to encode file.\nTry quality setting as it should always work.' if FileType=='ogg': Sentence+='\nSource file has not been altered.' raise ConversionError(Sentence) if desired=='wav': WavFileName=string.replace(WavName,'.convert.wav','.wav') os.rename(WavName,WavFileName)