Update of /cvsroot/freevo/freevo/src/tv/plugins
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6248

Added Files:
        manual_record.py 
Log Message:
first shot, it works, but is slow to show.

--- NEW FILE: manual_record.py ---
#!/usr/bin/env python
#-----------------------------------------------------------------------
# ManualRecord - 
#-----------------------------------------------------------------------
# $Id: manual_record.py,v 1.1 2004/02/13 05:13:09 mikeruelle Exp $
#
# Todo: 
# Notes: 
#
#-----------------------------------------------------------------------
# $Log: manual_record.py,v $
# Revision 1.1  2004/02/13 05:13:09  mikeruelle
# first shot, it works, but is slow to show.
#
#
#-----------------------------------------------------------------------
#
# Freevo - A Home Theater PC framework
#
# Copyright (C) 2002 Krister Lagerstrom, et al.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# ----------------------------------------------------------------------

from time import localtime, strftime, time, mktime, gmtime
import sys

import config
import plugin

import tv.record_client as record_client
import event as em

import tv.record_types
from tv.epg_types import TvProgram
import menu
from gui.GUIObject      import *
from gui.Border         import *
from gui.Label          import *
from gui.AlertBox       import *
from gui.OptionBox      import *
from gui.LetterBoxGroup import *
from gui.ConfirmBox     import ConfirmBox

# Use the alternate strptime module which seems to handle time zones
#
# XXX Remove when we are ready to require Python 2.3
if float(sys.version[0:3]) < 2.3:
    import tv.strptime as strptime
else:
    import _strptime as strptime

DEBUG = config.DEBUG
TRUE = 1
FALSE = 0

# maxinum number of days we can record
MAXDAYS = 7

# minimum amount of time it would take record_server.py to pick us up in seconds
# by default it is one minute plus a few seconds just in case
MINPICKUP = 70

class PluginInterface(plugin.Plugin):
    """
    """
    def __init__(self):
        """
        normal plugin init, but sets _type to 'mplayer_video'
        """
        plugin.Plugin.__init__(self)
        self._type = 'mainmenu_tv'
        self.parent = None

    def items(self, parent):
        self.parent = parent
        return [menu.MenuItem('Manual Record', action=self.show_manual_record)]

    def show_manual_record(self, menuw=None, arg=None):
        ManualRecord(parent=self.parent).show()

class ManualRecord(PopupBox):
    """
    left      x coordinate. Integer
    top       y coordinate. Integer
    width     Integer
    height    Integer
    context   Context in which the object is instanciated
    """
    
    def __init__(self, parent=None, left=None, top=None, width=500, height=350):
        self.errormsg = ''
        PopupBox.__init__(self, text=_('Manual Record'), left=left, top=top, 
                          width=width, height=height)

        self.v_spacing = 15
        self.h_margin = 20
        self.v_margin = 20

        self.internal_h_align = Align.LEFT

        if not self.left:     self.left   = self.osd.width/2 - self.width/2
        if not self.top:      self.top    = self.osd.height/2 - self.height/2

        # check the record server and see if up
        (self.server_available, msg) = record_client.connectionTest()
        if not self.server_available:
            errormsg = Label(_('Record server unavailable: %s') % msg,
                             self, Align.CENTER)
            return

        name = Label(_('Name:'), self, Align.LEFT)
        self.name_input = LetterBoxGroup(text='Test')
        self.name_input.h_align = Align.NONE
        self.add_child(self.name_input)

        chan = Label(_('Channel:'), self, Align.LEFT)

        self.chan_box = OptionBox('ANY')
        self.chan_box.h_align = Align.NONE
        i = 1
        chan_index = 0
        guide = tv.epg_xmltv.get_guide()
        for ch in guide.chan_list:
            i += 1
            self.chan_box.add_item(text=ch.displayname, value=ch.id)
        self.chan_box.toggle_selected_index(chan_index)
        self.chan_box.change_item(None)
        self.add_child(self.chan_box)

        # date 1
        toda1 = Label(_('Start Day:'), self, Align.LEFT)
        #month box
        self.todm_box1 = OptionBox('ANY')
        self.todm_box1.h_align = Align.NONE
        todm_index1 = 0
        mymonths = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 
'Oct', 'Nov', 'Dec' ]
        for m in range(0, 12):
            self.todm_box1.add_item(text=mymonths[m], value=m+1)
        self.todm_box1.toggle_selected_index(todm_index1)
        self.todm_box1.change_item(None)
        self.add_child(self.todm_box1)
        #date box
        self.todd_box1 = OptionBox('ANY')
        self.todd_box1.h_align = Align.NONE
        todd_index1 = 0
        for m in range(1, 32):
            self.todd_box1.add_item(text=str(m), value=m)
        self.todd_box1.toggle_selected_index(todd_index1)
        self.todd_box1.change_item(None)
        self.add_child(self.todd_box1)

        # time 1
        tod1 = Label(_('Start Time:'), self, Align.LEFT)
        self.tod_box1 = OptionBox('ANY')
        self.tod_box1.h_align = Align.NONE

        tod_index1 = 0
        for h in range(0,24):
            for m in range(0,60,5):
                text = "%.2d:%.2d" % (h, m)
                self.tod_box1.add_item(text=text, value=text)
        self.tod_box1.toggle_selected_index(tod_index1)
        # This is a hack for setting the OptionBox's label to the current
        # value. It should be done by OptionBox when drawing, but it doesn't
        # work :(
        self.tod_box1.change_item(None)
        self.add_child(self.tod_box1)

        # date 2
        toda2 = Label(_('Stop Day:'), self, Align.LEFT)
        #month box
        self.todm_box2 = OptionBox('ANY')
        self.todm_box2.h_align = Align.NONE
        todm_index2 = 0
        for m in range(0, 12):
            self.todm_box2.add_item(text=mymonths[m], value=m+1)
        self.todm_box2.toggle_selected_index(todm_index2)
        self.todm_box2.change_item(None)
        self.add_child(self.todm_box2)
        #date box
        self.todd_box2 = OptionBox('ANY')
        self.todd_box2.h_align = Align.NONE
        todd_index2 = 0
        for m in range(1, 32):
            self.todd_box2.add_item(text=str(m), value=m)
        self.todd_box2.toggle_selected_index(todd_index2)
        self.todd_box2.change_item(None)
        self.add_child(self.todd_box2)


        # time 2
        tod2 = Label(_('End Time:'), self, Align.LEFT)
        self.tod_box2 = OptionBox('ANY')
        self.tod_box2.h_align = Align.NONE

        i = 0
        tod_index2 = 0
        for h in range(0,24):
            for m in range(0,60,10):
                text = "%.2d:%.2d" % (h, m)
                self.tod_box2.add_item(text=text, value=text)
        self.tod_box2.toggle_selected_index(tod_index2)
        # This is a hack for setting the OptionBox's label to the current
        # value. It should be done by OptionBox when drawing, but it doesn't
        # work :(
        self.tod_box2.change_item(None)
        self.add_child(self.tod_box2)

        self.save = Button(_('Save'))
        self.add_child(self.save)
        self.cancel = Button(_('CANCEL'))
        self.add_child(self.cancel)


    def eventhandler(self, event, menuw=None):
        #print 'SELECTED CHILD: %s' % self.get_selected_child()
        #this if here so we don't crash when no record_server
        if event == em.INPUT_EXIT:
            self.destroy()
            return
        elif self.get_selected_child() == self.name_input:
            if event == em.INPUT_LEFT:
                self.name_input.change_selected_box('left')
                self.draw()
                self.osd.update(self.get_rect())
                return
            elif event == em.INPUT_RIGHT:
                self.name_input.change_selected_box('right')
                self.draw()
                self.osd.update(self.get_rect())
                return
            elif event == em.INPUT_ENTER:
                self.name_input.get_selected_box().toggle_selected()
                self.chan_box.toggle_selected()
                self.draw()
                self.osd.update(self.get_rect())
                return
            elif event == em.INPUT_UP:
                self.name_input.get_selected_box().charUp()
                self.draw()
                self.osd.update(self.get_rect())
                return
            elif event == em.INPUT_DOWN:
                self.name_input.get_selected_box().charDown()
                self.draw()
                self.osd.update(self.get_rect())
                return
            elif event in em.INPUT_ALL_NUMBERS: 
                self.name_input.get_selected_box().cycle_phone_char(event)
                self.draw()
                self.osd.update(self.get_rect())
                return

        elif self.get_selected_child() == self.chan_box:
            if event in (em.INPUT_UP, em.INPUT_DOWN):
                self.chan_box.change_item(event)
                self.draw()
            elif event == em.INPUT_ENTER:
                if self.chan_box.selected or self.chan_box.list.is_visible():
                    #if DEBUG: print '  Want to toggle_box'
                    self.chan_box.toggle_box()
                    self.draw()
            elif event in (em.INPUT_LEFT, em.MENU_PAGEUP):
                self.chan_box.toggle_selected()
                self.name_input.boxes[0].toggle_selected()
                self.draw()
            elif event in (em.INPUT_RIGHT, em.MENU_PAGEDOWN):
                self.chan_box.toggle_selected()
                self.todm_box1.toggle_selected()
                self.draw()
            elif event == em.INPUT_EXIT:
                self.destroy()
                return
            self.osd.update(self.get_rect())
            return

        elif self.get_selected_child() == self.todm_box1:
            if event in (em.INPUT_UP, em.INPUT_DOWN):
                self.todm_box1.change_item(event)
                self.draw()
            elif event == em.INPUT_ENTER:
                if self.todm_box1.selected or self.todm_box1.list.is_visible():
                    self.todm_box1.toggle_box()
                    self.draw()
            elif event in (em.INPUT_LEFT, em.MENU_PAGEUP):
                self.todm_box1.toggle_selected()
                self.chan_box.toggle_selected()
                self.draw()
            elif event in (em.INPUT_RIGHT, em.MENU_PAGEDOWN):
                self.todm_box1.toggle_selected()
                self.todd_box1.toggle_selected()
                self.draw()
            self.osd.update(self.get_rect())
            return

        elif self.get_selected_child() == self.todd_box1:
            if event in (em.INPUT_UP, em.INPUT_DOWN):
                self.todd_box1.change_item(event)
                self.draw()
            elif event == em.INPUT_ENTER:
                if self.todd_box1.selected or self.todd_box1.list.is_visible():
                    self.todd_box1.toggle_box()
                    self.draw()
            elif event in (em.INPUT_LEFT, em.MENU_PAGEUP):
                self.todd_box1.toggle_selected()
                self.todm_box1.toggle_selected()
                self.draw()
            elif event in (em.INPUT_RIGHT, em.MENU_PAGEDOWN):
                self.todd_box1.toggle_selected()
                self.tod_box1.toggle_selected()
                self.draw()
            self.osd.update(self.get_rect())
            return

        elif self.get_selected_child() == self.tod_box1:
            if event in (em.INPUT_UP, em.INPUT_DOWN):
                self.tod_box1.change_item(event)
                self.draw()
            elif event == em.INPUT_ENTER:
                if self.tod_box1.selected or self.tod_box1.list.is_visible():
                    self.tod_box1.toggle_box()
                    self.draw()
            elif event in (em.INPUT_LEFT, em.MENU_PAGEUP):
                self.tod_box1.toggle_selected()
                self.todd_box1.toggle_selected()
                self.draw()
            elif event in (em.INPUT_RIGHT, em.MENU_PAGEDOWN):
                self.tod_box1.toggle_selected()
                self.todm_box2.toggle_selected()
                self.draw()
            self.osd.update(self.get_rect())
            return
#
        elif self.get_selected_child() == self.todm_box2:
            if event in (em.INPUT_UP, em.INPUT_DOWN):
                self.todm_box2.change_item(event)
                self.draw()
            elif event == em.INPUT_ENTER:
                if self.todm_box2.selected or self.todm_box2.list.is_visible():
                    self.todm_box2.toggle_box()
                    self.draw()
            elif event in (em.INPUT_LEFT, em.MENU_PAGEUP):
                self.todm_box2.toggle_selected()
                self.tod_box1.toggle_selected()
                self.draw()
            elif event in (em.INPUT_RIGHT, em.MENU_PAGEDOWN):
                self.todm_box2.toggle_selected()
                self.todd_box2.toggle_selected()
                self.draw()
            self.osd.update(self.get_rect())
            return

        elif self.get_selected_child() == self.todd_box2:
            if event in (em.INPUT_UP, em.INPUT_DOWN):
                self.todd_box2.change_item(event)
                self.draw()
            elif event == em.INPUT_ENTER:
                if self.todd_box2.selected or self.todd_box2.list.is_visible():
                    self.todd_box2.toggle_box()
                    self.draw()
            elif event in (em.INPUT_LEFT, em.MENU_PAGEUP):
                self.todd_box2.toggle_selected()
                self.todm_box2.toggle_selected()
                self.draw()
            elif event in (em.INPUT_RIGHT, em.MENU_PAGEDOWN):
                self.todd_box2.toggle_selected()
                self.tod_box2.toggle_selected()
                self.draw()
            self.osd.update(self.get_rect())
            return

        elif self.get_selected_child() == self.tod_box2:
            if event in (em.INPUT_UP, em.INPUT_DOWN):
                self.tod_box2.change_item(event)
                self.draw()
            elif event == em.INPUT_ENTER:
                if self.tod_box2.selected or self.tod_box2.list.is_visible():
                    self.tod_box2.toggle_box()
                    self.draw()
            elif event in (em.INPUT_LEFT, em.MENU_PAGEUP):
                self.tod_box2.toggle_selected()
                self.todd_box2.toggle_selected()
                self.draw()
            elif event in (em.INPUT_RIGHT, em.MENU_PAGEDOWN):
                self.tod_box2.toggle_selected()
                self.save.toggle_selected()
                self.draw()
            self.osd.update(self.get_rect())
            return

#
        elif self.get_selected_child() == self.save:
            if event == em.INPUT_ENTER:
                # schedule the recording here
                prog = self.make_prog()
                if prog:
                    self.schedule_recording(prog)
                else:
                    AlertBox(parent=self, text=_('Failed: %s') % self.errormsg).show()
                return
            elif event in (em.INPUT_LEFT, em.MENU_PAGEUP):
                self.save.toggle_selected()
                self.tod_box2.toggle_selected()
                self.draw()
            elif event in (em.INPUT_RIGHT, em.MENU_PAGEDOWN):
                self.save.toggle_selected()
                self.cancel.toggle_selected()
                self.draw()
            self.osd.update(self.get_rect())
            return

        elif self.get_selected_child() == self.cancel:
            if event in (em.INPUT_LEFT, em.MENU_PAGEUP):
                self.save.toggle_selected()
                self.cancel.toggle_selected()
                self.draw()
            elif event == em.INPUT_ENTER:
                self.destroy()
                return
            self.osd.update(self.get_rect())
            return
        else:
            return self.parent.eventhandler(event)

    def make_prog(self):
        prog = None
        curtime_epoch = time()
        curtime = localtime(curtime_epoch)
        chan = self.chan_box.list.get_selected_item().value
        startmonth = self.todm_box1.list.get_selected_item().value
        startday = self.todd_box1.list.get_selected_item().value
        starthm = self.tod_box1.list.get_selected_item().value
        startyear = curtime[0] 
        stopmonth = self.todm_box2.list.get_selected_item().value
        stopday = self.todd_box2.list.get_selected_item().value
        stophm = self.tod_box2.list.get_selected_item().value
        stopyear = curtime[0] 
        currentmonth = curtime[1] 
        title = self.name_input.get_word()
        
        # handle the year wraparound
        if int(stopmonth) < currentmonth:
            stopyear = str(int(stopyear) + 1)
        if int(startmonth) < currentmonth:
            startyear = str(int(startyear) + 1)
        # create utc second start time
        starttime = mktime(strptime.strptime(str(startmonth)+" "+str(startday)+" 
"+str(startyear)+" "+str(starthm)+":00",'%m %d %Y %H:%M:%S'))
        # create utc stop time
        stoptime = mktime(strptime.strptime(str(stopmonth)+" "+str(stopday)+" 
"+str(stopyear)+" "+str(stophm)+":00",'%m %d %Y %H:%M:%S'))

        # so we don't record for more then maxdays (maxdays day * 24hr/day * 60 min/hr 
* 60 sec/min)
        if abs(stoptime - starttime) < (MAXDAYS * 86400): 
            if starttime < stoptime:
                if stoptime < curtime_epoch + MINPICKUP:
                    self.errormsg = "Sorry, the stop time does not give enough time 
for cron to pickup the change.  Please set it to record for a few minutes longer."
                else:
                    # assign attributes to object
                    prog = TvProgram()
                    prog.channel_id = chan
                    if title:
                        prog.title = title
                    else:
                        prog.title = "Manual Recorded"
                    prog.start = starttime
                    prog.stop = stoptime
            else:
                self.errormsg = "start time is not before stop time." 
        else:
            self.errormsg = "Program would record for more than " + str(MAXDAYS) + " 
day(s)!"
        return prog

    def schedule_recording(self,prog):
        (result, msg) = record_client.scheduleRecording(prog)
        if result:
            self.destroy()
            AlertBox(parent='osd', text=_('%s has been scheduled') % 
self.name_input.get_word()).show()
        else:
            AlertBox(parent=self, text=_('Failed: %s') % msg).show()



-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
Freevo-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to