Author: dmeyer
Date: Tue Mar 21 14:05:26 2006
New Revision: 8116
Modified:
trunk/tvserver/bin/freevo-tvserver
trunk/tvserver/src/config.py
trunk/tvserver/src/epg.py
trunk/tvserver/src/recorder.py
trunk/tvserver/src/server.py
Log:
integrate epg server into freevo-tvserver
Modified: trunk/tvserver/bin/freevo-tvserver
==============================================================================
--- trunk/tvserver/bin/freevo-tvserver (original)
+++ trunk/tvserver/bin/freevo-tvserver Tue Mar 21 14:05:26 2006
@@ -5,7 +5,7 @@
# -----------------------------------------------------------------------------
# $Id$
#
-# This helper will start the freevo recordserver.
+# This is the freevo tvserver (including epg server)
#
# -----------------------------------------------------------------------------
# Freevo - A Home Theater PC framework
@@ -33,8 +33,8 @@
# python imports
import os
+import time
import sys
-import pwd
import logging
# insert freevo path information
@@ -43,47 +43,118 @@
if not __site__ in sys.path:
sys.path.insert(0, __site__)
+pid = -1
+if len(sys.argv) == 1:
+ # Normal recordserver startup, fork epg client. We can not import kaa
before
+ # forking or the notifier will fail because the internal thread wakeup is
+ # handled by two different processes.
+ pid = os.fork()
+
+if not pid:
+ # This is the epg server. Import everything we need and start it
+
+ # kaa imports
+ import kaa
+ import kaa.epg
+
+ # freevo core imports
+ import freevo.conf
+
+ # read the config file
+ from freevo.tvserver.config import config
+
+ # logger setup
+ log = logging.getLogger()
+ log.setLevel(logging.INFO)
+
+ # remove handler, we want to set the look and avoid
+ # duplicate handlers
+ for l in log.handlers:
+ log.removeHandler(l)
+
+ handler = logging.FileHandler('%s/tvepg-%s' % (freevo.conf.LOGDIR,
os.getuid()))
+ handler.setFormatter(freevo.conf.formatter)
+ log.addHandler(handler)
+
+ # get logging object
+ log = logging.getLogger('record')
+
+ # set basic recording debug to info
+ log.setLevel(getattr(logging, config.loglevel))
+
+ guide = kaa.epg.Server(str(config.epg.database))
+
+ # run epg server
+ kaa.main()
+
+ # print debug at the end
+ log.info('terminate epg')
+ sys.exit(0)
+
+
+
+# At this point we are the main tvserver
+
# kaa imports
import kaa
-import kaa.notifier
-
-# FIXME: create logger objects in conf
+import kaa.epg
+
+# freevo core imports
import freevo.conf
+import freevo.ipc
+
+# get logging object
+log = logging.getLogger('record')
+
+if len(sys.argv) > 1 and sys.argv[1] == '-i':
+ # import interactive mode
+ from freevo.tvserver import interactive
-# create and read config
-from freevo.tvserver.config import config
+ kaa.main()
+ sys.exit(0)
# get logging object
log = logging.getLogger('record')
+# connect to the epg at client side
+while 1:
+ try:
+ epg = kaa.epg.connect('epg')
+ break
+ except Exception, e:
+ if os.waitpid(pid, os.WNOHANG)[0] == pid:
+ log.error('unable to start epg server')
+ sys.exit(1)
+ time.sleep(0.01)
+
+# import config. At this point we are conncted to the epg. This also means that
+# the epg server already opened the config file and maybe wrote it.
+from freevo.tvserver.config import config
+
# set basic recording debug to info
log.setLevel(getattr(logging, config.loglevel))
-# # change uid
-# try:
-# if config.SERVER_UID and os.getuid() == 0:
-# os.setgid(config.SERVER_GID)
-# os.setuid(config.SERVER_UID)
-# os.environ['USER'] = pwd.getpwuid(os.getuid())[0]
-# os.environ['HOME'] = pwd.getpwuid(os.getuid())[5]
-# except Exception, e:
-# log.warning('unable to set uid: %s' % e)
-
-if len(sys.argv) > 1:
- if sys.argv[1] == '-i':
- # import interactive mode
- from freevo.tvserver import interactive
-
- else:
- sys.exit(1)
-else:
- # import recordserver
- from freevo.tvserver.server import RecordServer
+# import recordserver
+from freevo.tvserver.server import RecordServer
+
+# start recordserver
+server = RecordServer()
- # start recordserver
- server = RecordServer()
+# get mbus address for epg settings
+mbus = freevo.ipc.Instance('tvserver')
+
+auth = mbus.cfg.hashkey.strip()
+host = mbus.addr['id'][mbus.addr['id'].find('@')+1:]
+port = epg._server.connect_to_network(host + ':0', auth)[1]
+
+# make epg information public
+server.epgaddr = (host, port)
kaa.main()
+# kill epg server
+# FIXME: make sure the server stops itself when the tvserver is gone
+os.kill(pid, 15)
+
# print debug at the end
log.info('terminate')
Modified: trunk/tvserver/src/config.py
==============================================================================
--- trunk/tvserver/src/config.py (original)
+++ trunk/tvserver/src/config.py Tue Mar 21 14:05:26 2006
@@ -31,8 +31,10 @@
# epg group
Group(name='epg', desc=_('epg settings'), schema=[
+ Var(name='database', default=freevo.conf.datafile('epg.sqlite'),
+ desc=_('epg database file')),
Dict(name='mapping', type=unicode, schema=Var(type=unicode),
- desc=_('EPG channel mapping'))])
+ desc=_('EPG channel mapping'))])
])
config.load('/etc/freevo/tvserver.conf')
Modified: trunk/tvserver/src/epg.py
==============================================================================
--- trunk/tvserver/src/epg.py (original)
+++ trunk/tvserver/src/epg.py Tue Mar 21 14:05:26 2006
@@ -38,8 +38,7 @@
from kaa.notifier import OneShotTimer, Timer, Signal, execute_in_timer
# freevo imports
-from freevo.ipc.epg import connect as guide
-from freevo.ipc.epg import QExpr
+import kaa.epg
# record imports
from record_types import *
@@ -59,7 +58,7 @@
"""
Return list of channels.
"""
- return guide().get_channels()
+ return kaa.epg.get_channels()
def check_all(self, favorites, recordings, callback, *args, **kwargs):
@@ -105,10 +104,13 @@
# moved a larger time interval, it won't be found again.
interval = (rec.start - 20 * 60, rec.start + 20 * 60)
+ channel = kaa.epg.get_channel(rec.channel)
+ if not channel:
+ log.error('unable to find %s in epg database', rec.channel)
+ return True
+
# try to find the exact title again
- results = guide().search(title = rec.name,
- channel=guide().get_channel(rec.channel),
- time = interval)
+ results = kaa.epg.search(title = rec.name, channel=channel, time =
interval)
for epginfo in results:
# check all results
@@ -170,9 +172,9 @@
# some favorite titles when they have short names.
if fav.substring:
# unable to do that right now
- listing = guide().search(keywords=fav.name)
+ listing = kaa.epg.search(keywords=fav.name)
else:
- listing = guide().search(title=QExpr('like', fav.name))
+ listing = kaa.epg.search(title=kaa.epg.QExpr('like', fav.name))
for p in listing:
if not fav.match(p.title, p.channel.name, p.start):
Modified: trunk/tvserver/src/recorder.py
==============================================================================
--- trunk/tvserver/src/recorder.py (original)
+++ trunk/tvserver/src/recorder.py Tue Mar 21 14:05:26 2006
@@ -44,10 +44,10 @@
# kaa imports
from kaa.notifier import OneShotTimer, Signal
+import kaa.epg
# freevo core imports
import freevo.ipc
-from freevo.ipc.epg import connect as guide
# record imports
from config import config
@@ -273,17 +273,17 @@
# step 1, see config for override
if channel in config.epg.mapping:
- chan = guide().get_channel(config.epg.mapping[channel])
+ chan =
kaa.epg.guide.get_channel(config.epg.mapping[channel])
if chan:
self.add_channel(chan, channel)
continue
# step 2, try tuner_id
- chan = guide().get_channel_by_tuner_id(channel)
+ chan = kaa.epg.guide.get_channel_by_tuner_id(channel)
if not chan:
# step 3, try name
- chan = guide().get_channel(channel)
+ chan = kaa.epg.guide.get_channel(channel)
if chan:
self.add_channel(chan, channel)
@@ -293,7 +293,7 @@
# Stop here. The channel is in the mapping list but not
# detected by the system. Before we do some bad guessing,
# just set the channel to a non epg channel
- self.add_channel(guide().new_channel(channel), channel)
+ self.add_channel(kaa.epg.guide.new_channel(channel),
channel)
continue
# Now we start the ugly part of guessing
@@ -301,7 +301,7 @@
found = False
# maybe the name is a little bit different
normchannel = self.normalize_name(channel)
- for c in guide().get_channels():
+ for c in kaa.epg.guide.get_channels():
if self.normalize_name(c.name) == normchannel:
self.add_channel(c, channel)
config.epg.mapping[channel] = c.name
Modified: trunk/tvserver/src/server.py
==============================================================================
--- trunk/tvserver/src/server.py (original)
+++ trunk/tvserver/src/server.py Tue Mar 21 14:05:26 2006
@@ -72,6 +72,7 @@
self.last_listing = []
self.live_tv_map = {}
self.locked = False
+ self.epgaddr = ('', 0)
# add port for channels and check if they are in live-tv mode
port = 6000
@@ -576,6 +577,13 @@
return ret
+ @freevo.ipc.expose('home-theatre.epg.connect')
+ def rpc_epg_connect(self):
+ """
+ """
+ return self.epgaddr
+
+
#
# mbus.status handling
#
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog