コード例 #1
0
    def eventhandler(self, event, menuw=None):
        """
        eventhandler for mplayer control. If an event is not bound in this
        function it will be passed over to the items eventhandler
        """
        logger.debug('%s.eventhandler(event=%s)', self.__class__, event)

        if not self.app:
            return self.item.eventhandler(event)

        if event in (STOP, PLAY_END, USER_END):
            self.stop()
            return self.item.eventhandler(event)

        if event == TOGGLE_OSD:
            dialog.show_play_state(dialog.PLAY_STATE_INFO, self.item,
                                   self.get_time_info)
            return True

        if event == PAUSE or event == PLAY:
            self.paused = not self.paused

            if self.paused:
                dialog.show_play_state(dialog.PLAY_STATE_PAUSE, self.item,
                                       self.get_time_info)
                webbrowser.ipc.pauseVideo()
            else:
                dialog.show_play_state(dialog.PLAY_STATE_PLAY, self.item,
                                       self.get_time_info)
                webbrowser.ipc.playVideo()
            return True

        if event == SEEK:
            self.paused = False
            webbrowser.ipc.seekVideo(event.arg)
            return True

        if event == 'WEB_IPC':
            if event.arg['event'] == 'error':
                self.stop()
                return True
            if event.arg['event'] == 'state':
                if event.arg['data'] == 0:
                    self.stop()
                    return True
                return True

        # nothing found? Try the eventhandler of the object who called us
        return self.item.eventhandler(event)
コード例 #2
0
ファイル: ytflashplayer.py プロジェクト: golaizola/freevo1
    def eventhandler(self, event, menuw=None):
        """
        eventhandler for mplayer control. If an event is not bound in this
        function it will be passed over to the items eventhandler
        """
        logger.debug("%s.eventhandler(event=%s)", self.__class__, event)

        if not self.app:
            return self.item.eventhandler(event)

        if event in (STOP, PLAY_END, USER_END):
            self.stop()
            return self.item.eventhandler(event)

        if event == TOGGLE_OSD:
            dialog.show_play_state(dialog.PLAY_STATE_INFO, self.item, self.get_time_info)
            return True

        if event == PAUSE or event == PLAY:
            self.paused = not self.paused

            if self.paused:
                dialog.show_play_state(dialog.PLAY_STATE_PAUSE, self.item, self.get_time_info)
                webbrowser.ipc.pauseVideo()
            else:
                dialog.show_play_state(dialog.PLAY_STATE_PLAY, self.item, self.get_time_info)
                webbrowser.ipc.playVideo()
            return True

        if event == SEEK:
            self.paused = False
            webbrowser.ipc.seekVideo(event.arg)
            return True

        if event == "WEB_IPC":
            if event.arg["event"] == "error":
                self.stop()
                return True
            if event.arg["event"] == "state":
                if event.arg["data"] == 0:
                    self.stop()
                    return True
                return True

        # nothing found? Try the eventhandler of the object who called us
        return self.item.eventhandler(event)
コード例 #3
0
ファイル: mplayer.py プロジェクト: murbaniak/freevo1
    def eventhandler(self, event, menuw=None):
        """
        eventhandler for mplayer control. If an event is not bound in this
        function it will be passed over to the items eventhandler
        """
        logger.debug('%s.eventhandler(event=%s)', self.__class__, event)
        if not self.app:
            return self.item.eventhandler(event)

        for p in self.plugins:
            if p.eventhandler(event):
                return True

        if event == VIDEO_MANUAL_SEEK:
            self.seek = 0
            rc.set_app_context(self, 'input')
            dialog.show_message("input")
            return True

        if event.context == 'input':
            if event in INPUT_ALL_NUMBERS:
                self.reset_seek_timeout()
                self.seek = self.seek * 10 + int(event);
                return True

            elif event == INPUT_ENTER:
                self.seek_timer.cancel()
                self.seek *= 60
                self.app.write('seek ' + str(self.seek) + ' 2\n')
                logger.debug("seek " + str(self.seek) + " 2\n")
                self.seek = 0
                rc.set_app_context(self, 'video')
                return True

            elif event == INPUT_EXIT:
                logger.debug('seek stopped')
                #self.app.write('seek stopped\n')
                self.seek_timer.cancel()
                self.seek = 0
                rc.set_app_context(self, 'video')
                return True

        if event == STOP:
            self.stop()
            return self.item.eventhandler(event)

        if event == 'AUDIO_ERROR_START_AGAIN':
            self.stop()
            self.play(self.options, self.item)
            return True

        if event in (PLAY_END, USER_END):
            self.stop()
            return self.item.eventhandler(event)

        if event == VIDEO_SEND_MPLAYER_CMD:
            self.app.write('%s\n' % event.arg)
            return True

        if event == TOGGLE_OSD:
            if dialog.is_dialog_supported():
                if self.play_state_dialog is None:
                    if self.paused:
                        self.play_state_dialog = dialog.show_play_state(dialog.PLAY_STATE_INFO, self.item, self.get_stored_time_info)
                    else:
                        self.play_state_dialog = dialog.show_play_state(dialog.PLAY_STATE_INFO, self.item, self.get_time_info)
                else:
                    self.play_state_dialog.hide()
                    self.play_state_dialog = None
            else:
                self.paused = False
                self.app.write('osd\n')
            return True

        if event == PAUSE or event == PLAY:
            self.paused = not self.paused
            # We have to store the current time before displaying the dialog
            # otherwise the act of requesting the current position resumes playback!
            if self.paused:
                self.stored_time_info = self.get_time_info()
                self.play_state_dialog = dialog.show_play_state(dialog.PLAY_STATE_PAUSE, self.item, self.get_stored_time_info)
                self.app.write('pause\n')
            else:
                self.app.write('speed_set 1.0\n')
                self.play_state_dialog = dialog.show_play_state(dialog.PLAY_STATE_PLAY, self.item, self.get_time_info)

            return True

        if event == SEEK:
            if event.arg > 0 and self.item_length != -1 and self.dynamic_seek_control:
                # check if the file is growing
                if self.item_info.get_endpos() == self.item_length:
                    # not growing, deactivate this
                    self.item_length = -1

                self.dynamic_seek_control = False

            if event.arg > 0 and self.item_length != -1:
                # safety time for bad mplayer seeking
                seek_safety_time = 20
                if self.item_info['type'] in ('MPEG-PES', 'MPEG-TS'):
                    seek_safety_time = 500

                # check if seek is allowed
                if self.item_length <= self.item.elapsed + event.arg + seek_safety_time:
                    # get new length
                    self.item_length = self.item_info.get_endpos()

                # check again if seek is allowed
                if self.item_length <= self.item.elapsed + event.arg + seek_safety_time:
                    logger.debug('unable to seek %s secs at time %s, length %s', event.arg, self.item.elapsed, self.item_length)
                    dialog.show_message(_('Seeking not possible'))
                    return False
            
            self.paused = False
            self.app.write('seek %s\n' % event.arg)
            if event.arg > 0:
                self.play_state_dialog = dialog.show_play_state(dialog.PLAY_STATE_SEEK_FORWARD, self.item, self.get_time_info)
            else:
                self.play_state_dialog = dialog.show_play_state(dialog.PLAY_STATE_SEEK_BACK, self.item, self.get_time_info)
            return True

        if event == VIDEO_AVSYNC:
            self.app.write('audio_delay %g\n' % float(event.arg));
            if config.MPLAYER_USE_OSD_SHOW_PROPS:
                self.app.write('osd_show_property_text "Audio delay ${audio_delay}" 2000\n')
            return True

        if event == VIDEO_SUBSYNC:
            self.app.write('sub_delay %g\n' % float(event.arg));
            if config.MPLAYER_USE_OSD_SHOW_PROPS:
                self.app.write('osd_show_property_text "Subtitles delay ${sub_delay}" 2000\n')
            return True

        if event == VIDEO_NEXT_AUDIOLANG:
            self.app.write('switch_audio\n')
            if config.MPLAYER_USE_OSD_SHOW_PROPS:
                self.app.write('osd_show_property_text "Audio ${switch_audio}" 2000\n')
            return True

        if event == VIDEO_NEXT_SUBTITLE:
            self.app.write('sub_select\n')
            if config.MPLAYER_USE_OSD_SHOW_PROPS:
                self.app.write('osd_show_property_text "Subtitles ${sub_file}" 2000\n')
            return True

        if event == OSD_MESSAGE:
            self.show_message(event.arg)
            return True

        if event == 'MPLAYER_VO':
            if config.OSD_SINGLE_WINDOW:
                w_ratio = float(config.CONF.width) / float(event.arg[0])
                h_ratio = float(config.CONF.height) / float(event.arg[1])
                ratio = min(w_ratio, h_ratio)
                w = int(event.arg[0] * ratio)
                h = int(event.arg[1] * ratio)
                x = (config.CONF.width - w) / 2
                y = (config.CONF.height - h) / 2
                osd.video_window.set_geometry((x,y), (w,h))
                osd.video_window.show()
            return True

        # nothing found? Try the eventhandler of the object who called us
        return self.item.eventhandler(event)
コード例 #4
0
ファイル: mplayer.py プロジェクト: adozenlines/freevo1
    def eventhandler(self, event, menuw=None):
        s_event = '%s' % event

        if event == em.STOP or event == em.PLAY_END:
            self.Stop()
            rc.post_event(em.PLAY_END)
            return True

        elif event == em.PAUSE or event == em.PLAY:
            self.app.write('pause\n')
            logger.debug('%s: sending pause to mplayer', time.time())
            return True

        elif event in [ em.TV_CHANNEL_UP, em.TV_CHANNEL_DOWN, em.TV_CHANNEL_LAST ] or s_event.startswith('INPUT_'):
            chan = None
            if event == em.TV_CHANNEL_UP:
                nextchan = self.fc.getNextChannel()
                nextchannum = self.fc.getNextChannelNum()
            elif event == em.TV_CHANNEL_DOWN:
                nextchan = self.fc.getPrevChannel()
                nextchannum = self.fc.getPrevChannelNum()
            elif event == em.TV_CHANNEL_LAST:
                if config.MPLAYER_OLDTVCHANNELCHANGE:
                    if os.path.isfile(os.path.join(config.FREEVO_CACHEDIR, 'lastchan')):
                        lastchanfile = os.path.join(config.FREEVO_CACHEDIR, 'lastchan')
                        lcfp = open(lastchanfile, "r")
                        nextchan = lcfp.readline()
                        nextchan = nextchan.strip()
                        nextchannum = lcfp.readline()
                        nextchannum = nextchannum.strip()
                        nextchannum = int(nextchannum)
                        lcfp.close()
                    else:
                        nextchan = self.fc.getChannel()
                        nextchannum = self.fc.getChannelNum()
                else:
                    return True
            else:
                chan = int(s_event[6])
                nextchan = self.fc.getManChannel(chan)
                nextchannum = self.fc.getManChannelNum(chan)

            nextvg = self.fc.getVideoGroup(nextchan, True)
            logger.debug('chan=%s, nextchannum=%s, nextchan=%s nextvg=%s', chan, nextchannum, nextchan, nextvg)

            if self.current_vg != nextvg:
                self.Stop(channel_change=1)
                self.Play('tv', nextchan)
                return True

            if self.mode == 'vcr':
                return

            elif self.current_vg.group_type == 'dvb':
                if not config.MPLAYER_OLDTVCHANNELCHANGE:
                    card = 0 # May be this should come from video groups or TV_CHANNELS
                    if em.TV_CHANNEL_UP:
                        self.app.write('dvb_set_channel %s %s\n' % (nextchannum, card))
                        self.fc.chanSet(nextchan, True)
                    elif em.TV_CHANNEL_DOWN:
                        self.app.write('dvb_set_channel %s %s\n' % (nextchannum, card))
                        self.fc.chanSet(nextchan, True)
                else:
                    self.Stop(channel_change=1)
                    self.Play('tv', nextchan)
                return True

            elif self.current_vg.group_type == 'ivtv':
                self.fc.chanSet(nextchan, True)
                self.app.write('seek 999999 0\n')

            else:
                freq_khz = self.fc.chanSet(nextchan, True, app=self.app)
                new_freq = '%1.3f' % (freq_khz / 1000.0)
                self.app.write('tv_set_freq %s\n' % new_freq)

            self.current_vg = self.fc.getVideoGroup(self.fc.getChannel(), True)

            # Display a channel changed message
            tuner_id, chan_name, prog_info = self.fc.getChannelInfo()
            now = time.strftime(config.TV_TIME_FORMAT)
            msg = '%s %s (%s): %s' % (now, chan_name, tuner_id, prog_info)
            cmd = 'osd_show_text "%s"\n' % msg
            self.app.write(cmd)
            return True

        elif event == em.TOGGLE_OSD:
	    if dialog.is_dialog_supported():
                dialog.show_play_state(dialog.PLAY_STATE_INFO, self.fc)
            else:
            # Display the channel info message
                tuner_id, chan_name, prog_info = self.fc.getChannelInfo()
                now = time.strftime(config.TV_TIME_FORMAT)
                msg = '%s %s (%s): %s' % (now, chan_name, tuner_id, prog_info)
                cmd = 'osd_show_text "%s"\n' % msg
                self.app.write(cmd)
                return False

        elif event == em.OSD_MESSAGE:
            self.app.write('osd_show_text "%s"\n' % event.arg);
            return True

        elif event == em.TV_SEND_MPLAYER_CMD:
            self.app.write('%s\n' % event.arg);
            return True

        return False
コード例 #5
0
ファイル: xine.py プロジェクト: spartrekus/freevo1
    def eventhandler(self, event, menuw=None):
        """
        eventhandler for xine control. If an event is not bound in this
        function it will be passed over to the items eventhandler
        """
        logger.log(9, 'eventhandler(event=%r, menuw=%r)', event.name, menuw)
        if not self.app:
            return self.item.eventhandler(event)

        if event in (PLAY_END, USER_END):
            self.stop(event)
            return self.item.eventhandler(event)

        if event == PAUSE or event == PLAY:
            self.paused = not self.paused
            if config.XINE_USE_FREEVO_OSD:
                self.play_state_dialog = dialog.show_play_state(
                    dialog.PLAY_STATE_PAUSE if self.paused else
                    dialog.PLAY_STATE_PLAY, self.item, self.get_time_info)
            self.app.write('pause\n')
            return True

        if event == STOP:
            self.stop(event)
            return self.item.eventhandler(event)

        if event == SEEK:
            pos = int(event.arg)
            if pos < 0:
                action = 'SeekRelative-'
                pos = 0 - pos
                if config.XINE_USE_FREEVO_OSD and dialog.is_dialog_supported():
                    self.play_state_dialog = dialog.show_play_state(
                        dialog.PLAY_STATE_SEEK_BACK, self.item,
                        self.get_time_info)
            else:
                action = 'SeekRelative+'
                if config.XINE_USE_FREEVO_OSD and dialog.is_dialog_supported():
                    self.play_state_dialog = dialog.show_play_state(
                        dialog.PLAY_STATE_SEEK_FORWARD, self.item,
                        self.get_time_info)
            if pos <= 15:
                pos = 15
            elif pos <= 30:
                pos = 30
            else:
                pos = 30
            self.app.write('%s%s\n' % (action, pos))
            return True

        if event == TOGGLE_OSD:
            if config.XINE_USE_FREEVO_OSD and dialog.is_dialog_supported():
                if self.play_state_dialog is None:
                    self.play_state_dialog = dialog.show_play_state(
                        dialog.PLAY_STATE_INFO, self.item, self.get_time_info)
                else:
                    self.play_state_dialog.hide()
                    self.play_state_dialog = None
            else:
                self.app.write('OSDStreamInfos\n')
            return True

        if event == VIDEO_TOGGLE_INTERLACE:

            self.app.write('ToggleInterleave\n')
            self.item['deinterlace'] = not self.item['deinterlace']
            return True

        if event == NEXT:
            self.app.write('EventNext\n')
            return True

        if event == PREV:
            self.app.write('EventPrior\n')
            return True

        if event == VIDEO_SEND_XINE_CMD:
            self.app.write('%s\n' % event.arg)
            return True

        # DVD NAVIGATION
        if event == DVDNAV_LEFT:
            self.app.write('EventLeft\n')
            return True

        if event == DVDNAV_RIGHT:
            self.app.write('EventRight\n')
            return True

        if event == DVDNAV_UP:
            self.app.write('EventUp\n')
            return True

        if event == DVDNAV_DOWN:
            self.app.write('EventDown\n')
            return True

        if event == DVDNAV_SELECT:
            self.app.write('EventSelect\n')
            return True

        if event == DVDNAV_TITLEMENU:
            self.app.write('TitleMenu\n')
            return True

        if event == DVDNAV_MENU:
            self.app.write('Menu\n')
            return True

        # VCD NAVIGATION
        if event in INPUT_ALL_NUMBERS:
            self.app.write('Number%s\n' % event.arg)
            time.sleep(0.1)
            self.app.write('EventSelect\n')
            return True

        if event == MENU:
            self.app.write('TitleMenu\n')
            return True

        # DVD/VCD language settings
        if event == VIDEO_NEXT_AUDIOLANG and self.max_audio:
            if self.current_audio < self.max_audio - 1:
                self.app.write('AudioChannelNext\n')
                self.current_audio += 1
                # wait until the stream is changed
                time.sleep(0.1)
            else:
                # bad hack to warp around
                if self.xine_type == 'fb':
                    self.app.write('AudioChannelDefault\n')
                    time.sleep(0.1)
                for i in range(self.max_audio):
                    self.app.write('AudioChannelPrior\n')
                    time.sleep(0.1)
                self.current_audio = -1
            return True

        if event == VIDEO_NEXT_SUBTITLE and self.max_subtitle:
            if self.current_subtitle < self.max_subtitle - 1:
                self.app.write('SpuNext\n')
                self.current_subtitle += 1
                # wait until the stream is changed
                time.sleep(0.1)
            else:
                # bad hack to warp around
                if self.xine_type == 'fb':
                    self.app.write('SpuDefault\n')
                    time.sleep(0.1)
                for i in range(self.max_subtitle):
                    self.app.write('SpuPrior\n')
                    time.sleep(0.1)
                self.current_subtitle = -1
            return True

        if event == VIDEO_NEXT_ANGLE:
            self.app.write('EventAngleNext\n')
            time.sleep(0.1)
            return True

        # nothing found? Try the eventhandler of the object who called us
        return self.item.eventhandler(event)
コード例 #6
0
ファイル: xine.py プロジェクト: freevo/freevo1
    def eventhandler(self, event, menuw=None):
        """
        eventhandler for xine control. If an event is not bound in this
        function it will be passed over to the items eventhandler
        """
        logger.log( 9, 'eventhandler(event=%r, menuw=%r)', event.name, menuw)
        if not self.app:
            return self.item.eventhandler(event)

        if event in (PLAY_END, USER_END):
            self.stop(event)
            return self.item.eventhandler(event)

        if event == PAUSE or event == PLAY:
            self.paused = not self.paused
            if config.XINE_USE_FREEVO_OSD:
                self.play_state_dialog = dialog.show_play_state(dialog.PLAY_STATE_PAUSE if self.paused else dialog.PLAY_STATE_PLAY,
                                                                self.item, self.get_time_info)
            self.app.write('pause\n')
            return True

        if event == STOP:
            self.stop(event)
            return self.item.eventhandler(event)

        if event == SEEK:
            pos = int(event.arg)
            if pos < 0:
                action='SeekRelative-'
                pos = 0 - pos
                if config.XINE_USE_FREEVO_OSD and dialog.is_dialog_supported():
                    self.play_state_dialog = dialog.show_play_state(dialog.PLAY_STATE_SEEK_BACK, self.item, self.get_time_info)
            else:
                action='SeekRelative+'
                if config.XINE_USE_FREEVO_OSD and dialog.is_dialog_supported():
                    self.play_state_dialog = dialog.show_play_state(dialog.PLAY_STATE_SEEK_FORWARD, self.item, self.get_time_info)
            if pos <= 15:
                pos = 15
            elif pos <= 30:
                pos = 30
            else:
                pos = 30
            self.app.write('%s%s\n' % (action, pos))
            return True

        if event == TOGGLE_OSD:
            if config.XINE_USE_FREEVO_OSD and dialog.is_dialog_supported():
                if self.play_state_dialog is None:
                    self.play_state_dialog = dialog.show_play_state(dialog.PLAY_STATE_INFO, self.item, self.get_time_info)
                else:
                    self.play_state_dialog.hide()
                    self.play_state_dialog = None
            else:
                self.app.write('OSDStreamInfos\n')
            return True

        if event == VIDEO_TOGGLE_INTERLACE:

            self.app.write('ToggleInterleave\n')
            self.item['deinterlace'] = not self.item['deinterlace']
            return True

        if event == NEXT:
            self.app.write('EventNext\n')
            return True

        if event == PREV:
            self.app.write('EventPrior\n')
            return True

        if event == VIDEO_SEND_XINE_CMD:
            self.app.write('%s\n' % event.arg)
            return True

        # DVD NAVIGATION
        if event == DVDNAV_LEFT:
            self.app.write('EventLeft\n')
            return True

        if event == DVDNAV_RIGHT:
            self.app.write('EventRight\n')
            return True

        if event == DVDNAV_UP:
            self.app.write('EventUp\n')
            return True

        if event == DVDNAV_DOWN:
            self.app.write('EventDown\n')
            return True

        if event == DVDNAV_SELECT:
            self.app.write('EventSelect\n')
            return True

        if event == DVDNAV_TITLEMENU:
            self.app.write('TitleMenu\n')
            return True

        if event == DVDNAV_MENU:
            self.app.write('Menu\n')
            return True

        # VCD NAVIGATION
        if event in INPUT_ALL_NUMBERS:
            self.app.write('Number%s\n' % event.arg)
            time.sleep(0.1)
            self.app.write('EventSelect\n')
            return True

        if event == MENU:
            self.app.write('TitleMenu\n')
            return True

        # DVD/VCD language settings
        if event == VIDEO_NEXT_AUDIOLANG and self.max_audio:
            if self.current_audio < self.max_audio - 1:
                self.app.write('AudioChannelNext\n')
                self.current_audio += 1
                # wait until the stream is changed
                time.sleep(0.1)
            else:
                # bad hack to warp around
                if self.xine_type == 'fb':
                    self.app.write('AudioChannelDefault\n')
                    time.sleep(0.1)
                for i in range(self.max_audio):
                    self.app.write('AudioChannelPrior\n')
                    time.sleep(0.1)
                self.current_audio = -1
            return True

        if event == VIDEO_NEXT_SUBTITLE and self.max_subtitle:
            if self.current_subtitle < self.max_subtitle - 1:
                self.app.write('SpuNext\n')
                self.current_subtitle += 1
                # wait until the stream is changed
                time.sleep(0.1)
            else:
                # bad hack to warp around
                if self.xine_type == 'fb':
                    self.app.write('SpuDefault\n')
                    time.sleep(0.1)
                for i in range(self.max_subtitle):
                    self.app.write('SpuPrior\n')
                    time.sleep(0.1)
                self.current_subtitle = -1
            return True

        if event == VIDEO_NEXT_ANGLE:
            self.app.write('EventAngleNext\n')
            time.sleep(0.1)
            return True

        # nothing found? Try the eventhandler of the object who called us
        return self.item.eventhandler(event)
コード例 #7
0
ファイル: mplayer.py プロジェクト: spartrekus/freevo1
    def eventhandler(self, event, menuw=None):
        s_event = '%s' % event

        if event == em.STOP or event == em.PLAY_END:
            self.Stop()
            rc.post_event(em.PLAY_END)
            return True

        elif event == em.PAUSE or event == em.PLAY:
            self.app.write('pause\n')
            logger.debug('%s: sending pause to mplayer', time.time())
            return True

        elif event in [
                em.TV_CHANNEL_UP, em.TV_CHANNEL_DOWN, em.TV_CHANNEL_LAST
        ] or s_event.startswith('INPUT_'):
            chan = None
            if event == em.TV_CHANNEL_UP:
                nextchan = self.fc.getNextChannel()
                nextchannum = self.fc.getNextChannelNum()
            elif event == em.TV_CHANNEL_DOWN:
                nextchan = self.fc.getPrevChannel()
                nextchannum = self.fc.getPrevChannelNum()
            elif event == em.TV_CHANNEL_LAST:
                if config.MPLAYER_OLDTVCHANNELCHANGE:
                    if os.path.isfile(
                            os.path.join(config.FREEVO_CACHEDIR, 'lastchan')):
                        lastchanfile = os.path.join(config.FREEVO_CACHEDIR,
                                                    'lastchan')
                        lcfp = open(lastchanfile, "r")
                        nextchan = lcfp.readline()
                        nextchan = nextchan.strip()
                        nextchannum = lcfp.readline()
                        nextchannum = nextchannum.strip()
                        nextchannum = int(nextchannum)
                        lcfp.close()
                    else:
                        nextchan = self.fc.getChannel()
                        nextchannum = self.fc.getChannelNum()
                else:
                    return True
            else:
                chan = int(s_event[6])
                nextchan = self.fc.getManChannel(chan)
                nextchannum = self.fc.getManChannelNum(chan)

            nextvg = self.fc.getVideoGroup(nextchan, True)
            logger.debug('chan=%s, nextchannum=%s, nextchan=%s nextvg=%s',
                         chan, nextchannum, nextchan, nextvg)

            if self.current_vg != nextvg:
                self.Stop(channel_change=1)
                self.Play('tv', nextchan)
                return True

            if self.mode == 'vcr':
                return

            elif self.current_vg.group_type == 'dvb':
                if not config.MPLAYER_OLDTVCHANNELCHANGE:
                    card = 0  # May be this should come from video groups or TV_CHANNELS
                    if em.TV_CHANNEL_UP:
                        self.app.write('dvb_set_channel %s %s\n' %
                                       (nextchannum, card))
                        self.fc.chanSet(nextchan, True)
                    elif em.TV_CHANNEL_DOWN:
                        self.app.write('dvb_set_channel %s %s\n' %
                                       (nextchannum, card))
                        self.fc.chanSet(nextchan, True)
                else:
                    self.Stop(channel_change=1)
                    self.Play('tv', nextchan)
                return True

            elif self.current_vg.group_type == 'ivtv':
                self.fc.chanSet(nextchan, True)
                self.app.write('seek 999999 0\n')

            else:
                freq_khz = self.fc.chanSet(nextchan, True, app=self.app)
                new_freq = '%1.3f' % (freq_khz / 1000.0)
                self.app.write('tv_set_freq %s\n' % new_freq)

            self.current_vg = self.fc.getVideoGroup(self.fc.getChannel(), True)

            # Display a channel changed message
            tuner_id, chan_name, prog_info = self.fc.getChannelInfo()
            now = time.strftime(config.TV_TIME_FORMAT)
            msg = '%s %s (%s): %s' % (now, chan_name, tuner_id, prog_info)
            cmd = 'osd_show_text "%s"\n' % msg
            self.app.write(cmd)
            return True

        elif event == em.TOGGLE_OSD:
            if dialog.is_dialog_supported():
                dialog.show_play_state(dialog.PLAY_STATE_INFO, self.fc)
            else:
                # Display the channel info message
                tuner_id, chan_name, prog_info = self.fc.getChannelInfo()
                now = time.strftime(config.TV_TIME_FORMAT)
                msg = '%s %s (%s): %s' % (now, chan_name, tuner_id, prog_info)
                cmd = 'osd_show_text "%s"\n' % msg
                self.app.write(cmd)
                return False

        elif event == em.OSD_MESSAGE:
            self.app.write('osd_show_text "%s"\n' % event.arg)
            return True

        elif event == em.TV_SEND_MPLAYER_CMD:
            self.app.write('%s\n' % event.arg)
            return True

        return False
コード例 #8
0
    def eventhandler(self, event, menuw=None):
        """
        eventhandler for mplayer control. If an event is not bound in this
        function it will be passed over to the items eventhandler
        """
        logger.debug('%s.eventhandler(event=%s)', self.__class__, event)
        if not self.app:
            return self.item.eventhandler(event)

        for p in self.plugins:
            if p.eventhandler(event):
                return True

        if event == VIDEO_MANUAL_SEEK:
            self.seek = 0
            rc.set_app_context(self, 'input')
            dialog.show_message("input")
            return True

        if event.context == 'input':
            if event in INPUT_ALL_NUMBERS:
                self.reset_seek_timeout()
                self.seek = self.seek * 10 + int(event)
                return True

            elif event == INPUT_ENTER:
                self.seek_timer.cancel()
                self.seek *= 60
                self.app.write('seek ' + str(self.seek) + ' 2\n')
                logger.debug("seek " + str(self.seek) + " 2\n")
                self.seek = 0
                rc.set_app_context(self, 'video')
                return True

            elif event == INPUT_EXIT:
                logger.debug('seek stopped')
                #self.app.write('seek stopped\n')
                self.seek_timer.cancel()
                self.seek = 0
                rc.set_app_context(self, 'video')
                return True

        if event == STOP:
            self.stop()
            return self.item.eventhandler(event)

        if event == 'AUDIO_ERROR_START_AGAIN':
            self.stop()
            self.play(self.options, self.item)
            return True

        if event in (PLAY_END, USER_END):
            self.stop()
            return self.item.eventhandler(event)

        if event == VIDEO_SEND_MPLAYER_CMD:
            self.app.write('%s\n' % event.arg)
            return True

        if event == TOGGLE_OSD:
            if dialog.is_dialog_supported():
                if self.play_state_dialog is None:
                    if self.paused:
                        self.play_state_dialog = dialog.show_play_state(
                            dialog.PLAY_STATE_INFO, self.item,
                            self.get_stored_time_info)
                    else:
                        self.play_state_dialog = dialog.show_play_state(
                            dialog.PLAY_STATE_INFO, self.item,
                            self.get_time_info)
                else:
                    self.play_state_dialog.hide()
                    self.play_state_dialog = None
            else:
                self.paused = False
                self.app.write('osd\n')
            return True

        if event == PAUSE or event == PLAY:
            self.paused = not self.paused
            # We have to store the current time before displaying the dialog
            # otherwise the act of requesting the current position resumes playback!
            if self.paused:
                self.stored_time_info = self.get_time_info()
                self.play_state_dialog = dialog.show_play_state(
                    dialog.PLAY_STATE_PAUSE, self.item,
                    self.get_stored_time_info)
                self.app.write('pause\n')
            else:
                self.app.write('speed_set 1.0\n')
                self.play_state_dialog = dialog.show_play_state(
                    dialog.PLAY_STATE_PLAY, self.item, self.get_time_info)

            return True

        if event == SEEK:
            if event.arg > 0 and self.item_length != -1 and self.dynamic_seek_control:
                # check if the file is growing
                if self.item_info.get_endpos() == self.item_length:
                    # not growing, deactivate this
                    self.item_length = -1

                self.dynamic_seek_control = False

            if event.arg > 0 and self.item_length != -1:
                # safety time for bad mplayer seeking
                seek_safety_time = 20
                if self.item_info['type'] in ('MPEG-PES', 'MPEG-TS'):
                    seek_safety_time = 500

                # check if seek is allowed
                if self.item_length <= self.item.elapsed + event.arg + seek_safety_time:
                    # get new length
                    self.item_length = self.item_info.get_endpos()

                # check again if seek is allowed
                if self.item_length <= self.item.elapsed + event.arg + seek_safety_time:
                    logger.debug(
                        'unable to seek %s secs at time %s, length %s',
                        event.arg, self.item.elapsed, self.item_length)
                    dialog.show_message(_('Seeking not possible'))
                    return False

            self.paused = False
            self.app.write('seek %s\n' % event.arg)
            if event.arg > 0:
                self.play_state_dialog = dialog.show_play_state(
                    dialog.PLAY_STATE_SEEK_FORWARD, self.item,
                    self.get_time_info)
            else:
                self.play_state_dialog = dialog.show_play_state(
                    dialog.PLAY_STATE_SEEK_BACK, self.item, self.get_time_info)
            return True

        if event == VIDEO_AVSYNC:
            self.app.write('audio_delay %g\n' % float(event.arg))
            if config.MPLAYER_USE_OSD_SHOW_PROPS:
                self.app.write(
                    'osd_show_property_text "Audio delay ${audio_delay}" 2000\n'
                )
            return True

        if event == VIDEO_SUBSYNC:
            self.app.write('sub_delay %g\n' % float(event.arg))
            if config.MPLAYER_USE_OSD_SHOW_PROPS:
                self.app.write(
                    'osd_show_property_text "Subtitles delay ${sub_delay}" 2000\n'
                )
            return True

        if event == VIDEO_NEXT_AUDIOLANG:
            self.app.write('switch_audio\n')
            if config.MPLAYER_USE_OSD_SHOW_PROPS:
                self.app.write(
                    'osd_show_property_text "Audio ${switch_audio}" 2000\n')
            return True

        if event == VIDEO_NEXT_SUBTITLE:
            self.app.write('sub_select\n')
            if config.MPLAYER_USE_OSD_SHOW_PROPS:
                self.app.write(
                    'osd_show_property_text "Subtitles ${sub_file}" 2000\n')
            return True

        if event == OSD_MESSAGE:
            self.show_message(event.arg)
            return True

        if event == 'MPLAYER_VO':
            if config.OSD_SINGLE_WINDOW:
                w_ratio = float(config.CONF.width) / float(event.arg[0])
                h_ratio = float(config.CONF.height) / float(event.arg[1])
                ratio = min(w_ratio, h_ratio)
                w = int(event.arg[0] * ratio)
                h = int(event.arg[1] * ratio)
                x = (config.CONF.width - w) / 2
                y = (config.CONF.height - h) / 2
                osd.video_window.set_geometry((x, y), (w, h))
                osd.video_window.show()
            return True

        # nothing found? Try the eventhandler of the object who called us
        return self.item.eventhandler(event)