Author: dmeyer
Date: Tue Dec 11 10:42:48 2007
New Revision: 2914
Log:
add support to choose a parser by the first bytes of the file
Modified:
trunk/metadata/src/__init__.py
trunk/metadata/src/factory.py
Modified: trunk/metadata/src/__init__.py
==============================================================================
--- trunk/metadata/src/__init__.py (original)
+++ trunk/metadata/src/__init__.py Tue Dec 11 10:42:48 2007
@@ -46,7 +46,7 @@
register('audio/ac3', ('ac3',), 'audio.ac3')
register('application/adts', ('aac',), 'audio.adts')
register('audio/m4a', ('m4a',), 'audio.m4a')
-register('application/ogg', ('ogg',), 'audio.ogg')
+register('application/ogg', ('ogg',), 'audio.ogg', magic='OggS\00')
register('application/pcm', ('aif','voc','au'), 'audio.pcm')
# Video parsers
Modified: trunk/metadata/src/factory.py
==============================================================================
--- trunk/metadata/src/factory.py (original)
+++ trunk/metadata/src/factory.py Tue Dec 11 10:42:48 2007
@@ -68,11 +68,11 @@
return _factory
-def register(mimetype, extensions, c):
+def register(mimetype, extensions, c, magic=None):
"""
Register a parser to the factory.
"""
- return Factory().register(mimetype, extensions, c)
+ return Factory().register(mimetype, extensions, c, magic)
def gettype(mimetype, extensions):
@@ -106,6 +106,7 @@
self.extmap = {}
self.mimemap = {}
self.classmap = {}
+ self.magicmap = {}
self.types = []
self.device_types = []
self.directory_types = []
@@ -158,6 +159,30 @@
except:
log.exception('parse error')
+ # Try to find a parser based on the first bytes of the
+ # file (magic header). If a magic header is found but the
+ # parser failed, no other parser will be tried to speed
+ # up parsing of a bunch of files. So magic information should
+ # only be set if the parser is very sure
+ file.seek(0,0)
+ magic = file.read(10)
+ for length, magicmap in self.magicmap.items():
+ if magic[:length] in magicmap:
+ for p in magicmap[magic[:length]]:
+ log.info('Trying %s by magic header', p[R_CLASS])
+ file.seek(0,0)
+ try:
+ parser = self.get_class(p[R_CLASS])
+ return parser(file)
+ except core.ParseError:
+ pass
+ except (KeyboardInterrupt, SystemExit):
+ sys.exit(0)
+ except:
+ log.exception('parse error')
+ log.info('Magic header found but parser failed')
+ return None
+
if not force:
log.info('No Type found by Extension. Give up')
return None
@@ -317,7 +342,7 @@
- def register(self, mimetype, extensions, c):
+ def register(self, mimetype, extensions, c, magic=None):
"""
register the parser to kaa.metadata
"""
@@ -336,6 +361,14 @@
self.extmap[e.lower()] = tuple
self.mimemap[mimetype] = tuple
+ # add to magic header list
+ if magic is not None:
+ if not len(magic) in self.magicmap:
+ self.magicmap[len(magic)] = {}
+ if not magic in self.magicmap[len(magic)]:
+ self.magicmap[len(magic)][magic] = []
+ self.magicmap[len(magic)][magic].append(tuple)
+
def get(self, mimetype, extensions):
"""
-------------------------------------------------------------------------
SF.Net email is sponsored by:
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog