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