def chapter(self): if self.schapter == None: rc.add_app(self) self.pop = PopupBox(_('Choose title to play. <1-9>')) self.pop.show() else: self.play()
def play(self, options, item): """ play a videoitem with vlc """ self.options = options self.item = item mode = item.mode url = item.url self.item_info = None self.item_length = -1 self.item.elapsed = 0 try: logger.debug('Vlc.play(): url=%s', url) except UnicodeError: logger.debug('Vlc.play(): [non-ASCII data]') if config.VLC_OPTIONS: vlc_options = config.VLC_OPTIONS command = self.cmd + ' ' + vlc_options + ' --intf dummy -f --key-quit=esc "%s"' % url rc.add_app(self) self.app = childapp.ChildApp2(command) return None
def Play(self, mode, tuner_channel=None): """ play with xine """ if not tuner_channel: tuner_channel = self.fc.getChannel() if plugin.getbyname('MIXER'): plugin.getbyname('MIXER').reset() command = copy.copy(self.command) if config.XINE_HAS_NO_LIRC: command.append('--no-lirc') if config.OSD_SINGLE_WINDOW: command += ['-W', str(osd.video_window.id), '--no-mouse'] osd.video_window.show() command.append('dvb://' + tuner_channel) logger.debug('Starting cmd=%s', command) rc.add_app(self) self.app = childapp.ChildApp2(command) dialog.enable_overlay_display(AppTextDisplay(self.ShowMessage)) return None
def play(self, options, item): """ play a videoitem with vlc """ self.options = options self.item = item mode = item.mode url = item.url self.item_info = None self.item_length = -1 self.item.elapsed = 0 try: logger.debug('Vlc.play(): url=%s', url) except UnicodeError: logger.debug('Vlc.play(): [non-ASCII data]') if config.VLC_OPTIONS: vlc_options=config.VLC_OPTIONS command = self.cmd + ' ' + vlc_options + ' --intf dummy -f --key-quit=esc "%s"' % url rc.add_app(self) self.app = childapp.ChildApp2(command) return None
def Play(self, mode, tuner_channel=None): """ Start play back. """ if not tuner_channel: tuner_channel = self.fc.getChannel() if plugin.getbyname('MIXER'): plugin.getbyname('MIXER').reset() self.disable_buffering_timer.stop() rc.add_app(self) # If it's the same channel as last time and we have come back to it after # more than 2 minutes start at the end of the buffer, otherwise jump # straight back in where we left off. if self.last_channel == tuner_channel: now = time.time() seconds_since_played = now - self.stop_time logger.debug('Same channel, seconds since last playing this channel %d', seconds_since_played) self.backend.set_events_enabled(True) if seconds_since_played > 120.0: # Start at the end of the buffer buffer_info = self.backend.get_buffer_info() self.backend.seekto(buffer_info[2] - 3) self.__change_state(State.PLAYING) else: logger.debug('New channel, tuning to %s', tuner_channel) self.backend.set_events_enabled(True) self.change_channel(tuner_channel) return None
def Play(self, mode, tuner_channel=None): """ play with xine """ if not tuner_channel: tuner_channel = self.fc.getChannel() if plugin.getbyname('MIXER'): plugin.getbyname('MIXER').reset() command = copy.copy(self.command) if not config.XINE_HAS_NO_LIRC and '--no-lirc' in command: command.remove('--no-lirc') if config.OSD_SINGLE_WINDOW: command += ['-W', str(osd.video_window.id), '--no-mouse'] osd.video_window.show() command.append('dvb://' + tuner_channel) logger.debug('Starting cmd=%s', command) rc.add_app(self) self.app = childapp.ChildApp2(command) dialog.enable_overlay_display(AppTextDisplay(self.ShowMessage)) return None
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_dvd(self, arg=None, menuw=None): self.schapter = None self.selected = None if len(self.files)>1: rc.add_app(self) self.pop = PopupBox(_('Choose disc (%i discs available).' % len(self.files) )) self.pop.show() else: self.selected = 1 self.chapter()
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(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 getcmd(self): """ Setup the main menu and handle events (remote control, etc) """ import plugin menuw = menu.MenuWidget() items = [] for p in plugin.get('mainmenu'): items += p.items(self) for i in items: i.is_mainmenu_item = True mainmenu = menu.Menu(_('Freevo Main Menu'), items, item_types='main', umount_all = 1) menuw.pushmenu(mainmenu) rc.add_app(menuw)
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 __init__(self, iArg=None, iMenuw=None, iWeather=None): print iMenuw print iWeather self.arg = iArg self.menuw = iMenuw self.mpd = iWeather self.menuw.hide(clear=False) rc.add_app(self) self.skins = ('mpd') self.subtitles = (_('mpd')) self.curSkin = 0 print self.mpd.name self.title = self.mpd.name self.subtitle = self.subtitles[0] # Fire up splashscreen and load the plugins skin.draw('mpd', self)
def getcmd(self): """ Setup the main menu and handle events (remote control, etc) """ import plugin menuw = menu.MenuWidget() items = [] for p in plugin.get('mainmenu'): items += p.items(self) for i in items: i.is_mainmenu_item = True mainmenu = menu.Menu(_('Freevo Main Menu'), items, item_types='main', umount_all=1) menuw.pushmenu(mainmenu) rc.add_app(menuw)
def __init__(self, arg=None, menu=None, weather=None): """ """ logger.log(9, "WeatherDetailHandler.__init__(arg=%r, menu=%r, weather=%r)", arg, menu, weather) self.arg = arg self.menuw = menu self.weather = weather self.menuw.hide(clear=False) rc.add_app(self) self.skins = ("day", "forecast", "week", "map") self.skin_num = 0 self.subtitles = (_("Current Conditions"), _("Today's Forecast"), _("Extended Forecast"), _("Radar Map")) self.title = "" self.subtitle = self.getSubtitle(self.skin_num) # Fire up splashscreen and load the plugins skin.draw("oneclick", self, transition=skin.TRANSITION_IN)
def __init__(self, iArg=None, iMenuw=None, iWeather=None ): print iMenuw print iWeather self.arg = iArg self.menuw = iMenuw self.mpd = iWeather self.menuw.hide(clear=False) rc.add_app(self) self.skins = ('mpd') self.subtitles = (_('mpd')) self.curSkin = 0 print self.mpd.name self.title = self.mpd.name self.subtitle = self.subtitles[0] # Fire up splashscreen and load the plugins skin.draw('mpd', self)
def __init__(self, arg=None, menu=None, weather=None): """ """ logger.log( 9, 'WeatherDetailHandler.__init__(arg=%r, menu=%r, weather=%r)', arg, menu, weather) self.arg = arg self.menuw = menu self.weather = weather self.menuw.hide(clear=False) rc.add_app(self) self.skins = ('day', 'forecast', 'week', 'map') self.skin_num = 0 self.subtitles = (_('Current Conditions'), _('Today\'s Forecast'), _('Extended Forecast'), _('Radar Map')) self.title = '' self.subtitle = self.getSubtitle(self.skin_num) # Fire up splashscreen and load the plugins skin.draw('oneclick', self, transition=skin.TRANSITION_IN)
def play(self, options, item): """ play a videoitem """ m = RE_YOUTUBE_URL.match(item.url) if not m: return url = 'http://www.youtube.com/watch?v=%s' % m.group(1) self.options = options self.item = item self.item_info = None self.item_length = -1 self.item.elapsed = 0 self.paused = False self.app = webbrowser.start_web_browser(url, self.__exited) rc.add_app(self) dialog.enable_overlay_display(None) Event(PLAY_START, item).post()
def play(self, options, item): """ play a videoitem """ m = RE_YOUTUBE_URL.match(item.url) if not m: return url = "http://www.youtube.com/watch?v=%s" % m.group(1) self.options = options self.item = item self.item_info = None self.item_length = -1 self.item.elapsed = 0 self.paused = False self.app = webbrowser.start_web_browser(url, self.__exited) rc.add_app(self) dialog.enable_overlay_display(None) Event(PLAY_START, item).post()
def Play(self, mode, channel=None, channel_change=0): """ Start the xine player """ logger.debug('XineIvtv.Play(mode=%r, channel=%r, channel_change=%r)', mode, channel, channel_change) self.mode = mode rc.add_app(self) self.mixer.Mute() self.xine.Start() self.tuner.SetChannelByName(channel, True) # Suppress annoying audio clicks time.sleep(0.6) self.mixer.UnMute() if config.XINE_TV_LIVE_RECORD: self.InitLiveRecording() else: self.tuner.ShowInfo() dialog.enable_overlay_display(AppTextDisplay(self.xine.ShowMessage)) logger.debug('Started %r app', self.mode)
def __set_current_dialog(self, dialog, duration, prepared): logger.debug('Setting current dialog to %s', dialog.__class__.__name__) if self.current_dialog != dialog: if not prepared: dialog.prepare() if hasattr(dialog, 'event_context'): rc.add_app(dialog) self.current_dialog = dialog self.current_time_details = (time.time(), duration) try: self.show_image(dialog.render(), dialog.skin.position) except: logger.error('Exception caught while trying to render dialog!\n' + traceback.format_exc()) if duration > 0.0: #Stop any pending hide timers self.hide_dialog_timer.stop() self.hide_dialog_timer.start(duration)
def play(self, item, playerGUI): """ play a radioitem with radio player """ logger.debug('%s.play(item=%r, playerGUI=%r)', self.__module__, item, playerGUI) self.playerGUI = playerGUI self.item = item #self.item.elapsed = 0 self.starttime = time.time() try: logger.debug('play %r', self.item.station) except AttributeError: return 'Cannot play with RadioPlayer - no station' self.mode = 'play' mixer = plugin.getbyname('MIXER') if mixer: mixer_vol = config.MIXER_VOLUME_RADIO_IN mixer.setLineinVolume(mixer_vol) mixer.setIgainVolume(mixer_vol) mixer.setMicVolume(mixer_vol) logger.debug('RadioPlayer mixer is %s', mixer) if config.RADIO_CMD.find('ivtv-radio') >= 0: # IVTV cards logger.debug('%s -f %s &', config.RADIO_CMD, self.item.station) os.system('%s -f %s &' % (config.RADIO_CMD, self.item.station)) else: # BTTV cards logger.debug('%s', config.RADIO_CMD_START%self.item.station) os.system('%s' % (config.RADIO_CMD_START % self.item.station)) #thread.start_new_thread(self.__update_thread, ()) rc.add_app(self) rc.post_event(PLAY_START) return None
class Game: def __init__(self): logger.log( 9, 'Game.__init__()') self.mode = None self.event_context = 'games' def play(self, item, menuw): logger.log( 9, 'play(item=%r, menuw=%r)', item, menuw) self.item = item self.filename = item.filename self.command = item.command self.mode = item.mode self.menuw = menuw if not os.path.isfile(self.filename): osd.clearscreen() osd.drawstring(_('File "%s" not found!') % self.filename, 30, 280) osd.update() time.sleep(2.0) self.menuw.refresh() return 0 if plugin.getbyname('MIXER'): plugin.getbyname('MIXER').reset() if plugin.is_active('joy'): try: plugin.getbyname('JOY').disable() except Exception, why: logger.warning('getbyname("JOY"): %s', why) logger.debug('Game.play(): Starting thread, cmd=%s', self.command) self.app=GameApp(self.command) rc.suspend() rc.add_app(self)
def Play(self, mode, tuner_channel=None, channel_change=0): if not tuner_channel: tuner_channel = self.fc.getChannel() vg = self.current_vg = self.fc.getVideoGroup(tuner_channel, True) if not vg.group_type == 'normal': print 'Tvtime only supports normal. "%s" is not implemented' % vg.group_type return if mode == 'tv' or mode == 'vcr': w, h = config.TV_VIEW_SIZE cf_norm = vg.tuner_norm cf_input = vg.input_num cf_device = vg.vdev s_norm = cf_norm.upper() outputplugin = '' if plugin.getbyname(plugin.TV).optionD_supported: if config.CONF.display == 'x11': outputplugin = 'Xv' elif config.CONF.display == 'mga': outputplugin = 'mga' elif config.CONF.display in ( 'directfb', 'dfbmga' ): outputplugin = 'directfb' else: outputplugin = config.CONF.display outputplugin = '-D %s' % outputplugin if mode == 'vcr': cf_input = '1' if hasattr(config, "TV_VCR_INPUT_NUM") and config.TV_VCR_INPUT_NUM: cf_input = config.TV_VCR_INPUT_NUM self.fc.chan_index = self.TunerSetChannel(tuner_channel) if hasattr(config, 'TV_PAD_CHAN_NUMBERS') and config.TV_PAD_CHAN_NUMBERS: mychan = tuner_channel else: mychan = self.fc.chan_index logger.debug('starting channel is %s', mychan) command = '%s %s -k -I %s -n %s -d %s -f %s -c %s -i %s' % \ (config.TVTIME_CMD, outputplugin, w, s_norm, cf_device, 'freevo', mychan, cf_input) if osd.get_fullscreen() == 1: command += ' -m' else: command += ' -M' else: print 'Mode "%s" is not implemented' % mode # BUG ui.message() return self.mode = mode mixer = plugin.getbyname('MIXER') # BUG Mixer manipulation code. # TV is on line in # VCR is mic in # btaudio (different dsp device) will be added later if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer_vol = mixer.getMainVolume() mixer.setMainVolume(0) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer_vol = mixer.getPcmVolume() mixer.setPcmVolume(0) # Start up the TV task self.app=TVTimeApp(command) rc.add_app(self) # Suppress annoying audio clicks time.sleep(0.4) # BUG Hm.. This is hardcoded and very unflexible. if mixer and mode == 'vcr': mixer.setMicVolume(config.MIXER_VOLUME_VCR_IN) elif mixer: mixer.setLineinVolume(config.MIXER_VOLUME_TV_IN) mixer.setIgainVolume(config.MIXER_VOLUME_TV_IN) if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer.setMainVolume(mixer_vol) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer.setPcmVolume(mixer_vol) logger.debug('%s: started %s app', time.time(), self.mode)
def view(self, item, zoom=0, rotation=0): """ view an image """ logger.log( 9, 'view(item, zoom=%s, rotation=%s)', zoom, rotation) if self.blend: self.blend.stop() self.blend.remove() self.blend = None if zoom: self.event_context = 'image_zoom' else: self.event_context = 'image' filename = item.filename self.fileitem = item self.parent = item.menuw if not self.free_cache in item.menuw.show_callbacks: item.menuw.show_callbacks.append(self.free_cache) self.filename = filename self.rotation = rotation if filename and len(filename) > 0: image = self.osd.loadbitmap(filename, cache=self.bitmapcache) else: # Using Container-Image image, w, h = item.loadimage() if not self.__added_app: rc.add_app(self) self.__added_app = True if not image: self.osd.clearscreen(color=self.osd.COL_BLACK) self.osd.drawstringframed(_('Can\'t Open Image\n"%s"') % Unicode(filename), config.OSD_OVERSCAN_LEFT + 20, config.OSD_OVERSCAN_TOP + 20, self.osd.width - (config.OSD_OVERSCAN_LEFT+config.OSD_OVERSCAN_RIGHT) - 40, self.osd.height - (config.OSD_OVERSCAN_TOP+config.OSD_OVERSCAN_BOTTOM) - 40, self.osd.getfont(config.OSD_DEFAULT_FONTNAME, config.OSD_DEFAULT_FONTSIZE), fgcolor=self.osd.COL_ORANGE, align_h='center', align_v='center', mode='soft') self.osd.update() return width, height = image.get_size() # Bounding box default values bbx = bby = bbw = bbh = 0 if zoom: # Translate the 9-element grid to bounding boxes if config.IMAGEVIEWER_REVERSED_IMAGES: if self.rotation == 90: bb = { 1:(2,2), 2:(2,1), 3:(2,0), 4:(1,2), 5:(1,1), 6:(1,0), 7:(0,2), 8:(0,1), 9:(0,0) } elif self.rotation == 180: bb = { 1:(2,0), 2:(1,0), 3:(0,0), 4:(2,1), 5:(1,1), 6:(0,1), 7:(2,2), 8:(1,2), 9:(0,2) } elif self.rotation == 270: bb = { 1:(0,0), 2:(0,1), 3:(0,2), 4:(1,0), 5:(1,1), 6:(1,2), 7:(2,0), 8:(2,1), 9:(2,2) } else: bb = { 1:(0,2), 2:(1,2), 3:(2,2), 4:(0,1), 5:(1,1), 6:(2,1), 7:(0,0), 8:(1,0), 9:(2,0) } else: if self.rotation == 90: bb = { 1:(2,0), 2:(2,1), 3:(2,2), 4:(1,0), 5:(1,1), 6:(1,2), 7:(0,0), 8:(0,1), 9:(0,2) } elif self.rotation == 180: bb = { 1:(2,2), 2:(1,2), 3:(0,2), 4:(2,1), 5:(1,1), 6:(0,1), 7:(2,0), 8:(1,0), 9:(0,0) } elif self.rotation == 270: bb = { 1:(0,2), 2:(0,1), 3:(0,0), 4:(1,2), 5:(1,1), 6:(1,0), 7:(2,2), 8:(2,1), 9:(2,0) } else: bb = { 1:(0,0), 2:(1,0), 3:(2,0), 4:(0,1), 5:(1,1), 6:(2,1), 7:(0,2), 8:(1,2), 9:(2,2) } if isinstance(zoom, int): h, v = bb[zoom] else: h, v = bb[zoom[0]] # Bounding box center bbcx = ([1, 3, 5][h]) * width / 6 bbcy = ([1, 3, 5][v]) * height / 6 if self.rotation % 180: # different calculations because image width is screen height scale_x = float(self.osd_width) / (height / 3) scale_y = float(self.osd_height) / (width / 3) scale = min(scale_x, scale_y) # read comment for the bbw and bbh calculations below bbw = min(max((width / 3) * scale, self.osd_height), width) / scale bbh = min(max((height / 3) * scale, self.osd_width), height) / scale else: scale_x = float(self.osd_width) / (width / 3) scale_y = float(self.osd_height) / (height / 3) scale = min(scale_x, scale_y) # the bb width is the width / 3 * scale, to avoid black bars left # and right exapand it to the osd_width but not if this is more than the # image width (same for height) bbw = min(max((width / 3) * scale, self.osd_width), width) / scale bbh = min(max((height / 3) * scale, self.osd_height), height) / scale # calculate the beginning of the bounding box bbx = max(0, bbcx - bbw/2) bby = max(0, bbcy - bbh/2) if bbx + bbw > width: bbx = width - bbw if bby + bbh > height: bby = height - bbh if self.rotation % 180: new_h, new_w = bbw * scale, bbh * scale else: new_w, new_h = bbw * scale, bbh * scale else: if self.rotation % 180: height, width = width, height # scale_x = scale_y = 1.0 # if width > osd_width: scale_x = float(osd_width) / width # if height > osd_height: scale_y = float(osd_height) / height scale_x = float(self.osd_width) / width scale_y = float(self.osd_height) / height scale = min(scale_x, scale_y) new_w, new_h = int(scale*width), int(scale*height) # Now we have all necessary information about zoom yes/no and # the kind of rotation x = (self.osd_width - new_w) / 2 y = (self.osd_height - new_h) / 2 last_item,last_image = self.last_image if not isinstance(zoom, int): # change zoom based on rotation if self.rotation == 90: zoom = zoom[0], -zoom[2], zoom[1] if self.rotation == 180: zoom = zoom[0], -zoom[1], -zoom[2] if self.rotation == 270: zoom = zoom[0], zoom[2], -zoom[1] # don't move outside the image if bbx + zoom[1] < 0: zoom = zoom[0], -bbx, zoom[2] if bbx + zoom[1] > width - bbw: zoom = zoom[0], width - (bbw + bbx), zoom[2] if bby + zoom[2] < 0: zoom = zoom[0], zoom[1], -bby if bby + zoom[2] > height - bbh: zoom = zoom[0], zoom[1], height - (bbh + bby) # change bbx bbx += zoom[1] bby += zoom[2] # save zoom, but revert the rotation mix up if not isinstance(zoom, int) and self.rotation: if self.rotation == 90: zoom = zoom[0], zoom[2], -zoom[1] if self.rotation == 180: zoom = zoom[0], -zoom[1], -zoom[2] if self.rotation == 270: zoom = zoom[0], -zoom[2], zoom[1] self.zoom = zoom self.last_image = (item, (image, x, y, scale, bbx, bby, bbw, bbh, self.rotation)) if (last_image and last_item != item and config.IMAGEVIEWER_BLEND_MODE != None): screen = self.osd.screen.convert() screen.fill((0,0,0,0)) screen.blit(self.osd.zoomsurface(image, scale, bbx, bby, bbw, bbh, rotation=self.rotation).convert(), (x, y)) # update the OSD self.drawosd(layer=screen) self.blend = Transition(self.osd.screen, screen, config.IMAGEVIEWER_BLEND_MODE) self.blend.start() self.blend.inprogress.connect(self.__blend_done, item) else: self.osd.clearscreen(color=self.osd.COL_BLACK) self.osd.drawsurface(image, x, y, scale, bbx, bby, bbw, bbh, rotation=self.rotation) # update the OSD self.drawosd() self.__drawn(item)
def show(self): logger.debug('show()') if not self.visible: self.visible = True self.refresh() rc.add_app(self.player)
def Play(self, mode, tuner_channel=None, channel_change=0): if tuner_channel != None: try: self.TunerSetChannel(tuner_channel) except ValueError: pass if not tuner_channel: tuner_channel = self.fc.getChannel() vg = self.current_vg = self.fc.getVideoGroup(tuner_channel, True) if not vg.group_type == 'normal': print 'Xawtv only supports normal. "%s" is not implemented' % vg.group_type return if mode == 'tv' or mode == 'vcr': w, h = config.TV_VIEW_SIZE cf_norm = vg.tuner_norm cf_input = vg.input_num cf_device = vg.vdev s_norm = cf_norm.upper() if mode == 'vcr': cf_input = '1' if hasattr(config, "TV_VCR_INPUT_NUM") and config.TV_VCR_INPUT_NUM: cf_input = config.TV_VCR_INPUT_NUM if hasattr(config, "TV_XAWTV_OPTS") and config.TV_XAWTV_OPTS: daoptions = config.TV_XAWTV_OPTS else: daoptions = '-xv -f' command = '%s %s -device %s ' % (self.xawtv_prog, daoptions, cf_device) else: print 'Mode "%s" is not implemented' % mode # BUG ui.message() return self.mode = mode mixer = plugin.getbyname('MIXER') # BUG Mixer manipulation code. # TV is on line in # VCR is mic in # btaudio (different dsp device) will be added later if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer_vol = mixer.getMainVolume() mixer.setMainVolume(0) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer_vol = mixer.getPcmVolume() mixer.setPcmVolume(0) # Start up the TV task self.app=XawtvApp(command, self.remote_prog) if tuner_channel: time.sleep(0.5) self.app.sendcmd('setstation %s' % tuner_channel) #XXX use remote to change the input we want rc.add_app(self) # Suppress annoying audio clicks time.sleep(0.4) # BUG Hm.. This is hardcoded and very unflexible. if mixer and mode == 'vcr': mixer.setMicVolume(config.MIXER_VOLUME_VCR_IN) elif mixer: mixer.setLineinVolume(config.MIXER_VOLUME_TV_IN) mixer.setIgainVolume(config.MIXER_VOLUME_TV_IN) if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer.setMainVolume(mixer_vol) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer.setPcmVolume(mixer_vol) logger.debug('%s: started %s app', time.time(), self.mode)
def show(self): logger.debug("show()") if not self.visible: self.visible = True self.refresh() rc.add_app(self.player)
def show(self): self.visible = 1 self.osd.dialog_layer.fill((0,0,0,config.OSD_DIALOG_BACKGROUND_DIM)) self.draw() rc.add_app(self)
def play(self, options, item): """ play video media with xine """ logger.log( 9, 'play(options=%r, item=%r)', options, item) self.item = item self.options = options self.item.elapsed = 0 if config.EVENTS.has_key(item.mode): self.event_context = item.mode else: self.event_context = 'video' if self.command is None: config_file_opt = [] network_opt = [] if config.XINE_USE_FREEVO_OSD: config_file = dialog.utils.get_xine_config_file() if config_file: config_file_opt = ['--config', config_file] if config.XINE_USE_FREEVO_OSD and dialog.overlay_display_supports_dialogs: xine_cmd_line = config.XINE_COMMAND + config.XINE_ARGS_DEF if xine_cmd_line.find('--network') == -1 or xine_cmd_line.find(' -n') == -1: network_opt = ['--network'] passwd_file = '%s/.xine/passwd' % os.environ['HOME'] if not os.path.exists(passwd_file): out = open(passwd_file, 'w') out.write('ALL:ALLOW\n') out.close() print _('!WARNING! created a xine passwd file with ALL:ALLOW') self.command = [ '--prio=%s' % config.MPLAYER_NICE ] + \ config.XINE_COMMAND.split(' ') + \ network_opt + \ [ '--stdctl', '-V', config.XINE_VO_DEV, '-A', config.XINE_AO_DEV ] + \ config.XINE_ARGS_DEF.split(' ') + config_file_opt command = copy.copy(self.command) if item['deinterlace']: command.append('-D') if config.XINE_HAS_NO_LIRC: command.append('--no-lirc') if config.OSD_SINGLE_WINDOW: command += ['-W', str(osd.video_window.id), '--no-mouse'] osd.video_window.show() self.max_audio = 0 self.current_audio = -1 self.max_subtitle = 0 self.current_subtitle = -1 if item.mode == 'dvd': for track in item.info['tracks']: if track.has_key('audio'): self.max_audio = max(self.max_audio, len(track['audio'])) for track in item.info['tracks']: if track.has_key('subtitles'): self.max_subtitle = max(self.max_subtitle, len(track['subtitles'])) if item.mode == 'dvd' and hasattr(item, 'filename') and item.filename and \ item.filename.endswith('.iso'): # dvd:///full/path/to/image.iso/ command.append('dvd://%s/' % item.filename) elif item.mode == 'dvd' and hasattr(item.media, 'devicename'): # dvd:///dev/dvd/2 command.append('dvd://%s/%s' % (item.media.devicename, item.url[6:])) elif item.mode == 'dvd': # no devicename? Probably a mirror image on the HD command.append(item.url) elif item.mode == 'vcd': # vcd:///dev/cdrom -- NO track support (?) command.append('vcd://%s' % item.media.devicename) elif item.mimetype == 'cue': command.append('vcd://%s' % item.filename) self.event_context = 'vcd' else: if (len(options) > 1): if (options[1] == '--playlist'): #command.append('%s %s' % (options[1],options[2])) command.append(options[1]) command.append(options[2]) else: if item['resume']: self.item.elapsed = int(item['resume']) self.tmp_playlist = self.write_playlist(item, self.item.elapsed) command.append('--playlist') command.append(self.tmp_playlist) else: command.append(item.url) self.stdout_plugins = [] self.paused = False self.item_length = -1 rc.add_app(self) self.app = XineApp(command, self) self.play_state_dialog = None dialog.enable_overlay_display(AppTextDisplay(self.ShowMessage)) return None
def start_vdr_plugin(self, arg=None, menuw=None): if plugin.getbyname('MIXER'): mixer=plugin.getbyname('MIXER') mixer.reset() if self.viewer=='xine': command = [ '--prio=%s' % config.MPLAYER_NICE ] + \ config.XINE_COMMAND.split(' ') + \ [ '--stdctl', '-V', config.XINE_VO_DEV, '-A', config.XINE_AO_DEV ] + \ config.XINE_ARGS_DEF.split(' ') command.append('-D') #command.remove('--config') #command.remove(config.XINE_CONFIG) #for value in command # if value.startswith('--post'): # command.remove(value) if not rc.PYLIRC and '--no-lirc' in command: command.remove('--no-lirc') if config.VDR_XINE_FIFO_PATH: command.append(config.VDR_XINE_FIFO_PATH) else: command.append('vdr://var/vdr/xine/stream#demux:mpeg_pes') else: self.tcp=1 if self.viewer=='tvtime': command = config.TVTIME_CMD + " " + config.TVTIME_ARGS else: command = self.viewer if self.tcp: self.svdrp = SVDRP(config.VDR_SVDRP_HOST,port=config.VDR_SVDRP_PORT,close_connection=config.VDR_SVDRP_ALWAYSCLOSE) # let's see if the freevo plugin is loaded in freevo result = self.svdrp.write_cmd('plug freevo' + '\n') if result[0:3] == '214': self.vdrhasfreevoplugin = True # turn off VDR remotes self.svdrp.write_cmd('plug freevo rctl off' + '\n') print result else: print "\n#####################################" print "VDR has no plugin named 'freevo' loaded" print "Most likely you'll experience key-hit conflicts in VDR" print "#####################################\n" # switch vdr to the last used channel channel=self.vdrinterface.getVar('CURRENT_TV_CHANNEL') if channel: print "switching to "+channel self.svdrp.chan(channel) if self.viewer!='xine': mixer.setLineinVolume(100) if not self.menuw: self.menuw = menuw self.menuw.hide() self.app = childapp.ChildApp2(command, stop_osd=2) rc.add_app(self, context='vdr') return None
def Play(self, mode, tuner_channel=None, channel_change=0): if tuner_channel != None: try: self.TunerSetChannel(tuner_channel) except ValueError: pass if not tuner_channel: tuner_channel = self.fc.getChannel() vg = self.current_vg = self.fc.getVideoGroup(tuner_channel, True) if not vg.group_type == 'normal': print 'Xawtv only supports normal. "%s" is not implemented' % vg.group_type return if mode == 'tv' or mode == 'vcr': w, h = config.TV_VIEW_SIZE cf_norm = vg.tuner_norm cf_input = vg.input_num cf_device = vg.vdev s_norm = cf_norm.upper() if mode == 'vcr': cf_input = '1' if hasattr(config, "TV_VCR_INPUT_NUM") and config.TV_VCR_INPUT_NUM: cf_input = config.TV_VCR_INPUT_NUM if hasattr(config, "TV_XAWTV_OPTS") and config.TV_XAWTV_OPTS: daoptions = config.TV_XAWTV_OPTS else: daoptions = '-xv -f' command = '%s %s -device %s ' % (self.xawtv_prog, daoptions, cf_device) else: print 'Mode "%s" is not implemented' % mode # BUG ui.message() return self.mode = mode mixer = plugin.getbyname('MIXER') # BUG Mixer manipulation code. # TV is on line in # VCR is mic in # btaudio (different dsp device) will be added later if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer_vol = mixer.getMainVolume() mixer.setMainVolume(0) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer_vol = mixer.getPcmVolume() mixer.setPcmVolume(0) # Start up the TV task self.app = XawtvApp(command, self.remote_prog) if tuner_channel: time.sleep(0.5) self.app.sendcmd('setstation %s' % tuner_channel) #XXX use remote to change the input we want rc.add_app(self) # Suppress annoying audio clicks time.sleep(0.4) # BUG Hm.. This is hardcoded and very unflexible. if mixer and mode == 'vcr': mixer.setMicVolume(config.MIXER_VOLUME_VCR_IN) elif mixer: mixer.setLineinVolume(config.MIXER_VOLUME_TV_IN) mixer.setIgainVolume(config.MIXER_VOLUME_TV_IN) if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer.setMainVolume(mixer_vol) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer.setPcmVolume(mixer_vol) logger.debug('%s: started %s app', time.time(), self.mode)
def play(self, options, item): """ play a videoitem with mplayer """ logger.log( 9, 'options=%r', options) for k, v in item.__dict__.items(): logger.log( 9, 'item[%s]=%r', k, v) mode = item.mode url = item.url self.options = options self.item = item self.item_info = None self.item_length = -1 self.item.elapsed = 0 if mode == 'file': url = item.url[6:] self.item_info = mmpython.parse(url) if hasattr(self.item_info, 'get_length'): self.item_length = self.item_info.get_endpos() self.dynamic_seek_control = True if url.startswith('dvd://') and url[-1] == '/': url += '1' if url == 'vcd://': c_len = 0 for i in range(len(item.info.tracks)): if item.info.tracks[i].length > c_len: c_len = item.info.tracks[i].length url = item.url + str(i+1) url=Unicode(url) try: logger.debug('MPlayer.play(): mode=%s, url=%s', mode, url) except UnicodeError: logger.debug('MPlayer.play(): [non-ASCII data]') if mode == 'file' and not os.path.isfile(url): # This event allows the videoitem which contains subitems to # try to play the next subitem return '%s\nnot found' % os.path.basename(url) set_vcodec = False if item['xvmc'] and item['type'][:6] in ['MPEG-1', 'MPEG-2', 'MPEG-T']: set_vcodec = True mode = item.mimetype if not config.MPLAYER_ARGS.has_key(mode): logger.info('MPLAYER_ARGS not defined for %r, using default', mode) mode = 'default' logger.debug('mode=%s args=%s', mode, config.MPLAYER_ARGS[mode]) # Build the MPlayer command args = { 'nice': config.MPLAYER_NICE, 'cmd': config.MPLAYER_CMD, 'vo': '-vo %s' % config.MPLAYER_VO_DEV, 'vo_opts': config.MPLAYER_VO_DEV_OPTS, 'vc': '', 'ao': '-ao %s' % config.MPLAYER_AO_DEV, 'ao_opts': config.MPLAYER_AO_DEV_OPTS, 'default_args': config.MPLAYER_ARGS_DEF, 'mode_args': config.MPLAYER_ARGS[mode], 'fxd_args': ' '.join(options), 'geometry': '', 'verbose': '', 'dvd-device': '', 'cdrom-device': '', 'alang': '', 'aid': '', 'slang': '', 'sid': '', 'playlist': '', 'field-dominance': '', 'edl': '', 'mc': '', 'delay': '', 'sub': '', 'audiofile': '', 'af': [], 'vf': [], 'url': url, 'disable_osd': False, 'start_position': [], } if item['resume']: t = int(item['resume']) info = mmpython.parse(item.filename) if hasattr(info, 'seek') and t: args['start_position']=['-sb' , str(info.seek(t))] else: args['start_position']=['-ss', str(t)] if config.CONF.x or config.CONF.y: args['geometry'] = '-geometry %d:%d' % (config.CONF.x, config.CONF.y) if config.DEBUG_CHILDAPP: args['verbose'] = '-v' if mode == 'dvd': if config.DVD_LANG_PREF: # There are some bad mastered DVDs out there. E.g. the specials on # the German Babylon 5 Season 2 disc claim they have more than one # audio track, even more then on en. But only the second en works, # mplayer needs to be started without -alang to find the track if hasattr(item, 'mplayer_audio_broken') and item.mplayer_audio_broken: print '*** dvd audio broken, try without alang ***' else: args['alang'] = '-alang %s' % config.DVD_LANG_PREF if config.DVD_SUBTITLE_PREF: # Only use if defined since it will always turn on subtitles when defined args['slang'] = '-slang %s' % config.DVD_SUBTITLE_PREF if mode == 'dvd': # dvd on harddisc args['dvd-device'] = '%s' % item.filename args['url'] = url[:6] + url[url.rfind('/')+1:] elif mode != 'file' and hasattr(item.media, 'devicename'): args['dvd-device'] = '%s' % item.media.devicename if item.media and hasattr(item.media, 'devicename'): args['cdrom-device'] = '%s' % item.media.devicename if item.selected_subtitle == -1: args['sid'] = '-noautosub' elif item.selected_subtitle is not None: if mode == 'file': if os.path.isfile(os.path.splitext(item.filename)[0]+'.idx'): args['sid'] = '-vobsubid %s' % str(item.selected_subtitle) else: args['sid'] = '-sid %s' % str(item.selected_subtitle) else: args['sid'] = '-sid %s' % str(item.selected_subtitle) if item.selected_audio is not None: args['aid'] = '-aid %s' % str(item.selected_audio) # This comes from the bilingual language selection menu if hasattr(item, 'selected_language') and item.selected_language: if item.selected_language == 'left': args['af'].append('pan=2:1:1:0:0') elif item.selected_language == 'right': args['af'].append('pan=2:0:0:1:1') if not set_vcodec: if item['deinterlace'] and config.MPLAYER_VF_INTERLACED: args['vf'].append(config.MPLAYER_VF_INTERLACED) elif config.MPLAYER_VF_PROGRESSIVE: args['vf'].append(config.MPLAYER_VF_PROGRESSIVE) if config.VIDEO_FIELD_DOMINANCE is not None: args['field-dominance'] = '-field-dominance %d' % int(item['field-dominance']) if os.path.isfile(os.path.splitext(item.filename)[0]+'.edl'): args['edl'] = '-edl %s' % str(os.path.splitext(item.filename)[0]+'.edl') if dialog.overlay_display_supports_dialogs: # Disable the mplayer OSD if we have a better option. args['disable_osd'] = True # Mplayer command and standard arguments if set_vcodec: if item['deinterlace']: bobdeint='bobdeint' else: bobdeint='nobobdeint' args['vo'] = '-vo xvmc:%s' % bobdeint args['vc'] = '-vc ffmpeg12mc' if hasattr(item, 'is_playlist') and item.is_playlist: args['playlist'] = '-playlist' if args['fxd_args'].find('-playlist') > 0: args['fxd_args'] = args['fxd_args'].replace('-playlist', '') args['playlist'] = '-playlist' # correct avi delay based on kaa.metadata settings if config.MPLAYER_SET_AUDIO_DELAY and item.info.has_key('delay') and item.info['delay'] > 0: args['mc'] = '-mc %s' % str(int(item.info['delay'])+1) args['delay'] = '-delay -%s' % str(item.info['delay']) # mplayer A/V is screwed up when setrting screen refresh rate to the same value as the movies FPS # this does happen almost exclusively at 23.976 FPS. Let's try to fix it. if config.MPLAYER_RATE_SET_FROM_VIDEO and item.getattr('fps') in ['23.976', '24.000' ]: args['mc'] = '-mc %s' % str(int(config.MPLAYER_AUDIO_DELAY)+1) args['delay'] = '-delay %s' % str(config.MPLAYER_AUDIO_DELAY) # autocrop if config.MPLAYER_AUTOCROP and not item.network_play and args['fxd_args'].find('crop=') == -1: logger.debug('starting autocrop') (x1, y1, x2, y2) = (1000, 1000, 0, 0) crop_points = config.MPLAYER_AUTOCROP_START if not isinstance(crop_points, list): crop_points = [crop_points] for crop_point in crop_points: (x1, y1, x2, y2) = self.get_crop(crop_point, x1, y1, x2, y2) if x1 < 1000 and x2 < 1000: args['vf'].append('crop=%s:%s:%s:%s' % (x2-x1, y2-y1, x1, y1)) logger.debug('crop=%s:%s:%s:%s', x2 - x1, y2 - y1, x1, y1) if item.subtitle_file: d, f = util.resolve_media_mountdir(item.subtitle_file) util.mount(d) args['sub'] = '-sub %s' % f if item.audio_file: d, f = util.resolve_media_mountdir(item.audio_file) util.mount(d) args['audiofile'] = '-audiofile %s' % f self.plugins = plugin.get('mplayer_video') for p in self.plugins: command = p.play(command, self) vo = ['%(vo)s' % args, '%(vo_opts)s' % args] vo = filter(len, vo) vo = ':'.join(vo) ao = ['%(ao)s' % args, '%(ao_opts)s' % args] ao = filter(len, ao) ao = ':'.join(ao) # process the mplayer options extracting video and audio filters args['default_args'], args = self.find_filters(args['default_args'], args) args['mode_args'], args = self.find_filters(args['mode_args'], args) args['fxd_args'], args = self.find_filters(args['fxd_args'], args) command = ['--prio=%(nice)s' % args] command += ['%(cmd)s' % args] command += ['-slave'] command += str('%(verbose)s' % args).split() command += str('%(geometry)s' % args).split() command += vo.split() command += str('%(vc)s' % args).split() command += ao.split() command += args['dvd-device'] and ['-dvd-device', '%(dvd-device)s' % args] or [] command += args['cdrom-device'] and ['-cdrom-device', '%(cdrom-device)s' % args] or [] command += str('%(alang)s' % args).split() command += str('%(aid)s' % args).split() command += str('%(audiofile)s' % args).split() command += str('%(slang)s' % args).split() command += str('%(sid)s' % args).split() command += str('%(sub)s' % args).split() command += str('%(field-dominance)s' % args).split() command += str('%(edl)s' % args).split() command += str('%(mc)s' % args).split() command += str('%(delay)s' % args).split() command += args['default_args'].split() command += args['mode_args'].split() command += args['fxd_args'].split() command += args['af'] and ['-af', '%s' % ','.join(args['af'])] or [] command += args['vf'] and ['-vf', '%s' % ','.join(args['vf'])] or [] command += args['disable_osd'] and ['-osdlevel', '0'] or [] command += args['start_position'] if config.OSD_SINGLE_WINDOW: command += ['-wid', str(osd.video_window.id)] # This ensures constant subtitle size, disable if you do not like this # and want to have the size as designed by the sutitle creator. # Unfortunately, subtitle size is heavilly dependant on the size of # the video, i.e. width/height so the size varies so much that is unusable if config.MPLAYER_ASS_FONT_SCALE and mode not in ['dvd', 'default']: v_height = float(item.getattr('height')) v_width = float(item.getattr('width')) f_scale = (v_width / v_height) * config.MPLAYER_ASS_FONT_SCALE command += ['-ass-font-scale', str(f_scale)] # use software scaler? #XXX these need to be in the arg list as the scaler will add vf args if '-nosws' in command: command.remove('-nosws') elif '-framedrop' not in command: command += config.MPLAYER_SOFTWARE_SCALER.split() command = filter(len, command) command += str('%(playlist)s' % args).split() command += ['%(url)s' % args] logger.debug(' '.join(command[1:])) #if plugin.getbyname('MIXER'): #plugin.getbyname('MIXER').reset() self.paused = False rc.add_app(self) self.app = MPlayerApp(command, self) dialog.enable_overlay_display(AppTextDisplay(self.show_message)) self.play_state_dialog = None return None
def Play(self, mode, tuner_channel=None): """ """ logger.log( 9, 'MPlayer.Play(mode=%r, tuner_channel=%r)', mode, tuner_channel) # Try to see if the channel is not tunable try: channel = int(tuner_channel) except ValueError: channel = 0 vg = self.current_vg = self.fc.getVideoGroup(tuner_channel, True) if not tuner_channel: tuner_channel = self.fc.getChannel() # Convert to MPlayer TV setting strings device = 'device=%s' % vg.vdev input = 'input=%s' % vg.input_num norm = 'norm=%s' % vg.tuner_norm w, h = config.TV_VIEW_SIZE outfmt = 'outfmt=%s' % config.TV_VIEW_OUTFMT # Build the MPlayer command line args = { 'nice': config.MPLAYER_NICE, 'cmd': config.MPLAYER_CMD, 'vo': '-vo %s' % config.MPLAYER_VO_DEV, 'vo_opts': config.MPLAYER_VO_DEV_OPTS, 'vc': '', 'ao': '-ao %s' % config.MPLAYER_AO_DEV, 'ao_opts': config.MPLAYER_AO_DEV_OPTS, 'default_args': config.MPLAYER_ARGS_DEF.split(), 'mode_args': config.MPLAYER_ARGS.has_key(mode) and config.MPLAYER_ARGS[mode].split() or [], 'geometry': (config.CONF.x or config.CONF.y) and '-geometry %d:%d' % (config.CONF.x, config.CONF.y) or '', 'verbose': '', 'dvd-device': '', 'cdrom-device': '', 'alang': '', 'aid': '', 'slang': '', 'sid': '', 'playlist': '', 'field-dominance': '', 'edl': '', 'mc': '', 'delay': '', 'sub': '', 'audiofile': '', 'af': [], 'vf': [], 'tv': '', 'url': '', 'disable_osd': False, } if dialog.overlay_display_supports_dialogs: # Disable the mplayer OSD if we have a better option. args['disable_osd'] = True if mode == 'tv': if vg.group_type == 'ivtv': ivtv_dev = ivtv.IVTV(vg.vdev) ivtv_dev.init_settings() ivtv_dev.setinputbyname(vg.input_type) cur_std = ivtv_dev.getstd() import tv.v4l2 try: new_std = tv.v4l2.NORMS.get(vg.tuner_norm) if cur_std != new_std: ivtv_dev.setstd(new_std) except: logger.error('Error! Videogroup norm value "%s" not from NORMS: %s', vg.tuner_norm, tv.v4l2.NORMS.keys()) ivtv_dev.close() # Do not set the channel if negative if channel >= 0: self.fc.chanSet(tuner_channel, True) args['url'] = vg.vdev if config.MPLAYER_ARGS.has_key('ivtv'): args['mode_args'] = config.MPLAYER_ARGS['ivtv'].split() elif vg.group_type == 'webcam': self.fc.chanSet(tuner_channel, True, app='mplayer') args['url'] = '' if config.MPLAYER_ARGS.has_key('webcam'): args['mode_args'] = config.MPLAYER_ARGS['webcam'].split() elif vg.group_type == 'dvb': self.fc.chanSet(tuner_channel, True, app='mplayer') args['url'] = ('dvb://%s' % (tuner_channel,)) args['mode_args'] = config.MPLAYER_ARGS['dvb'].split() elif vg.group_type == 'tvalsa': freq_khz = self.fc.chanSet(tuner_channel, True, app='mplayer') tuner_freq = '%1.3f' % (freq_khz / 1000.0) args['tv'] = '-tv driver=%s:%s:freq=%s:%s:%s:%s:width=%s:height=%s:%s %s' % \ (config.TV_DRIVER, vg.adev, tuner_freq, device, input, norm, w, h, outfmt, config.TV_OPTS) args['url'] = 'tv://' if config.MPLAYER_ARGS.has_key('tv'): args['mode_args'] = config.MPLAYER_ARGS['tv'].split() else: # group_type == 'normal' freq_khz = self.fc.chanSet(tuner_channel, True, app='mplayer') tuner_freq = '%1.3f' % (freq_khz / 1000.0) args['tv'] = '-tv driver=%s:freq=%s:%s:%s:%s:width=%s:height=%s:%s %s' % \ (config.TV_DRIVER, tuner_freq, device, input, norm, w, h, outfmt, config.TV_OPTS) args['url'] = 'tv://' if config.MPLAYER_ARGS.has_key('tv'): args['mode_args'] = config.MPLAYER_ARGS['tv'].split() elif mode == 'vcr': args['tv'] = '-tv driver=%s:%s:%s:%s:width=%s:height=%s:%s %s' % \ (config.TV_DRIVER, device, input, norm, w, h, outfmt, config.TV_OPTS) args['url'] = 'tv://' if config.MPLAYER_ARGS.has_key('tv'): args['mode_args'] = config.MPLAYER_ARGS['tv'].split() else: logger.error('Mode "%s" is not implemented', mode) return logger.debug('mplayer args = %r', args) vo = ['%(vo)s' % args, '%(vo_opts)s' % args] vo = filter(len, vo) vo = ':'.join(vo) ao = ['%(ao)s' % args, '%(ao_opts)s' % args] ao = filter(len, ao) ao = ':'.join(ao) command = ['--prio=%(nice)s' % args] command += ['%(cmd)s' % args] command += ['-slave'] command += str('%(verbose)s' % args).split() command += str('%(geometry)s' % args).split() command += vo.split() command += str('%(vc)s' % args).split() command += ao.split() command += args['default_args'] command += args['mode_args'] command += str('%(dvd-device)s' % args).split() command += str('%(cdrom-device)s' % args).split() command += str('%(alang)s' % args).split() command += str('%(aid)s' % args).split() command += str('%(audiofile)s' % args).split() command += str('%(slang)s' % args).split() command += str('%(sid)s' % args).split() command += str('%(sub)s' % args).split() command += str('%(field-dominance)s' % args).split() command += str('%(edl)s' % args).split() command += str('%(mc)s' % args).split() command += str('%(delay)s' % args).split() if args['af']: command += ['-af', '%s' % ','.join(args['af'])] if args['vf']: command += ['-vf', '%s' % ','.join(args['vf'])] command += str('%(tv)s' % args).split() command += args['disable_osd'] and ['-osdlevel', '0'] or [] if config.OSD_SINGLE_WINDOW: command += ['-wid', str(osd.video_window.id)] osd.video_window.show() # use software scaler? if '-nosws' in command: command.remove('-nosws') elif '-framedrop' not in command: command += config.MPLAYER_SOFTWARE_SCALER.split() #if options: # command += options command = filter(len, command) #command = self.sort_filter(command) url = '%(url)s' % args command += [url] logger.debug('%r', command) self.mode = mode # XXX Mixer manipulation code. # TV is on line in # VCR is mic in # btaudio (different dsp device) will be added later mixer = plugin.getbyname('MIXER') if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer_vol = mixer.getMainVolume() mixer.setMainVolume(0) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer_vol = mixer.getPcmVolume() mixer.setPcmVolume(0) # Start up the TV task self.app = childapp.ChildApp2(command) rc.add_app(self) # Suppress annoying audio clicks time.sleep(0.4) # XXX Hm.. This is hardcoded and very unflexible. if mixer and mode == 'vcr': mixer.setMicVolume(config.MIXER_VOLUME_VCR_IN) elif mixer: mixer.setLineinVolume(config.MIXER_VOLUME_TV_IN) mixer.setIgainVolume(config.MIXER_VOLUME_TV_IN) if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer.setMainVolume(mixer_vol) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer.setPcmVolume(mixer_vol) dialog.enable_overlay_display(AppTextDisplay(self.show_message)) logger.debug('%s: started %s app', time.time(), self.mode)
def play(self, options, item): """ play video media with xine """ logger.log(9, 'play(options=%r, item=%r)', options, item) self.item = item self.options = options self.item.elapsed = 0 if config.EVENTS.has_key(item.mode): self.event_context = item.mode else: self.event_context = 'video' if self.command is None: config_file_opt = [] network_opt = [] if config.XINE_USE_FREEVO_OSD: config_file = dialog.utils.get_xine_config_file() if config_file: config_file_opt = ['--config', config_file] if config.XINE_USE_FREEVO_OSD and dialog.overlay_display_supports_dialogs: xine_cmd_line = config.XINE_COMMAND + config.XINE_ARGS_DEF if xine_cmd_line.find('--network') == -1 or xine_cmd_line.find( ' -n') == -1: network_opt = ['--network'] passwd_file = '%s/.xine/passwd' % os.environ['HOME'] if not os.path.exists(passwd_file): out = open(passwd_file, 'w') out.write('ALL:ALLOW\n') out.close() print _( '!WARNING! created a xine passwd file with ALL:ALLOW') self.command = [ '--prio=%s' % config.MPLAYER_NICE ] + \ config.XINE_COMMAND.split(' ') + \ network_opt + \ [ '--stdctl', '-V', config.XINE_VO_DEV, '-A', config.XINE_AO_DEV ] + \ config.XINE_ARGS_DEF.split(' ') + config_file_opt command = copy.copy(self.command) if item['deinterlace']: command.append('-D') if not config.XINE_HAS_NO_LIRC and '--no-lirc' in command: command.remove('--no-lirc') if config.OSD_SINGLE_WINDOW: command += ['-W', str(osd.video_window.id), '--no-mouse'] osd.video_window.show() self.max_audio = 0 self.current_audio = -1 self.max_subtitle = 0 self.current_subtitle = -1 if item.mode == 'dvd': for track in item.info['tracks']: if track.has_key('audio'): self.max_audio = max(self.max_audio, len(track['audio'])) for track in item.info['tracks']: if track.has_key('subtitles'): self.max_subtitle = max(self.max_subtitle, len(track['subtitles'])) if item.mode == 'dvd' and hasattr(item, 'filename') and item.filename and \ item.filename.endswith('.iso'): # dvd:///full/path/to/image.iso/ command.append('dvd://%s/' % item.filename) elif item.mode == 'dvd' and hasattr(item.media, 'devicename'): # dvd:///dev/dvd/2 command.append('dvd://%s/%s' % (item.media.devicename, item.url[6:])) elif item.mode == 'dvd': # no devicename? Probably a mirror image on the HD command.append(item.url) elif item.mode == 'vcd': # vcd:///dev/cdrom -- NO track support (?) command.append('vcd://%s' % item.media.devicename) elif item.mimetype == 'cue': command.append('vcd://%s' % item.filename) self.event_context = 'vcd' else: if (len(options) > 1): if (options[1] == '--playlist'): #command.append('%s %s' % (options[1],options[2])) command.append(options[1]) command.append(options[2]) else: if item['resume']: self.item.elapsed = int(item['resume']) self.tmp_playlist = self.write_playlist( item, self.item.elapsed) command.append('--playlist') command.append(self.tmp_playlist) else: command.append(item.url) self.stdout_plugins = [] self.paused = False self.item_length = -1 rc.add_app(self) self.app = XineApp(command, self) self.play_state_dialog = None dialog.enable_overlay_display(AppTextDisplay(self.ShowMessage)) return None
def Play(self, mode, tuner_channel=None): """ """ logger.log(9, 'MPlayer.Play(mode=%r, tuner_channel=%r)', mode, tuner_channel) # Try to see if the channel is not tunable try: channel = int(tuner_channel) except ValueError: channel = 0 vg = self.current_vg = self.fc.getVideoGroup(tuner_channel, True) if not tuner_channel: tuner_channel = self.fc.getChannel() # Convert to MPlayer TV setting strings device = 'device=%s' % vg.vdev input = 'input=%s' % vg.input_num norm = 'norm=%s' % vg.tuner_norm w, h = config.TV_VIEW_SIZE outfmt = 'outfmt=%s' % config.TV_VIEW_OUTFMT # Build the MPlayer command line args = { 'nice': config.MPLAYER_NICE, 'cmd': config.MPLAYER_CMD, 'vo': '-vo %s' % config.MPLAYER_VO_DEV, 'vo_opts': config.MPLAYER_VO_DEV_OPTS, 'vc': '', 'ao': '-ao %s' % config.MPLAYER_AO_DEV, 'ao_opts': config.MPLAYER_AO_DEV_OPTS, 'default_args': config.MPLAYER_ARGS_DEF.split(), 'mode_args': config.MPLAYER_ARGS.has_key(mode) and config.MPLAYER_ARGS[mode].split() or [], 'geometry': (config.CONF.x or config.CONF.y) and '-geometry %d:%d' % (config.CONF.x, config.CONF.y) or '', 'verbose': '', 'dvd-device': '', 'cdrom-device': '', 'alang': '', 'aid': '', 'slang': '', 'sid': '', 'playlist': '', 'field-dominance': '', 'edl': '', 'mc': '', 'delay': '', 'sub': '', 'audiofile': '', 'af': [], 'vf': [], 'tv': '', 'url': '', 'disable_osd': False, } if dialog.overlay_display_supports_dialogs: # Disable the mplayer OSD if we have a better option. args['disable_osd'] = True if mode == 'tv': if vg.group_type == 'ivtv': ivtv_dev = ivtv.IVTV(vg.vdev) ivtv_dev.init_settings() ivtv_dev.setinputbyname(vg.input_type) cur_std = ivtv_dev.getstd() import tv.v4l2 try: new_std = tv.v4l2.NORMS.get(vg.tuner_norm) if cur_std != new_std: ivtv_dev.setstd(new_std) except: logger.error( 'Error! Videogroup norm value "%s" not from NORMS: %s', vg.tuner_norm, tv.v4l2.NORMS.keys()) ivtv_dev.close() # Do not set the channel if negative if channel >= 0: self.fc.chanSet(tuner_channel, True) args['url'] = vg.vdev if config.MPLAYER_ARGS.has_key('ivtv'): args['mode_args'] = config.MPLAYER_ARGS['ivtv'].split() elif vg.group_type == 'webcam': self.fc.chanSet(tuner_channel, True, app='mplayer') args['url'] = '' if config.MPLAYER_ARGS.has_key('webcam'): args['mode_args'] = config.MPLAYER_ARGS['webcam'].split() elif vg.group_type == 'dvb': self.fc.chanSet(tuner_channel, True, app='mplayer') args['url'] = ('dvb://%s' % (tuner_channel, )) args['mode_args'] = config.MPLAYER_ARGS['dvb'].split() elif vg.group_type == 'tvalsa': freq_khz = self.fc.chanSet(tuner_channel, True, app='mplayer') tuner_freq = '%1.3f' % (freq_khz / 1000.0) args['tv'] = '-tv driver=%s:%s:freq=%s:%s:%s:%s:width=%s:height=%s:%s %s' % \ (config.TV_DRIVER, vg.adev, tuner_freq, device, input, norm, w, h, outfmt, config.TV_OPTS) args['url'] = 'tv://' if config.MPLAYER_ARGS.has_key('tv'): args['mode_args'] = config.MPLAYER_ARGS['tv'].split() else: # group_type == 'normal' freq_khz = self.fc.chanSet(tuner_channel, True, app='mplayer') tuner_freq = '%1.3f' % (freq_khz / 1000.0) args['tv'] = '-tv driver=%s:freq=%s:%s:%s:%s:width=%s:height=%s:%s %s' % \ (config.TV_DRIVER, tuner_freq, device, input, norm, w, h, outfmt, config.TV_OPTS) args['url'] = 'tv://' if config.MPLAYER_ARGS.has_key('tv'): args['mode_args'] = config.MPLAYER_ARGS['tv'].split() elif mode == 'vcr': args['tv'] = '-tv driver=%s:%s:%s:%s:width=%s:height=%s:%s %s' % \ (config.TV_DRIVER, device, input, norm, w, h, outfmt, config.TV_OPTS) args['url'] = 'tv://' if config.MPLAYER_ARGS.has_key('tv'): args['mode_args'] = config.MPLAYER_ARGS['tv'].split() else: logger.error('Mode "%s" is not implemented', mode) return logger.debug('mplayer args = %r', args) vo = ['%(vo)s' % args, '%(vo_opts)s' % args] vo = filter(len, vo) vo = ':'.join(vo) ao = ['%(ao)s' % args, '%(ao_opts)s' % args] ao = filter(len, ao) ao = ':'.join(ao) command = ['--prio=%(nice)s' % args] command += ['%(cmd)s' % args] command += ['-slave'] command += str('%(verbose)s' % args).split() command += str('%(geometry)s' % args).split() command += vo.split() command += str('%(vc)s' % args).split() command += ao.split() command += args['default_args'] command += args['mode_args'] command += str('%(dvd-device)s' % args).split() command += str('%(cdrom-device)s' % args).split() command += str('%(alang)s' % args).split() command += str('%(aid)s' % args).split() command += str('%(audiofile)s' % args).split() command += str('%(slang)s' % args).split() command += str('%(sid)s' % args).split() command += str('%(sub)s' % args).split() command += str('%(field-dominance)s' % args).split() command += str('%(edl)s' % args).split() command += str('%(mc)s' % args).split() command += str('%(delay)s' % args).split() if args['af']: command += ['-af', '%s' % ','.join(args['af'])] if args['vf']: command += ['-vf', '%s' % ','.join(args['vf'])] command += str('%(tv)s' % args).split() command += args['disable_osd'] and ['-osdlevel', '0'] or [] if config.OSD_SINGLE_WINDOW: command += ['-wid', str(osd.video_window.id)] osd.video_window.show() # use software scaler? if '-nosws' in command: command.remove('-nosws') elif '-framedrop' not in command: command += config.MPLAYER_SOFTWARE_SCALER.split() #if options: # command += options command = filter(len, command) #command = self.sort_filter(command) url = '%(url)s' % args command += [url] logger.debug('%r', command) self.mode = mode # XXX Mixer manipulation code. # TV is on line in # VCR is mic in # btaudio (different dsp device) will be added later mixer = plugin.getbyname('MIXER') if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer_vol = mixer.getMainVolume() mixer.setMainVolume(0) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer_vol = mixer.getPcmVolume() mixer.setPcmVolume(0) # Start up the TV task self.app = childapp.ChildApp2(command) rc.add_app(self) # Suppress annoying audio clicks time.sleep(0.4) # XXX Hm.. This is hardcoded and very unflexible. if mixer and mode == 'vcr': mixer.setMicVolume(config.MIXER_VOLUME_VCR_IN) elif mixer: mixer.setLineinVolume(config.MIXER_VOLUME_TV_IN) mixer.setIgainVolume(config.MIXER_VOLUME_TV_IN) if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer.setMainVolume(mixer_vol) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer.setPcmVolume(mixer_vol) dialog.enable_overlay_display(AppTextDisplay(self.show_message)) logger.debug('%s: started %s app', time.time(), self.mode)
def Play(self, mode, tuner_channel=None, channel_change=0): if not tuner_channel: tuner_channel = self.fc.getChannel() vg = self.current_vg = self.fc.getVideoGroup(tuner_channel, True) if not vg.group_type == 'normal': print 'Tvtime only supports normal. "%s" is not implemented' % vg.group_type return if mode == 'tv' or mode == 'vcr': w, h = config.TV_VIEW_SIZE cf_norm = vg.tuner_norm cf_input = vg.input_num cf_device = vg.vdev s_norm = cf_norm.upper() outputplugin = '' if plugin.getbyname(plugin.TV).optionD_supported: if config.CONF.display == 'x11': outputplugin = 'Xv' elif config.CONF.display == 'mga': outputplugin = 'mga' elif config.CONF.display in ('directfb', 'dfbmga'): outputplugin = 'directfb' else: outputplugin = config.CONF.display outputplugin = '-D %s' % outputplugin if mode == 'vcr': cf_input = '1' if hasattr(config, "TV_VCR_INPUT_NUM") and config.TV_VCR_INPUT_NUM: cf_input = config.TV_VCR_INPUT_NUM self.fc.chan_index = self.TunerSetChannel(tuner_channel) if hasattr(config, 'TV_PAD_CHAN_NUMBERS') and config.TV_PAD_CHAN_NUMBERS: mychan = tuner_channel else: mychan = self.fc.chan_index logger.debug('starting channel is %s', mychan) command = '%s %s -k -I %s -n %s -d %s -f %s -c %s -i %s' % \ (config.TVTIME_CMD, outputplugin, w, s_norm, cf_device, 'freevo', mychan, cf_input) if osd.get_fullscreen() == 1: command += ' -m' else: command += ' -M' else: print 'Mode "%s" is not implemented' % mode # BUG ui.message() return self.mode = mode mixer = plugin.getbyname('MIXER') # BUG Mixer manipulation code. # TV is on line in # VCR is mic in # btaudio (different dsp device) will be added later if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer_vol = mixer.getMainVolume() mixer.setMainVolume(0) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer_vol = mixer.getPcmVolume() mixer.setPcmVolume(0) # Start up the TV task self.app = TVTimeApp(command) rc.add_app(self) # Suppress annoying audio clicks time.sleep(0.4) # BUG Hm.. This is hardcoded and very unflexible. if mixer and mode == 'vcr': mixer.setMicVolume(config.MIXER_VOLUME_VCR_IN) elif mixer: mixer.setLineinVolume(config.MIXER_VOLUME_TV_IN) mixer.setIgainVolume(config.MIXER_VOLUME_TV_IN) if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer.setMainVolume(mixer_vol) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer.setPcmVolume(mixer_vol) logger.debug('%s: started %s app', time.time(), self.mode)
def play(self, options, item): """ play a videoitem with mplayer """ logger.log(9, 'options=%r', options) for k, v in item.__dict__.items(): logger.log(9, 'item[%s]=%r', k, v) mode = item.mode url = item.url self.options = options self.item = item self.item_info = None self.item_length = -1 self.item.elapsed = 0 if mode == 'file': url = item.url[6:] self.item_info = mmpython.parse(url) if hasattr(self.item_info, 'get_length'): self.item_length = self.item_info.get_endpos() self.dynamic_seek_control = True if url.startswith('dvd://') and url[-1] == '/': url += '1' if url == 'vcd://': c_len = 0 for i in range(len(item.info.tracks)): if item.info.tracks[i].length > c_len: c_len = item.info.tracks[i].length url = item.url + str(i + 1) url = Unicode(url) try: logger.debug('MPlayer.play(): mode=%s, url=%s', mode, url) except UnicodeError: logger.debug('MPlayer.play(): [non-ASCII data]') if mode == 'file' and not os.path.isfile(url): # This event allows the videoitem which contains subitems to # try to play the next subitem return '%s\nnot found' % os.path.basename(url) set_vcodec = False if item['xvmc'] and item['type'][:6] in ['MPEG-1', 'MPEG-2', 'MPEG-T']: set_vcodec = True mode = item.mimetype if not config.MPLAYER_ARGS.has_key(mode): logger.info('MPLAYER_ARGS not defined for %r, using default', mode) mode = 'default' logger.debug('mode=%s args=%s', mode, config.MPLAYER_ARGS[mode]) # Build the MPlayer command args = { 'nice': config.MPLAYER_NICE, 'cmd': config.MPLAYER_CMD, 'vo': '-vo %s' % config.MPLAYER_VO_DEV, 'vo_opts': config.MPLAYER_VO_DEV_OPTS, 'vc': '', 'ao': '-ao %s' % config.MPLAYER_AO_DEV, 'ao_opts': config.MPLAYER_AO_DEV_OPTS, 'default_args': config.MPLAYER_ARGS_DEF, 'mode_args': config.MPLAYER_ARGS[mode], 'fxd_args': ' '.join(options), 'geometry': '', 'verbose': '', 'dvd-device': '', 'cdrom-device': '', 'alang': '', 'aid': '', 'slang': '', 'sid': '', 'playlist': '', 'field-dominance': '', 'edl': '', 'mc': '', 'delay': '', 'sub': '', 'audiofile': '', 'af': [], 'vf': [], 'url': url, 'disable_osd': False, 'start_position': [], } if item['resume']: t = int(item['resume']) info = mmpython.parse(item.filename) if hasattr(info, 'seek') and t: args['start_position'] = ['-sb', str(info.seek(t))] else: args['start_position'] = ['-ss', str(t)] if config.CONF.x or config.CONF.y: args['geometry'] = '-geometry %d:%d' % (config.CONF.x, config.CONF.y) if config.DEBUG_CHILDAPP: args['verbose'] = '-v' if mode == 'dvd': if config.DVD_LANG_PREF: # There are some bad mastered DVDs out there. E.g. the specials on # the German Babylon 5 Season 2 disc claim they have more than one # audio track, even more then on en. But only the second en works, # mplayer needs to be started without -alang to find the track if hasattr( item, 'mplayer_audio_broken') and item.mplayer_audio_broken: print '*** dvd audio broken, try without alang ***' else: args['alang'] = '-alang %s' % config.DVD_LANG_PREF if config.DVD_SUBTITLE_PREF: # Only use if defined since it will always turn on subtitles when defined args['slang'] = '-slang %s' % config.DVD_SUBTITLE_PREF if mode == 'dvd': # dvd on harddisc args['dvd-device'] = '%s' % item.filename args['url'] = url[:6] + url[url.rfind('/') + 1:] elif mode != 'file' and hasattr(item.media, 'devicename'): args['dvd-device'] = '%s' % item.media.devicename if item.media and hasattr(item.media, 'devicename'): args['cdrom-device'] = '%s' % item.media.devicename if item.selected_subtitle == -1: args['sid'] = '-noautosub' elif item.selected_subtitle is not None: if mode == 'file': if os.path.isfile(os.path.splitext(item.filename)[0] + '.idx'): args['sid'] = '-vobsubid %s' % str(item.selected_subtitle) else: args['sid'] = '-sid %s' % str(item.selected_subtitle) else: args['sid'] = '-sid %s' % str(item.selected_subtitle) if item.selected_audio is not None: args['aid'] = '-aid %s' % str(item.selected_audio) # This comes from the bilingual language selection menu if hasattr(item, 'selected_language') and item.selected_language: if item.selected_language == 'left': args['af'].append('pan=2:1:1:0:0') elif item.selected_language == 'right': args['af'].append('pan=2:0:0:1:1') if not set_vcodec: if item['deinterlace'] and config.MPLAYER_VF_INTERLACED: args['vf'].append(config.MPLAYER_VF_INTERLACED) elif config.MPLAYER_VF_PROGRESSIVE: args['vf'].append(config.MPLAYER_VF_PROGRESSIVE) if config.VIDEO_FIELD_DOMINANCE is not None: args['field-dominance'] = '-field-dominance %d' % int( item['field-dominance']) if os.path.isfile(os.path.splitext(item.filename)[0] + '.edl'): args['edl'] = '-edl %s' % str( os.path.splitext(item.filename)[0] + '.edl') if dialog.overlay_display_supports_dialogs: # Disable the mplayer OSD if we have a better option. args['disable_osd'] = True # Mplayer command and standard arguments if set_vcodec: if item['deinterlace']: bobdeint = 'bobdeint' else: bobdeint = 'nobobdeint' args['vo'] = '-vo xvmc:%s' % bobdeint args['vc'] = '-vc ffmpeg12mc' if hasattr(item, 'is_playlist') and item.is_playlist: args['playlist'] = '-playlist' if args['fxd_args'].find('-playlist') > 0: args['fxd_args'] = args['fxd_args'].replace('-playlist', '') args['playlist'] = '-playlist' # correct avi delay based on kaa.metadata settings if config.MPLAYER_SET_AUDIO_DELAY and item.info.has_key( 'delay') and item.info['delay'] > 0: args['mc'] = '-mc %s' % str(int(item.info['delay']) + 1) args['delay'] = '-delay -%s' % str(item.info['delay']) # mplayer A/V is screwed up when setrting screen refresh rate to the same value as the movies FPS # this does happen almost exclusively at 23.976 FPS. Let's try to fix it. if config.MPLAYER_RATE_SET_FROM_VIDEO and item.getattr('fps') in [ '23.976', '24.000' ]: args['mc'] = '-mc %s' % str(int(config.MPLAYER_AUDIO_DELAY) + 1) args['delay'] = '-delay %s' % str(config.MPLAYER_AUDIO_DELAY) # autocrop if config.MPLAYER_AUTOCROP and not item.network_play and args[ 'fxd_args'].find('crop=') == -1: logger.debug('starting autocrop') (x1, y1, x2, y2) = (1000, 1000, 0, 0) crop_points = config.MPLAYER_AUTOCROP_START if not isinstance(crop_points, list): crop_points = [crop_points] for crop_point in crop_points: (x1, y1, x2, y2) = self.get_crop(crop_point, x1, y1, x2, y2) if x1 < 1000 and x2 < 1000: args['vf'].append('crop=%s:%s:%s:%s' % (x2 - x1, y2 - y1, x1, y1)) logger.debug('crop=%s:%s:%s:%s', x2 - x1, y2 - y1, x1, y1) if item.subtitle_file: d, f = util.resolve_media_mountdir(item.subtitle_file) util.mount(d) args['sub'] = '-sub %s' % f if item.audio_file: d, f = util.resolve_media_mountdir(item.audio_file) util.mount(d) args['audiofile'] = '-audiofile %s' % f self.plugins = plugin.get('mplayer_video') for p in self.plugins: command = p.play(command, self) vo = ['%(vo)s' % args, '%(vo_opts)s' % args] vo = filter(len, vo) vo = ':'.join(vo) ao = ['%(ao)s' % args, '%(ao_opts)s' % args] ao = filter(len, ao) ao = ':'.join(ao) # process the mplayer options extracting video and audio filters args['default_args'], args = self.find_filters(args['default_args'], args) args['mode_args'], args = self.find_filters(args['mode_args'], args) args['fxd_args'], args = self.find_filters(args['fxd_args'], args) command = ['--prio=%(nice)s' % args] command += ['%(cmd)s' % args] command += ['-slave'] command += str('%(verbose)s' % args).split() command += str('%(geometry)s' % args).split() command += vo.split() command += str('%(vc)s' % args).split() command += ao.split() command += args['dvd-device'] and [ '-dvd-device', '%(dvd-device)s' % args ] or [] command += args['cdrom-device'] and [ '-cdrom-device', '%(cdrom-device)s' % args ] or [] command += str('%(alang)s' % args).split() command += str('%(aid)s' % args).split() command += str('%(audiofile)s' % args).split() command += str('%(slang)s' % args).split() command += str('%(sid)s' % args).split() command += str('%(sub)s' % args).split() command += str('%(field-dominance)s' % args).split() command += str('%(edl)s' % args).split() command += str('%(mc)s' % args).split() command += str('%(delay)s' % args).split() command += args['default_args'].split() command += args['mode_args'].split() command += args['fxd_args'].split() command += args['af'] and ['-af', '%s' % ','.join(args['af'])] or [] command += args['vf'] and ['-vf', '%s' % ','.join(args['vf'])] or [] command += args['disable_osd'] and ['-osdlevel', '0'] or [] command += args['start_position'] if config.OSD_SINGLE_WINDOW: command += ['-wid', str(osd.video_window.id)] # This ensures constant subtitle size, disable if you do not like this # and want to have the size as designed by the sutitle creator. # Unfortunately, subtitle size is heavilly dependant on the size of # the video, i.e. width/height so the size varies so much that is unusable if config.MPLAYER_ASS_FONT_SCALE and mode not in ['dvd', 'default']: try: v_height = float(item.getattr('height')) v_width = float(item.getattr('width')) f_scale = (v_width / v_height) * config.MPLAYER_ASS_FONT_SCALE command += ['-ass-font-scale', str(f_scale)] except: pass # use software scaler? #XXX these need to be in the arg list as the scaler will add vf args if '-nosws' in command: command.remove('-nosws') elif '-framedrop' not in command: command += config.MPLAYER_SOFTWARE_SCALER.split() command = filter(len, command) command += str('%(playlist)s' % args).split() command += ['%(url)s' % args] logger.debug(' '.join(command[1:])) #if plugin.getbyname('MIXER'): #plugin.getbyname('MIXER').reset() self.paused = False rc.add_app(self) self.app = MPlayerApp(command, self) dialog.enable_overlay_display(AppTextDisplay(self.show_message)) self.play_state_dialog = None return None