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