All pastes #190780 Raw Edit

Stuff

public python v1 · immutable
·published 2006-10-04 09:29 UTC
rendered paste body
"""$ python fileinfo.pyTraceback (most recent call last):  File "fileinfo.py", line 80, in ?    for info in listDirectory("/data/", [".mp3"]):  File "fileinfo.py", line 76, in listDirectory    return [getFileInfoClass(f)(f) for f in fileList]  File "/usr/lib/python2.4/UserDict.py", line 7, in __init__    self.update(dict)  File "/usr/lib/python2.4/UserDict.py", line 46, in update    self.data.update(dict)ValueError: dictionary update sequence element #0 has length 1; 2 is required""""""Framework for getting filetype-specific metadata.Instantiate appropriate class with filename.  Returned object acts like adictionary, with key-value pairs for each piece of metadata.    import fileinfo    info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3")    print "\\n".join(["%s=%s" % (k, v) for k, v in info.items()])Or use listDirectory function to get info on all files in a directory.    for info in fileinfo.listDirectory("/music/ap/", [".mp3"]):        ...Framework can be extended by adding classes for particular file types, e.g.HTMLFileInfo, MPGFileInfo, DOCFileInfo.  Each class is completely responsible forparsing its files appropriately; see MP3FileInfo for example."""import osimport sysfrom UserDict import UserDictdef stripnulls(data):	"strip whitespace and nulls"	return data.replace("\00", "").strip()		class FileInfo(UserDict):	"store fle metadata"	def __init_(self, filename=None):		UserDict.__init__(self)		self["name"] = filename				class MP3FileInfo(FileInfo):	"store ID3v1.0 MP3 tags"	tagDataMap = {"title" : (3, 33, stripnulls),					"artist" : (33, 63, stripnulls),					"album" : (63, 93, stripnulls),					"year" : (93, 97, stripnulls),					"comment" : (97, 126, stripnulls),					"genre" : (127,128, ord)}						def __parse(self, filename):		self.clear()		try:			fsock = open(filename, "rb", 0)			try:				fsock.seek(-128, 2)				tagdata = fsock.read(128)			finally:				fsock.close()			if tagdata[:3] == "TAG":				for tag, (start, end, parseFunc) in self.tagDataMap.items():					self[tag] = parseFunc(tagdata[start:end])		except IOError:			pass								def __setitem__(self, key, item):		if key == "name" and item:			self.__parse(item)		FileInfo.__setitem__(self, key, item)			def listDirectory(directory, fileExtList):	"get a list of fine into object for files of particular extensions"	fileList = [os.path.normcase(f)					for f in os.listdir(directory)]	fileList = [os.path.join(directory, f)					for f in fileList						if os.path.splitext(f)[1] in fileExtList]	def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):      		"get file info class from filename extension"                             		subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]       		return hasattr(module, subclass) and getattr(module, subclass) or FileInfo	return [getFileInfoClass(f)(f) for f in fileList]			if __name__ == "__main__":    for info in listDirectory("/data/", [".mp3"]):        print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])        print