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

Reply via email to