Author: duncan
Date: Thu Nov 1 18:19:06 2007
New Revision: 10057
Log:
Added more record client kaa rpc functions
Updated tv.upsoon to use them
Modified:
branches/rel-1/freevo/src/tv/plugins/upsoon.py
branches/rel-1/freevo/src/tv/record_client.py
Modified: branches/rel-1/freevo/src/tv/plugins/upsoon.py
==============================================================================
--- branches/rel-1/freevo/src/tv/plugins/upsoon.py (original)
+++ branches/rel-1/freevo/src/tv/plugins/upsoon.py Thu Nov 1 18:19:06 2007
@@ -40,6 +40,7 @@
import glob
import thread
import tv.v4l2
+from tv.record_client import RecordClient
from kaa.notifier import Timer, EventHandler
from tv.channels import FreevoChannels
from util.marmalade import jellyToXML, unjellyFromXML
@@ -79,16 +80,19 @@
self.event = EventHandler(self.event_handler)
self.event.register(('VIDEO_START', 'VIDEO_END'))
- server_string = 'http://%s:%s/' % (config.RECORDSERVER_IP,
config.RECORDSERVER_PORT)
- _debug_('%s' % server_string)
- self.server = xmlrpclib.Server(server_string, allow_none=1)
- _debug_('%s' % self.server)
-
- self.serverup = None
- self.next_program = self.findNextProgram()
- _debug_('%s' % (self.next_program))
+ self.recordclient = RecordClient()
+ #server_string = 'http://%s:%s/' % (config.RECORDSERVER_IP,
config.RECORDSERVER_PORT)
+ #_debug_('%s' % server_string)
+ #self.server = xmlrpclib.Server(server_string, allow_none=1)
+ #_debug_('%s' % self.server)
+
+ #self.serverup = None
+ #self.next_program = self.findNextProgram()
+ #_debug_('%s' % (self.next_program))
+ self.next_program = None
self.fc = FreevoChannels()
+ self.rdev = config.RADIO_DEVICE
self.seconds_before_announce = 120
self.seconds_before_start = 60
@@ -97,112 +101,31 @@
self.stopped = False # flag that tells upsoon stopped the tv, not
the user
- def findNextProgram(self):
- """ returns the next program that will be recorded """
- _debug_('findNextProgram(self)', 2)
- serverup = True
- try:
- (status, message) = self.server.findNextProgram()
- _debug_('status=%s, message=%s' % (status, message), 2)
- except TypeError, e:
- _debug_('findNextProgram:%s' % e, DINFO)
- status = False
- pass
- except Exception, e:
- serverup = False
- status = False
- if sys.exc_type != socket.error:
- traceback.print_exc()
- _debug_('findNextProgram:%s' % e, 0)
-
- if self.serverup != serverup:
- self.serverup = serverup
- if serverup:
- _debug_('The record server is up')
- else:
- _debug_('The record server is down')
-
- if not status:
- return None
-
- next_program = unjellyFromXML(message)
- return next_program
-
-
- def isPlayerRunning(self):
- """
- Check with the record server if suspended by user
- """
- _debug_('isPlayerRunning(self)', 2)
- serverup = True
- try:
- (status, message) = self.server.isPlayerRunning()
- _debug_('status=%s, message=%s' % (status, message), 2)
- except Exception, e:
- serverup = False
- message = None
- if sys.exc_type != socket.error:
- traceback.print_exc()
- _debug_('isPlayerRunning:%s' % e, 0)
-
- if self.serverup != serverup:
- self.serverup = serverup
- if serverup:
- _debug_('The record server is up')
- else:
- _debug_('The record server is down')
+ def findNextProgramHandler(self, result):
+ """ Handles the result from the findNextProgram call """
+ self.next_program = result
- if message == None:
- return None
-
- return status
-
-
- def getPlayerRunning(self):
- """
- Return is a player is running
- """
- _debug_('getPlayerRunning(self)', 2)
- return self.is_player_running
-
-
- def close(self):
- """
- to be called before the plugin exists.
- It terminates the connection with the server
- """
- _debug_('close(self)')
-
-
- def timer_handler(self):
- """
- Sends a poll message to the record server
- """
- now=time.time()
- _debug_('poll(self)', 2)
-
- self.next_program = self.findNextProgram()
+ now = time.time()
_debug_('now=%s next=%s ' % (time.strftime('%T', time.localtime(now)),
self.next_program), 2)
if self.next_program == None:
- return None
+ return
- vdev=self.fc.getVideoGroup(self.next_program.channel_id, False).vdev
- rdev=config.RADIO_DEVICE
+ self.vdev = self.getVideoForChannel(self.next_program.channel_id)
- self.tv_lockfile = config.FREEVO_CACHEDIR +
'/record.'+vdev.split('/')[-1]
+ self.tv_lockfile = os.path.join(config.FREEVO_CACHEDIR,
'record.'+vdev.split('/')[-1])
# Remove the pending record lock file when a record lock file is
written
if os.path.exists(self.pending_lockfile):
if os.path.exists(self.tv_lockfile):
os.remove(self.pending_lockfile)
_debug_("record.soon lockfile removed")
- return None
+ return
# Check if a recording is in progress
if os.path.exists(self.tv_lockfile):
- return None
+ return
secs_to_next = self.next_program.start - config.TV_RECORD_PADDING_PRE
- int(now + 0.5)
_debug_('next recording in %s secs' % (secs_to_next), 2)
@@ -211,9 +134,21 @@
# stop the player 60 seconds before recording is due to start
if (secs_to_next > self.seconds_before_announce):
- return None
+ return
+
+ _debug_('stopping video or radio player')
+ self.stopVideoInUse(self.vdev)
+ self.stopRadioInUse(self.rdev)
+ return
+
+
+ def getVideoForChannel(self, channel_id):
+ """ get the video device given a channel id """
+ return self.fc.getVideoGroup(channel_id, False).vdev
- # check the video
+
+ def stopVideoInUse(self, vdev):
+ """ stop the video device if being used """
if vdev:
try:
dev_fh = os.open(vdev, os.O_TRUNC)
@@ -232,7 +167,9 @@
except:
_debug_('cannot check video device \"%s\"' % (vdev), 0)
- # check the radio
+
+ def stopRadioInUse(self, rdev):
+ """ stop the radio device if being used """
if rdev:
try:
dev_fh = os.open(rdev, os.O_TRUNC)
@@ -251,7 +188,31 @@
except:
_debug_('cannot check radio device \"%s\"' % (rdev), 0)
- return None
+ def getPlayerRunning(self):
+ """
+ Return is a player is running
+ """
+ _debug_('getPlayerRunning(self)', 2)
+ return self.is_player_running
+
+
+ def close(self):
+ """
+ to be called before the plugin exists.
+ It terminates the connection with the server
+ """
+ _debug_('close(self)')
+
+
+ def timer_handler(self):
+ """
+ Sends a poll message to the record server
+ """
+ _debug_('timer_handler()', 2)
+
+ self.recordclient.findNextProgram(self.findNextProgramHandler)
+
+ return True
def event_handler(self, event):
@@ -277,21 +238,38 @@
if __name__ == '__main__':
# test code, run with freevo execute /path/to/upsoon.py
- if len(sys.argv) >= 2:
- function = sys.argv[1]
- else:
- function = 'none'
+ config.DEBUG = 2
+ function = None
+ if len(sys.argv) > 1:
+ function = sys.argv[1].lower()
+ rc = RecordClient()
+
+ if function == "run":
+ pi = PluginInterface()
+ Timer(pi.timer_handler).start(15)
+ kaa.main()
+
+ elif function == "findnextprogram":
+ def handler(result):
+ print 'findnextprogram=%r' % (result)
+ print result.__dict__
+ raise SystemExit
+ rc.findNextProgram(handler)
+ kaa.main()
+
+ elif function == "isplayerrunning":
+ def handler(result):
+ print 'isplayerrunning=%r' % (result)
+ raise SystemExit
+ rc.isPlayerRunning(handler)
+ kaa.main()
- if function == "isplayerrunning":
- (result, response) = isPlayerRunning()
- print response
-
- # looks like devinfo...
- fc = FreevoChannels()
- vg=fc.getVideoGroup('K10', False)
- print "vg=%s" % vg
- print "dir(%s)" % dir(vg)
- for it in dir(vg):
- print " %s:%s" % (it, eval('vg.'+it))
- vdev=vg.vdev
- print "vdev=%s" % vdev
+ else:
+ fc = FreevoChannels()
+ vg=fc.getVideoGroup('K10', False)
+ print "vg=%s" % vg
+ print "dir(%s)" % dir(vg)
+ for it in dir(vg):
+ print " %s:%s" % (it, eval('vg.'+it))
+ vdev=vg.vdev
+ print "vdev=%s" % vdev
Modified: branches/rel-1/freevo/src/tv/record_client.py
==============================================================================
--- branches/rel-1/freevo/src/tv/record_client.py (original)
+++ branches/rel-1/freevo/src/tv/record_client.py Thu Nov 1 18:19:06 2007
@@ -60,16 +60,37 @@
print e
raise
- @kaa.notifier.execute_in_mainloop()
+ [EMAIL PROTECTED]()
def recordserver_rpc(self, cmd, *args, **kwargs):
print 'RecordClient.recordserver_rpc(cmd=%r, args=%r, kwargs=%r)' %
(cmd, args, kwargs)
return self.server.rpc(cmd, *args, **kwargs)
def getScheduledRecordings(self):
+ """ get the scheduled recordings, returning an in process object """
print 'RecordClient.getScheduledRecordings()'
inprogress = self.recordserver_rpc('getScheduledRecordings')
print 'RecordClient.getScheduledRecordings.inprogress = %r' %
(inprogress)
return inprogress
+
+ # this redefined getScheduledRecordings
+ def getScheduledRecordings(self, callback):
+ """ get the scheduled recordings, using a callback function """
+ print 'RecordClient.getScheduledRecordings(callback=%r)' % (callback)
+ res = self.server.rpc('getScheduledRecordings').connect(callback)
+ print 'RecordClient.getScheduledRecordings().res = %r' % (res)
+ return res
+
+
+ def findNextProgram(self, callback):
+ """ find the next program using a callback function """
+ print 'RecordClient.findNextProgram(callback=%r)' % (callback)
+ self.server.rpc('findNextProgram').connect(callback)
+
+
+ def isPlayerRunning(self, callback):
+ """ is a player running, using a callback function """
+ print 'RecordClient.isPlayerRunning(callback=%r)' % (callback)
+ self.server.rpc('isPlayerRunning').connect(callback)
@@ -278,6 +299,15 @@
if __name__ == '__main__':
+
+ def handler(result):
+ print 'result = %r' % (result)
+ raise SystemExit
+
+ rc = RecordClient()
+ rc.getScheduledRecordings(handler)
+ kaa.main()
+
if len(sys.argv) >= 2:
function = sys.argv[1]
else:
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog