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

Reply via email to