Update of /cvsroot/freevo/freevo/src/record
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32699/src/record

Modified Files:
        server.py 
Log Message:
-Integrate some things into the Twisted main loop:
  -More events.
  -Daemon plugins (polling and event handling).

-Recording plugins are now DaemonPlugins that:
  -Get polled.
  -Handle events.

-Add hooks to a temporary cached guide in util.tv_util, at least until
 there's a replacement.



Index: server.py
===================================================================
RCS file: /cvsroot/freevo/freevo/src/record/server.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** server.py   5 Aug 2004 17:35:40 -0000       1.1
--- server.py   8 Aug 2004 19:03:18 -0000       1.2
***************
*** 8,11 ****
--- 8,23 ----
  # -----------------------------------------------------------------------
  # $Log$
+ # Revision 1.2  2004/08/08 19:03:18  rshortt
+ # -Integrate some things into the Twisted main loop:
+ #   -More events.
+ #   -Daemon plugins (polling and event handling).
+ #
+ # -Recording plugins are now DaemonPlugins that:
+ #   -Get polled.
+ #   -Handle events.
+ #
+ # -Add hooks to a temporary cached guide in util.tv_util, at least until
+ #  there's a replacement.
+ #
  # Revision 1.1  2004/08/05 17:35:40  dischi
  # move recordserver and plugins into extra dir
***************
*** 35,40 ****
  
  import sys, string, random, time, os, re, pwd, traceback, stat
- import config
- from util import vfs
  
  from twisted.web import xmlrpc, server
--- 47,50 ----
***************
*** 47,52 ****
  from tv.record_types import ScheduledRecordings
  
  import tv.record_types
- import tv.epg_xmltv
  import util.tv_util as tv_util
  import plugin
--- 57,66 ----
  from tv.record_types import ScheduledRecordings
  
+ import config, eventhandler
+ eh = eventhandler.get_singleton()
+ 
+ from event import *
+ from util import vfs
  import tv.record_types
  import util.tv_util as tv_util
  import plugin
***************
*** 58,62 ****
          log.debug(String(text))
          
! # XXX: In the future we should have one lock per VideoGroup.
  tv_lock_file = config.FREEVO_CACHEDIR + '/record'
  
--- 72,82 ----
          log.debug(String(text))
          
! # Do we need to change logging?
! appname = os.path.splitext(os.path.basename(sys.argv[0]))[0]
! logfile = '%s/%s-%s.log' % (config.LOGDIR, appname, os.getuid())
! log.startLogging(open(logfile, 'a'))
! 
! # XXX: change this to use tv0.lock (ivtvX/dvbX/etc..) where
! #      it may need it.
  tv_lock_file = config.FREEVO_CACHEDIR + '/record'
  
***************
*** 143,147 ****
   
      def scheduleRecording(self, prog=None):
!         global guide
  
          if not prog:
--- 163,167 ----
   
      def scheduleRecording(self, prog=None):
!         guide = tv_util.get_guide()
  
          if not prog:
***************
*** 195,202 ****
          # if prog.start <= now and prog.stop >= now and recording:
          if recording:
!             #print 'stopping current recording'
!             rec_plugin = plugin.getbyname('RECORD')
!             if rec_plugin:
!                 rec_plugin.Stop()
         
          return (TRUE, 'recording removed')
--- 215,220 ----
          # if prog.start <= now and prog.stop >= now and recording:
          if recording:
!             _debug_('stopping current recording')
!             eh.post(Event('STOP_RECORDING', arg=prog))
         
          return (TRUE, 'recording removed')
***************
*** 219,223 ****
  
      def findProg(self, chan=None, start=None):
!         global guide
  
          _debug_('findProg: %s, %s' % (chan, start))
--- 237,241 ----
  
      def findProg(self, chan=None, start=None):
!         guide = tv_util.get_guide()
  
          _debug_('findProg: %s, %s' % (chan, start))
***************
*** 233,238 ****
                  for prog in ch.programs:
                      if start == '%s' % prog.start:
!                         _debug_('PROGRAM MATCH: %s' % prog.decode().title)
!                         return (TRUE, prog.decode())
  
          return (FALSE, 'prog not found')
--- 251,256 ----
                  for prog in ch.programs:
                      if start == '%s' % prog.start:
!                         _debug_('PROGRAM MATCH: %s' % prog.title)
!                         return (TRUE, prog)
  
          return (FALSE, 'prog not found')
***************
*** 240,244 ****
  
      def findMatches(self, find=None, movies_only=None):
!         global guide
  
          _debug_('findMatches: %s' % find)
--- 258,262 ----
  
      def findMatches(self, find=None, movies_only=None):
!         guide = tv_util.get_guide()
  
          _debug_('findMatches: %s' % find)
***************
*** 289,293 ****
  
          # XXX TODO: only do this if the guide has changed?
!         guide = tv.epg_xmltv.get_guide()
  
          
--- 307,311 ----
  
          # XXX TODO: only do this if the guide has changed?
!         guide = tv_util.get_guide()
  
          
***************
*** 339,344 ****
                          sr.removeProgram(currently_recording, 
                                           tv_util.getKey(currently_recording))
!                         plugin.getbyname('RECORD').Stop()
!                         time.sleep(5)
                          _debug_('CALLED RECORD STOP 1')
                      else:
--- 357,362 ----
                          sr.removeProgram(currently_recording, 
                                           tv_util.getKey(currently_recording))
!                         eh.post(Event('STOP_RECORDING', arg=prog))
!                         # time.sleep(5)
                          _debug_('CALLED RECORD STOP 1')
                      else:
***************
*** 355,360 ****
                                  sr.removeProgram(currently_recording, 
                                                   tv_util.getKey(currently_recording))
!                                 plugin.getbyname('RECORD').Stop()
!                                 time.sleep(5)
                                  _debug_('CALLED RECORD STOP 2')
                              else: 
--- 373,378 ----
                                  sr.removeProgram(currently_recording, 
                                                   tv_util.getKey(currently_recording))
!                                 eh.post(Event('STOP_RECORDING', arg=prog))
!                                 # time.sleep(5)
                                  _debug_('CALLED RECORD STOP 2')
                              else: 
***************
*** 387,391 ****
          if rec_prog:
              _debug_('start recording')
!             self.record_app = plugin.getbyname('RECORD')
  
              if not self.record_app:
--- 405,413 ----
          if rec_prog:
              _debug_('start recording')
!             self.record_app = True
! 
!             # XXX: make a good list of recordserver events, maybe use one to
!             #      notify if we aren't really recording something so we can
!             #      clear it from the schedule.
  
              if not self.record_app:
***************
*** 395,399 ****
                  return
  
!             self.record_app.Record(rec_prog)
  
  
--- 417,421 ----
                  return
  
!             eh.post(Event('RECORD', arg=rec_prog))
  
  
***************
*** 552,556 ****
      
      def addFavoriteToSchedule(self, fav):
!         global guide
          favs = {}
          favs[fav.name] = fav
--- 574,578 ----
      
      def addFavoriteToSchedule(self, fav):
!         guide = tv_util.get_guide()
          favs = {}
          favs[fav.name] = fav
***************
*** 572,576 ****
          #        previously decided not to record it.
  
!         global guide
      
          self.updateGuide()
--- 594,598 ----
          #        previously decided not to record it.
  
!         guide = tv_util.get_guide()
      
          self.updateGuide()
***************
*** 788,791 ****
--- 810,819 ----
              
  
+     def startup(self):
+         self.startMinuteCheck()
+         self.startPlugins()
+         self.handleEvents()
+             
+ 
      def startMinuteCheck(self):
          next_minute = (int(time.time()/60) * 60 + 60) - int(time.time())
***************
*** 793,802 ****
          reactor.callLater(next_minute, self.minuteCheck)
          
      def minuteCheck(self):
          next_minute = (int(time.time()/60) * 60 + 60) - int(time.time())
          if next_minute != 60:
              # Compensate for timer drift 
!             if config.DEBUG:
!                 log.debug('top of the minute in %s seconds' % next_minute)
              reactor.callLater(next_minute, self.minuteCheck)
          else:
--- 821,830 ----
          reactor.callLater(next_minute, self.minuteCheck)
          
+ 
      def minuteCheck(self):
          next_minute = (int(time.time()/60) * 60 + 60) - int(time.time())
          if next_minute != 60:
              # Compensate for timer drift 
!             _debug_('top of the minute in %s seconds' % next_minute)
              reactor.callLater(next_minute, self.minuteCheck)
          else:
***************
*** 806,848 ****
  
  
!     def eventNotice(self):
!         _debug_('RECORDSERVER GOT EVENT NOTICE')
!         # Use callLater so that handleEvents will get called the next time
!         # through the main loop.
!         reactor.callLater(0, self.handleEvents) 
  
  
      def handleEvents(self):
-         _debug_('RECORDSERVER HANDLING EVENT')
  
!         if event:
!             if event == OS_EVENT_POPEN2:
!                 print 'popen %s' % event.arg[1]
!                 event.arg[0].child = util.popen3.Popen3(event.arg[1])
  
!             elif event == OS_EVENT_WAITPID:
!                 pid = event.arg[0]
!                 print 'waiting on pid %s' % pid
  
!                 for i in range(20):
!                     try:
!                         wpid = os.waitpid(pid, os.WNOHANG)[0]
!                     except OSError:
!                         # forget it
!                         continue
!                     if wpid == pid:
!                         break
!                     time.sleep(0.1)
  
!             elif event == OS_EVENT_KILL:
!                 pid = event.arg[0]
!                 sig = event.arg[1]
  
!                 print 'killing pid %s with sig %s' % (pid, sig)
                  try:
!                     os.kill(pid, sig)
                  except OSError:
!                     pass
  
                  for i in range(20):
                      try:
--- 834,924 ----
  
  
!     def poll_plugin(self, plugin):
!         # _debug_('polling %s' % plugin.plugin_name)
!         plugin.poll()
!         reactor.callLater(plugin.poll_interval*0.1, self.poll_plugin, plugin)
! 
! 
!     def startPlugins(self):
!         for p in plugin.get('daemon_poll'):
!             _debug_('found a poll plugin: %s' % p.plugin_name)
!             reactor.callLater(0.1, self.poll_plugin, p)
  
  
      def handleEvents(self):
  
!         if not len(eh.queue):
!             # No event, check again really soon.
!             reactor.callLater(0.1, self.handleEvents) 
!             return
  
!         event = eh.queue[0]
!         del eh.queue[0]
!         # If we got an event then call this function in the next iteration
!         # of the main loop to exhaust the queue quickly without blocking as
!         # if we clear them all at the same time.
!         reactor.callLater(0, self.handleEvents) 
  
!         _debug_('handling event %s' % str(event))
  
!         if eh.eventhandler_plugins == None:
!             import plugin
!             _debug_('init')
!             eh.eventhandler_plugins  = []
!             eh.eventlistener_plugins = []
  
!             for p in plugin.get('daemon_eventhandler'):
!                 if hasattr(p, 'event_listener') and p.event_listener:
!                     eh.eventlistener_plugins.append(p)
!                 else:
!                     eh.eventhandler_plugins.append(p)
! 
!         for p in eh.eventlistener_plugins:
!             p.eventhandler(event=event)
! 
!         if event == OS_EVENT_POPEN2:
!             print 'popen %s' % event.arg[1]
!             event.arg[0].child = util.popen3.Popen3(event.arg[1])
! 
!         elif event == OS_EVENT_WAITPID:
!             pid = event.arg[0]
!             _debug_('waiting on pid %s' % pid)
! 
!             for i in range(20):
                  try:
!                     wpid = os.waitpid(pid, os.WNOHANG)[0]
                  except OSError:
!                     # forget it
!                     continue
!                 if wpid == pid:
!                     break
!                 time.sleep(0.1)
  
+         elif event == OS_EVENT_KILL:
+             pid = event.arg[0]
+             sig = event.arg[1]
+ 
+             _debug_('killing pid %s with sig %s' % (pid, sig))
+             try:
+                 os.kill(pid, sig)
+             except OSError:
+                 pass
+ 
+             for i in range(20):
+                 try:
+                     wpid = os.waitpid(pid, os.WNOHANG)[0]
+                 except OSError:
+                     # forget it
+                     continue
+                 if wpid == pid:
+                     break
+                 time.sleep(0.1)
+ 
+             else:
+                 _debug_('force killing with signal 9')
+                 try:
+                     os.kill(pid, 9)
+                 except OSError:
+                     pass
                  for i in range(20):
                      try:
***************
*** 854,903 ****
                          break
                      time.sleep(0.1)
  
!                 else:
!                     print 'force killing with signal 9'
!                     try:
!                         os.kill(pid, 9)
!                     except OSError:
!                         pass
!                     for i in range(20):
!                         try:
!                             wpid = os.waitpid(pid, os.WNOHANG)[0]
!                         except OSError:
!                             # forget it
!                             continue
!                         if wpid == pid:
!                             break
!                         time.sleep(0.1)
!                 print 'recorderver: After wait()'
! 
!             elif event == RECORD_START:
!                 _debug_('Handling event RECORD_START')
!                 prog = event.arg
!                 open(tv_lock_file, 'w').close()
!                 self.create_fxd(prog)
!                 if config.VCR_PRE_REC:
!                     util.popen3.Popen3(config.VCR_PRE_REC)
  
!             elif event == RECORD_STOP:
!                 _debug_('Handling event RECORD_STOP')
!                 os.remove(tv_lock_file)
!                 prog = event.arg
!                 try:
!                     snapshot(prog.filename)
!                 except:
!                     # If automatic pickling fails, use on-demand caching when
!                     # the file is accessed instead. 
!                     os.rename(vfs.getoverlay(prog.filename + '.raw.tmp'),
!                               vfs.getoverlay(os.path.splitext(prog.filename)[0] + 
'.png'))
  
!                 if config.VCR_POST_REC:
!                     util.popen3.Popen3(config.VCR_POST_REC)
  
-             else:
-                 print 'not handling event %s' % str(event)
-                 return
-         else:
-             print 'no event to get' 
  
  
--- 930,958 ----
                          break
                      time.sleep(0.1)
+             _debug_('recorderver: After wait()')
  
!         elif event == RECORD_START:
!             _debug_('Handling event RECORD_START')
!             prog = event.arg
!             open(tv_lock_file, 'w').close()
!             self.create_fxd(prog)
!             if config.VCR_PRE_REC:
!                 util.popen3.Popen3(config.VCR_PRE_REC)
  
!         elif event == RECORD_STOP:
!             _debug_('Handling event RECORD_STOP')
!             os.remove(tv_lock_file)
!             prog = event.arg
!             try:
!                 snapshot(prog.filename)
!             except:
!                 # If automatic pickling fails, use on-demand caching when
!                 # the file is accessed instead. 
!                 os.rename(vfs.getoverlay(prog.filename + '.raw.tmp'),
!                           vfs.getoverlay(os.path.splitext(prog.filename)[0] + 
'.png'))
  
!             if config.VCR_POST_REC:
!                 util.popen3.Popen3(config.VCR_POST_REC)
  
  
  
***************
*** 910,913 ****
          reactor.listenTCP(config.TV_RECORD_SERVER_PORT, server.Site(rs))
  
!     rs.startMinuteCheck()
      reactor.run()
--- 965,968 ----
          reactor.listenTCP(config.TV_RECORD_SERVER_PORT, server.Site(rs))
  
!     rs.startup()
      reactor.run()



-------------------------------------------------------
This SF.Net email is sponsored by OSTG. Have you noticed the changes on
Linux.com, ITManagersJournal and NewsForge in the past few weeks? Now,
one more big change to announce. We are now OSTG- Open Source Technology
Group. Come see the changes on the new OSTG site. www.ostg.com
_______________________________________________
Freevo-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to