Esempio n. 1
0
class ProgramItem(Item):
    """
    Item class for program items

    This is used in the tv guide
    and in the list of schedules recordings.
    """
    def __init__(self, parent, prog, context='menu'):
        Item.__init__(self, parent, skin_type='video')
        logger.log(9, '__init__(parent=%r, prog=%r, context=%r)', parent, prog,
                   context)
        # prog is a TvProgram object as we get it from the recordserver
        self.prog = prog
        self.context = context

        if hasattr(prog, 'name'): self.name = self.title = prog.name
        if hasattr(prog, 'title'): self.title = self.name = Unicode(prog.title)
        if hasattr(prog, 'sub_title'): self.sub_title = prog.sub_title
        if hasattr(prog, 'desc'): self.description = prog.desc
        if hasattr(prog, 'categories'): self.categories = prog.categories
        if hasattr(prog, 'ratings'): self.ratings = prog.ratings
        if hasattr(prog, 'advisories'): self.advisories = prog.advisories

        self.channel = tv_util.get_chan_displayname(prog.channel_id)
        if hasattr(prog, 'scheduled'):
            self.scheduled = prog.scheduled
        else:
            self.scheduled = False

        self.favorite = False
        if hasattr(prog, 'allowDuplicates'):
            self.allowDuplicates = prog.allowDuplicates
        else:
            self.allowDuplicates = 1

        if hasattr(prog, 'onlyNew'):
            self.onlyNew = prog.onlyNew
        else:
            self.onlyNew = 0

        self.overlap = prog.overlap

        self.start = time.strftime(config.TV_DATETIME_FORMAT,
                                   time.localtime(prog.start))
        self.stop = time.strftime(config.TV_DATETIME_FORMAT,
                                  time.localtime(prog.stop))
        self.recordclient = RecordClient()

    def actions(self):
        """ List of actions """
        logger.log(9, 'actions()')
        #list of entries for the menu
        items = []

        #'Play', if this programm is currently running or starts soon
        if self.context == 'guide':
            items.append((self.play, _('Play')))
            #now = time.time()
            #if self.prog.start <= now+(7*60) and self.prog.stop > now:
            #    items.append((self.play, _('Play')))

        # 'Show full description'
        items.append((self.show_description, _('Full Description')))

        if self.recordclient.pingNow():

            # 'Schedule for recording' OR 'Remove from schedule'
            (status, reason) = self.recordclient.isProgScheduledNow(self.prog)
            self.scheduled = status
            if self.scheduled:
                items.append((self.remove_program, _('Remove from schedule')))
            else:
                items.append(
                    (self.schedule_program, _('Schedule for recording')))

            # 'Add to favorites' OR 'Remove from favorites'
            (status, reason) = self.recordclient.isProgAFavoriteNow(self.prog)
            self.favorite = status
            if self.favorite:
                items.append((self.edit_favorite, _('Edit favorite')))
            else:
                items.append((self.add_favorite, _('Add to favorites')))

        plugins_list = plugin.get('tv_program')
        for p in plugins_list:
            items += p.items(self)

        return items

    ### Actions:

    def play(self, arg=None, menuw=None):
        """ Start watching TV """
        logger.log(9, 'play(arg=%r, menuw=%r)', arg, menuw)
        # watching TV should only be possible from the guide
        if not self.context == 'guide':
            rc.post_event(MENU_SELECT)
            return
        now = time.time()
        if menuw: menuw.delete_submenu()
        # Check if the selected program is >7 min in the future
        if self.prog.start > now + (7 * 60):
            if menuw: menuw.show()
            # this program is in the future
            if self.scheduled:
                msgtext = _(
                    'Do you want to remove the Program from the record schedule?'
                )
                confirmbtn = _('Remove')
            else:
                msgtext = _(
                    'This Program is in the future. Do you want to record it?')
                confirmbtn = _('Record')
            dialog.show_confirmation(msgtext,
                                     lambda: self.toggle_rec(menuw=menuw),
                                     proceed_text=confirmbtn)
            return
        else:
            # check if the device is free
            fc = FreevoChannels()
            # for that we need the name of the lock file
            suffix = fc.getVideoGroup(self.prog.channel_id, True,
                                      CHANNEL_ID).vdev
            suffix = suffix.split('/')[-1]
            tvlockfile = config.FREEVO_CACHEDIR + '/record.' + suffix
            if os.path.exists(tvlockfile):
                if menuw: menuw.show()
                # XXX: In the future add the options to watch what we are
                #      recording or cancel it and watch TV.
                msgtext = _('Sorry, you cannot watch TV while recording. ')
                msgtext += _('If this is not true then remove ')
                msgtext += tvlockfile + '.'
                dialog.show_alert(msgtext)
            else:
                # everything is ok, we can start watching!
                self.parent.hide()
                self.parent.player('tv', self.prog.channel_id)

    def show_description(self, arg=None, menuw=None):
        """ View a full scrollable description of the program.  """
        logger.log(9, 'show_description(arg=%r, menuw=%r)', arg, menuw)
        ShowProgramDetails(menuw, self)

    def toggle_rec(self, arg=None, menuw=None):
        """ Schedule or unschedule this program, depending on its current status """
        logger.log(9, 'toggle_rec(arg=%r, menuw=%r)', arg, menuw)
        if self.scheduled:
            # remove this program from schedule it it is already scheduled
            self.remove_program(menuw=menuw)
        else:
            # otherwise add it to schedule without more questions
            self.schedule_program(menuw=menuw)

    def schedule_program(self, arg=None, menuw=None):
        """ Add a program to schedule """
        logger.log(9, 'schedule_program(arg=%r, menuw=%r)', arg, menuw)
        # schedule the program
        (status, reason) = self.recordclient.scheduleRecordingNow(self.prog)
        if status == 'ok':
            self.scheduled = True
            menuw.delete_submenu(refresh=False)
            if hasattr(self.parent, 'update'):
                self.parent.update(force=True)
            else:
                menuw.refresh(reload=True)
            msgtext = _('"%s" has been scheduled for recording') % self.name
        elif status == 'conflict':
            msgtext = _('Conflict detected!')
            self.resolve_conflict(menuw, reason)
            return
        else:
            # something went wrong
            msgtext = _('Scheduling failed: ') + _(reason)

        dialog.show_message(msgtext)

    def remove_program(self, arg=None, menuw=None):
        """ Remove a program from schedule """
        logger.log(9, 'remove_program(arg=%r, menuw=%r)', arg, menuw)
        # remove the program
        (status,
         reason) = self.recordclient.removeScheduledRecordingNow(self.prog)
        if status:
            self.scheduled = False
            menuw.delete_submenu(refresh=False)
            if hasattr(self.parent, 'update'):
                self.parent.update(force=True)
            else:
                menuw.refresh(reload=True)
            msgtext = _('"%s" has been removed from schedule') % self.name
        else:
            # something went wrong
            msgtext = _('Remove failed') + (':\n%s' % reason)
        dialog.show_message(msgtext)

    def add_favorite(self, arg=None, menuw=None):
        """ Add a program to favorites """
        logger.log(9, 'add_favorite(arg=%r, menuw=%r)', arg, menuw)
        if menuw:
            menuw.delete_submenu(refresh=False)
        # create a favorite
        fav = Favorite(self.title, self.prog, True, True, True, -1, True,
                       False)
        logger.log(9, 'self.title=%r, self.prog=%r, fav.__dict__=%r)',
                   self.title, self.prog, fav.__dict__)
        # and a favorite item which represents the submen
        fav_item = FavoriteItem(self, fav, fav_action='add')
        # and open that submenu
        fav_item.display_submenu(menuw=menuw)

    def edit_favorite(self, arg=None, menuw=None):
        """
        Edit the settings of a favorite
        """
        logger.log(9, 'edit_favorite(arg=%r, menuw=%r)', arg, menuw)
        if menuw:
            menuw.delete_submenu(refresh=False)

        # get the favorite from the record client
        (got_fav, fav) = self.recordclient.getFavoriteObjectNow(self.prog)
        if got_fav:
            # create a favorite item for the submenu
            fav_item = FavoriteItem(self, fav, fav_action='edit')
            # and open the submenu
            fav_item.display_submenu(menuw=menuw)
        else:
            dialog.show_alert(_('Cannot edit favorite %s') % self.name)

    def display_submenu(self, arg=None, menuw=None):
        """
        Open the submenu for this item
        """
        logger.log(9, 'display_submenu(arg=%r, menuw=%r)', arg, menuw)
        if not menuw:
            return
        # this tries to imitated freevo's internal way of creating submenus
        menuw.make_submenu(_('Program Menu'), self.actions(), self)
        menuw.show()

    def resolve_conflict(self, menuw, conflictingProgs):
        prog_text = self.prog.getattr('time') + u' ' + self.prog.title
        other_prog_text = u''
        menu_items = []
        for progs in conflictingProgs:
            remove_text = ''
            for cprog in progs:
                if other_prog_text:
                    other_prog_text += u'\n'
                other_prog_text += cprog.getattr('time') + u' ' + cprog.title
                if not remove_text:
                    remove_text = cprog.title
                else:
                    remove_text += u', ' + cprog.title
            other_prog_text += u'\n\n'
            menu_items.append(
                menu.MenuItem(
                    _('Remove ') + remove_text, self.remove_and_schedule,
                    progs))
        self.conflict_info = _(
            'How do you want to resolve the conflict?\n%s\nconflicts with\n%s'
        ) % (prog_text, other_prog_text)
        menu_items.append(
            menu.MenuItem(
                _('Cancel scheduling ') + self.prog.title,
                menuw.back_one_menu))

        conflict_menu = menu.Menu(_('Resovle Conflict'),
                                  menu_items,
                                  item_types='tv conflict menu')
        conflict_menu.infoitem = self
        menuw.delete_submenu(refresh=False)
        menuw.pushmenu(conflict_menu)
        menuw.refresh()

    def remove_and_schedule(self, arg=None, menuw=None):
        for prog in arg:
            self.recordclient.removeScheduledRecordingNow(prog)
        menuw.back_one_menu()
        self.schedule_program(menuw=menuw)
Esempio n. 2
0
class ProgramItem(Item):
    """
    Item class for program items

    This is used in the tv guide
    and in the list of schedules recordings.
    """
    def __init__(self, parent, prog, context='menu'):
        Item.__init__(self, parent, skin_type='video')
        logger.log( 9, '__init__(parent=%r, prog=%r, context=%r)', parent, prog, context)
        # prog is a TvProgram object as we get it from the recordserver
        self.prog = prog
        self.context= context

        if hasattr(prog, 'name'): self.name = self.title = prog.name
        if hasattr(prog, 'title'): self.title = self.name = Unicode(prog.title)
        if hasattr(prog, 'sub_title'): self.sub_title = prog.sub_title
        if hasattr(prog, 'desc'): self.description = prog.desc
        if hasattr(prog, 'categories'):self.categories = prog.categories
        if hasattr(prog, 'ratings'): self.ratings = prog.ratings
        if hasattr(prog, 'advisories'): self.advisories = prog.advisories

        self.channel = tv_util.get_chan_displayname(prog.channel_id)
        if hasattr(prog, 'scheduled'):
            self.scheduled = prog.scheduled
        else:
            self.scheduled = False

        self.favorite = False
        self.allowDuplicates = prog.allowDuplicates
        self.onlyNew = prog.onlyNew
        self.overlap = prog.overlap

        self.start = time.strftime(config.TV_DATETIME_FORMAT, time.localtime(prog.start))
        self.stop = time.strftime(config.TV_DATETIME_FORMAT, time.localtime(prog.stop))
        self.recordclient = RecordClient()


    def actions(self):
        """ List of actions """
        logger.log( 9, 'actions()')
        #list of entries for the menu
        items = []

        #'Play', if this programm is currently running or starts soon
        if self.context == 'guide':
            items.append((self.play, _('Play')))
            #now = time.time()
            #if self.prog.start <= now+(7*60) and self.prog.stop > now:
            #    items.append((self.play, _('Play')))

        # 'Show full description'
        items.append((self.show_description, _('Full Description')))

        if self.recordclient.pingNow():

            # 'Schedule for recording' OR 'Remove from schedule'
            (status, reason) = self.recordclient.isProgScheduledNow(self.prog)
            self.scheduled = status
            if self.scheduled:
                items.append((self.remove_program, _('Remove from schedule')))
            else:
                items.append((self.schedule_program, _('Schedule for recording')))

            # 'Add to favorites' OR 'Remove from favorites'
            (status, reason) = self.recordclient.isProgAFavoriteNow(self.prog)
            self.favorite = status
            if self.favorite:
                items.append((self.edit_favorite, _('Edit favorite')))
            else:
                items.append((self.add_favorite, _('Add to favorites')))

        plugins_list = plugin.get('tv_program')
        for p in plugins_list:
            items += p.items(self)

        return items


    ### Actions:

    def play(self, arg=None, menuw=None):
        """ Start watching TV """
        logger.log( 9, 'play(arg=%r, menuw=%r)', arg, menuw)
        # watching TV should only be possible from the guide
        if not self.context == 'guide':
            rc.post_event(MENU_SELECT)
            return
        now = time.time()
        if menuw: menuw.delete_submenu()
        # Check if the selected program is >7 min in the future
        if self.prog.start > now + (7*60):
            if menuw: menuw.show()
            # this program is in the future
            if self.scheduled:
                msgtext= _('Do you want to remove the Program from the record schedule?')
                confirmbtn = _('Remove')
            else:
                msgtext = _('This Program is in the future. Do you want to record it?')
                confirmbtn = _('Record')
            dialog.show_confirmation(msgtext, lambda: self.toggle_rec(menuw=menuw), proceed_text=confirmbtn)
            return
        else:
            # check if the device is free
            fc = FreevoChannels()
            # for that we need the name of the lock file
            suffix = fc.getVideoGroup(self.prog.channel_id, True, CHANNEL_ID).vdev
            suffix = suffix.split('/')[-1]
            tvlockfile = config.FREEVO_CACHEDIR + '/record.'+suffix
            if os.path.exists(tvlockfile):
                if menuw: menuw.show()
                # XXX: In the future add the options to watch what we are
                #      recording or cancel it and watch TV.
                msgtext = _('Sorry, you cannot watch TV while recording. ')
                msgtext += _('If this is not true then remove ')
                msgtext += tvlockfile + '.'
                dialog.show_alert(msgtext)
            else:
                # everything is ok, we can start watching!
                self.parent.hide()
                self.parent.player('tv', self.prog.channel_id)


    def show_description(self, arg=None, menuw=None):
        """ View a full scrollable description of the program.  """
        logger.log( 9, 'show_description(arg=%r, menuw=%r)', arg, menuw)
        ShowProgramDetails(menuw, self)


    def toggle_rec(self, arg=None, menuw=None):
        """ Schedule or unschedule this program, depending on its current status """
        logger.log( 9, 'toggle_rec(arg=%r, menuw=%r)', arg, menuw)
        if self.scheduled:
            # remove this program from schedule it it is already scheduled
            self.remove_program(menuw=menuw)
        else:
            # otherwise add it to schedule without more questions
            self.schedule_program(menuw=menuw)


    def schedule_program(self, arg=None, menuw=None):
        """ Add a program to schedule """
        logger.log( 9, 'schedule_program(arg=%r, menuw=%r)', arg, menuw)
        # schedule the program
        (status, reason) = self.recordclient.scheduleRecordingNow(self.prog)
        if status == 'ok':
            self.scheduled = True
            menuw.delete_submenu(refresh=False)
            if hasattr(self.parent, 'update'):
                self.parent.update(force=True)
            else:
                menuw.refresh(reload=True)
            msgtext= _('"%s" has been scheduled for recording') % self.name
        elif status == 'conflict':
            msgtext=_('Conflict detected!')
            self.resolve_conflict(menuw, reason)
            return
        else:
            # something went wrong
            msgtext = _('Scheduling failed: ')+ _(reason)

        dialog.show_message(msgtext)


    def remove_program(self, arg=None, menuw=None):
        """ Remove a program from schedule """
        logger.log( 9, 'remove_program(arg=%r, menuw=%r)', arg, menuw)
        # remove the program
        (status, reason) = self.recordclient.removeScheduledRecordingNow(self.prog)
        if status:
            self.scheduled = False
            menuw.delete_submenu(refresh=False)
            if hasattr(self.parent, 'update'):
                self.parent.update(force=True)
            else:
                menuw.refresh(reload=True)
            msgtext = _('"%s" has been removed from schedule') % self.name
        else:
            # something went wrong
            msgtext = _('Remove failed')+(':\n%s' % reason)
        dialog.show_message(msgtext)


    def add_favorite(self, arg=None, menuw=None):
        """ Add a program to favorites """
        logger.log( 9, 'add_favorite(arg=%r, menuw=%r)', arg, menuw)
        if menuw:
            menuw.delete_submenu(refresh=False)
        # create a favorite
        fav = Favorite(self.title, self.prog, True, True, True, -1, True, False)
        logger.log( 9, 'self.title=%r, self.prog=%r, fav.__dict__=%r)', self.title, self.prog, fav.__dict__)
        # and a favorite item which represents the submen
        fav_item = FavoriteItem(self, fav, fav_action='add')
        # and open that submenu
        fav_item.display_submenu(menuw=menuw)


    def edit_favorite(self, arg=None, menuw=None):
        """
        Edit the settings of a favorite
        """
        logger.log( 9, 'edit_favorite(arg=%r, menuw=%r)', arg, menuw)
        if menuw:
            menuw.delete_submenu(refresh=False)

        # get the favorite from the record client
        (got_fav, fav) = self.recordclient.getFavoriteObjectNow(self.prog)
        if got_fav:
            # create a favorite item for the submenu
            fav_item = FavoriteItem(self, fav, fav_action='edit')
            # and open the submenu
            fav_item.display_submenu(menuw=menuw)
        else:
            dialog.show_alert(_('Cannot edit favorite %s') % self.name)


    def display_submenu(self, arg=None, menuw=None):
        """
        Open the submenu for this item
        """
        logger.log( 9, 'display_submenu(arg=%r, menuw=%r)', arg, menuw)
        if not menuw:
            return
        # this tries to imitated freevo's internal way of creating submenus
        menuw.make_submenu(_('Program Menu'), self.actions(), self)
        menuw.show()

    def resolve_conflict(self, menuw, conflictingProgs):
        prog_text = self.prog.getattr('time') + u' ' + self.prog.title
        other_prog_text = u''
        menu_items = []
        for progs in conflictingProgs:
            remove_text = ''
            for cprog in progs:
                if other_prog_text:
                    other_prog_text += u'\n'
                other_prog_text += cprog.getattr('time') + u' ' + cprog.title
                if not remove_text:
                    remove_text = cprog.title
                else:
                    remove_text += u', ' + cprog.title
            other_prog_text += u'\n\n'
            menu_items.append(menu.MenuItem(_('Remove ') + remove_text, self.remove_and_schedule, progs))
        self.conflict_info = _('How do you want to resolve the conflict?\n%s\nconflicts with\n%s') % (prog_text, other_prog_text)
        menu_items.append(menu.MenuItem(_('Cancel scheduling ') + self.prog.title, menuw.back_one_menu))

        conflict_menu = menu.Menu(_('Resovle Conflict'), menu_items, item_types='tv conflict menu')
        conflict_menu.infoitem = self
        menuw.delete_submenu(refresh = False)
        menuw.pushmenu(conflict_menu)
        menuw.refresh()


    def remove_and_schedule(self, arg=None, menuw=None):
        for prog in arg:
            self.recordclient.removeScheduledRecordingNow(prog)
        menuw.back_one_menu()
        self.schedule_program(menuw=menuw)