Author: dmeyer
Date: Fri Dec 15 17:40:09 2006
New Revision: 2239

Added:
   trunk/metadata/src/disc/cdinfo.py
Removed:
   trunk/metadata/src/disc/DiscID.py
Modified:
   trunk/metadata/setup.py
   trunk/metadata/src/__init__.py
   trunk/metadata/src/audio/core.py
   trunk/metadata/src/disc/audio.py
   trunk/metadata/src/disc/cdrommodule.c
   trunk/metadata/src/disc/core.py
   trunk/metadata/src/disc/dvd.py
   trunk/metadata/src/disc/ifomodule.c
   trunk/metadata/src/disc/vcd.py
   trunk/metadata/src/factory.py
   trunk/metadata/src/games/core.py
   trunk/metadata/src/image/core.py
   trunk/metadata/src/mediainfo.py
   trunk/metadata/src/misc/directory.py
   trunk/metadata/src/misc/xml.py
   trunk/metadata/src/video/core.py

Log:
More updates and code move. Some code using kaa.metadata
could be broken now, needs to be checked.


Modified: trunk/metadata/setup.py
==============================================================================
--- trunk/metadata/setup.py     (original)
+++ trunk/metadata/setup.py     Fri Dec 15 17:40:09 2006
@@ -40,10 +40,10 @@
     sys.exit(1)
 
 # cdrom extension, FIXME: check if it will compile
-cdrom = Extension('kaa/metadata/disc/cdrom', ['src/disc/cdrommodule.c'])
+cdrom = Extension('kaa/metadata/disc/_cdrom', ['src/disc/cdrommodule.c'])
 
 # check for libdvdread
-ifoparser = Extension('kaa/metadata/disc/ifoparser', ['src/disc/ifomodule.c'],
+ifoparser = Extension('kaa/metadata/disc/_ifoparser', ['src/disc/ifomodule.c'],
                       libraries=[ 'dvdread' ])
 
 try:

Modified: trunk/metadata/src/__init__.py
==============================================================================
--- trunk/metadata/src/__init__.py      (original)
+++ trunk/metadata/src/__init__.py      Fri Dec 15 17:40:09 2006
@@ -38,11 +38,11 @@
 
 # import factory code for kaa.metadata access
 from factory import *
-from disc.discinfo import cdrom_disc_id as getid
-from mediainfo import MediaInfo, MEDIA_AUDIO, MEDIA_VIDEO, MEDIA_IMAGE, \
+from disc.cdinfo import getid
+from mediainfo import Media, MEDIA_AUDIO, MEDIA_VIDEO, MEDIA_IMAGE, \
      MEDIA_AV, MEDIA_SUBTITLE, MEDIA_CONTAINER, MEDIA_DIRECTORY, MEDIA_DISC, \
      MEDIA_GAME
 
 
 # use network functions
-USE_NETWORK     = 1
+USE_NETWORK = 1

Modified: trunk/metadata/src/audio/core.py
==============================================================================
--- trunk/metadata/src/audio/core.py    (original)
+++ trunk/metadata/src/audio/core.py    Fri Dec 15 17:40:09 2006
@@ -32,20 +32,44 @@
 from kaa.metadata import mediainfo
 from kaa.metadata.factory import register
 
-ParseError = mediainfo.KaaMetadataParseError
+# fourcc list
+import kaa.metadata.fourcc as fourcc
+
+
+AUDIOCORE = ['channels', 'samplerate', 'length', 'encoder', 'codec', 'format',
+             'samplebits', 'bitrate', 'fourcc', 'trackno' ]
+
+MUSICCORE = ['trackof', 'album', 'genre', 'discs', 'thumbnail' ]
+
+
+ParseError = mediainfo.ParseError
 EXTENSION_STREAM = mediainfo.EXTENSION_STREAM
 
-class Music(mediainfo.AudioInfo):
+
+class Audio(mediainfo.Media):
+    """
+    Audio Tracks in a Multiplexed Container.
+    """
+    _keys = mediainfo.Media._keys + AUDIOCORE
+    media = mediainfo.MEDIA_AUDIO
+
+    def _finalize(self):
+        mediainfo.Media._finalize(self)
+        if self.codec is not None:
+            self.fourcc, self.codec = fourcc.resolve(self.codec)
+
+
+class Music(Audio):
     """
     Digital Music.
     """
-    _keys = mediainfo.AudioInfo._keys + mediainfo.MUSICCORE
+    _keys = Audio._keys + MUSICCORE
 
     def _finalize(self):
         """
         Correct same data based on specific rules
         """
-        mediainfo.AudioInfo._finalize(self)
+        Audio._finalize(self)
         if self.trackof:
             try:
                 # XXX Why is this needed anyway?

Modified: trunk/metadata/src/disc/audio.py
==============================================================================
--- trunk/metadata/src/disc/audio.py    (original)
+++ trunk/metadata/src/disc/audio.py    Fri Dec 15 17:40:09 2006
@@ -30,7 +30,6 @@
 # -----------------------------------------------------------------------------
 
 # python imports
-import cdrom
 import logging
 
 # kaa.metadata imports
@@ -39,12 +38,13 @@
 
 # kaa.metadata.disc imports
 import core
-import DiscID
+import cdinfo
 import CDDB
 
 # get logging object
 log = logging.getLogger('metadata')
 
+
 class AudioDisc(core.Disc):
     def __init__(self,device):
         core.Disc.__init__(self)
@@ -61,8 +61,8 @@
 
     def query(self, device):
 
-        cdromfd = DiscID.open(device)
-        disc_id = DiscID.disc_id(cdromfd)
+        cdromfd = cdinfo.audiocd_id(device)
+        disc_id = cdinfo.audiocd_id(cdromfd)
 
         if kaa.metadata.USE_NETWORK:
             try:
@@ -138,7 +138,7 @@
 
 
         # read the tracks to generate the title list
-        (first, last) = cdrom.toc_header(cdromfd)
+        (first, last) = cdinfo.audiocd_toc_header(cdromfd)
 
         lmin = 0
         lsec = 0
@@ -146,9 +146,9 @@
         num = 0
         for i in range(first, last + 2):
             if i == last + 1:
-                min, sec, frames = cdrom.leadout(cdromfd)
+                min, sec, frames = cdinfo.audiocd_leadout(cdromfd)
             else:
-                min, sec, frames = cdrom.toc_entry(cdromfd, i)
+                min, sec, frames = cdinfo.audiocd_toc_entry(cdromfd, i)
             if num:
                 self.tracks[num-1].length = (min-lmin)*60 + (sec-lsec)
             num += 1

Added: trunk/metadata/src/disc/cdinfo.py
==============================================================================
--- (empty file)
+++ trunk/metadata/src/disc/cdinfo.py   Fri Dec 15 17:40:09 2006
@@ -0,0 +1,218 @@
+# python imports
+import os
+import re
+import time
+import array
+import md5
+from struct import *
+import logging
+from fcntl import ioctl
+
+# cdrom module
+import _cdrom
+
+# get logging object
+log = logging.getLogger('metadata')
+
+
+def audiocd_open(device=None, flags=None):
+    # Allow this function to be called with no arguments,
+    # specifying that we should call cdrom.open() with
+    # no arguments.
+    if device == None:
+        return _cdrom.open()
+    elif flags == None:
+        return _cdrom.open(device)
+    else:
+        return _cdrom.open(device, flags)
+
+
+def audiocd_id(device):
+    (first, last) = _cdrom.toc_header(device)
+
+    track_frames = []
+    checksum = 0
+    
+    for i in range(first, last + 1):
+       (min, sec, frame) = _cdrom.toc_entry(device, i)
+        n = min*60 + sec
+        while n > 0:
+            checksum += n % 10
+            n = n / 10
+       track_frames.append(min*60*75 + sec*75 + frame)
+
+    (min, sec, frame) = _cdrom.leadout(device)
+    track_frames.append(min*60*75 + sec*75 + frame)
+    total_time = (track_frames[-1] / 75) - (track_frames[0] / 75)
+    discid = ((checksum % 0xff) << 24 | total_time << 8 | last)
+    return [discid, last] + track_frames[:-1] + [ track_frames[-1] / 75 ]
+
+
+def audiocd_toc_header(self, device):
+    return _cdrom.toc_header(device)
+
+
+def audiocd_toc_entry(self, device):
+    return _cdrom.toc_entry(device)
+
+
+def audiocd_leadout(self, device):
+    return _cdrom.leadout(device)
+
+
+def status(device, handle_mix = 0):
+    """
+    check the current disc in device
+    return: no disc (0), audio cd (1), data cd (2), blank cd (3)
+    """
+    CDROM_DRIVE_STATUS=0x5326
+    CDSL_CURRENT=( (int ) ( ~ 0 >> 1 ) )
+    CDROM_DISC_STATUS=0x5327
+    CDS_AUDIO=100
+    CDS_MIXED=105
+    CDS_DISC_OK=4
+
+    # FreeBSD ioctls - there is no CDROM.py
+    # XXX 0xc0086305 below creates a warning, but 0xc0086305L
+    # doesn't work. Suppress that warning for Linux users,
+    # until a better solution can be found.
+    if os.uname()[0] == 'FreeBSD':
+        CDIOREADTOCENTRYS = 0xc0086305L
+        CD_MSF_FORMAT = 2
+
+    fd = None
+    try:
+        fd = os.open(device, os.O_RDONLY | os.O_NONBLOCK)
+        if os.uname()[0] == 'FreeBSD':
+            try:
+                cd_toc_entry = array.array('c', '\000'*4096)
+                (address, length) = cd_toc_entry.buffer_info()
+                buf = pack('BBHP', CD_MSF_FORMAT, 0, length, address)
+                s = ioctl(fd, CDIOREADTOCENTRYS, buf)
+                s = CDS_DISC_OK
+            except (OSError, IOError):
+                s = CDS_NO_DISC
+        else:
+            s = ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT)
+    except (OSError, IOError):
+        log.error('ERROR: no permission to read %s' % device)
+        log.error('Media detection not possible, set drive to \'empty\'')
+
+        # maybe we need to close the fd if ioctl fails, maybe
+        # open fails and there is no fd, maye we aren't running
+        # linux and don't have ioctl
+        try:
+            if fd:
+                os.close(fd)
+        except (OSError, IOError):
+            pass
+        return 0
+
+    if not s == CDS_DISC_OK:
+        # no disc, error, whatever
+        try:
+            os.close(fd)
+        except (OSError, IOError):
+            pass
+        return 0
+
+    if os.uname()[0] == 'FreeBSD':
+        s = 0
+        # We already have the TOC from above
+        for i in range(0, 4096, 8):
+            control = unpack('B', cd_toc_entry[i+1])[0] & 4
+            track = unpack('B', cd_toc_entry[i+2])[0]
+            if track == 0:
+                break
+            if control == 0 and s != CDS_MIXED:
+                s = CDS_AUDIO
+            elif control != 0:
+                if s == CDS_AUDIO:
+                    s = CDS_MIXED
+                else:
+                    s = 100 + control # ugly, but encodes Linux ioctl returns
+            elif control == 5:
+                s = CDS_MIXED
+
+    else:
+        s = ioctl(fd, CDROM_DISC_STATUS)
+    os.close(fd)
+
+    if s == CDS_MIXED and handle_mix:
+        return 4
+    if s == CDS_AUDIO or s == CDS_MIXED:
+        return 1
+
+    try:
+        fd = open(device, 'rb')
+        # try to read from the disc to get information if the disc
+        # is a rw medium not written yet
+
+        fd.seek(32768) # 2048 multiple boundary for FreeBSD
+        # FreeBSD doesn't return IOError unless we try and read:
+        fd.read(1)
+    except IOError:
+        # not readable
+       fd.close()
+       return 3
+
+    # disc ok
+    fd.close()
+    return 2
+
+
+_id_cache = {}
+
+def getid(device, handle_mix=0):
+    """
+    return the disc id of the device or None if no disc is there
+    """
+    global _id_cache
+    try:
+        if _id_cache[device][0] + 0.9 > time.time():
+            return _id_cache[device][1:]
+    except (KeyError, IndexError):
+        pass
+
+    disc_type = status(device, handle_mix=handle_mix)
+    if disc_type == 0 or disc_type == 3:
+        return 0, None
+
+    elif disc_type == 1 or disc_type == 4:
+        # audio disc
+        discfd = audiocd_open(device)
+        id = audiocd_id(discfd)
+        id = '%08lx_%d' % (id[0], id[1])
+        discfd.close()
+    else:
+        f = open(device,'rb')
+
+        if os.uname()[0] == 'FreeBSD':
+            # FreeBSD can only seek to 2048 multiple boundaries.
+            # Below works on Linux and FreeBSD:
+            f.seek(32768)
+            id = f.read(829)
+            label = id[40:72]
+            id = id[813:829]
+        else:
+            f.seek(0x0000832d)
+            id = f.read(16)
+            f.seek(32808, 0)
+            label = f.read(32)
+
+        if CREATE_MD5_ID:
+            id_md5 = md5.new()
+            id_md5.update(f.read(51200))
+            id = id_md5.hexdigest()
+
+        f.close()
+
+        m = re.match("^(.*[^ ]) *$", label)
+        if m:
+            id = '%s%s' % (id, m.group(1))
+        id = re.compile('[^a-zA-Z0-9()_-]').sub('_', id)
+
+
+    _id_cache[device] = time.time(), disc_type, id
+    id = id.replace('/','_')
+    return disc_type, id

Modified: trunk/metadata/src/disc/cdrommodule.c
==============================================================================
--- trunk/metadata/src/disc/cdrommodule.c       (original)
+++ trunk/metadata/src/disc/cdrommodule.c       Fri Dec 15 17:40:09 2006
@@ -233,12 +233,12 @@
     { NULL, NULL }
 };
 
-void initcdrom(void)
+void init_cdrom(void)
 {
     PyObject *module, *dict;
 
-    module = Py_InitModule("cdrom", cdrom_methods);
+    module = Py_InitModule("_cdrom", cdrom_methods);
     dict = PyModule_GetDict(module);
-    cdrom_error = PyErr_NewException("cdrom.error", NULL, NULL);
+    cdrom_error = PyErr_NewException("_cdrom.error", NULL, NULL);
     PyDict_SetItemString(dict, "error", cdrom_error);
 }

Modified: trunk/metadata/src/disc/core.py
==============================================================================
--- trunk/metadata/src/disc/core.py     (original)
+++ trunk/metadata/src/disc/core.py     Fri Dec 15 17:40:09 2006
@@ -30,195 +30,32 @@
 # -----------------------------------------------------------------------------
 
 # python imports
-import os
-import re
-import time
-import array
 import md5
-from struct import *
 import logging
-from fcntl import ioctl
 
 # kaa imports
 from kaa.metadata import mediainfo
 from kaa.metadata.factory import register
+from kaa.metadata.video.core import VideoStream
+
+# extra cdinfo parser
+import cdinfo
 
 EXTENSION_DEVICE = mediainfo.EXTENSION_DEVICE
-VideoTrack = mediainfo.VideoInfo
+EXTENSION_DIRECTORY = mediainfo.EXTENSION_DIRECTORY
 
 # get logging object
 log = logging.getLogger('metadata')
 
 CREATE_MD5_ID = 0
 
-import DiscID
-
-
-def cdrom_disc_status(device, handle_mix = 0):
-    """
-    check the current disc in device
-    return: no disc (0), audio cd (1), data cd (2), blank cd (3)
-    """
-    CDROM_DRIVE_STATUS=0x5326
-    CDSL_CURRENT=( (int ) ( ~ 0 >> 1 ) )
-    CDROM_DISC_STATUS=0x5327
-    CDS_AUDIO=100
-    CDS_MIXED=105
-    CDS_DISC_OK=4
-
-    # FreeBSD ioctls - there is no CDROM.py
-    # XXX 0xc0086305 below creates a warning, but 0xc0086305L
-    # doesn't work. Suppress that warning for Linux users,
-    # until a better solution can be found.
-    if os.uname()[0] == 'FreeBSD':
-        CDIOREADTOCENTRYS = 0xc0086305L
-        CD_MSF_FORMAT = 2
-
-    fd = None
-    try:
-        fd = os.open(device, os.O_RDONLY | os.O_NONBLOCK)
-        if os.uname()[0] == 'FreeBSD':
-            try:
-                cd_toc_entry = array.array('c', '\000'*4096)
-                (address, length) = cd_toc_entry.buffer_info()
-                buf = pack('BBHP', CD_MSF_FORMAT, 0, length, address)
-                s = ioctl(fd, CDIOREADTOCENTRYS, buf)
-                s = CDS_DISC_OK
-            except (OSError, IOError):
-                s = CDS_NO_DISC
-        else:
-            s = ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT)
-    except (OSError, IOError):
-        log.error('ERROR: no permission to read %s' % device)
-        log.error('Media detection not possible, set drive to \'empty\'')
-
-        # maybe we need to close the fd if ioctl fails, maybe
-        # open fails and there is no fd, maye we aren't running
-        # linux and don't have ioctl
-        try:
-            if fd:
-                os.close(fd)
-        except (OSError, IOError):
-            pass
-        return 0
-
-    if not s == CDS_DISC_OK:
-        # no disc, error, whatever
-        try:
-            os.close(fd)
-        except (OSError, IOError):
-            pass
-        return 0
-
-    if os.uname()[0] == 'FreeBSD':
-        s = 0
-        # We already have the TOC from above
-        for i in range(0, 4096, 8):
-            control = unpack('B', cd_toc_entry[i+1])[0] & 4
-            track = unpack('B', cd_toc_entry[i+2])[0]
-            if track == 0:
-                break
-            if control == 0 and s != CDS_MIXED:
-                s = CDS_AUDIO
-            elif control != 0:
-                if s == CDS_AUDIO:
-                    s = CDS_MIXED
-                else:
-                    s = 100 + control # ugly, but encodes Linux ioctl returns
-            elif control == 5:
-                s = CDS_MIXED
-
-    else:
-        s = ioctl(fd, CDROM_DISC_STATUS)
-    os.close(fd)
-
-    if s == CDS_MIXED and handle_mix:
-        return 4
-    if s == CDS_AUDIO or s == CDS_MIXED:
-        return 1
-
-    try:
-        fd = open(device, 'rb')
-        # try to read from the disc to get information if the disc
-        # is a rw medium not written yet
-
-        fd.seek(32768) # 2048 multiple boundary for FreeBSD
-        # FreeBSD doesn't return IOError unless we try and read:
-        fd.read(1)
-    except IOError:
-        # not readable
-       fd.close()
-       return 3
-
-    # disc ok
-    fd.close()
-    return 2
-
-
-id_cache = {}
-
-def cdrom_disc_id(device, handle_mix=0):
-    """
-    return the disc id of the device or None if no disc is there
-    """
-    global id_cache
-    try:
-        if id_cache[device][0] + 0.9 > time.time():
-            return id_cache[device][1:]
-    except (KeyError, IndexError):
-        pass
-
-    disc_type = cdrom_disc_status(device, handle_mix=handle_mix)
-    if disc_type == 0 or disc_type == 3:
-        return 0, None
-
-    elif disc_type == 1 or disc_type == 4:
-        # audio disc
-        cdrom = DiscID.open(device)
-        id = DiscID.disc_id(cdrom)
-        id = '%08lx_%d' % (id[0], id[1])
-        cdrom.close()
-    else:
-        f = open(device,'rb')
-
-        if os.uname()[0] == 'FreeBSD':
-            # FreeBSD can only seek to 2048 multiple boundaries.
-            # Below works on Linux and FreeBSD:
-            f.seek(32768)
-            id = f.read(829)
-            label = id[40:72]
-            id = id[813:829]
-        else:
-            f.seek(0x0000832d)
-            id = f.read(16)
-            f.seek(32808, 0)
-            label = f.read(32)
-
-        if CREATE_MD5_ID:
-            id_md5 = md5.new()
-            id_md5.update(f.read(51200))
-            id = id_md5.hexdigest()
-
-        f.close()
-
-        m = re.match("^(.*[^ ]) *$", label)
-        if m:
-            id = '%s%s' % (id, m.group(1))
-        id = re.compile('[^a-zA-Z0-9()_-]').sub('_', id)
-
-
-    id_cache[device] = time.time(), disc_type, id
-    id = id.replace('/','_')
-    return disc_type, id
-
-
-class Disc(mediainfo.CollectionInfo):
+class Disc(mediainfo.Collection):
 
-    _keys = mediainfo.CollectionInfo._keys + [ 'mixed', 'label' ]
+    _keys = mediainfo.Collection._keys + [ 'mixed', 'label' ]
     media = mediainfo.MEDIA_DISC
     
     def is_disc(self, device):
-        (type, self.id) = cdrom_disc_id(device, handle_mix=1)
+        (type, self.id) = cdinfo.cdrom_disc_id(device, handle_mix=1)
         if type != 2:
             if type == 4:
                 self.mixed = 1

Modified: trunk/metadata/src/disc/dvd.py
==============================================================================
--- trunk/metadata/src/disc/dvd.py      (original)
+++ trunk/metadata/src/disc/dvd.py      Fri Dec 15 17:40:09 2006
@@ -36,11 +36,12 @@
 import logging
 
 # kaa.metadata imports
-from kaa.metadata import mediainfo
+import kaa.metadata.video.core as video
+import kaa.metadata.audio.core as audio
 
 # kaa.metadata.disc imports
 import core
-import ifoparser
+import _ifoparser
 
 # get logging object
 log = logging.getLogger('metadata')
@@ -51,9 +52,9 @@
 _video_format = ('NTSC', 'PAL')
 _video_aspect = (4.0 / 3, 16.0 / 9, 1.0, 16.0 / 9)
 
-class DVDVideo(mediainfo.VideoInfo):
+class DVDVideo(video.VideoStream):
     def __init__(self, data):
-        mediainfo.VideoInfo.__init__(self)
+        video.VideoStream.__init__(self)
         self.length = data[0]
         self.fps    = _video_fps[data[1]]
         self.format = _video_format[data[2]]
@@ -63,12 +64,12 @@
         self.codec  = 'MP2V'
 
 
-class DVDAudio(mediainfo.AudioInfo):
+class DVDAudio(audio.Audio):
 
-    _keys = mediainfo.AudioInfo._keys + [ 'id' ]
+    _keys = audio.Audio._keys + [ 'id' ]
 
     def __init__(self, pos, info):
-        mediainfo.AudioInfo.__init__(self)
+        audio.Audio.__init__(self)
         self.id = 128 + pos
         self.language, self.codec, self.channels, self.samplerate = info
         if self.codec == '0x2001':      # DTS
@@ -76,16 +77,16 @@
             self.id += 8
 
 
-class DVDTitle(mediainfo.AVInfo):
+class DVDTitle(video.AVContainer):
 
-    _keys = mediainfo.AVInfo._keys + [ 'angles' ]
+    _keys = video.AVContainer._keys + [ 'angles' ]
 
     def __init__(self, info):
-        mediainfo.AVInfo.__init__(self)
+        video.AVContainer.__init__(self)
         self.chapters = []
         pos = 0
         for length in info[0]:
-            chapter = mediainfo.ChapterInfo()
+            chapter = video.Chapter()
             chapter.pos = pos
             pos += length
             self.chapters.append(chapter)
@@ -100,7 +101,7 @@
             self.audio.append(DVDAudio(pos, a))
 
         for pos, s in enumerate(info[-1]):
-            self.subtitles.append(mediainfo.SubtitleInfo(s))
+            self.subtitles.append(video.Subtitle(s))
 
 
 class DVDInfo(core.Disc):
@@ -136,7 +137,7 @@
 
 
     def _parse(self, device):
-        info = ifoparser.parse(device)
+        info = _ifoparser.parse(device)
         if not info:
             raise core.ParseError()
         for pos, title in enumerate(info):
@@ -202,6 +203,6 @@
         self._parse(f.name)
 
 
-core.register( 'video/dvd', mediainfo.EXTENSION_DEVICE, DVDInfo )
-core.register('video/dvd', mediainfo.EXTENSION_DIRECTORY, DVDInfo)
+core.register( 'video/dvd', core.EXTENSION_DEVICE, DVDInfo )
+core.register('video/dvd', core.EXTENSION_DIRECTORY, DVDInfo)
 core.register('video/dvd', ['iso'], DVDInfo)

Modified: trunk/metadata/src/disc/ifomodule.c
==============================================================================
--- trunk/metadata/src/disc/ifomodule.c (original)
+++ trunk/metadata/src/disc/ifomodule.c Fri Dec 15 17:40:09 2006
@@ -319,7 +319,7 @@
 };
 
 
-void initifoparser(void) {
-    (void) Py_InitModule("ifoparser", IfoMethods);
+void init_ifoparser(void) {
+    (void) Py_InitModule("_ifoparser", IfoMethods);
     PyEval_InitThreads();
 }

Modified: trunk/metadata/src/disc/vcd.py
==============================================================================
--- trunk/metadata/src/disc/vcd.py      (original)
+++ trunk/metadata/src/disc/vcd.py      Fri Dec 15 17:40:09 2006
@@ -79,7 +79,7 @@
             else:
                 min, sec, frames = cdrom.toc_entry(device, i)
             if num:
-                vi = core.VideoTrack()
+                vi = core.VideoStream()
                 # XXX add more static information here, it's also possible
                 # XXX to scan for more informations like fps
                 # XXX Settings to MPEG1/2 is a wild guess, maybe the track

Modified: trunk/metadata/src/factory.py
==============================================================================
--- trunk/metadata/src/factory.py       (original)
+++ trunk/metadata/src/factory.py       Fri Dec 15 17:40:09 2006
@@ -41,7 +41,7 @@
 import logging
 
 # kaa imports
-import mediainfo
+import mediainfo as core
 
 # get logging object
 log = logging.getLogger('metadata')
@@ -95,8 +95,8 @@
 
 class _Factory:
     """
-    Abstract Factory for the creation of MediaInfo instances. The different
-    Methods create MediaInfo objects by parsing the given medium.
+    Abstract Factory for the creation of Media instances. The different
+    Methods create Media objects by parsing the given medium.
     """
     def __init__(self):
         self.extmap = {}
@@ -111,7 +111,6 @@
         """
         This functions imports all known parser.
         """
-        import mediainfo
         import audio.ogg
         import audio.m4a
         import audio.ac3
@@ -177,7 +176,7 @@
             try:
                 parser = self.extmap[e[1:]][R_CLASS]
                 return parser(file)
-            except mediainfo.KaaMetadataParseError:
+            except core.ParseError:
                 pass
             except (KeyboardInterrupt, SystemExit):
                 sys.exit(0)
@@ -231,7 +230,7 @@
                 log.debug('Trying %s' % e[R_MIMETYPE])
                 try:
                     return e[R_CLASS](url)
-                except mediainfo.KaaMetadataParseError:
+                except core.ParseError:
                     pass
                 except (KeyboardInterrupt, SystemExit):
                     sys.exit(0)
@@ -250,7 +249,7 @@
             if self.mimemap.has_key(mime):
                 try:
                     return self.mimemap[mime][R_CLASS](file)
-                except mediainfo.KaaMetadataParseError:
+                except core.ParseError:
                     pass
                 except (KeyboardInterrupt, SystemExit):
                     sys.exit(0)
@@ -291,7 +290,7 @@
                 t = e[R_CLASS](devicename)
                 t.url = 'file://%s' % os.path.abspath(devicename)
                 return t
-            except mediainfo.KaaMetadataParseError:
+            except core.ParseError:
                 pass
             except (KeyboardInterrupt, SystemExit):
                 sys.exit(0)
@@ -306,7 +305,7 @@
             log.debug('Trying %s' % e[R_MIMETYPE])
             try:
                 return e[R_CLASS](dirname)
-            except mediainfo.KaaMetadataParseError:
+            except core.ParseError:
                 pass
             except (KeyboardInterrupt, SystemExit):
                 sys.exit(0)
@@ -349,11 +348,11 @@
         log.debug('%s registered' % mimetype)
         tuple = (mimetype, extensions, c)
 
-        if extensions == mediainfo.EXTENSION_DEVICE:
+        if extensions == core.EXTENSION_DEVICE:
             self.device_types.append(tuple)
-        elif extensions == mediainfo.EXTENSION_DIRECTORY:
+        elif extensions == core.EXTENSION_DIRECTORY:
             self.directory_types.append(tuple)
-        elif extensions == mediainfo.EXTENSION_STREAM:
+        elif extensions == core.EXTENSION_STREAM:
             self.stream_types.append(tuple)
         else:
             self.types.append(tuple)
@@ -366,11 +365,11 @@
         """
         return the object for mimetype/extensions or None
         """
-        if extensions == mediainfo.EXTENSION_DEVICE:
+        if extensions == core.EXTENSION_DEVICE:
             l = self.device_types
-        elif extensions == mediainfo.EXTENSION_DIRECTORY:
+        elif extensions == core.EXTENSION_DIRECTORY:
             l = self.directory_types
-        elif extensions == mediainfo.EXTENSION_STREAM:
+        elif extensions == core.EXTENSION_STREAM:
             l = self.stream_types
         else:
             l = self.types

Modified: trunk/metadata/src/games/core.py
==============================================================================
--- trunk/metadata/src/games/core.py    (original)
+++ trunk/metadata/src/games/core.py    Fri Dec 15 17:40:09 2006
@@ -32,7 +32,7 @@
 from kaa.metadata import mediainfo
 from kaa.metadata.factory import register
 
-ParseError = mediainfo.KaaMetadataParseError
+ParseError = mediainfo.ParseError
 
-class Game(mediainfo.MediaInfo):
+class Game(mediainfo.Media):
     media = mediainfo.MEDIA_GAME

Modified: trunk/metadata/src/image/core.py
==============================================================================
--- trunk/metadata/src/image/core.py    (original)
+++ trunk/metadata/src/image/core.py    Fri Dec 15 17:40:09 2006
@@ -42,7 +42,7 @@
 from kaa.metadata.factory import register
 from kaa.metadata import mediainfo
 
-ParseError = mediainfo.KaaMetadataParseError
+ParseError = mediainfo.ParseError
 
 # get logging object
 log = logging.getLogger('metadata')
@@ -52,12 +52,12 @@
               'thumbnail','software','hardware', 'dpi', 'city', 'rotation' ]
 
 
-class Image(mediainfo.MediaInfo):
+class Image(mediainfo.Media):
     """
     Digital Images, Photos, Pictures.
     """
 
-    _keys = mediainfo.MediaInfo._keys + ATTRIBUTES
+    _keys = mediainfo.Media._keys + ATTRIBUTES
     media = mediainfo.MEDIA_IMAGE
     
     def _finalize(self):
@@ -67,7 +67,7 @@
         """
         if self.url and self.url.startswith('file://'):
             self.parse_external_files(self.url[7:])
-        mediainfo.MediaInfo._finalize(self)
+        mediainfo.Media._finalize(self)
 
 
     def parse_external_files(self, filename):

Modified: trunk/metadata/src/mediainfo.py
==============================================================================
--- trunk/metadata/src/mediainfo.py     (original)
+++ trunk/metadata/src/mediainfo.py     Fri Dec 15 17:40:09 2006
@@ -39,9 +39,6 @@
 # kaa imports
 from kaa.strutils import str_to_unicode, unicode_to_str
 
-# fourcc list for debugging
-import fourcc
-
 UNPRINTABLE_KEYS = [ 'thumbnail']
 
 # media type definitions
@@ -59,18 +56,6 @@
 MEDIACORE = ['title', 'caption', 'comment', 'size', 'type', 'subtype', 'date',
              'keywords', 'country', 'language', 'url', 'media', 'artist', 
'mime']
 
-AUDIOCORE = ['channels', 'samplerate', 'length', 'encoder', 'codec', 'format',
-             'samplebits', 'bitrate', 'fourcc', 'trackno' ]
-
-VIDEOCORE = ['length', 'encoder', 'bitrate', 'samplerate', 'codec', 'format',
-             'samplebits', 'width', 'height', 'fps', 'aspect', 'trackno', 
'fourcc' ]
-
-MUSICCORE = ['trackof', 'album', 'genre', 'discs', 'thumbnail' ]
-
-AVCORE    = ['length', 'encoder', 'trackno', 'trackof', 'copyright', 'product',
-             'genre', 'writer', 'producer', 'studio', 'rating', 'starring',
-             'delay', 'image', 'video', 'audio', 'subtitles', 'chapters', 
'software' ]
-
 EXTENSION_DEVICE    = 'device'
 EXTENSION_DIRECTORY = 'directory'
 EXTENSION_STREAM    = 'stream'
@@ -79,19 +64,19 @@
 log = logging.getLogger('metadata')
 
 
-class KaaMetadataParseError:
+class ParseError:
     pass
 
 
-class MediaInfo(object):
+class Media(object):
     media = None
     
     """
-    MediaInfo is the base class to all Media Metadata Containers. It defines
-    the basic structures that handle metadata. MediaInfo and its derivates
+    Media is the base class to all Media Metadata Containers. It defines
+    the basic structures that handle metadata. Media and its derivates
     contain a common set of metadata attributes that is listed in keys.
     Specific derivates contain additional keys to the dublin core set that is
-    defined in MediaInfo.
+    defined in Media.
     """
     _keys = MEDIACORE
     table_mapping = {}
@@ -101,7 +86,7 @@
             # create mediainfo based on dict
             for key, value in hash.items():
                 if isinstance(value, list) and value and isinstance(value[0], 
dict):
-                    value = [ MediaInfo(x) for x in value ]
+                    value = [ Media(x) for x in value ]
                 self._set(key, value)
             return
         
@@ -212,7 +197,7 @@
                 setattr(self, key, str_to_unicode(value))
             if isinstance(value, unicode):
                 setattr(self, key, value.strip().rstrip().replace(u'\0', u''))
-            if isinstance(value, list) and value and isinstance(value[0], 
MediaInfo):
+            if isinstance(value, list) and value and isinstance(value[0], 
Media):
                 for submenu in value:
                     submenu._finalize()
 
@@ -276,7 +261,7 @@
         result = {}
         for k in self._keys:
             value = getattr(self, k, None)
-            if isinstance(value, list) and value and isinstance(value[0], 
MediaInfo):
+            if isinstance(value, list) and value and isinstance(value[0], 
Media):
                 value = [ x.convert() for x in value ]
             result[k] = value
         return result
@@ -289,92 +274,13 @@
         return self._keys
 
 
-class AudioInfo(MediaInfo):
-    """
-    Audio Tracks in a Multiplexed Container.
-    """
-    _keys = MediaInfo._keys + AUDIOCORE
-    media = MEDIA_AUDIO
-
-    def _finalize(self):
-        MediaInfo._finalize(self)
-        if self.codec is not None:
-            self.fourcc, self.codec = fourcc.resolve(self.codec)
-
-
-class VideoInfo(MediaInfo):
-    """
-    Video Tracks in a Multiplexed Container.
-    """
-    _keys = MediaInfo._keys + VIDEOCORE
-    media = MEDIA_VIDEO
-
-    def _finalize(self):
-        MediaInfo._finalize(self)
-        if self.codec is not None:
-            self.fourcc, self.codec = fourcc.resolve(self.codec)
-
-
-class ChapterInfo(MediaInfo):
-    """
-    Chapter in a Multiplexed Container.
-    """
-    _keys = ['name', 'pos', 'enabled']
-
-    def __init__(self, name=None, pos=0):
-        MediaInfo.__init__(self)
-        self.name = name
-        self.pos = pos
-        self.enabled = True
-
-
-class SubtitleInfo(MediaInfo):
-    """
-    Subtitle Tracks in a Multiplexed Container.
-    """
-    _keys = ['language', 'trackno', 'title']
-    media = MEDIA_SUBTITLE
-
-    def __init__(self, language=None):
-        MediaInfo.__init__(self)
-        self.language = language
-
-        
-class AVInfo(MediaInfo):
-    """
-    Container for Audio and Video streams. This is the Container Type for
-    all media, that contain more than one stream.
-    """
-    _keys = MediaInfo._keys + AVCORE
-    media = MEDIA_AV
-
-    def __init__(self):
-        MediaInfo.__init__(self)
-        self.audio = []
-        self.video = []
-        self.subtitles = []
-        self.chapters  = []
-
-
-    def _finalize(self):
-        """
-        Correct same data based on specific rules
-        """
-        MediaInfo._finalize(self)
-        if not self.length and len(self.video) and self.video[0].length:
-            self.length = self.video[0].length
-        for container in [ self ] + self.video + self.audio:
-            if container.length:
-                container.length = int(container.length)
-
-
-class CollectionInfo(MediaInfo):
+class Collection(Media):
     """
     Collection of Digial Media like CD, DVD, Directory, Playlist
     """
-    _keys = MediaInfo._keys + [ 'id', 'tracks' ]
+    _keys = Media._keys + [ 'id', 'tracks' ]
     media = MEDIA_CONTAINER
 
     def __init__(self):
-        MediaInfo.__init__(self)
+        Media.__init__(self)
         self.tracks = []

Modified: trunk/metadata/src/misc/directory.py
==============================================================================
--- trunk/metadata/src/misc/directory.py        (original)
+++ trunk/metadata/src/misc/directory.py        Fri Dec 15 17:40:09 2006
@@ -46,14 +46,14 @@
 log = logging.getLogger('metadata')
 
 
-class Directory(core.MediaInfo):
+class Directory(core.Media):
     """
     Simple parser for reading a .directory file.
     """
     media = core.MEDIA_DIRECTORY
 
     def __init__(self, directory):
-        core.MediaInfo.__init__(self)
+        core.Media.__init__(self)
         for func in (self.parse_dot_directory, self.parse_bins):
             try:
                 func(directory)

Modified: trunk/metadata/src/misc/xml.py
==============================================================================
--- trunk/metadata/src/misc/xml.py      (original)
+++ trunk/metadata/src/misc/xml.py      Fri Dec 15 17:40:09 2006
@@ -46,14 +46,14 @@
     'freevo': 'Freevo XML Definition'
     }
 
-class XML(core.MediaInfo):
+class XML(core.Media):
 
     def __init__(self,file):
         ext = os.path.splitext(file.name)[1].lower()
         if not ext in ('.xml', '.fxd', '.html', '.htm'):
-            raise core.KaaMetadataParseError()
+            raise core.ParseError()
 
-        core.MediaInfo.__init__(self)
+        core.Media.__init__(self)
 
         self.mime  = 'text/xml'
         self.type  = ''
@@ -72,10 +72,10 @@
         try:
             doc = ctxt.doc()
         except libxml2.parserError:
-            raise core.KaaMetadataParseError()
+            raise core.ParseError()
 
         if not doc or not doc.children or not doc.children.name:
-            raise core.KaaMetadataParseError()
+            raise core.ParseError()
 
         tag = doc.children.name
         if tag in XML_TAG_INFO:

Modified: trunk/metadata/src/video/core.py
==============================================================================
--- trunk/metadata/src/video/core.py    (original)
+++ trunk/metadata/src/video/core.py    Fri Dec 15 17:40:09 2006
@@ -31,16 +31,88 @@
 
 from kaa.metadata import mediainfo
 from kaa.metadata.factory import register
+from kaa.metadata.audio.core import Audio as AudioStream
+
+# fourcc list
+import kaa.metadata.fourcc as fourcc
+
+ParseError = mediainfo.ParseError
+
+VIDEOCORE = ['length', 'encoder', 'bitrate', 'samplerate', 'codec', 'format',
+             'samplebits', 'width', 'height', 'fps', 'aspect', 'trackno', 
'fourcc' ]
+
+AVCORE    = ['length', 'encoder', 'trackno', 'trackof', 'copyright', 'product',
+             'genre', 'writer', 'producer', 'studio', 'rating', 'starring',
+             'delay', 'image', 'video', 'audio', 'subtitles', 'chapters', 
'software' ]
+
+class VideoStream(mediainfo.Media):
+    """
+    Video Tracks in a Multiplexed Container.
+    """
+    _keys = mediainfo.Media._keys + VIDEOCORE
+    media = mediainfo.MEDIA_VIDEO
+
+    def _finalize(self):
+        mediainfo.Media._finalize(self)
+        if self.codec is not None:
+            self.fourcc, self.codec = fourcc.resolve(self.codec)
+
+
+class Chapter(mediainfo.Media):
+    """
+    Chapter in a Multiplexed Container.
+    """
+    _keys = ['name', 'pos', 'enabled']
+
+    def __init__(self, name=None, pos=0):
+        mediainfo.Media.__init__(self)
+        self.name = name
+        self.pos = pos
+        self.enabled = True
+
+
+class Subtitle(mediainfo.Media):
+    """
+    Subtitle Tracks in a Multiplexed Container.
+    """
+    _keys = ['language', 'trackno', 'title']
+    media = mediainfo.MEDIA_SUBTITLE
+
+    def __init__(self, language=None):
+        mediainfo.Media.__init__(self)
+        self.language = language
+
+        
+class AVContainer(mediainfo.Media):
+    """
+    Container for Audio and Video streams. This is the Container Type for
+    all media, that contain more than one stream.
+    """
+    _keys = mediainfo.Media._keys + AVCORE
+    media = mediainfo.MEDIA_AV
+
+    def __init__(self):
+        mediainfo.Media.__init__(self)
+        self.audio = []
+        self.video = []
+        self.subtitles = []
+        self.chapters  = []
+
+
+    def _finalize(self):
+        """
+        Correct same data based on specific rules
+        """
+        mediainfo.Media._finalize(self)
+        if not self.length and len(self.video) and self.video[0].length:
+            self.length = self.video[0].length
+        for container in [ self ] + self.video + self.audio:
+            if container.length:
+                container.length = int(container.length)
 
-ParseError = mediainfo.KaaMetadataParseError
 
 # TODO: copy stuff to this file
 
-VideoStream  = mediainfo.VideoInfo
-AudioStream  = mediainfo.AudioInfo
-AVContainer = mediainfo.AVInfo
 MEDIA_AUDIO = mediainfo.MEDIA_AUDIO
 MEDIA_AV = mediainfo.MEDIA_AV
-Subtitle = mediainfo.SubtitleInfo
-Chapter = mediainfo.ChapterInfo
-Collection = mediainfo.CollectionInfo
+Collection = mediainfo.Collection

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to