Hi,
I have added changing a favorites day, start time, stop time and channel
to the tv.favorite.py class.
For this I also needed to change other files. See attached diffs.
Some explanation on the changes:
- tvserver/src/favorite.py:
This class required a start and stop time in string format, but
it returned time (via long_list()) as a int. I changed that so
that it also returns an string format.
- tvserver/src/server.py:
Added rpc_favorite_modify() + fixed some problems
- core/src/ipc/tvserver.py:
Added modify()
- ui/src/tv/favorite.py:
Added new features.
Regards,
Jose
Index: favorite.py
===================================================================
--- favorite.py (revision 9583)
+++ favorite.py (working copy)
@@ -32,6 +32,7 @@
# -----------------------------------------------------------------------------
# python imports
+import re
import time
# kaa imports
@@ -51,8 +52,12 @@
# get tvserver interface
tvserver = freevo.ipc.Instance('freevo').tvserver
-DAY_NAMES = (_('Sun'), _('Mon'), _('Tue'), _('Wed'), _('Thu'), _('Fri'), _('Sat'))
+DAY_NAMES = [_('Sun'), _('Mon'), _('Tue'), _('Wed'), _('Thu'), _('Fri'), _('Sat')]
+#Define the time slots (when chnaging the time) in minutes
+TIME_SLOTS = 10
+TIME_RANGE = (1440 / TIME_SLOTS)
+
class FavoriteItem(Item):
"""
A favorite item to add/delete/change a favorite for the recordserver.
@@ -63,6 +68,8 @@
self.new = True
self.id = 0
+ self.start = float(0)
+ self.stop = float(1440*60)-1
if isinstance(fav, kaa.epg.Program):
# created with Program object
# Convert to 0=Sunday - 6=Saterday
@@ -77,13 +84,18 @@
if day in f.days:
self.new = False
self.id = f.id
+ for t in f.times:
+ self.start, self.stop = self._str_to_time(t)
else:
# created with ipc Favorite object
self.name = self.title = fav.title
self.days = fav.days
self.channels = fav.channels
+ #self.start = fav.time
self.new = False
self.id = fav.id
+ for t in fav.times:
+ self.start, self.stop = self._str_to_time(t)
def __getitem__(self, key):
@@ -102,6 +114,14 @@
else:
channels = ', '.join(['%s' % chan for chan in self.channels])
return channels
+ if key == 'time':
+ return self['start'] + u' - ' + self['stop']
+ if key == 'start':
+ return unicode(time.strftime(config.tv.timeformat,
+ time.gmtime(self.start)))
+ if key == 'stop':
+ return unicode(time.strftime(config.tv.timeformat,
+ time.gmtime(self.stop)))
return Item.__getitem__(self, key)
@@ -123,6 +143,15 @@
else:
items.append(ActionItem(_('Remove favorite'), self, self.remove))
+ items.append(ActionItem(_('Change day'), self, self.change_days))
+ items.append(ActionItem(_('Change channel'), self, self.change_channels))
+ action = ActionItem(_('Change start time'), self, self.change_time)
+ action.parameter('start')
+ items.append(action)
+ action = ActionItem(_('Change stop time'), self, self.change_time)
+ action.parameter('stop')
+ items.append(action)
+
s = Menu(self, items, type = 'tv favorite menu')
s.submenu = True
s.infoitem = self
@@ -132,16 +161,16 @@
@kaa.notifier.yield_execution()
def add(self):
result = tvserver.favorites.add(self.title, self.channels, self.days,
- 'ANY', 50, False)
+ [self._time_to_str()], 50, False)
if isinstance(result, kaa.notifier.InProgress):
yield result
result = result()
if result != tvserver.favorites.SUCCESS:
text = _('Adding favorite Failed')+(': %s' % result)
else:
- text = _('"%s" has been scheduled as favorite') % self.title
+ text = _('"%s" has been added to your favorites') % self.title
MessageWindow(text).show()
- self.get_menustack().delete_submenu()
+ self.get_menustack().back_one_menu()
@kaa.notifier.yield_execution()
@@ -153,4 +182,126 @@
if result != tvserver.favorites.SUCCESS:
text = _('Remove favorite Failed')+(': %s' % result)
MessageWindow(text).show()
- self.get_menustack().delete_submenu()
+ self.get_menustack().back_one_menu()
+
+ @kaa.notifier.yield_execution()
+ def modify(self, info):
+ result = tvserver.favorites.modify(self.id, info)
+ if isinstance(result, kaa.notifier.InProgress):
+ yield result
+ result = result()
+ if result != tvserver.favorites.SUCCESS:
+ text = _('Modified favorite Failed')+(': %s' % result)
+ MessageWindow(text).show()
+
+ def change_days(self):
+ items = []
+ action = ActionItem('ANY', self, self.handle_change)
+ action.parameter('days', 'ANY')
+ items.append(action)
+ for dayname in DAY_NAMES:
+ action = ActionItem(dayname, self, self.handle_change)
+ action.parameter('days', dayname)
+ items.append(action)
+
+ s = Menu(self, items, type = 'tv favorite menu')
+ s.submenu = True
+ s.infoitem = self
+ self.get_menustack().pushmenu(s)
+
+ def change_channels(self):
+ items = []
+ action = ActionItem('ANY', self, self.handle_change)
+ action.parameter('channels', 'ANY')
+ items.append(action)
+
+ list = kaa.epg.get_channels(sort=True)
+ for chan in list:
+ action = ActionItem(chan.name, self, self.handle_change)
+ action.parameter('channels', chan.name)
+ items.append(action)
+
+ s = Menu(self, items, type = 'tv favorite menu')
+ s.submenu = True
+ s.infoitem = self
+ self.get_menustack().pushmenu(s)
+
+ def change_time(self, startstop):
+ items = []
+ action = ActionItem('ANY', self, self.handle_change)
+ action.parameter(startstop, 'ANY')
+ items.append(action)
+ if startstop == 'start':
+ starttime = self.start
+ else:
+ starttime = self.stop - (self.stop % (TIME_SLOTS * 60))
+ for i in range(TIME_RANGE):
+ newtime = float( (i * TIME_SLOTS * 60) + starttime) % (1440 * 60)
+ showtime = unicode(time.strftime(config.tv.timeformat,
+ time.gmtime(newtime)))
+ action = ActionItem(showtime, self, self.handle_change)
+ action.parameter(startstop, newtime)
+ items.append(action)
+
+ s = Menu(self, items, type = 'tv favorite menu')
+ s.submenu = True
+ s.infoitem = self
+ self.get_menustack().pushmenu(s)
+
+ def handle_change(self, item, value):
+
+ info = None
+ infovalue = None
+ if item == 'days':
+ info = 'days'
+ if value == 'ANY':
+ self.days = [0, 1, 2, 3, 4, 5, 6]
+ else:
+ self.days = [DAY_NAMES.index(value)]
+ infovalue = self.days
+ if item == 'channels':
+ info = 'channels'
+ if value == 'ANY':
+ self.channels = []
+ list = kaa.epg.get_channels(sort=True)
+ for chan in list:
+ self.channels.append(chan.name)
+ else:
+ self.channels = [value]
+ infovalue = self.channels
+ if item == 'start':
+ info = 'times'
+ if value == 'ANY':
+ self.start = float(0)
+ self.stop = float(1440*60)-1
+ else:
+ self.start = value
+ infovalue = [self._time_to_str()]
+ if item == 'stop':
+ info = 'times'
+ if value == 'ANY':
+ self.start = float(0)
+ self.stop = float(1440*60)-1
+ else:
+ self.stop = value
+ infovalue = [self._time_to_str()]
+
+ if not self.new:
+ self.modify([(info, infovalue)])
+
+ self.get_menustack().back_one_menu()
+
+ def _time_to_str(self):
+ start = time.strftime('%H:%M', time.gmtime(self.start))
+ stop = time.strftime('%H:%M', time.gmtime(self.stop))
+ return start + '-' + stop
+
+ def _str_to_time(self, t):
+ # internal regexp for time format
+ _time_re = re.compile('([0-9]*):([0-9]*)-([0-9]*):([0-9]*)')
+
+ m = _time_re.match(t).groups()
+ start = float(m[0])*3600 + float(m[1])*60
+ stop = float(m[2])*3600 + float(m[3])*60
+
+ return start, stop
Index: tvserver.py
===================================================================
--- tvserver.py (revision 9583)
+++ tvserver.py (working copy)
@@ -291,7 +291,7 @@
"""
A favorite object from the recordserver.
"""
- def __init__(self, id, title, channels, priority, days, time, one_shot,
+ def __init__(self, id, title, channels, priority, days, times, one_shot,
substring):
"""
The init function creates the object. The parameters are the complete
@@ -302,7 +302,7 @@
self.channels = channels
self.priority = priority
self.days = days
- self.time = time
+ self.times = times
self.one_shot = one_shot
self.substring = substring
self.description = {}
@@ -414,6 +414,23 @@
yield self.SUCCESS
+ @kaa.notifier.yield_execution()
+ def modify(self, id, info):
+ """
+ remove a favorite
+ parameter: id of the favorite,
+ info of the changed item [ ( var, val ) (...) ]
+ """
+ if not self.server:
+ yield _('tvserver unavailable')
+ result = self.rpc('home-theatre.favorite.modify', id, info)
+ yield result
+ if not result():
+ # FIXME: get real error message from tvserver
+ yield 'failed'
+ yield self.SUCCESS
+
+
def list(self):
"""
"""
Index: favorite.py
===================================================================
--- favorite.py (revision 9583)
+++ favorite.py (working copy)
@@ -86,11 +86,7 @@
self.fxdname = ''
self.once = once
self.substring = substring
- for t in times:
- m = _time_re.match(t).groups()
- start = int(m[0])*100 + int(m[1])
- stop = int(m[2])*100 + int(m[3])
- self.times.append((start, stop))
+ self.times = times
self.start_padding = config.record.start_padding
self.stop_padding = config.record.stop_padding
@@ -119,10 +115,7 @@
if child.name == 'times':
self.times = []
for t in child.children:
- m = _time_re.match(t.content).groups()
- start = int(m[0])*100 + int(m[1])
- stop = int(m[2])*100 + int(m[3])
- self.times.append((start, stop))
+ self.times.append(t.content)
if child.name == 'padding':
self.start_padding = int(child.getattr('start'))
self.stop_padding = int(child.getattr('stop'))
@@ -159,8 +152,11 @@
if not int(time.strftime('%w', timestruct)) in self.days:
return False
stime = int(timestruct[3]) * 100 + int(timestruct[4])
- for t1, t2 in self.times:
- if stime >= t1 and stime <= t2:
+ for t in self.times:
+ m = _time_re.match(t).groups()
+ start = int(m[0])*100 + int(m[1])
+ stop = int(m[2])*100 + int(m[3])
+ if stime >= start and stime <= stop:
return True
return False
@@ -252,8 +248,7 @@
channels.add_child('channel', chan)
times = node.add_child('times')
for t in self.times:
- times.add_child('start', '%02d:%02d-%02d:%02d' % \
- (t[0] / 100, t[0] % 100, t[1] / 100, t[1] % 100))
+ times.add_child('start', t)
if self.once:
node.add_child('once')
if self.substring:
Index: server.py
===================================================================
--- server.py (revision 9583)
+++ server.py (working copy)
@@ -433,10 +433,10 @@
@freevo.ipc.expose('home-theatre.recording.modify')
- def rpc_recording_modify(self, int, info):
+ def rpc_recording_modify(self, id, info):
"""
modify a recording
- parameter: id [ ( var val ) (...) ]
+ parameter: id, [ ( var, val ) (...) ]
"""
key_val = dict(info)
log.info('recording.modify: %s' % id)
@@ -564,6 +564,12 @@
return NameError('Already scheduled')
self.favorites.append(f)
+ #Align favorites id(s)
+ next = 0
+ for r in self.favorites:
+ r.id = next
+ next += 1
+
# update schedule
self.epg_update()
@@ -586,6 +592,12 @@
return NameError('Favorite not found!')
log.info('favorite.remove: %s', f)
self.favorites.remove(f)
+
+ #Align favorites id(s)
+ next = 0
+ for r in self.favorites:
+ r.id = next
+ next += 1
# send update to all clients
msg = [ f.long_list() for f in self.favorites ]
@@ -593,6 +605,29 @@
return []
+ @freevo.ipc.expose('home-theatre.favorite.modify')
+ def rpc_favorite_modify(self, id, info):
+ """
+ modify a recording
+ parameter: id, [ ( var, val ) (...) ]
+ """
+ key_val = dict(info)
+ log.info('favorite.modify: %s' % id)
+ for r in self.favorites:
+ if r.id == id:
+ cp = copy.copy(self.favorites[id])
+ for key in key_val:
+ setattr(cp, key, key_val[key])
+ self.favorites[self.favorites.index(r)] = cp
+ # update schedule
+ self.epg_update()
+ # send update to all clients
+ msg = [ f.long_list() for f in self.favorites ]
+ self.send_event('home-theatre.favorite.list.update', *msg)
+ return []
+ return IndexError('Favorite not found')
+
+
@freevo.ipc.expose('home-theatre.favorite.list')
def rpc_favorite_list(self):
"""
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Freevo-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-devel