def show_epg_info(current_channel): global _epg_info_dialog if dialog.is_dialog_supported(): if _epg_info_dialog is None: _epg_info_dialog = EPGInfoDialog() _epg_info_dialog.set_initial_channel(current_channel) _epg_info_dialog.show()
def show_epg_info(current_channel): global _epg_info_dialog if dialog.is_dialog_supported(): if _epg_info_dialog is None: _epg_info_dialog = EPGInfoDialog() _epg_info_dialog.set_initial_channel(current_channel) _epg_info_dialog.show()
def play(self, player=None): logger.debug('%s.play(player=%r)', self.__module__, player) global _player_ if _player_ and _player_.player and _player_.player.is_playing(): _player_.stop() _player_ = self if self.player and self.player.is_playing(): self.stop() if player: self.player = player else: self.possible_players = [] for p in plugin.getbyname(plugin.AUDIO_PLAYER, True): rating = p.rate(self.item) * 10 if config.AUDIO_PREFERED_PLAYER == p.name: rating += 1 if hasattr( self.item, 'force_player') and p.name == self.item.force_player: rating += 100 if (rating, p) not in self.possible_players: self.possible_players += [(rating, p)] self.possible_players = filter(lambda l: l[0] > 0, self.possible_players) self.possible_players.sort(lambda l, o: -cmp(l[0], o[0])) if len(self.possible_players) > 0: self.player_rating, self.player = self.possible_players[0] if self.menuw and self.menuw.visible and self.visible: self.menuw.hide(clear=False) self.running = True error = self.player.play(self.item, self) if error: print error self.running = False if self.visible: rc.remove_app(self.player) self.item.eventhandler(PLAY_END) else: self.paused = False if self.visible and dialog.is_dialog_supported(): self.dialog = audio.show_play_state(dialog.PLAY_STATE_PLAY, self.item, self.get_time_info) self.dialog.show() if self.visible: rc.add_app(self.player) self.refresh()
def play(self, player=None): logger.debug('%s.play(player=%r)', self.__module__, player) global _player_ if _player_ and _player_.player and _player_.player.is_playing(): _player_.stop() _player_ = self if self.player and self.player.is_playing(): self.stop() if player: self.player = player else: self.possible_players = [] for p in plugin.getbyname(plugin.AUDIO_PLAYER, True): rating = p.rate(self.item) * 10 if config.AUDIO_PREFERED_PLAYER == p.name: rating += 1 if hasattr(self.item, 'force_player') and p.name == self.item.force_player: rating += 100 if (rating, p) not in self.possible_players: self.possible_players += [(rating, p)] self.possible_players = filter(lambda l: l[0] > 0, self.possible_players) self.possible_players.sort(lambda l, o: -cmp(l[0], o[0])) if len(self.possible_players) > 0: self.player_rating, self.player = self.possible_players[0] if self.menuw and self.menuw.visible and self.visible: self.menuw.hide(clear=False) self.running = True error = self.player.play(self.item, self) if error: print error self.running = False if self.visible: rc.remove_app(self.player) self.item.eventhandler(PLAY_END) else: self.paused = False if self.visible and dialog.is_dialog_supported(): self.dialog = audio.show_play_state(dialog.PLAY_STATE_PLAY, self.item, self.get_time_info) self.dialog.show() if self.visible: rc.add_app(self.player) self.refresh()
def show_channel_banner(channel=None, channel_number=None): global _channel_banner_dialog if dialog.is_dialog_supported(): if channel is None and channel_number is None: raise RuntimeException('Either channel or channel_number must be specified!') if _channel_banner_dialog is None: _channel_banner_dialog = ChannelBannerDialog() _channel_banner_dialog.set_channel(channel, channel_number) _channel_banner_dialog.show() else: if channel: dialog.show_message(channel) else: dialog.show_message(channel_number)
def show_channel_banner(channel=None, channel_number=None): global _channel_banner_dialog if dialog.is_dialog_supported(): if channel is None and channel_number is None: raise RuntimeException( 'Either channel or channel_number must be specified!') if _channel_banner_dialog is None: _channel_banner_dialog = ChannelBannerDialog() _channel_banner_dialog.set_channel(channel, channel_number) _channel_banner_dialog.show() else: if channel: dialog.show_message(channel) else: dialog.show_message(channel_number)
def show(self): logger.debug('show() self.visible=%r', self.visible) if not self.visible: self.visible = True self.refresh() rc.add_app(self.player) if self.dialog: self.dialog.show() elif dialog.is_dialog_supported(): if self.paused: self.dialog = audio.show_play_state(dialog.PLAY_STATE_PAUSE, self.item, self.get_time_info) else: self.dialog = audio.show_play_state(dialog.PLAY_STATE_PLAY, self.item, self.get_time_info) self.dialog.show()
def show(self): logger.debug('show() self.visible=%r', self.visible) if not self.visible: self.visible = True self.refresh() rc.add_app(self.player) if self.dialog: self.dialog.show() elif dialog.is_dialog_supported(): if self.paused: self.dialog = audio.show_play_state( dialog.PLAY_STATE_PAUSE, self.item, self.get_time_info) else: self.dialog = audio.show_play_state( dialog.PLAY_STATE_PLAY, self.item, self.get_time_info) self.dialog.show()
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)