import os import sys import copy import struct ########################################################################### ### String that acts something like a streaming file (read, tell, close) class stryle: def __init__(self,s): self.buffer=s self.__tell=long(0) def read(self,n): self.__tell += n return self.buffer[self.__tell-n:self.__tell] def tell(self): return self.__tell def close(self): return ########################################################################### ### Riff class class Riff: def __init__(self,fn=None,fyleArg=None,parentArg=None): if fyleArg is None: self.fn = fn self.sz = os.stat(fn).st_size fyle = open(fn) else: self.fn = None self.sz = 0 fyle = fyleArg self.parent=parentArg eight = fyle.read(8) tell0 = fyle.tell() self.ID = eight[:4] self.Length=struct.unpack(' 0 and fyle.tell()==self.sz: fyle.close() def changeLength(self,deltaLength): self.Length += deltaLength if self.parent: self.parent.changeLength(deltaLength) def addData(self,moreData): self.Data += moreData self.changeLength(len(moreData)) def reParent(self,parent): self.parent = parent for id,idx in self.subChunks['idList']: self.subChunks[id][idx].reParent(self) def deepcopy(self,parent=None): newSelf=copy.deepcopy(self) newSelf.reParent(parent) return newSelf def replaceSubChunk( self, newRiff, idx=0): ID = newRiff.ID[:] oldLength = 0+self.subChunks[ID][idx].Length self.subChunks[ID][idx] = newRiff.deepcopy(self) self.changeLength( newRiff.Length - oldLength) def pout(self, indent='', dataShow=0): if self.Data: lenData=len(self.Data) elif self.Data is None: lenData=-1 else: lenData=0 d = dict(ID=self.ID,fn=self.fn,sz=self.sz,Length=self.Length,subID=self.subID,lenData=lenData,parent=self.parent) if dataShow > 0: if self.Data is None: d['show']=None else : d['show']=self.Data[:dataShow] print( indent + str(d) ) if self.ID=='fmt ': print( indent + ' ' + str(dict(fmt=self.fmt)) ) for id,idx in self.subChunks['idList']: self.subChunks[id][idx].pout( indent=' '+indent,dataShow=dataShow) if __name__=='__main__': for av in sys.argv[1:]: riff=Riff(fn=av) print( riff) riff.pout(dataShow=4) if 'RIFFADD' in os.environ: id_data=os.environ['RIFFADD'] if riff.subID: riff.subChunks[id_data[:4]][0].addData(id_data[4:]) else: riff.addData(id_data) riff.pout(indent=' ADDED DATA> ') if 'RIFFREPLACE' in os.environ and riff.subID: id_data=os.environ['RIFFREPLACE'] ID,newData = id_data[:4],id_data[4:] if ID in riff.subChunks: cpy = copy.deepcopy(riff.subChunks[ID][0]) cpy.parent = None cpy.pout(indent=' COPY>') riff.subChunks[ID][0].pout(indent=' ORIG>') cpy.addData(newData) riff.replaceSubChunk( cpy) print( ' '+str(riff)) riff.pout(indent=' REPLACED DATA> ')