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)
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)
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)
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
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)
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)
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
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)