def __init__(self, session, request): WebScreen.__init__(self, session, request) from WebComponents.Sources.About import About from WebComponents.Sources.Frontend import Frontend from WebComponents.Sources.Hdd import Hdd from WebComponents.Sources.Network import Network from Components.config import config from Components.About import about from Components.Sources.StaticText import StaticText try: from Tools.StbHardware import getFPVersion except: from Tools.DreamboxHardware import getFPVersion from Tools.HardwareInfo import HardwareInfo hw = HardwareInfo() self["About"] = About(session) self["Network"] = Network() self["Hdd"] = Hdd() self["Frontends"] = Frontend() try: from enigma import getImageVersionString, getBuildVersionString, getEnigmaVersionString self["EnigmaVersion"] = StaticText(getEnigmaVersionString()) self["ImageVersion"] = StaticText(getVersionString() + '.' + getBuildVersionString()) except: self["EnigmaVersion"] = StaticText(about.getEnigmaVersionString()) self["ImageVersion"] = StaticText(about.getVersionString()) self["WebIfVersion"] = StaticText(config.plugins.Webinterface.version.value) self["FpVersion"] = StaticText(str(getFPVersion())) self["DeviceName"] = StaticText(hw.get_device_name())
def __init__(self, session, cancelable = True, close_on_finish = False): self.skin = NFIFlash.skin Screen.__init__(self, session) self["job_progressbar"] = Progress() self["job_progresslabel"] = StaticText("") self["finished"] = Boolean() self["infolabel"] = StaticText("") self["statusbar"] = StaticText(_("Please select .NFI flash image file from medium")) self["listlabel"] = StaticText(_("select .NFI flash file")+":") self["key_green"] = StaticText() self["key_yellow"] = StaticText() self["key_blue"] = StaticText() self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions"], { "green": self.ok, "yellow": self.reboot, "ok": self.ok, "left": self.left, "right": self.right, "up": self.up, "down": self.down }, -1) currDir = "/media/usb/" self.filelist = FileList(currDir, matchingPattern = "^.*\.(nfi|NFI)") self["filelist"] = self.filelist self.nfifile = "" self.md5sum = "" self.job = None self.box = HardwareInfo().get_device_name()
def __init__(self): self.model = HardwareInfo().get_device_model() # cfg files has modelname rcname entries. # modelname is boxname optionally followed by .rctype for line in open((resolveFilename(SCOPE_SKIN, "rc_models/rc_models.cfg")), "r"): if line.startswith(self.model): m, r = line.strip().split() self.RcModels[m] = r
def __init__(self): self.model = HardwareInfo().get_device_model() # cfg files has modelname rcname entries. # modelname is boxname optionally followed by .rctype for line in open((resolveFilename(SCOPE_SKIN, 'rc_models/rc_models.cfg')), 'r'): if line[:len(self.model)] == self.model: m, r = line.strip().split() self.RcModels[m] = r # on spark has only one rc break
def getDeviceName(self): device_name = "unknown" try: file = open("/proc/stb/info/vumodel", "r") device_name = file.readline().strip() file.close() except IOError: from Tools.HardwareInfo import HardwareInfo device_name = HardwareInfo.get_device_name() return device_name
class RcModel: RcModels = {} def __init__(self): self.model = HardwareInfo().get_device_model() # cfg files has modelname rcname entries. # modelname is boxname optionally followed by .rctype if "technomate" in open("/etc/.brandtype","r").readline(): for line in open((resolveFilename(SCOPE_SKIN, 'rc_models/rc_models_te.cfg')), 'r'): if line.startswith(self.model): m, r = line.strip().split() self.RcModels[m] = r elif "edision" in open("/etc/.brandtype","r").readline(): for line in open((resolveFilename(SCOPE_SKIN, 'rc_models/rc_models_ed.cfg')), 'r'): if line.startswith(self.model): m, r = line.strip().split() self.RcModels[m] = r else: for line in open((resolveFilename(SCOPE_SKIN, 'rc_models/rc_models.cfg')), 'r'): if line.startswith(self.model): m, r = line.strip().split() self.RcModels[m] = r def rcIsDefault(self): # Default RC can only happen with DMM type remote controls... return self.model.startswith('dm') def getRcFile(self, ext): # check for rc/type every time so rctype changes will be noticed if os.path.exists('/proc/stb/ir/rc/type'): rc = open('/proc/stb/ir/rc/type').read().strip() modeltype = '%s.%s' % (self.model, rc) else: modeltype = None if modeltype is not None and modeltype in self.RcModels.keys(): remote = self.RcModels[modeltype] elif self.model in self.RcModels.keys(): remote = self.RcModels[self.model] else: remote = 'dmm' # default. Assume files for dmm exists f = resolveFilename(SCOPE_SKIN, 'rc_models/' + remote + '.' + ext) if not os.path.exists(f): f = resolveFilename(SCOPE_SKIN, 'rc_models/dmm.' + ext) return f def getRcImg(self): return self.getRcFile('png') def getRcPositions(self): return self.getRcFile('xml')
def __init__(self): self.model = HardwareInfo().get_device_model() # cfg files has modelname rcname entries. # modelname is boxname optionally followed by .rctype if "technomate" in open("/etc/.brandtype","r").readline(): for line in open((resolveFilename(SCOPE_SKIN, 'rc_models/rc_models_te.cfg')), 'r'): if line.startswith(self.model): m, r = line.strip().split() self.RcModels[m] = r elif "edision" in open("/etc/.brandtype","r").readline(): for line in open((resolveFilename(SCOPE_SKIN, 'rc_models/rc_models_ed.cfg')), 'r'): if line.startswith(self.model): m, r = line.strip().split() self.RcModels[m] = r else: for line in open((resolveFilename(SCOPE_SKIN, 'rc_models/rc_models.cfg')), 'r'): if line.startswith(self.model): m, r = line.strip().split() self.RcModels[m] = r
class RcModel: RcModels = {} def __init__(self): self.model = HardwareInfo().get_device_model() # cfg files has modelname rcname entries. # modelname is boxname optionally followed by .rctype for line in open((resolveFilename(SCOPE_SKIN, "rc_models/rc_models.cfg")), "r"): if line.startswith(self.model): m, r = line.strip().split() self.RcModels[m] = r def rcIsDefault(self): # Default RC can only happen with DMM type remote controls... return self.model.startswith("dm") def getRcFile(self, ext): # check for rc/type every time so rctype changes will be noticed if os.path.exists("/proc/stb/ir/rc/type"): rc = open("/proc/stb/ir/rc/type").read().strip() modeltype = "%s.%s" % (self.model, rc) else: modeltype = None if modeltype is not None and modeltype in self.RcModels.keys(): remote = self.RcModels[modeltype] elif self.model in self.RcModels.keys(): remote = self.RcModels[self.model] else: remote = "dmm" # default. Assume files for dmm exists f = resolveFilename(SCOPE_SKIN, "rc_models/" + remote + "." + ext) if not os.path.exists(f): f = resolveFilename(SCOPE_SKIN, "rc_models/dmm." + ext) return f def getRcImg(self): return self.getRcFile("png") def getRcPositions(self): return self.getRcFile("xml")
def __init__(self): self.iService = None self.iServiceReference = None self.iAudioDelay = None self.channelAudio = AC3 self.whichAudio = AC3 self.bIsRecording = False # Current audio- delay self.systemDelay = {} self.getAudioInformation() self.activateTimer = eTimer() self.activateTimer.callback.append(self.activateDelay) self.activateWait = config.plugins.AC3LipSync.activationDelay.getValue() # Current value for movie start behaviour self.movieStart = config.usage.on_movie_start.getValue() # find out box type self.oHWInfo = HardwareInfo() self.bHasToRestartService = self.oHWInfo.get_device_name() == "dm7025"
def VideoChangeDetect(self): global resolutionlabel config_port = config.av.videoport.value config_mode = str(config.av.videomode[config_port].value).replace( '\n', '') config_res = str(config.av.videomode[config_port].value[:-1]).replace( '\n', '') config_pol = str(config.av.videomode[config_port].value[-1:]).replace( '\n', '') config_rate = str(config.av.videorate[config_mode].value).replace( 'Hz', '').replace('\n', '') f = open("/proc/stb/video/videomode") current_mode = f.read()[:-1].replace('\n', '') f.close() if current_mode.upper() in ('PAL', 'NTSC'): current_mode = current_mode.upper() current_pol = '' if 'i' in current_mode: current_pol = 'i' elif 'p' in current_mode: current_pol = 'p' current_res = current_pol and current_mode.split( current_pol)[0].replace('\n', '') or "" current_rate = current_pol and current_mode.split( current_pol)[0].replace( '\n', '') and current_mode.split(current_pol)[1].replace( '\n', '') or "" video_height = None video_width = None video_pol = None video_rate = None if path.exists("/proc/stb/vmpeg/0/yres"): f = open("/proc/stb/vmpeg/0/yres", "r") try: video_height = int(f.read(), 16) except: pass f.close() if path.exists("/proc/stb/vmpeg/0/xres"): f = open("/proc/stb/vmpeg/0/xres", "r") try: video_width = int(f.read(), 16) except: pass f.close() if path.exists("/proc/stb/vmpeg/0/progressive"): f = open("/proc/stb/vmpeg/0/progressive", "r") try: video_pol = "p" if int(f.read(), 16) else "i" except: pass f.close() if path.exists("/proc/stb/vmpeg/0/framerate"): f = open("/proc/stb/vmpeg/0/framerate", "r") try: video_rate = int(f.read()) except: pass f.close() if not video_height or not video_width or not video_pol or not video_rate: service = self.session.nav.getCurrentService() if service is not None: info = service.info() else: info = None if info: video_height = int( info.getInfo(iServiceInformation.sVideoHeight)) video_width = int(info.getInfo( iServiceInformation.sVideoWidth)) video_pol = ("i", "p")[info.getInfo( iServiceInformation.sProgressive)] video_rate = int(info.getInfo(iServiceInformation.sFrameRate)) if video_height and video_width and video_pol and video_rate: resolutionlabel["content"].setText( _("Video content: %ix%i%s %iHz") % (video_width, video_height, video_pol, (video_rate + 500) / 1000)) if (700 < video_width <= 720 ) and video_height <= 480 and video_rate in (23976, 24000, 29970, 59940): new_res = "480" elif (700 < video_width <= 720 ) and video_height <= 576 and video_rate in (25000, 50000): new_res = "576" elif (video_width == 1280) and video_height <= 720: new_res = "720" else: new_res = config_res if video_rate != -1: if video_rate == 25000 and video_pol == 'i': new_rate = 50000 elif video_rate == 59940 or ( video_rate == 29970 and video_pol == 'i') or (video_rate == 29970 and video_pol == 'p' and config.av.autores.value == 'disabled'): new_rate = 60000 elif video_rate == 23976: new_rate = 24000 elif video_rate == 29970: new_rate = 30000 else: new_rate = video_rate new_rate = str((new_rate + 500) / 1000) else: new_rate = config_rate if video_pol != -1: new_pol = str(video_pol) else: new_pol = config_pol write_mode = None new_mode = None if config_mode in ('PAL', 'NTSC'): write_mode = config_mode elif config.av.autores.value == 'all' or ( config.av.autores.value == 'hd' and int(new_res) >= 720): if (config.av.autores_deinterlace.value and HardwareInfo().is_nextgen()) or ( config.av.autores_deinterlace.value and not HardwareInfo().is_nextgen() and int(new_res) <= 720): new_pol = new_pol.replace('i', 'p') if new_res + new_pol + new_rate in iAVSwitch.modes_available: new_mode = new_res + new_pol + new_rate if new_mode == '480p24' or new_mode == '576p24': new_mode = config.av.autores_480p24.value if new_mode == '720p24': new_mode = config.av.autores_720p24.value if new_mode == '1080p24': new_mode = config.av.autores_1080p24.value if new_mode == '1080p25': new_mode = config.av.autores_1080p25.value if new_mode == '1080p30': new_mode = config.av.autores_1080p30.value elif new_res + new_pol in iAVSwitch.modes_available: new_mode = new_res + new_pol else: new_mode = config_mode + new_rate write_mode = new_mode elif config.av.autores.value == 'hd' and int(new_res) <= 576: if (config.av.autores_deinterlace.value and HardwareInfo().is_nextgen()) or ( config.av.autores_deinterlace.value and not HardwareInfo().is_nextgen() and not config.av.autores_sd.value == '1080i'): new_mode = config.av.autores_sd.value.replace( 'i', 'p') + new_rate else: if new_pol in 'p': new_mode = config.av.autores_sd.value.replace( 'i', 'p') + new_rate else: new_mode = config.av.autores_sd.value + new_rate if new_mode == '720p24': new_mode = config.av.autores_720p24.value if new_mode == '1080p24': new_mode = config.av.autores_1080p24.value if new_mode == '1080p25': new_mode = config.av.autores_1080p25.value if new_mode == '1080p30': new_mode = config.av.autores_1080p30.value write_mode = new_mode else: if path.exists('/proc/stb/video/videomode_%shz' % new_rate) and config_rate == 'multi': f = open("/proc/stb/video/videomode_%shz" % new_rate, "r") multi_videomode = f.read().replace('\n', '') f.close() if multi_videomode and (current_mode != multi_videomode): write_mode = multi_videomode else: write_mode = config_mode + new_rate if write_mode and current_mode != write_mode: resolutionlabel["restxt"].setText( _("Video mode: %s") % write_mode) if config.av.autores.value != "disabled" and config.av.autores_label_timeout.value != '0': resolutionlabel.show() print "[VideoMode] setMode - port: %s, mode: %s" % ( config_port, write_mode) f = open("/proc/stb/video/videomode", "w") f.write(write_mode) f.close() iAVSwitch.setAspect(config.av.aspect) iAVSwitch.setWss(config.av.wss) iAVSwitch.setPolicy43(config.av.policy_43) iAVSwitch.setPolicy169(config.av.policy_169) self.delay = False self.detecttimer.stop()
def InitUsageConfig(): config.usage = ConfigSubsection() config.usage.showdish = ConfigYesNo(default=True) config.usage.multibouquet = ConfigYesNo(default=True) config.usage.alternative_number_mode = ConfigYesNo(default=False) def alternativeNumberModeChange(configElement): eDVBDB.getInstance().setNumberingMode(configElement.value) refreshServiceList() config.usage.alternative_number_mode.addNotifier( alternativeNumberModeChange) config.usage.hide_number_markers = ConfigYesNo(default=True) config.usage.hide_number_markers.addNotifier(refreshServiceList) config.usage.servicetype_icon_mode = ConfigSelection( default="0", choices=[("0", _("None")), ("1", _("Left from servicename")), ("2", _("Right from servicename"))]) config.usage.servicetype_icon_mode.addNotifier(refreshServiceList) config.usage.crypto_icon_mode = ConfigSelection( default="0", choices=[("0", _("None")), ("1", _("Left from servicename")), ("2", _("Right from servicename"))]) config.usage.crypto_icon_mode.addNotifier(refreshServiceList) config.usage.record_indicator_mode = ConfigSelection( default="0", choices=[("0", _("None")), ("1", _("Left from servicename")), ("2", _("Right from servicename")), ("3", _("Red colored"))]) config.usage.record_indicator_mode.addNotifier(refreshServiceList) choicelist = [("-1", _("Devide")), ("0", _("Disable"))] for i in range(100, 1300, 100): choicelist.append( ("%d" % i, ngettext("%d pixel wide", "%d pixels wide", i) % i)) config.usage.servicelist_column = ConfigSelection(default="0", choices=choicelist) config.usage.servicelist_column.addNotifier(refreshServiceList) config.usage.service_icon_enable = ConfigYesNo(default=False) config.usage.service_icon_enable.addNotifier(refreshServiceList) config.usage.servicelist_cursor_behavior = ConfigSelection( default="standard", choices=[("standard", _("Standard")), ("keep", _("Keep service")), ("reverseB", _("Reverse bouquet buttons")), ("keep reverseB", _("Keep service") + " + " + _("Reverse bouquet buttons"))]) config.usage.multiepg_ask_bouquet = ConfigYesNo(default=False) config.usage.quickzap_bouquet_change = ConfigYesNo(default=False) config.usage.e1like_radio_mode = ConfigYesNo(default=True) choicelist = [("0", _("No timeout"))] for i in range(1, 12): choicelist.append( ("%d" % i, ngettext("%d second", "%d seconds", i) % i)) config.usage.infobar_timeout = ConfigSelection(default="5", choices=choicelist) config.usage.show_infobar_on_zap = ConfigYesNo(default=True) config.usage.show_infobar_on_skip = ConfigYesNo(default=True) config.usage.show_infobar_on_event_change = ConfigYesNo(default=False) # [ IQON : require by technomate : by wslee #config.usage.show_second_infobar = ConfigSelection(default = None, choices = [(None, _("None"))] + choicelist + [("EPG",_("EPG"))]) config.usage.show_second_infobar = ConfigSelection( default="5", choices=[(None, _("None"))] + choicelist + [("EPG", _("EPG"))]) # IQON : by wslee ] config.usage.infobar_frontend_source = ConfigSelection( default="tuner", choices=[("settings", _("Settings")), ("tuner", _("Tuner"))]) config.usage.oldstyle_zap_controls = ConfigYesNo(default=False) config.usage.oldstyle_channel_select_controls = ConfigYesNo(default=False) # [ IQON : default use ch button : by knuth config.usage.zap_with_ch_buttons = ConfigYesNo(default=True) config.usage.show_dvdplayer = ConfigYesNo(default=True) # IQON : by knuth ] config.usage.ok_is_channelselection = ConfigYesNo(default=False) config.usage.show_spinner = ConfigYesNo(default=True) config.usage.enable_tt_caching = ConfigYesNo(default=True) choicelist = [] for i in (10, 30): choicelist.append( ("%d" % i, ngettext("%d second", "%d seconds", i) % i)) for i in (60, 120, 300, 600, 1200, 1800): m = i / 60 choicelist.append( ("%d" % i, ngettext("%d minute", "%d minutes", m) % m)) for i in (3600, 7200, 14400): h = i / 3600 choicelist.append(("%d" % i, ngettext("%d hour", "%d hours", h) % h)) config.usage.hdd_standby = ConfigSelection( default="300", choices=[("0", _("No standby"))] + choicelist) config.usage.output_12V = ConfigSelection(default="do not change", choices=[("do not change", _("Do not change")), ("off", _("Off")), ("on", _("On"))]) config.usage.pip_zero_button = ConfigSelection( default="standard", choices=[("standard", _("Standard")), ("swap", _("Swap PiP and main picture")), ("swapstop", _("Move PiP to main picture")), ("stop", _("Stop PiP"))]) config.usage.pip_hideOnExit = ConfigSelection(default="without popup", choices=[("no", _("No")), ("popup", _("With popup")), ("without popup", _("Without popup")) ]) choicelist = [("-1", _("Disabled")), ("0", _("No timeout"))] for i in [60, 300, 600, 900, 1800, 2700, 3600]: m = i / 60 choicelist.append( ("%d" % i, ngettext("%d minute", "%d minutes", m) % m)) config.usage.pip_last_service_timeout = ConfigSelection(default="0", choices=choicelist) config.usage.default_path = ConfigText(default=resolveFilename(SCOPE_HDD)) config.usage.timer_path = ConfigText(default="<default>") config.usage.instantrec_path = ConfigText(default="<default>") from Tools.HardwareInfo import HardwareInfo try: if HardwareInfo().get_device_name() in ("tmnanose", "force2solid", "optimussosplus", "force2", "force2plus", "tmnanosecombo", "fusionhd"): config.usage.timeshift_path = ConfigText(default="/media/usb/") config.usage.allowed_timeshift_paths = ConfigLocations( default=["/media/usb/"]) else: config.usage.timeshift_path = ConfigText(default="/media/hdd/") config.usage.allowed_timeshift_paths = ConfigLocations( default=["/media/hdd/"]) except: pass config.usage.movielist_trashcan = ConfigYesNo(default=True) config.usage.movielist_trashcan_days = ConfigNumber(default=8) config.usage.movielist_trashcan_reserve = ConfigNumber(default=40) config.usage.on_movie_start = ConfigSelection( default="resume", choices=[("ask", _("Ask user")), ("resume", _("Resume from last position")), ("beginning", _("Start from the beginning"))]) config.usage.on_movie_stop = ConfigSelection( default="movielist", choices=[("ask", _("Ask user")), ("movielist", _("Return to movie list")), ("quit", _("Return to previous service"))]) config.usage.on_movie_eof = ConfigSelection( default="movielist", choices=[("ask", _("Ask user")), ("movielist", _("Return to movie list")), ("quit", _("Return to previous service")), ("pause", _("Pause movie at end")), ("playlist", _("Play next (return to movie list)")), ("playlistquit", _("Play next (return to previous service)")), ("loop", _("Continues play (loop)")), ("repeatcurrent", _("Repeat"))]) config.usage.next_movie_msg = ConfigYesNo(default=True) config.usage.last_movie_played = ConfigText() config.usage.leave_movieplayer_onExit = ConfigSelection( default="popup", choices=[("no", _("No")), ("popup", _("With popup")), ("without popup", _("Without popup"))]) config.usage.setup_level = ConfigSelection(default="expert", choices=[ ("simple", _("Simple")), ("intermediate", _("Intermediate")), ("expert", _("Expert")) ]) config.usage.startup_to_standby = ConfigYesNo(default=False) config.usage.on_long_powerpress = ConfigSelection( default="show_menu", choices=[("show_menu", _("Show shutdown menu")), ("shutdown", _("Immediate shutdown")), ("standby", _("Standby"))]) config.usage.on_short_powerpress = ConfigSelection( default="standby", choices=[("show_menu", _("Show shutdown menu")), ("shutdown", _("Immediate shutdown")), ("standby", _("Standby"))]) choicelist = [("0", _("Do nothing"))] for i in range(3600, 21601, 3600): h = abs(i / 3600) h = ngettext("%d hour", "%d hours", h) % h choicelist.append(("%d" % i, _("Standby in ") + h)) config.usage.inactivity_timer = ConfigSelection(default="0", choices=choicelist) config.usage.inactivity_timer_blocktime = ConfigYesNo(default=True) config.usage.inactivity_timer_blocktime_begin = ConfigClock( default=time.mktime((0, 0, 0, 6, 0, 0, 0, 0, 0))) config.usage.inactivity_timer_blocktime_end = ConfigClock( default=time.mktime((0, 0, 0, 23, 0, 0, 0, 0, 0))) choicelist = [("0", _("Disabled")), ("event_standby", _("Standby after current event"))] for i in range(900, 7201, 900): m = abs(i / 60) m = ngettext("%d minute", "%d minutes", m) % m choicelist.append(("%d" % i, _("Standby in ") + m)) config.usage.sleep_timer = ConfigSelection(default="0", choices=choicelist) choicelist = [("0", _("Disabled"))] for i in [60, 300, 600] + range(900, 7201, 900): m = abs(i / 60) m = ngettext("%d minute", "%d minutes", m) % m choicelist.append(("%d" % i, _("after ") + m)) config.usage.standby_to_shutdown_timer = ConfigSelection( default="0", choices=choicelist) config.usage.standby_to_shutdown_timer_blocktime = ConfigYesNo( default=True) config.usage.standby_to_shutdown_timer_blocktime_begin = ConfigClock( default=time.mktime((0, 0, 0, 6, 0, 0, 0, 0, 0))) config.usage.standby_to_shutdown_timer_blocktime_end = ConfigClock( default=time.mktime((0, 0, 0, 23, 0, 0, 0, 0, 0))) choicelist = [("0", _("Disabled"))] for i in (5, 30, 60, 300, 600, 900, 1200, 1800, 2700, 3600): if i < 60: m = ngettext("%d second", "%d seconds", i) % i else: m = abs(i / 60) m = ngettext("%d minute", "%d minutes", m) % m choicelist.append(("%d" % i, m)) config.usage.screen_saver = ConfigSelection(default="60", choices=choicelist) config.usage.check_timeshift = ConfigYesNo(default=True) choicelist = [("0", _("Disabled"))] for i in (2, 3, 4, 5, 10, 20, 30): choicelist.append( ("%d" % i, ngettext("%d second", "%d seconds", i) % i)) for i in (60, 120, 300): m = i / 60 choicelist.append( ("%d" % i, ngettext("%d minute", "%d minutes", m) % m)) config.usage.timeshift_start_delay = ConfigSelection(default="0", choices=choicelist) config.usage.alternatives_priority = ConfigSelection( default="0", choices=[("0", "DVB-S/-C/-T"), ("1", "DVB-S/-T/-C"), ("2", "DVB-C/-S/-T"), ("3", "DVB-C/-T/-S"), ("4", "DVB-T/-C/-S"), ("5", "DVB-T/-S/-C")]) nims = [("-1", _("auto"))] for x in nimmanager.nim_slots: nims.append((str(x.slot), x.getSlotName())) config.usage.frontend_priority = ConfigSelection(default="-1", choices=list(nims)) nims.insert(0, ("-2", _("Disabled"))) config.usage.recording_frontend_priority = ConfigSelection(default="-2", choices=nims) config.misc.disable_background_scan = ConfigYesNo(default=False) config.usage.show_event_progress_in_servicelist = ConfigSelection( default='barright', choices=[('barleft', _("Progress bar left")), ('barright', _("Progress bar right")), ('percleft', _("Percentage left")), ('percright', _("Percentage right")), ('no', _("No"))]) config.usage.show_channel_numbers_in_servicelist = ConfigYesNo( default=True) config.usage.show_event_progress_in_servicelist.addNotifier( refreshServiceList) config.usage.show_channel_numbers_in_servicelist.addNotifier( refreshServiceList) config.usage.blinking_display_clock_during_recording = ConfigYesNo( default=False) config.usage.show_message_when_recording_starts = ConfigYesNo(default=True) config.usage.load_length_of_movies_in_moviellist = ConfigYesNo( default=True) config.usage.show_icons_in_movielist = ConfigSelection( default='i', choices=[ ('o', _("Off")), ('p', _("Progress")), ('s', _("Small progress")), ('i', _("Icons")), ]) config.usage.movielist_unseen = ConfigYesNo(default=False) # [ IQON : snr_on_osd default setting true : by knuth #config.usage.swap_snr_on_osd = ConfigYesNo(default = False) config.usage.swap_snr_on_osd = ConfigYesNo(default=True) # IQON : by knuth ] def SpinnerOnOffChanged(configElement): setSpinnerOnOff(int(configElement.value)) config.usage.show_spinner.addNotifier(SpinnerOnOffChanged) def EnableTtCachingChanged(configElement): setEnableTtCachingOnOff(int(configElement.value)) config.usage.enable_tt_caching.addNotifier(EnableTtCachingChanged) def TunerTypePriorityOrderChanged(configElement): setTunerTypePriorityOrder(int(configElement.value)) config.usage.alternatives_priority.addNotifier( TunerTypePriorityOrderChanged, immediate_feedback=False) def PreferredTunerChanged(configElement): setPreferredTuner(int(configElement.value)) config.usage.frontend_priority.addNotifier(PreferredTunerChanged) config.usage.hide_zap_errors = ConfigYesNo(default=False) config.usage.hide_ci_messages = ConfigYesNo(default=False) # [ IQON : crypto info default not show : by knuth # config.usage.show_cryptoinfo = ConfigYesNo(default = True) config.usage.show_cryptoinfo = ConfigSelection( default="emu", choices=["full", "emu", "off"]) # IQON : by knuth ] config.usage.show_eit_nownext = ConfigYesNo(default=True) config.usage.show_vcr_scart = ConfigYesNo(default=False) if SystemInfo["Fan"]: choicelist = [('off', _("Off")), ('on', _("On")), ('auto', _("Auto"))] if os.path.exists("/proc/stb/fp/fan_choices"): choicelist = [ x for x in choicelist if x[0] in open( "/proc/stb/fp/fan_choices", "r").read().strip().split(" ") ] config.usage.fan = ConfigSelection(choicelist) def fanChanged(configElement): open(SystemInfo["Fan"], "w").write(configElement.value) config.usage.fan.addNotifier(fanChanged) if SystemInfo["FanPWM"]: def fanSpeedChanged(configElement): open(SystemInfo["FanPWM"], "w").write(hex(configElement.value)[2:]) config.usage.fanspeed = ConfigSlider(default=127, increment=8, limits=(0, 255)) config.usage.fanspeed.addNotifier(fanSpeedChanged) if SystemInfo["StandbyLED"]: def standbyLEDChanged(configElement): open(SystemInfo["StandbyLED"], "w").write(configElement.value and "on" or "off") config.usage.standbyLED = ConfigYesNo(default=True) config.usage.standbyLED.addNotifier(standbyLEDChanged) if SystemInfo["WakeOnLAN"]: def wakeOnLANChanged(configElement): open(SystemInfo["WakeOnLAN"], "w").write(configElement.value and "on" or "off") config.usage.wakeOnLAN = ConfigYesNo(default=False) config.usage.wakeOnLAN.addNotifier(wakeOnLANChanged) config.epg = ConfigSubsection() config.epg.eit = ConfigYesNo(default=True) config.epg.mhw = ConfigYesNo(default=False) config.epg.freesat = ConfigYesNo(default=True) config.epg.viasat = ConfigYesNo(default=True) config.epg.netmed = ConfigYesNo(default=True) config.epg.virgin = ConfigYesNo(default=False) config.misc.showradiopic = ConfigYesNo(default=True) def EpgSettingsChanged(configElement): from enigma import eEPGCache mask = 0xffffffff if not config.epg.eit.value: mask &= ~(eEPGCache.NOWNEXT | eEPGCache.SCHEDULE | eEPGCache.SCHEDULE_OTHER) if not config.epg.mhw.value: mask &= ~eEPGCache.MHW if not config.epg.freesat.value: mask &= ~(eEPGCache.FREESAT_NOWNEXT | eEPGCache.FREESAT_SCHEDULE | eEPGCache.FREESAT_SCHEDULE_OTHER) if not config.epg.viasat.value: mask &= ~eEPGCache.VIASAT if not config.epg.netmed.value: mask &= ~(eEPGCache.NETMED_SCHEDULE | eEPGCache.NETMED_SCHEDULE_OTHER) if not config.epg.virgin.value: mask &= ~(eEPGCache.VIRGIN_NOWNEXT | eEPGCache.VIRGIN_SCHEDULE) eEPGCache.getInstance().setEpgSources(mask) config.epg.eit.addNotifier(EpgSettingsChanged) config.epg.mhw.addNotifier(EpgSettingsChanged) config.epg.freesat.addNotifier(EpgSettingsChanged) config.epg.viasat.addNotifier(EpgSettingsChanged) config.epg.netmed.addNotifier(EpgSettingsChanged) config.epg.virgin.addNotifier(EpgSettingsChanged) config.epg.histminutes = ConfigSelectionNumber(min=0, max=120, stepwidth=15, default=0, wraparound=True) def EpgHistorySecondsChanged(configElement): from enigma import eEPGCache eEPGCache.getInstance().setEpgHistorySeconds( config.epg.histminutes.getValue() * 60) config.epg.histminutes.addNotifier(EpgHistorySecondsChanged) def setHDDStandby(configElement): for hdd in harddiskmanager.HDDList(): hdd[1].setIdleTime(int(configElement.value)) config.usage.hdd_standby.addNotifier(setHDDStandby, immediate_feedback=False) if SystemInfo["12V_Output"]: def set12VOutput(configElement): Misc_Options.getInstance().set_12V_output( configElement.value == "on" and 1 or 0) config.usage.output_12V.addNotifier(set12VOutput, immediate_feedback=False) config.usage.keymap = ConfigText( default=eEnv.resolve("${datadir}/enigma2/keymap.xml")) config.seek = ConfigSubsection() config.seek.selfdefined_13 = ConfigNumber(default=15) config.seek.selfdefined_46 = ConfigNumber(default=60) config.seek.selfdefined_79 = ConfigNumber(default=300) config.seek.speeds_forward = ConfigSet( default=[2, 4, 8, 16, 32, 64, 128], choices=[2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128]) config.seek.speeds_backward = ConfigSet( default=[2, 4, 8, 16, 32, 64, 128], choices=[1, 2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128]) config.seek.speeds_slowmotion = ConfigSet(default=[2, 4, 8], choices=[2, 4, 6, 8, 12, 16, 25]) config.seek.enter_forward = ConfigSelection(default="2", choices=[ "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128" ]) config.seek.enter_backward = ConfigSelection(default="1", choices=[ "1", "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128" ]) config.seek.on_pause = ConfigSelection(default="play", choices=[("play", _("Play")), ("step", _("Single step (GOP)")), ("last", _("Last speed"))]) config.crash = ConfigSubsection() config.crash.details = ConfigYesNo(default=False) config.usage.timerlist_finished_timer_position = ConfigSelection( default="end", choices=[("beginning", _("At beginning")), ("end", _("At end"))]) def updateEnterForward(configElement): if not configElement.value: configElement.value = [2] updateChoices(config.seek.enter_forward, configElement.value) config.seek.speeds_forward.addNotifier(updateEnterForward, immediate_feedback=False) def updateEnterBackward(configElement): if not configElement.value: configElement.value = [2] updateChoices(config.seek.enter_backward, configElement.value) config.seek.speeds_backward.addNotifier(updateEnterBackward, immediate_feedback=False) def updateEraseSpeed(el): eBackgroundFileEraser.getInstance().setEraseSpeed(int(el.value)) def updateEraseFlags(el): eBackgroundFileEraser.getInstance().setEraseFlags(int(el.value)) config.misc.erase_speed = ConfigSelection(default="20", choices=[("10", "10 MB/s"), ("20", "20 MB/s"), ("50", "50 MB/s"), ("100", "100 MB/s")]) config.misc.erase_speed.addNotifier(updateEraseSpeed, immediate_feedback=False) config.misc.erase_flags = ConfigSelection(default="1", choices=[ ("0", _("Disable")), ("1", _("Internal hdd only")), ("3", _("Everywhere")) ]) config.misc.erase_flags.addNotifier(updateEraseFlags, immediate_feedback=False) if SystemInfo["ZapMode"]: def setZapmode(el): open(SystemInfo["ZapMode"], "w").write(el.value) config.misc.zapmode = ConfigSelection( default="mute", choices=[("mute", _("Black screen")), ("hold", _("Hold screen")), ("mutetilllock", _("Black screen till locked")), ("holdtilllock", _("Hold till locked"))]) config.misc.zapmode.addNotifier(setZapmode, immediate_feedback=False) config.subtitles = ConfigSubsection() config.subtitles.ttx_subtitle_colors = ConfigSelection( default="1", choices=[("0", _("original")), ("1", _("white")), ("2", _("yellow"))]) config.subtitles.ttx_subtitle_original_position = ConfigYesNo( default=False) config.subtitles.subtitle_position = ConfigSelection(choices=[ "0", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "150", "200", "250", "300", "350", "400", "450" ], default="50") config.subtitles.subtitle_alignment = ConfigSelection(choices=[ ("left", _("left")), ("center", _("center")), ("right", _("right")) ], default="center") config.subtitles.subtitle_rewrap = ConfigYesNo(default=False) config.subtitles.subtitle_borderwidth = ConfigSelection( choices=["1", "2", "3", "4", "5"], default="3") config.subtitles.subtitle_fontsize = ConfigSelection(choices=[ "16", "18", "20", "22", "24", "26", "28", "30", "32", "34", "36", "38", "40", "42", "44", "46", "48", "50", "52", "54" ], default="34") subtitle_delay_choicelist = [] for i in range(-900000, 1845000, 45000): if i == 0: subtitle_delay_choicelist.append(("0", _("No delay"))) else: subtitle_delay_choicelist.append( ("%d" % i, "%2.1f sec" % (i / 90000.))) config.subtitles.subtitle_noPTSrecordingdelay = ConfigSelection( default="315000", choices=subtitle_delay_choicelist) config.subtitles.dvb_subtitles_yellow = ConfigYesNo(default=False) config.subtitles.dvb_subtitles_original_position = ConfigSelection( default="0", choices=[("0", _("Original")), ("1", _("Fixed")), ("2", _("Relative"))]) config.subtitles.dvb_subtitles_centered = ConfigYesNo(default=True) config.subtitles.subtitle_bad_timing_delay = ConfigSelection( default="0", choices=subtitle_delay_choicelist) config.subtitles.dvb_subtitles_backtrans = ConfigSelection( default="0", choices=[("0", _("No transparency")), ("25", "10%"), ("50", "20%"), ("75", "30%"), ("100", "40%"), ("125", "50%"), ("150", "60%"), ("175", "70%"), ("200", "80%"), ("225", "90%"), ("255", _("Full transparency"))]) config.subtitles.pango_subtitle_colors = ConfigSelection( default="0", choices=[("0", _("alternative")), ("1", _("white")), ("2", _("yellow"))]) config.subtitles.pango_subtitles_delay = ConfigSelection( default="0", choices=subtitle_delay_choicelist) config.subtitles.pango_subtitles_fps = ConfigSelection( default="1", choices=[("1", _("Original")), ("23976", _("23.976")), ("24000", _("24")), ("25000", _("25")), ("29970", _("29.97")), ("30000", _("30"))]) config.subtitles.pango_autoturnon = ConfigYesNo(default=True) config.autolanguage = ConfigSubsection() audio_language_choices = [ ("---", _("None")), ("orj dos ory org esl qaa und mis mul ORY ORJ Audio_ORJ", _("Original")), ("ara", _("Arabic")), ("eus baq", _("Basque")), ("bul", _("Bulgarian")), ("hrv", _("Croatian")), ("ces cze", _("Czech")), ("dan", _("Danish")), ("dut ndl", _("Dutch")), ("eng qaa", _("English")), ("est", _("Estonian")), ("fin", _("Finnish")), ("fra fre", _("French")), ("deu ger", _("German")), ("ell gre", _("Greek")), ("heb", _("Hebrew")), ("hun", _("Hungarian")), ("ita", _("Italian")), ("lav", _("Latvian")), ("lit", _("Lithuanian")), ("ltz", _("Luxembourgish")), ("nor", _("Norwegian")), ("pol", _("Polish")), ("por", _("Portuguese")), ("fas per", _("Persian")), ("ron rum", _("Romanian")), ("rus", _("Russian")), ("srp", _("Serbian")), ("slk slo", _("Slovak")), ("slv", _("Slovenian")), ("spa", _("Spanish")), ("swe", _("Swedish")), ("tha", _("Thai")), ("tur Audio_TUR", _("Turkish")) ] def setEpgLanguage(configElement): eServiceEvent.setEPGLanguage(configElement.value) # config.autolanguage.audio_epglanguage = ConfigSelection(audio_language_choices[:1] + audio_language_choices [2:], default="---") config.autolanguage.audio_epglanguage = ConfigSelection( audio_language_choices[:1] + audio_language_choices[2:], default="eng qaa") # [iq] config.autolanguage.audio_epglanguage.addNotifier(setEpgLanguage) def setEpgLanguageAlternative(configElement): eServiceEvent.setEPGLanguageAlternative(configElement.value) config.autolanguage.audio_epglanguage_alternative = ConfigSelection( audio_language_choices[:1] + audio_language_choices[2:], default="---") config.autolanguage.audio_epglanguage_alternative.addNotifier( setEpgLanguageAlternative) # [ IQON : default language eng : by knuth # config.autolanguage.audio_autoselect1 = ConfigSelection(choices=audio_language_choices, default="---") config.autolanguage.audio_autoselect1 = ConfigSelection( choices=audio_language_choices, default="eng qaa") # [iq] config.autolanguage.audio_autoselect2 = ConfigSelection( choices=audio_language_choices, default="---") config.autolanguage.audio_autoselect3 = ConfigSelection( choices=audio_language_choices, default="---") config.autolanguage.audio_autoselect4 = ConfigSelection( choices=audio_language_choices, default="---") config.autolanguage.audio_defaultac3 = ConfigYesNo(default=True) # [iq] # config.autolanguage.audio_defaultac3 = ConfigYesNo(default = False) # [iq] config.autolanguage.audio_defaultddp = ConfigYesNo(default=False) config.autolanguage.audio_usecache = ConfigYesNo(default=True) subtitle_language_choices = audio_language_choices[: 1] + audio_language_choices[ 2:] # config.autolanguage.subtitle_autoselect1 = ConfigSelection(choices=subtitle_language_choices, default="---") config.autolanguage.subtitle_autoselect1 = ConfigSelection( choices=subtitle_language_choices, default="eng qaa") # [iq] config.autolanguage.subtitle_autoselect2 = ConfigSelection( choices=subtitle_language_choices, default="---") config.autolanguage.subtitle_autoselect3 = ConfigSelection( choices=subtitle_language_choices, default="---") config.autolanguage.subtitle_autoselect4 = ConfigSelection( choices=subtitle_language_choices, default="---") config.autolanguage.subtitle_hearingimpaired = ConfigYesNo(default=False) config.autolanguage.subtitle_defaultimpaired = ConfigYesNo(default=False) config.autolanguage.subtitle_defaultdvb = ConfigYesNo(default=False) config.autolanguage.subtitle_usecache = ConfigYesNo(default=True) # config.autolanguage.equal_languages = ConfigSelection(default = "15", choices = [ config.autolanguage.equal_languages = ConfigSelection( default="0", choices=[ # [iq] ("0", _("None")), ("1", "1"), ("2", "2"), ("3", "1,2"), ("4", "3"), ("5", "1,3"), ("6", "2,3"), ("7", "1,2,3"), ("8", "4"), ("9", "1,4"), ("10", "2,4"), ("11", "1,2,4"), ("12", "3,4"), ("13", "1,3,4"), ("14", "2,3,4"), ("15", _("All")) ]) # IQON : by knuth ] # [ IQON : fan controller default setup : by knuth config.fan_config = ConfigSubsection() config.fan_config.offset = ConfigNumber(default=0) config.fan_config.default = ConfigNumber(default=5) config.fan_config.increment = ConfigNumber(default=5) config.fan_config.configured = ConfigYesNo(default=False) # IQON : by knuth ] # [ IQON : default vfd scroll and try_cooltvguide : by knuth config.vfd_scroll = ConfigYesNo(default=True) config.usage.try_cooltvguide = ConfigYesNo(default=True) # [iq] # IQON : by knuth ] config.streaming = ConfigSubsection() config.streaming.stream_ecm = ConfigYesNo(default=False) config.streaming.descramble = ConfigYesNo(default=True) config.streaming.stream_eit = ConfigYesNo(default=True) config.streaming.stream_ait = ConfigYesNo(default=True) config.streaming.authentication = ConfigYesNo(default=False)
return len(CamControl('softcam').getList()) > 1 SystemInfo["HasSoftcamInstalled"] = hassoftcaminstalled() SystemInfo["NumVideoDecoders"] = getNumVideoDecoders() SystemInfo["PIPAvailable"] = SystemInfo["NumVideoDecoders"] > 1 SystemInfo["CanMeasureFrontendInputPower"] = eDVBResourceManager.getInstance( ).canMeasureFrontendInputPower() SystemInfo["12V_Output"] = Misc_Options.getInstance().detected_12V_output() SystemInfo["ZapMode"] = fileCheck("/proc/stb/video/zapmode") or fileCheck( "/proc/stb/video/zapping_mode") SystemInfo["NumFrontpanelLEDs"] = countFrontpanelLEDs() SystemInfo["FrontpanelDisplay"] = fileExists("/dev/dbox/oled0") or fileExists( "/dev/dbox/lcd0") SystemInfo["LCDsymbol_circle_recording"] = fileCheck( "/proc/stb/lcd/symbol_circle") or HardwareInfo().get_device_model() in ( "hd51", "vs1500") and fileCheck("/proc/stb/lcd/symbol_recording") SystemInfo["LCDsymbol_timeshift"] = fileCheck("/proc/stb/lcd/symbol_timeshift") SystemInfo["LCDshow_symbols"] = ( HardwareInfo().get_device_model().startswith("et9") or HardwareInfo().get_device_model() in ("hd51", "vs1500")) and fileCheck("/proc/stb/lcd/show_symbols") SystemInfo["LCDsymbol_hdd"] = HardwareInfo().get_device_model() in ( "hd51", "vs1500") and fileCheck("/proc/stb/lcd/symbol_hdd") SystemInfo["FrontpanelDisplayGrayscale"] = fileExists("/dev/dbox/oled0") SystemInfo["DeepstandbySupport"] = HardwareInfo().get_device_name() != "dm800" SystemInfo["Fan"] = fileCheck("/proc/stb/fp/fan") SystemInfo["FanPWM"] = SystemInfo["Fan"] and fileCheck("/proc/stb/fp/fan_pwm") SystemInfo["StandbyLED"] = fileCheck("/proc/stb/power/standbyled") SystemInfo["PowerOffDisplay"] = HardwareInfo().get_device_model( ) not in "formuler1" and fileCheck("/proc/stb/power/vfd") or fileCheck(
class AVSwitch: hw_type = HardwareInfo().get_device_name() rates = {} # high-level, use selectable modes. modes = {} # a list of (high-level) modes for a certain port. rates["PAL"] = { "50Hz": { 50: "pal" }, "60Hz": { 60: "pal60" }, "multi": { 50: "pal", 60: "pal60" } } rates["NTSC"] = {"60Hz": {60: "ntsc"}} rates["Multi"] = {"multi": {50: "pal", 60: "ntsc"}} rates["480i"] = {"60Hz": {60: "480i"}} rates["576i"] = {"50Hz": {50: "576i"}} rates["480p"] = {"60Hz": {60: "480p"}} rates["576p"] = {"50Hz": {50: "576p"}} rates["720p"] = { "50Hz": { 50: "720p50" }, "60Hz": { 60: "720p" }, "multi": { 50: "720p50", 60: "720p" } } rates["1080i"] = { "50Hz": { 50: "1080i50" }, "60Hz": { 60: "1080i" }, "multi": { 50: "1080i50", 60: "1080i" } } rates["1080p"] = { "50Hz": { 50: "1080p50" }, "60Hz": { 60: "1080p" }, "multi": { 50: "1080p50", 60: "1080p" } } rates["PC"] = { "1024x768": { 60: "1024x768" }, # not possible on DM7025 "800x600": { 60: "800x600" }, # also not possible "720x480": { 60: "720x480" }, "720x576": { 60: "720x576" }, "1280x720": { 60: "1280x720" }, "1280x720 multi": { 50: "1280x720_50", 60: "1280x720" }, "1920x1080": { 60: "1920x1080" }, "1920x1080 multi": { 50: "1920x1080", 60: "1920x1080_50" }, "1280x1024": { 60: "1280x1024" }, "1366x768": { 60: "1366x768" }, "1366x768 multi": { 50: "1366x768", 60: "1366x768_50" }, "1280x768": { 60: "1280x768" }, "640x480": { 60: "640x480" } } modes["Scart"] = ["PAL", "NTSC", "Multi"] # modes["DVI-PC"] = ["PC"] if hw_type in ('elite', 'premium', 'premium+', 'ultra', "me", "minime"): config.av.edid_override = True if (about.getChipSetString() in ('7241', '7358', '7362', '7346', '7356', '7424', '7425', '7435', 'pnx8493', '7162', '7111')) or (hw_type in ('elite', 'premium', 'premium+', 'ultra', "me", "minime")): modes["HDMI"] = [ "720p", "1080p", "1080i", "576p", "576i", "480p", "480i" ] widescreen_modes = {"720p", "1080p", "1080i"} else: modes["HDMI"] = ["720p", "1080i", "576p", "576i", "480p", "480i"] widescreen_modes = {"720p", "1080i"} modes["YPbPr"] = modes["HDMI"] if getBrandOEM() == 'vuplus': modes["Scart-YPbPr"] = modes["HDMI"] # if modes.has_key("DVI-PC") and not getModeList("DVI-PC"): # print "remove DVI-PC because of not existing modes" # del modes["DVI-PC"] if modes.has_key("YPbPr") and getBoxType() in ( 'force2solid', 'zgemmash1', 'zgemmas2s', 'mago', 'enibox', 'mutant1100', 'et4x00', 'et7500', 'et7000', 'et8500', 'xp1000mk', 'xp1000max', 'xp1000plus', 'sf8', 'tm2t', 'tmsingle', 'vusolo2', 'tmnano', 'iqonios300hd', 'iqonios300hdv2', 'classm', 'axodin', 'axodinc', 'genius', 'evo', 'galaxym6', 'geniuse3hd', 'evoe3hd', 'axase3', 'axase3c', 'dm500hdv2', 'dm500hd', 'dm800', 'mixosf7', 'mixoslumi', 'mixosf5mini', 'gi9196lite', 'ixusszero', 'optimussos1', 'enfinity', 'marvel1', 'bre2ze', 'sezam1000hd', 'mbmini', 'atemio5x00', 'xpeedlx1', 'xpeedlx2', 'vusolose', 'gbipbox', 'formuler3', 'optimussos3plus', 'force1plus', 'vuzero') or (about.getModelString() == 'ini-3000'): del modes["YPbPr"] if modes.has_key("Scart") and getBoxType() in ('force2solid', 'optimussos', 'vuzero'): del modes["Scart"] if getBoxType() == 'vuzero': del modes["Scart-YPbPr"] def __init__(self): self.last_modes_preferred = [] self.on_hotplug = CList() self.current_mode = None self.current_port = None self.readAvailableModes() self.createConfig() self.readPreferredModes() def readAvailableModes(self): try: f = open("/proc/stb/video/videomode_choices") modes = f.read()[:-1] f.close() except IOError: print "couldn't read available videomodes." self.modes_available = [] return self.modes_available = modes.split(' ') def readPreferredModes(self): try: f = open("/proc/stb/video/videomode_preferred") modes = f.read()[:-1] f.close() self.modes_preferred = modes.split(' ') except IOError: print "reading preferred modes failed, using all modes" self.modes_preferred = self.modes_available if self.modes_preferred != self.last_modes_preferred: self.last_modes_preferred = self.modes_preferred self.on_hotplug("HDMI") # must be HDMI # check if a high-level mode with a given rate is available. def isModeAvailable(self, port, mode, rate): rate = self.rates[mode][rate] for mode in rate.values(): if port == "DVI": if hw_type in ('elite', 'premium', 'premium+', 'ultra', "me", "minime"): if mode not in self.modes_preferred and not config.av.edid_override.value: print "no, not preferred" return False if mode not in self.modes_available: return False return True def isWidescreenMode(self, port, mode): return mode in self.widescreen_modes def setMode(self, port, mode, rate, force=None): print "[VideoMode] setMode - port: %s, mode: %s, rate: %s" % ( port, mode, rate) # config.av.videoport.setValue(port) # we can ignore "port" self.current_mode = mode self.current_port = port modes = self.rates[mode][rate] mode_50 = modes.get(50) mode_60 = modes.get(60) if mode_50 is None or force == 60: mode_50 = mode_60 if mode_60 is None or force == 50: mode_60 = mode_50 mode_etc = None if os.path.exists('/proc/stb/video/videomode_50hz') and getBoxType( ) not in ('gb800solo', 'gb800se', 'gb800ue'): f = open("/proc/stb/video/videomode_50hz", "w") f.write(mode_50) f.close() if os.path.exists('/proc/stb/video/videomode_60hz') and getBoxType( ) not in ('gb800solo', 'gb800se', 'gb800ue'): try: f = open("/proc/stb/video/videomode_60hz", "w") f.write(mode_60) f.close() except IOError: print "setting videomode failed." try: mode_etc = modes.get(int(rate[:2])) f = open("/proc/stb/video/videomode", "w") f.write(mode_etc) f.close() except: # not support 50Hz, 60Hz for 1080p try: # fallback if no possibility to setup 50/60 hz mode f = open("/proc/stb/video/videomode", "w") f.write(mode_50) f.close() except IOError: print "setting videomode failed." map = {"cvbs": 0, "rgb": 1, "svideo": 2, "yuv": 3} self.setColorFormat(map[config.av.colorformat.value]) def saveMode(self, port, mode, rate): config.av.videoport.setValue(port) config.av.videoport.save() if port in config.av.videomode: config.av.videomode[port].setValue(mode) config.av.videomode[port].save() if mode in config.av.videorate: config.av.videorate[mode].setValue(rate) config.av.videorate[mode].save() def isPortAvailable(self, port): # fixme return True def isPortUsed(self, port): if port == "HDMI": self.readPreferredModes() return len(self.modes_preferred) != 0 else: return True def getPortList(self): return [port for port in self.modes if self.isPortAvailable(port)] # get a list with all modes, with all rates, for a given port. def getModeList(self, port): res = [] for mode in self.modes[port]: # list all rates which are completely valid rates = [ rate for rate in self.rates[mode] if self.isModeAvailable(port, mode, rate) ] # if at least one rate is ok, add this mode if len(rates): res.append((mode, rates)) return res def createConfig(self, *args): hw_type = HardwareInfo().get_device_name() has_hdmi = HardwareInfo().has_hdmi() lst = [] config.av.videomode = ConfigSubDict() config.av.videorate = ConfigSubDict() # create list of output ports portlist = self.getPortList() for port in portlist: descr = port if 'HDMI' in port: lst.insert(0, (port, descr)) else: lst.append((port, descr)) modes = self.getModeList(port) if len(modes): config.av.videomode[port] = ConfigSelection( choices=[mode for (mode, rates) in modes]) for (mode, rates) in modes: config.av.videorate[mode] = ConfigSelection(choices=rates) config.av.videoport = ConfigSelection(choices=lst) def setInput(self, input): INPUT = {"ENCODER": 0, "SCART": 1, "AUX": 2} eAVSwitch.getInstance().setInput(INPUT[input]) def setColorFormat(self, value): if not self.current_port: self.current_port = config.av.videoport.value if self.current_port in ("YPbPr", "Scart-YPbPr"): eAVSwitch.getInstance().setColorFormat(3) else: eAVSwitch.getInstance().setColorFormat(value) def setConfiguredMode(self): port = config.av.videoport.value if port not in config.av.videomode: print "current port not available, not setting videomode" return mode = config.av.videomode[port].value if mode not in config.av.videorate: print "current mode not available, not setting videomode" return rate = config.av.videorate[mode].value self.setMode(port, mode, rate) def setAspect(self, cfgelement): print "[VideoMode] setting aspect: %s" % cfgelement.value f = open("/proc/stb/video/aspect", "w") f.write(cfgelement.value) f.close() def setWss(self, cfgelement): if not cfgelement.value: wss = "auto(4:3_off)" else: wss = "auto" if os.path.exists("/proc/stb/denc/0/wss"): print "[VideoMode] setting wss: %s" % wss f = open("/proc/stb/denc/0/wss", "w") f.write(wss) f.close() def setPolicy43(self, cfgelement): print "[VideoMode] setting policy: %s" % cfgelement.value f = open("/proc/stb/video/policy", "w") f.write(cfgelement.value) f.close() def setPolicy169(self, cfgelement): if os.path.exists("/proc/stb/video/policy2"): print "[VideoMode] setting policy2: %s" % cfgelement.value f = open("/proc/stb/video/policy2", "w") f.write(cfgelement.value) f.close() def getOutputAspect(self): ret = (16, 9) port = config.av.videoport.value if port not in config.av.videomode: print "current port not available in getOutputAspect!!! force 16:9" else: mode = config.av.videomode[port].value force_widescreen = self.isWidescreenMode(port, mode) is_widescreen = force_widescreen or config.av.aspect.value in ( "16:9", "16:10") is_auto = config.av.aspect.value == "auto" if is_widescreen: if force_widescreen: pass else: aspect = { "16:9": "16:9", "16:10": "16:10" }[config.av.aspect.value] if aspect == "16:10": ret = (16, 10) elif is_auto: try: aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read() if aspect_str == "1": # 4:3 ret = (4, 3) except IOError: pass else: # 4:3 ret = (4, 3) return ret def getFramebufferScale(self): aspect = self.getOutputAspect() fb_size = getDesktop(0).size() return aspect[0] * fb_size.height(), aspect[1] * fb_size.width() def setAspectRatio(self, value): pass def getAspectRatioSetting(self): valstr = config.av.aspectratio.value if valstr == "4_3_letterbox": val = 0 elif valstr == "4_3_panscan": val = 1 elif valstr == "16_9": val = 2 elif valstr == "16_9_always": val = 3 elif valstr == "16_10_letterbox": val = 4 elif valstr == "16_10_panscan": val = 5 elif valstr == "16_9_letterbox": val = 6 return val
class AVSwitch: hw_type = HardwareInfo().get_device_name() rates = { } # high-level, use selectable modes. modes = { } # a list of (high-level) modes for a certain port. rates["PAL"] = { "50Hz": { 50: "pal" }, "60Hz": { 60: "pal60" }, "multi": { 50: "pal", 60: "pal60" } } rates["NTSC"] = { "60Hz": { 60: "ntsc" } } rates["Multi"] = { "multi": { 50: "pal", 60: "ntsc" } } rates["480i"] = { "60Hz": { 60: "480i" } } rates["576i"] = { "50Hz": { 50: "576i" } } rates["480p"] = { "60Hz": { 60: "480p" } } rates["576p"] = { "50Hz": { 50: "576p" } } rates["720p"] = { "50Hz": { 50: "720p50" }, "60Hz": { 60: "720p" }, "multi": { 50: "720p50", 60: "720p" }, "auto": { 50: "720p50", 60: "720p", 24: "720p24" } } rates["1080i"] = { "50Hz": { 50: "1080i50" }, "60Hz": { 60: "1080i" }, "multi": { 50: "1080i50", 60: "1080i" }, "auto": { 50: "1080i50", 60: "1080i", 24: "1080p24" } } rates["1080p"] = { "50Hz": { 50: "1080p50" }, "60Hz": { 60: "1080p" }, "multi": { 50: "1080p50", 60: "1080p" }, "auto": { 50: "1080p50", 60: "1080p", 24: "1080p24" } } if getBoxType().startswith('dm9'): rates["2160p"] = { "50Hz": { 50: "2160p50" }, "60Hz": { 60: "2160p60" }, "multi": { 50: "2160p50", 60: "2160p60" }, "auto": { 50: "2160p50", 60: "2160p60", 24: "2160p24" } } else: rates["2160p"] = { "50Hz": { 50: "2160p50" }, "60Hz": { 60: "2160p" }, "multi": { 50: "2160p50", 60: "2160p" }, "auto": { 50: "2160p50", 60: "2160p", 24: "2160p24" } } rates["2160p30"] = { "25Hz": { 50: "2160p25" }, "30Hz": { 60: "2160p30"} , "multi": { 50: "2160p25", 60: "2160p30" }, "auto": { 50: "2160p25", 60: "2160p30", 24: "2160p24" } } rates["PC"] = { "1024x768": { 60: "1024x768" }, # not possible on DM7025 "800x600" : { 60: "800x600" }, # also not possible "720x480" : { 60: "720x480" }, "720x576" : { 60: "720x576" }, "1280x720": { 60: "1280x720" }, "1280x720 multi": { 50: "1280x720_50", 60: "1280x720" }, "1920x1080": { 60: "1920x1080"}, "1920x1080 multi": { 50: "1920x1080", 60: "1920x1080_50" }, "1280x1024": { 60: "1280x1024"}, "1366x768" : { 60: "1366x768"}, "1366x768 multi": { 50: "1366x768", 60: "1366x768_50" }, "1280x768": { 60: "1280x768" }, "640x480" : { 60: "640x480" } } modes["Scart"] = ["PAL", "NTSC", "Multi"] # modes["DVI-PC"] = ["PC"] if (about.getChipSetString() in ('7366', '7376', '5272s', '7444', '7445', '7445s')): modes["HDMI"] = ["720p", "1080p", "2160p", "1080i", "576p", "576i", "480p", "480i"] widescreen_modes = {"720p", "1080p", "1080i", "2160p"} elif (about.getChipSetString() in ('7252', '7251', '7251S', '7252S', '7251s', '7252s', '72604', '7278', '7444s', '3798mv200', '3798cv200', 'hi3798mv200', 'hi3798cv200')): modes["HDMI"] = ["720p", "1080p", "2160p", "2160p30", "1080i", "576p", "576i", "480p", "480i"] widescreen_modes = {"720p", "1080p", "1080i", "2160p", "2160p30"} elif (about.getChipSetString() in ('7241', '7358', '7362', '73625', '7346', '7356', '73565', '7424', '7425', '7435', '7552', '7581', '7584', '75845', '7585', 'pnx8493', '7162', '7111', '3716mv410', 'hi3716mv410', 'hi3716mv430')) or (getBrandOEM() in ('azbox')): modes["HDMI"] = ["720p", "1080p", "1080i", "576p", "576i", "480p", "480i"] widescreen_modes = {"720p", "1080p", "1080i"} elif about.getChipSetString() in ('meson-6',): modes["HDMI"] = ["720p", "1080p", "1080i"] widescreen_modes = {"720p", "1080p", "1080i"} elif about.getChipSetString() in ('meson-64','S905D'): modes["HDMI"] = ["720p", "1080p", "2160p", "2160p30", "1080i"] widescreen_modes = {"720p", "1080p", "1080i", "2160p", "2160p30"} else: modes["HDMI"] = ["720p", "1080i", "576p", "576i", "480p", "480i"] widescreen_modes = {"720p", "1080i"} modes["YPbPr"] = modes["HDMI"] if has_scartyuv: modes["Scart-YPbPr"] = modes["HDMI"] # if modes.has_key("DVI-PC") and not getModeList("DVI-PC"): # print "[AVSwitch] remove DVI-PC because of not existing modes" # del modes["DVI-PC"] if modes.has_key("YPbPr") and not has_yuv: del modes["YPbPr"] if modes.has_key("Scart") and not has_scart and not has_rca and not has_avjack: del modes["Scart"] if getBoxType() in ('mutant2400',): f = open("/proc/stb/info/board_revision", "r").read() if f >= "2": del modes["YPbPr"] def __init__(self): self.last_modes_preferred = [ ] self.on_hotplug = CList() self.current_mode = None self.current_port = None self.readAvailableModes() self.is24hzAvailable() self.readPreferredModes() self.createConfig() def readAvailableModes(self): try: f = open("/proc/stb/video/videomode_choices") modes = f.read()[:-1] f.close() except IOError: print "[AVSwitch] couldn't read available videomodes." modes = [ ] return modes return modes.split(' ') def readPreferredModes(self): if config.av.edid_override.value == False: try: f = open("/proc/stb/video/videomode_edid") modes = f.read()[:-1] f.close() self.modes_preferred = modes.split(' ') print "[AVSwitch] reading edid modes: ", self.modes_preferred except IOError: print "[AVSwitch] reading edid modes failed, using all modes" try: f = open("/proc/stb/video/videomode_preferred") modes = f.read()[:-1] f.close() self.modes_preferred = modes.split(' ') print "[AVSwitch] reading _preferred modes: ", self.modes_preferred except IOError: print "[AVSwitch] reading preferred modes failed, using all modes" self.modes_preferred = self.readAvailableModes() else: self.modes_preferred = self.readAvailableModes() print "[AVSwitch] used default modes: ", self.modes_preferred if len(self.modes_preferred) <= 2: print "[AVSwitch] preferend modes not ok, possible driver failer, len=", len(self.modes_preferred) self.modes_preferred = self.readAvailableModes() if self.modes_preferred != self.last_modes_preferred: self.last_modes_preferred = self.modes_preferred self.on_hotplug("HDMI") # must be HDMI def is24hzAvailable(self): try: self.has24pAvailable = os.access("/proc/stb/video/videomode_24hz", os.W_OK) and True or False except IOError: print "[AVSwitch] failed to read video choices 24hz ." self.has24pAvailable = False SystemInfo["have24hz"] = self.has24pAvailable # check if a high-level mode with a given rate is available. def isModeAvailable(self, port, mode, rate): rate = self.rates[mode][rate] for mode in rate.values(): if port == "DVI": if getBrandOEM() in ('azbox',): if mode not in self.modes_preferred and not config.av.edid_override.value: print "[AVSwitch] no, not preferred" return False if port != "HDMI": if mode not in self.readAvailableModes(): return False elif mode not in self.modes_preferred: return False return True def isWidescreenMode(self, port, mode): return mode in self.widescreen_modes def setMode(self, port, mode, rate, force = None): print "[AVSwitch] setMode - port: %s, mode: %s, rate: %s" % (port, mode, rate) # config.av.videoport.setValue(port) # we can ignore "port" self.current_mode = mode self.current_port = port modes = self.rates[mode][rate] mode_50 = modes.get(50) mode_60 = modes.get(60) mode_24 = modes.get(24) if mode_50 is None or force == 60: mode_50 = mode_60 if mode_60 is None or force == 50: mode_60 = mode_50 if mode_24 is None or force: mode_24 = mode_60 if force == 50: mode_24 = mode_50 try: f = open("/proc/stb/video/videomode_50hz", "w") f.write(mode_50) f.close() f = open("/proc/stb/video/videomode_60hz", "w") f.write(mode_60) f.close() except IOError: try: # fallback if no possibility to setup 50/60 hz mode f = open("/proc/stb/video/videomode", "w") f.write(mode_50) f.close() except IOError: print "[AVSwitch] setting videomode failed." if SystemInfo["have24hz"]: try: open("/proc/stb/video/videomode_24hz", "w").write(mode_24) except IOError: print "[VideoHardware] cannot open /proc/stb/video/videomode_24hz" if getBrandOEM() in ('gigablue',): try: # use 50Hz mode (if available) for booting f = open("/etc/videomode", "w") f.write(mode_50) f.close() except IOError: print "[AVSwitch] writing initial videomode to /etc/videomode failed." map = {"cvbs": 0, "rgb": 1, "svideo": 2, "yuv": 3} self.setColorFormat(map[config.av.colorformat.value]) if about.getCPUString().startswith('STx'): #call setResolution() with -1,-1 to read the new scrren dimensions without changing the framebuffer resolution from enigma import gMainDC gMainDC.getInstance().setResolution(-1, -1) def saveMode(self, port, mode, rate): config.av.videoport.setValue(port) config.av.videoport.save() if port in config.av.videomode: config.av.videomode[port].setValue(mode) config.av.videomode[port].save() if mode in config.av.videorate: config.av.videorate[mode].setValue(rate) config.av.videorate[mode].save() def isPortAvailable(self, port): # fixme return True def isPortUsed(self, port): if port == "HDMI": self.readPreferredModes() return len(self.modes_preferred) != 0 else: return True def getPortList(self): return [port for port in self.modes if self.isPortAvailable(port)] # get a list with all modes, with all rates, for a given port. def getModeList(self, port): res = [ ] for mode in self.modes[port]: # list all rates which are completely valid rates = [rate for rate in self.rates[mode] if self.isModeAvailable(port, mode, rate)] # if at least one rate is ok, add this mode if len(rates): res.append( (mode, rates) ) return res def createConfig(self, *args): hw_type = HardwareInfo().get_device_name() has_hdmi = HardwareInfo().has_hdmi() lst = [] config.av.videomode = ConfigSubDict() config.av.autores_mode_sd = ConfigSubDict() config.av.autores_mode_hd = ConfigSubDict() config.av.autores_mode_fhd = ConfigSubDict() config.av.autores_mode_uhd = ConfigSubDict() config.av.videorate = ConfigSubDict() config.av.autores_rate_sd = ConfigSubDict() config.av.autores_rate_hd = ConfigSubDict() config.av.autores_rate_fhd = ConfigSubDict() config.av.autores_rate_uhd = ConfigSubDict() # create list of output ports portlist = self.getPortList() for port in portlist: descr = port if 'HDMI' in port: lst.insert(0, (port, descr)) else: lst.append((port, descr)) modes = self.getModeList(port) if len(modes): config.av.videomode[port] = ConfigSelection(choices = [mode for (mode, rates) in modes]) config.av.autores_mode_sd[port] = ConfigSelection(choices = [mode for (mode, rates) in modes]) config.av.autores_mode_hd[port] = ConfigSelection(choices = [mode for (mode, rates) in modes]) config.av.autores_mode_fhd[port] = ConfigSelection(choices = [mode for (mode, rates) in modes]) config.av.autores_mode_uhd[port] = ConfigSelection(choices = [mode for (mode, rates) in modes]) for (mode, rates) in modes: ratelist = [] for rate in rates: if rate in ("auto") and not SystemInfo["have24hz"]: continue ratelist.append((rate, rate)) config.av.videorate[mode] = ConfigSelection(choices = ratelist) config.av.autores_rate_sd[mode] = ConfigSelection(choices = ratelist) config.av.autores_rate_hd[mode] = ConfigSelection(choices = ratelist) config.av.autores_rate_fhd[mode] = ConfigSelection(choices = ratelist) config.av.autores_rate_uhd[mode] = ConfigSelection(choices = ratelist) config.av.videoport = ConfigSelection(choices = lst) def setInput(self, input): INPUT = { "ENCODER": 0, "SCART": 1, "AUX": 2 } eAVSwitch.getInstance().setInput(INPUT[input]) def setColorFormat(self, value): if not self.current_port: self.current_port = config.av.videoport.value if self.current_port in ("YPbPr", "Scart-YPbPr"): eAVSwitch.getInstance().setColorFormat(3) elif self.current_port in ("RCA"): eAVSwitch.getInstance().setColorFormat(0) else: eAVSwitch.getInstance().setColorFormat(value) def setConfiguredMode(self): port = config.av.videoport.value if port not in config.av.videomode: print "[AVSwitch] current port not available, not setting videomode" return mode = config.av.videomode[port].value if mode not in config.av.videorate: print "[AVSwitch] current mode not available, not setting videomode" return rate = config.av.videorate[mode].value self.setMode(port, mode, rate) def setAspect(self, cfgelement): print "[AVSwitch] setting aspect: %s" % cfgelement.value try: f = open("/proc/stb/video/aspect", "w") f.write(cfgelement.value) f.close() except IOError: print "[AVSwitch] setting aspect failed." def setWss(self, cfgelement): if not cfgelement.value: wss = "auto(4:3_off)" else: wss = "auto" if os.path.exists("/proc/stb/denc/0/wss"): print "[AVSwitch] setting wss: %s" % wss f = open("/proc/stb/denc/0/wss", "w") f.write(wss) f.close() def setPolicy43(self, cfgelement): print "[AVSwitch] setting policy: %s" % cfgelement.value arw = "0" try: if about.getChipSetString() in ('meson-6', 'meson-64'): if cfgelement.value == "panscan" : arw = "11" if cfgelement.value == "letterbox" : arw = "12" if cfgelement.value == "bestfit" : arw = "10" open("/sys/class/video/screen_mode", "w").write(arw) else: f = open("/proc/stb/video/policy", "w") f.write(cfgelement.value) f.close() except IOError: print "[AVSwitch] setting policy43 failed." def setPolicy169(self, cfgelement): if os.path.exists("/proc/stb/video/policy2"): print "[AVSwitch] setting policy2: %s" % cfgelement.value f = open("/proc/stb/video/policy2", "w") f.write(cfgelement.value) f.close() def getOutputAspect(self): ret = (16,9) port = config.av.videoport.value if port not in config.av.videomode: print "current port not available in getOutputAspect!!! force 16:9" else: mode = config.av.videomode[port].value force_widescreen = self.isWidescreenMode(port, mode) is_widescreen = force_widescreen or config.av.aspect.value in ("16:9", "16:10") is_auto = config.av.aspect.value == "auto" if is_widescreen: if force_widescreen: pass else: aspect = {"16:9": "16:9", "16:10": "16:10"}[config.av.aspect.value] if aspect == "16:10": ret = (16,10) elif is_auto: try: aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read() if aspect_str == "1": # 4:3 ret = (4,3) except IOError: pass else: # 4:3 ret = (4,3) return ret def getFramebufferScale(self): aspect = self.getOutputAspect() fb_size = getDesktop(0).size() return aspect[0] * fb_size.height(), aspect[1] * fb_size.width() def setAspectRatio(self, value): eAVSwitch.getInstance().setAspectRatio(value) def getAspectRatioSetting(self): valstr = config.av.aspectratio.value if valstr == "4_3_letterbox": val = 0 elif valstr == "4_3_panscan": val = 1 elif valstr == "16_9": val = 2 elif valstr == "16_9_always": val = 3 elif valstr == "16_10_letterbox": val = 4 elif valstr == "16_10_panscan": val = 5 elif valstr == "16_9_letterbox": val = 6 return val
from Components.config import config, ConfigOnOff, ConfigText, ConfigSubsection from Tools.HardwareInfo import HardwareInfo config.plugins.mediarenderer = ConfigSubsection() config.plugins.mediarenderer.enabled = ConfigOnOff(default=True) config.plugins.mediarenderer.name = ConfigText( default="%s" % (HardwareInfo().get_device_name()), fixed_size=False) config.plugins.mediarenderer.uuid = ConfigText(default="", fixed_size=False)
dev = devname[:3] part = devname[3:] for p in part: if not p.isdigit(): return devname, 0 return dev, part and int(part) or 0 def getUserfriendlyDeviceName(self, dev, phys): dev, part = self.splitDeviceName(dev) description = _("External Storage %s") % dev try: description = readFile("/sys" + phys + "/model") except IOError, s: print "couldn't read model: ", s from Tools.HardwareInfo import HardwareInfo for physdevprefix, pdescription in DEVICEDB.get(HardwareInfo().device_name,{}).items(): if phys.startswith(physdevprefix): description = pdescription # not wholedisk and not partition 1 if part and part != 1: description += _(" (Partition %d)") % part return description def addMountedPartition(self, device, desc): for x in self.partitions: if x.mountpoint == device: #already_mounted return self.partitions.append(Partition(mountpoint=device, description=desc)) def removeMountedPartition(self, mountpoint):
def getHardwareTypeString(): return HardwareInfo().get_device_string()
def LayoutFinish(self): if not HardwareInfo().is_nextgen(): self.createTimer.start(800) else: self.createTimer.start(1600)
# from Plugins.Plugin import PluginDescriptor from Tools.HardwareInfo import HardwareInfo from Components.config import config, ConfigSubsection, ConfigSelection, ConfigDirectory, ConfigYesNo, Config, ConfigText from InternetRadioScreen import InternetRadioScreen config.plugins.internetradio = ConfigSubsection() config.plugins.internetradio.showinextensions = ConfigYesNo(default=True) config.plugins.internetradio.dirname = ConfigDirectory( default="/media/hdd/streamripper/") config.plugins.internetradio.riptosinglefile = ConfigYesNo(default=False) config.plugins.internetradio.createdirforeachstream = ConfigYesNo(default=True) config.plugins.internetradio.addsequenceoutputfile = ConfigYesNo(default=False) config.plugins.internetradio.filter = ConfigText(default=_("Countries")) if HardwareInfo().get_device_name() == "dm500hd": config.plugins.internetradio.visualization = ConfigSelection(choices=[ ("2", _("On")), ("3", _("Off")) ], default="2") else: config.plugins.internetradio.visualization = ConfigSelection(choices=[ ("0", _("Screen and OLED")), ("1", _("OLED only")), ("2", _("Screen only")), ("3", _("Off")) ], default="2") config.plugins.internetradio.googlecover = ConfigYesNo(default=False) config.plugins.internetradio.startupname = ConfigText(default="") config.plugins.internetradio.startuptext = ConfigText(default="") config.plugins.internetradio.fullscreenautoactivation = ConfigSelection( choices=[("30", _("30 seconds")), ("60", _("1 minutes")),
SystemInfo["NumVideoDecoders"] = getNumVideoDecoders() SystemInfo["CanMeasureFrontendInputPower"] = eDVBResourceManager.getInstance( ).canMeasureFrontendInputPower() def countFrontpanelLEDs(): leds = 0 if fileExists("/proc/stb/fp/led_set_pattern"): leds += 1 while fileExists("/proc/stb/fp/led%d_pattern" % leds): leds += 1 return leds SystemInfo["NumFrontpanelLEDs"] = countFrontpanelLEDs() SystemInfo["FrontpanelDisplay"] = fileExists("/dev/dbox/oled0") or fileExists( "/dev/dbox/lcd0") SystemInfo["OledDisplay"] = fileExists("/dev/dbox/oled0") SystemInfo["LcdDisplay"] = fileExists("/dev/dbox/lcd0") SystemInfo["DeepstandbySupport"] = HardwareInfo().get_device_name() != "dm800" SystemInfo["HDMICEC"] = ( path.exists("/dev/hdmi_cec") or path.exists("/dev/misc/hdmi_cec0")) and fileExists( "/usr/lib/enigma2/python/Plugins/SystemPlugins/HdmiCEC/plugin.pyo") SystemInfo["SABSetup"] = fileExists( "/usr/lib/enigma2/python/Plugins/SystemPlugins/SABnzbd/plugin.pyo") SystemInfo["SeekStatePlay"] = False SystemInfo["GraphicLCD"] = getBoxType() == "vuultimo"
def __init__(self, session, destdir="/tmp/"): self.skin = NFIDownload.skin Screen.__init__(self, session) self["job_progressbar"] = Progress() self["job_progresslabel"] = StaticText() self["infolabel"] = StaticText() self["statusbar"] = StaticText() self["label_top"] = StaticText() self["label_bottom"] = StaticText() self["path_bottom"] = StaticText() self["key_green"] = StaticText() self["key_yellow"] = StaticText() self["key_blue"] = StaticText() self["key_red"] = StaticText() self["feedlist"] = Feedlist([ 0, (eListboxPythonMultiContent.TYPE_TEXT, 0, 0, 250, 30, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, "feed not available") ]) self["destlist"] = FileList(destdir, showDirectories=True, showFiles=False) self["destlist"].hide() self.download_container = eConsoleAppContainer() self.nfo = "" self.nfofile = "" self.feedhtml = "" self.focus = None self.download = None self.box = HardwareInfo().get_device_name() self.feed_base = "http://www.dreamboxupdate.com/opendreambox/1.5/%s/images/" % self.box self.nfi_filter = "" # "release" # only show NFIs containing this string, or all if "" self.wizard_mode = False self["actions"] = ActionMap( [ "OkCancelActions", "ColorActions", "DirectionActions", "EPGSelectActions" ], { "cancel": self.closeCB, "red": self.closeCB, "green": self.nfi_download, "yellow": self.switchList, "blue": self.askCreateUSBstick, "prevBouquet": self.switchList, "nextBouquet": self.switchList, "ok": self.ok, "left": self.left, "right": self.right, "up": self.up, "upRepeated": self.up, "downRepeated": self.down, "down": self.down }, -1) self.feed_download()
class VideoHardware: hw_type = HardwareInfo().get_device_name() rates = {} # high-level, use selectable modes. modes = {} # a list of (high-level) modes for a certain port. rates["PAL"] = { "50Hz": { 50: "pal" }, "60Hz": { 60: "pal60" }, "multi": { 50: "pal", 60: "pal60" } } rates["NTSC"] = {"60Hz": {60: "ntsc"}} rates["Multi"] = {"multi": {50: "pal", 60: "ntsc"}} rates["480i"] = {"60Hz": {60: "480i"}} rates["576i"] = {"50Hz": {50: "576i"}} rates["480p"] = {"60Hz": {60: "480p"}} rates["576p"] = {"50Hz": {50: "576p"}} if about.getChipSetString().find('7335') != -1 or about.getChipSetString( ).find('7358') != -1 or about.getChipSetString().find( '7356') != -1 or about.getChipSetString().find( '7405') != -1 or about.getChipSetString().find('7424') != -1: rates["720p"] = { "24Hz": { 24: "720p24" }, "25Hz": { 25: "720p25" }, "30Hz": { 30: "720p30" }, "50Hz": { 50: "720p50" }, "60Hz": { 60: "720p" }, "multi": { 50: "720p50", 60: "720p" } } else: rates["720p"] = { "50Hz": { 50: "720p50" }, "60Hz": { 60: "720p" }, "multi": { 50: "720p50", 60: "720p" } } rates["1080i"] = { "50Hz": { 50: "1080i50" }, "60Hz": { 60: "1080i" }, "multi": { 50: "1080i50", 60: "1080i" } } if about.getChipSetString().find( '7405') != -1 or about.getChipSetString().find('7335') != -1: rates["1080p"] = { "24Hz": { 24: "1080p24" }, "25Hz": { 25: "1080p25" }, "30Hz": { 30: "1080p30" } } elif about.getChipSetString().find('7358') != -1 or about.getChipSetString( ).find('7356') != -1 or about.getChipSetString().find('7424') != -1: rates["1080p"] = { "24Hz": { 24: "1080p24" }, "25Hz": { 25: "1080p25" }, "30Hz": { 30: "1080p30" }, "50Hz": { 50: "1080p50" }, "60Hz": { 60: "1080p" }, "multi": { 50: "1080p50", 60: "1080p" } } elif hw_type == 'elite' or hw_type == 'premium' or hw_type == 'premium+' or hw_type == 'ultra' or hw_type == "me" or hw_type == "minime": rates["1080p"] = { "50Hz": { 50: "1080p50" }, "60Hz": { 60: "1080p" }, "23Hz": { 23: "1080p" }, "24Hz": { 24: "1080p" }, "25Hz": { 25: "1080p" }, "30Hz": { 30: "1080p" }, "multi": { 50: "1080p50", 60: "1080p" } } rates["PC"] = { "1024x768": { 60: "1024x768" }, # not possible on DM7025 "800x600": { 60: "800x600" }, # also not possible "720x480": { 60: "720x480" }, "720x576": { 60: "720x576" }, "1280x720": { 60: "1280x720" }, "1280x720 multi": { 50: "1280x720_50", 60: "1280x720" }, "1920x1080": { 60: "1920x1080" }, "1920x1080 multi": { 50: "1920x1080", 60: "1920x1080_50" }, "1280x1024": { 60: "1280x1024" }, "1366x768": { 60: "1366x768" }, "1366x768 multi": { 50: "1366x768", 60: "1366x768_50" }, "1280x768": { 60: "1280x768" }, "640x480": { 60: "640x480" } } modes["Scart"] = ["PAL", "NTSC", "Multi"] modes["DVI-PC"] = ["PC"] if hw_type == 'elite' or hw_type == 'premium' or hw_type == 'premium+' or hw_type == 'ultra' or hw_type == "me" or hw_type == "minime": config.av.edid_override = True if about.getChipSetString().find('7335') != -1 or about.getChipSetString( ).find('7358') != -1 or about.getChipSetString( ).find('7356') != -1 or about.getChipSetString( ).find('7405') != -1 or about.getChipSetString().find( '7424' ) != -1 or hw_type == 'elite' or hw_type == 'premium' or hw_type == 'premium+' or hw_type == 'ultra' or hw_type == "me" or hw_type == "minime": modes["YPbPr"] = [ "720p", "1080i", "1080p", "576p", "480p", "576i", "480i" ] modes["DVI"] = [ "720p", "1080i", "1080p", "576p", "480p", "576i", "480i" ] widescreen_modes = set(["720p", "1080i", "1080p"]) else: modes["YPbPr"] = ["720p", "1080i", "576p", "480p", "576i", "480i"] modes["DVI"] = ["720p", "1080i", "576p", "480p", "576i", "480i"] widescreen_modes = set(["720p", "1080i"]) if boxtype.startswith('vu') or boxtype == 'dm500hd' or boxtype == 'dm800': if about.getChipSetString( ).find('7358') != -1 or about.getChipSetString().find( '7356') != -1 or about.getChipSetString().find('7424') != -1: modes["Scart-YPbPr"] = [ "720p", "1080i", "1080p", "576p", "480p", "576i", "480i" ] else: modes["Scart-YPbPr"] = [ "720p", "1080i", "576p", "480p", "576i", "480i" ] def getOutputAspect(self): ret = (16, 9) port = config.av.videoport.getValue() if port not in config.av.videomode: print "current port not available in getOutputAspect!!! force 16:9" else: mode = config.av.videomode[port].getValue() force_widescreen = self.isWidescreenMode(port, mode) is_widescreen = force_widescreen or config.av.aspect.getValue( ) in ("16_9", "16_10") is_auto = config.av.aspect.getValue() == "auto" if is_widescreen: if force_widescreen: pass else: aspect = { "16_9": "16:9", "16_10": "16:10" }[config.av.aspect.getValue()] if aspect == "16:10": ret = (16, 10) elif is_auto: try: aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read() if aspect_str == "1": # 4:3 ret = (4, 3) except IOError: pass else: # 4:3 ret = (4, 3) return ret def __init__(self): self.last_modes_preferred = [] self.on_hotplug = CList() self.current_mode = None self.current_port = None self.readAvailableModes() if self.modes.has_key("DVI-PC") and not self.getModeList("DVI-PC"): print "remove DVI-PC because of not existing modes" del self.modes["DVI-PC"] if boxtype in ('et4x00', 'xp1000', 'tm2t', 'tmsingle', 'vusolo2', 'tmnano', 'iqonios300hd', 'odinm7', 'e3hd', 'dm500hdv2', 'dm500hd', 'dm800', 'ebox7358', 'eboxlumi', 'ebox5100', 'ixusszero', 'optimussos1') or (about.getModelString() == 'ini-3000'): del self.modes["YPbPr"] if hw_type in ('elite', 'premium', 'premium+', 'ultra', "me", "minime"): self.readPreferredModes() self.createConfig() self.readPreferredModes() # take over old AVSwitch component :) from Components.AVSwitch import AVSwitch config.av.aspectratio.notifiers = [] config.av.tvsystem.notifiers = [] config.av.wss.notifiers = [] AVSwitch.getOutputAspect = self.getOutputAspect config.av.aspect.addNotifier(self.updateAspect) config.av.wss.addNotifier(self.updateAspect) config.av.policy_169.addNotifier(self.updateAspect) config.av.policy_43.addNotifier(self.updateAspect) def readAvailableModes(self): try: f = open("/proc/stb/video/videomode_choices") modes = f.read()[:-1] f.close() except IOError: print "couldn't read available videomodes." self.modes_available = [] return self.modes_available = modes.split(' ') def readPreferredModes(self): try: f = open("/proc/stb/video/videomode_preferred") modes = f.read()[:-1] f.close() self.modes_preferred = modes.split(' ') except IOError: print "reading preferred modes failed, using all modes" self.modes_preferred = self.modes_available if self.modes_preferred != self.last_modes_preferred: self.last_modes_preferred = self.modes_preferred print "hotplug on dvi" self.on_hotplug("DVI") # must be DVI # check if a high-level mode with a given rate is available. def isModeAvailable(self, port, mode, rate): rate = self.rates[mode][rate] for mode in rate.values(): ##### Only for test ##### if port == "DVI": if hw_type in ('elite', 'premium', 'premium+', 'ultra', "me", "minime"): if mode not in self.modes_preferred and not config.av.edid_override.value: print "no, not preferred" return False ##### Only for test ##### if mode not in self.modes_available: return False return True def isWidescreenMode(self, port, mode): return mode in self.widescreen_modes def setMode(self, port, mode, rate, force=None): print "setMode - port:", port, "mode:", mode, "rate:", rate config.av.videoport.setValue(port) # [iq] # we can ignore "port" self.current_mode = mode self.current_port = port modes = self.rates[mode][rate] mode_50 = modes.get(50) mode_60 = modes.get(60) if mode_50 is None or force == 60: mode_50 = mode_60 if mode_60 is None or force == 50: mode_60 = mode_50 try: mode_etc = None if rate == "24Hz" or rate == "25Hz" or rate == "30Hz": mode_etc = modes.get(int(rate[:2])) f = open("/proc/stb/video/videomode", "w") f.write(mode_etc) f.close() # not support 50Hz, 60Hz for 1080p else: f = open("/proc/stb/video/videomode_50hz", "w") f.write(mode_50) f.close() f = open("/proc/stb/video/videomode_60hz", "w") f.write(mode_60) f.close() except IOError: try: # fallback if no possibility to setup 50/60 hz mode f = open("/proc/stb/video/videomode", "w") f.write(mode_50) f.close() except IOError: print "setting videomode failed." try: if rate == "24Hz" or rate == "25Hz" or rate == "30Hz": mode_etc = modes.get(int(rate[:2])) f = open("/proc/stb/video/videomode", "w") f.write(mode_etc) f.close() else: # fallback if no possibility to setup 50/60 hz mode f = open("/proc/stb/video/videomode", "w") f.write(mode_50) f.close() except IOError: print "writing initial videomode to /etc/videomode failed." self.updateAspect(None) def saveMode(self, port, mode, rate): print "saveMode", port, mode, rate config.av.videoport.setValue(port) config.av.videoport.save() if port in config.av.videomode: config.av.videomode[port].setValue(mode) config.av.videomode[port].save() if mode in config.av.videorate: config.av.videorate[mode].setValue(rate) config.av.videorate[mode].save() def isPortAvailable(self, port): # fixme return True def isPortUsed(self, port): if port == "DVI": self.readPreferredModes() return len(self.modes_preferred) != 0 else: return True def getPortList(self): return [port for port in self.modes if self.isPortAvailable(port)] # get a list with all modes, with all rates, for a given port. def getModeList(self, port): print "getModeList for port", port res = [] for mode in self.modes[port]: # list all rates which are completely valid rates = [ rate for rate in self.rates[mode] if self.isModeAvailable(port, mode, rate) ] # if at least one rate is ok, add this mode if len(rates): res.append((mode, rates)) return res def createConfig(self, *args): hw_type = HardwareInfo().get_device_name() has_hdmi = HardwareInfo().has_hdmi() lst = [] config.av.videomode = ConfigSubDict() config.av.videorate = ConfigSubDict() # create list of output ports portlist = self.getPortList() for port in portlist: descr = port if descr == 'DVI' and has_hdmi: descr = 'HDMI' elif descr == 'DVI-PC' and has_hdmi: descr = 'HDMI-PC' lst.append((port, descr)) # create list of available modes modes = self.getModeList(port) if len(modes): config.av.videomode[port] = ConfigSelection( choices=[mode for (mode, rates) in modes]) for (mode, rates) in modes: config.av.videorate[mode] = ConfigSelection(choices=rates) config.av.videoport = ConfigSelection(choices=lst) def setColorFormatAsPort(configElement): if configElement.getValue() == "YPbPr" or configElement.getValue( ) == "Scart-YPbPr": config.av.colorformat.setValue("yuv") config.av.videoport.addNotifier(setColorFormatAsPort) def setConfiguredMode(self): port = config.av.videoport.getValue() if port not in config.av.videomode: print "current port not available, not setting videomode" return mode = config.av.videomode[port].getValue() if mode not in config.av.videorate: print "current mode not available, not setting videomode" return rate = config.av.videorate[mode].getValue() self.setMode(port, mode, rate) def updateAspect(self, cfgelement): # determine aspect = {any,4:3,16:9,16:10} # determine policy = {bestfit,letterbox,panscan,nonlinear} # based on; # config.av.videoport.getValue(): current video output device # Scart: # config.av.aspect: # 4_3: use policy_169 # 16_9,16_10: use policy_43 # auto always "bestfit" # config.av.policy_169 # letterbox use letterbox # panscan use panscan # scale use bestfit # config.av.policy_43 # pillarbox use panscan # panscan use letterbox ("panscan" is just a bad term, it's inverse-panscan) # nonlinear use nonlinear # scale use bestfit port = config.av.videoport.getValue() if port not in config.av.videomode: print "current port not available, not setting videomode" return mode = config.av.videomode[port].getValue() force_widescreen = self.isWidescreenMode(port, mode) is_widescreen = force_widescreen or config.av.aspect.getValue() in ( "16_9", "16_10") is_auto = config.av.aspect.getValue() == "auto" policy2 = "policy" # use main policy if is_widescreen: if force_widescreen: aspect = "16:9" else: aspect = { "16_9": "16:9", "16_10": "16:10" }[config.av.aspect.getValue()] policy_choices = { "pillarbox": "panscan", "panscan": "letterbox", "nonlinear": "nonlinear", "scale": "bestfit" } if path.exists("/proc/stb/video/policy_choices"): f = open("/proc/stb/video/policy_choices") if "auto" in f.readline(): policy_choices.update({"auto": "auto"}) else: policy_choices.update({"auto": "bestfit"}) f.close() policy = policy_choices[config.av.policy_43.getValue()] policy2_choices = { "letterbox": "letterbox", "panscan": "panscan", "scale": "bestfit" } if path.exists("/proc/stb/video/policy2_choices"): f = open("/proc/stb/video/policy2_choices") if "auto" in f.readline(): policy2_choices.update({"auto": "auto"}) else: policy2_choices.update({"auto": "bestfit"}) f.close() policy2 = policy2_choices[config.av.policy_169.getValue()] elif is_auto: aspect = "any" policy = "bestfit" else: aspect = "4:3" policy = { "letterbox": "letterbox", "panscan": "panscan", "scale": "bestfit", "auto": "bestfit" }[config.av.policy_169.getValue()] if not config.av.wss.getValue(): wss = "auto(4:3_off)" else: wss = "auto" print "-> setting aspect: %s, policy: %s, policy2: %s, wss: %s" % ( aspect, policy, policy2, wss) f = open("/proc/stb/video/aspect", "w") f.write(aspect) f.close() f = open("/proc/stb/video/policy", "w") f.write(policy) f.close() f = open("/proc/stb/denc/0/wss", "w") f.write(wss) f.close() try: f = open("/proc/stb/video/policy2", "w") f.write(policy2) f.close() except IOError: pass
try: file = open("/proc/stb/info/chipset", "r") chipset = file.readline().strip() file.close() except: chipset = "unknown" try: file = open("/proc/stb/info/boxtype", "r") model = file.readline().strip() file.close() except: model = "unknown" has_rca = False hw_type = HardwareInfo().get_device_name() if getBoxType() == 'gbquad' or getBoxType( ) == 'et5x00' or model == 'et6000' or getBoxType() == 'e3hd' or getBoxType( ) == 'odinm6' or getMachineName() == 'AX-Odin' or getBoxType( ) == 'ebox7358' or getBoxType( ) == 'tmnano' or hw_type == 'ultra' or hw_type == "me" or hw_type == "minime" or getBoxType( ) == 'optimussos1' or getBoxType() == 'optimussos2' or getBoxType( ) == 'gb800seplus' or getBoxType( ) == 'gb800ueplus' or model == 'ini-1000ru' or model == 'ini-1000sv': has_rca = True class VideoWizardSummary(WizardSummary): skin = ( """<screen name="VideoWizardSummary" position="0,0" size="132,64" id="1"> <widget name="text" position="6,4" size="120,40" font="Regular;12" transparent="1" />
DONATE = "http://bit.ly/seriespluginpaypal" TERMS = "http://www.serienserver.de" ABOUT = "\n " + NAME + " " + VERSION + "\n\n" \ + _(" (C) 2012 by betonme @ IHAD \n\n") \ + _(" Terms: ") + TERMS + "\n\n" \ + _(" {lookups:d} successful lookups.\n") \ + _(" How much time have You saved?\n\n") \ + _(" Support: ") + SUPPORT + "\n" \ + _(" Feel free to donate. \n") \ + _(" PayPal: ") + DONATE USER_AGENT = "Enigma2-" + NAME try: from Tools.HardwareInfo import HardwareInfo DEVICE = HardwareInfo().get_device_name().strip() except: DEVICE = '' REQUEST_PARAMETER = "?device=" + DEVICE + "&version=SP" + VERSION WHERE_EPGMENU = 'WHERE_EPGMENU' WHERE_CHANNELMENU = 'WHERE_CHANNELMENU' def buildURL(url): if config.plugins.seriesplugin.proxy_url.value: return config.plugins.seriesplugin.proxy_url.value + REQUEST_PARAMETER + "&url=" + url else: return url
def getLatestImageTimestamp(self): currentTimeoutDefault = socket.getdefaulttimeout() socket.setdefaulttimeout(3) try: # TODO: Use Twisted's URL fetcher, urlopen is evil. And it can # run in parallel to the package update. from time import strftime from datetime import datetime imageVersion = about.getImageTypeString().split(" ")[1] imageVersion = (int(imageVersion) < 5 and "%.1f" or "%s") % int(imageVersion) latestImageTimestamp = datetime.fromtimestamp(int(urlopen("http://openpli.org/download/timestamp/%s~%s" % (HardwareInfo().get_device_model(), imageVersion)).read())).strftime(_("%Y-%m-%d %H:%M")) except: latestImageTimestamp = "" socket.setdefaulttimeout(currentTimeoutDefault) return latestImageTimestamp
class AC3delay: def __init__(self): self.iService = None self.iServiceReference = None self.iAudioDelay = None self.channelAudio = AC3 self.whichAudio = AC3 self.bIsRecording = False # Current audio- delay self.systemDelay = {} self.getAudioInformation() self.activateTimer = eTimer() self.activateTimer.callback.append(self.activateDelay) self.activateWait = config.plugins.AC3LipSync.activationDelay.getValue( ) # Current value for movie start behaviour self.movieStart = config.usage.on_movie_start.getValue() # find out box type self.oHWInfo = HardwareInfo() self.bHasToRestartService = self.oHWInfo.get_device_name() == "dm7025" def initAudio(self): self.iService = NavigationInstance.instance.getCurrentService() self.iServiceReference = NavigationInstance.instance.getCurrentlyPlayingServiceReference( ) self.iAudioDelay = self.iService and self.iService.audioDelay() self.iSeek = self.iService and self.iService.seek() def deleteAudio(self): self.iService = None self.iAudioDelay = None self.iSeek = None def setChannelAudio(self, sAudio): self.channelAudio = sAudio def delayedActivateDelay(self): if self.activateTimer.isActive: self.activateTimer.stop() self.activateTimer.start(self.activateWait, False) def activateDelay(self): # This activation code is only neccessary for DM7025. # DM800, DM8000 and DM500HD directly activate the delay after using "setAC3Delay" and "setPCMDelay", they don't need the service restart if self.activateTimer.isActive: self.activateTimer.stop() if self.bHasToRestartService == True: bInitialized = False if self.iService == None: self.initAudio() bInitialized = True if self.iServiceReference is not None: lCurPosition = self.cueGetCurrentPosition() self.deleteAudio() if self.whichAudio == self.channelAudio: config.usage.on_movie_start.setValue("beginning") NavigationInstance.instance.stopService() NavigationInstance.instance.playService( self.iServiceReference) config.usage.on_movie_start.setValue(self.movieStart) if lCurPosition is not None: self.lCurPosition = lCurPosition self.timer = eTimer() self.timer.callback.append(self.seekAfterWait) self.timer.start(200, False) else: self.deleteAudio() def seekAfterWait(self): self.timer.stop() self.initAudio() if self.iSeek is not None: self.iSeek.seekTo(self.lCurPosition) self.deleteAudio() def cueGetCurrentPosition(self): if self.iSeek is None: return None r = self.iSeek.getPlayPosition() if r[0]: return None return long(r[1]) def getSystemDelay(self, sAudio): bInitialized = False if self.iService == None: self.initAudio() bInitialized = True iDelay = 0 if self.iAudioDelay is not None: if sAudio == AC3: iDelay = self.iAudioDelay.getAC3Delay() elif sAudio == PCM: iDelay = self.iAudioDelay.getPCMDelay() elif sAudio == AC3GLOB: iDelay = config.av.generalAC3delay.getValue() else: iDelay = config.av.generalPCMdelay.getValue() if bInitialized == True: self.deleteAudio() if iDelay == -1: iDelay = 0 return iDelay def setSystemDelay(self, sAudio, iDelay, bDelayStart): bInitialized = False if self.iService == None: self.initAudio() bInitialized = True if self.iAudioDelay is not None: iDelayLameDb = iDelay if iDelayLameDb == 0: iDelayLameDb = -1 if sAudio == AC3: self.iAudioDelay.setAC3Delay(iDelayLameDb) elif sAudio == PCM: self.iAudioDelay.setPCMDelay(iDelayLameDb) elif sAudio == AC3GLOB: config.av.generalAC3delay.setValue(iDelay) config.av.generalAC3delay.save() #Setting the global delay does not activate it, so now we call setAC3Delay to activate the new delay.. self.iAudioDelay.setAC3Delay(self.systemDelay[AC3]) else: config.av.generalPCMdelay.setValue(iDelay) config.av.generalPCMdelay.save() #Setting the global delay does not activate it, so now we call setPCMDelay to activate the new delay.. self.iAudioDelay.setPCMDelay(self.systemDelay[PCM]) if bInitialized == True: self.deleteAudio() if bDelayStart == True: self.delayedActivateDelay() else: self.activateDelay() def getAudioInformation(self): bInitialized = False if self.iService == None: self.initAudio() bInitialized = True # check if we are in a recording lCurPosition = self.cueGetCurrentPosition() if lCurPosition is not None: self.bIsRecording = True # check if downmix is enabled try: bDownmixEnabled = config.av.downmix_ac3.value except: bDownmixEnabled = False oAudioTracks = self.iService and self.iService.audioTracks() n = oAudioTracks and oAudioTracks.getNumberOfTracks() or 0 tlist = [] self.selectedAudioInfo = ("", 0) self.selectedAudioIndex = None if n > 0: self.selectedAudioIndex = oAudioTracks.getCurrentTrack() for x in range(n): i = oAudioTracks.getTrackInfo(x) language = i.getLanguage() description = i.getDescription() if language in LanguageCodes: language = LanguageCodes[language][0] if len(description): description += " (" + language + ")" else: description = language tlist.append((description, x)) if x == self.selectedAudioIndex: if ((description.find("AC3") != -1 or description.find("AC-3") != -1) and not bDownmixEnabled ) or description.find("DTS") != -1: self.whichAudio = AC3 self.channelAudio = AC3 else: self.whichAudio = PCM self.channelAudio = PCM self.selectedAudioInfo = (description, x) tlist.sort(key=lambda x: x[0]) self.audioTrackList = tlist for sAudio in AC3PCM: self.systemDelay[sAudio] = self.getSystemDelay(sAudio) del oAudioTracks if bInitialized == True: self.deleteAudio()
class AVSwitch(): hw_type = HardwareInfo().get_device_name() rates = {} modes = {} rates['PAL'] = { '50Hz': { 50: 'pal' }, '60Hz': { 60: 'pal60' }, 'multi': { 50: 'pal', 60: 'pal60' } } rates['NTSC'] = {'60Hz': {60: 'ntsc'}} rates['Multi'] = {'multi': {50: 'pal', 60: 'ntsc'}} rates['480i'] = {'60Hz': {60: '480i'}} rates['576i'] = {'50Hz': {50: '576i'}} rates['480p'] = {'60Hz': {60: '480p'}} rates['576p'] = {'50Hz': {50: '576p'}} rates['720p'] = { '50Hz': { 50: '720p50' }, '60Hz': { 60: '720p' }, 'multi': { 50: '720p50', 60: '720p' } } rates['1080i'] = { '50Hz': { 50: '1080i50' }, '60Hz': { 60: '1080i' }, 'multi': { 50: '1080i50', 60: '1080i' } } rates['1080p'] = { '50Hz': { 50: '1080p50' }, '60Hz': { 60: '1080p' }, 'multi': { 50: '1080p50', 60: '1080p' } } rates['PC'] = { '1024x768': { 60: '1024x768' }, '800x600': { 60: '800x600' }, '720x480': { 60: '720x480' }, '720x576': { 60: '720x576' }, '1280x720': { 60: '1280x720' }, '1280x720 multi': { 50: '1280x720_50', 60: '1280x720' }, '1920x1080': { 60: '1920x1080' }, '1920x1080 multi': { 50: '1920x1080', 60: '1920x1080_50' }, '1280x1024': { 60: '1280x1024' }, '1366x768': { 60: '1366x768' }, '1366x768 multi': { 50: '1366x768', 60: '1366x768_50' }, '1280x768': { 60: '1280x768' }, '640x480': { 60: '640x480' } } modes['Scart'] = ['PAL', 'NTSC', 'Multi'] if hw_type in ('elite', 'premium', 'premium+', 'ultra', 'me', 'minime'): config.av.edid_override = True if about.getChipSetString() in ('7241', '7358', '7362', '7346', '7356', '7424', '7425', '7435', 'pnx8493', '7162', '7111') or hw_type in ('elite', 'premium', 'premium+', 'ultra', 'me', 'minime'): modes['HDMI'] = [ '720p', '1080p', '1080i', '576p', '576i', '480p', '480i' ] widescreen_modes = {'720p', '1080p', '1080i'} else: modes['HDMI'] = ['720p', '1080i', '576p', '576i', '480p', '480i'] widescreen_modes = {'720p', '1080i'} modes['YPbPr'] = modes['HDMI'] if getBoxType().startswith('vu') or getBoxType() in ('dm500hd', 'dm800'): modes['Scart-YPbPr'] = modes['HDMI'] if modes.has_key('YPbPr') and getBoxType( ) in ('cloudibox3se', 'xpeedlxcs2', 'xpeedlxcc', 'osmini', 'gbx1', 'gbx3', 'sf3038', 'spycat', 'bwidowx', 'bwidowx2', 'fegasusx3', 'fegasusx5s', 'fegasusx5t', 'force2', 'force2plus', 'optimussos', 'tmnanose', 'tmnanocombo', 'zgemmash1', 'zgemmash2', 'zgemmas2s', 'zgemmass', 'mago', 'enibox', 'sf108', 'x1plus', 'xcombo', 'mutant1100', 'mutant1200', 'mutant500c', 'et4x00', 'et7500', 'et7000', 'et8500', 'et8500s', 'xp1000mk', 'xp1000max', 'xp1000plus', 'sf8', 'tm2t', 'tmsingle', 'vusolo2', 'tmnano', 'iqonios300hd', 'iqonios300hdv2', 'classm', 'axodin', 'axodinc', 'genius', 'evo', 'galaxym6', 'geniuse3hd', 'evoe3hd', 'axase3', 'axase3c', 'dm500hdv2', 'dm500hd', 'dm800', 'mixosf7', 'mixoslumi', 'mixosf5mini', 'gi9196lite', 'ixusszero', 'optimussos1', 'enfinity', 'marvel1', 'bre2ze', 'sezam1000hd', 'mbmini', 'atemio5x00', 'xpeedlx1', 'xpeedlx2', 'vusolose', 'gbipbox', 'formuler3', 'optimussos3plus', 'force1plus', 'vuzero', 'vizyonvita') or about.getModelString() == 'ini-3000': del modes['YPbPr'] if modes.has_key('Scart') and getBoxType() in ('fusionhd', 'force2', 'force2plus', 'optimussos', 'tmnanose', 'tmnanosecombo', 'gbx1', 'gbx3'): del modes['Scart'] if getBoxType() in 'mutant2400': f = open('/proc/stb/info/board_revision', 'r').read() if f >= '2': del modes['YPbPr'] def __init__(self): self.last_modes_preferred = [] self.on_hotplug = CList() self.current_mode = None self.current_port = None self.readAvailableModes() self.createConfig() self.readPreferredModes() return def readAvailableModes(self): try: f = open('/proc/stb/video/videomode_choices') modes = f.read()[:-1] f.close() except IOError: print "couldn't read available videomodes." self.modes_available = [] return self.modes_available = modes.split(' ') def readPreferredModes(self): try: f = open('/proc/stb/video/videomode_preferred') modes = f.read()[:-1] f.close() self.modes_preferred = modes.split(' ') except IOError: print 'reading preferred modes failed, using all modes' self.modes_preferred = self.modes_available if self.modes_preferred != self.last_modes_preferred: self.last_modes_preferred = self.modes_preferred self.on_hotplug('HDMI') def isModeAvailable(self, port, mode, rate): rate = self.rates[mode][rate] for mode in rate.values(): if port == 'DVI': if hw_type in ('elite', 'premium', 'premium+', 'ultra', 'me', 'minime'): if mode not in self.modes_preferred and not config.av.edid_override.value: print 'no, not preferred' return False if mode not in self.modes_available: return False return True def isWidescreenMode(self, port, mode): return mode in self.widescreen_modes def setMode(self, port, mode, rate, force=None): print '[VideoMode] setMode - port: %s, mode: %s, rate: %s' % ( port, mode, rate) self.current_mode = mode self.current_port = port modes = self.rates[mode][rate] mode_50 = modes.get(50) mode_60 = modes.get(60) if mode_50 is None or force == 60: mode_50 = mode_60 if mode_60 is None or force == 50: mode_60 = mode_50 mode_etc = None if os.path.exists('/proc/stb/video/videomode_50hz') and getBoxType( ) not in ('gb800solo', 'gb800se', 'gb800ue'): f = open('/proc/stb/video/videomode_50hz', 'w') f.write(mode_50) f.close() if os.path.exists('/proc/stb/video/videomode_60hz') and getBoxType( ) not in ('gb800solo', 'gb800se', 'gb800ue'): try: f = open('/proc/stb/video/videomode_60hz', 'w') f.write(mode_60) f.close() except IOError: print 'setting videomode failed.' try: mode_etc = modes.get(int(rate[:2])) f = open('/proc/stb/video/videomode', 'w') f.write(mode_etc) f.close() except: try: f = open('/proc/stb/video/videomode', 'w') f.write(mode_50) f.close() except IOError: print 'setting videomode failed.' map = {'cvbs': 0, 'rgb': 1, 'svideo': 2, 'yuv': 3} self.setColorFormat(map[config.av.colorformat.value]) if about.getCPUString().startswith('STx'): from enigma import gMainDC gMainDC.getInstance().setResolution(-1, -1) return def saveMode(self, port, mode, rate): config.av.videoport.setValue(port) config.av.videoport.save() if port in config.av.videomode: config.av.videomode[port].setValue(mode) config.av.videomode[port].save() if mode in config.av.videorate: config.av.videorate[mode].setValue(rate) config.av.videorate[mode].save() def isPortAvailable(self, port): return True def isPortUsed(self, port): if port == 'HDMI': self.readPreferredModes() return len(self.modes_preferred) != 0 else: return True def getPortList(self): return [port for port in self.modes if self.isPortAvailable(port)] def getModeList(self, port): res = [] for mode in self.modes[port]: rates = [ rate for rate in self.rates[mode] if self.isModeAvailable(port, mode, rate) ] if len(rates): res.append((mode, rates)) return res def createConfig(self, *args): hw_type = HardwareInfo().get_device_name() has_hdmi = HardwareInfo().has_hdmi() lst = [] config.av.videomode = ConfigSubDict() config.av.videorate = ConfigSubDict() portlist = self.getPortList() for port in portlist: descr = port if 'HDMI' in port: lst.insert(0, (port, descr)) else: lst.append((port, descr)) modes = self.getModeList(port) if len(modes): config.av.videomode[port] = ConfigSelection( choices=[mode for mode, rates in modes]) for mode, rates in modes: config.av.videorate[mode] = ConfigSelection(choices=rates) config.av.videoport = ConfigSelection(choices=lst) def setInput(self, input): INPUT = {'ENCODER': 0, 'SCART': 1, 'AUX': 2} eAVSwitch.getInstance().setInput(INPUT[input]) def setColorFormat(self, value): if not self.current_port: self.current_port = config.av.videoport.value if self.current_port in ('YPbPr', 'Scart-YPbPr'): eAVSwitch.getInstance().setColorFormat(3) elif self.current_port in 'RCA': eAVSwitch.getInstance().setColorFormat(0) else: eAVSwitch.getInstance().setColorFormat(value) def setConfiguredMode(self): port = config.av.videoport.value if port not in config.av.videomode: print 'current port not available, not setting videomode' return mode = config.av.videomode[port].value if mode not in config.av.videorate: print 'current mode not available, not setting videomode' return rate = config.av.videorate[mode].value self.setMode(port, mode, rate) def setAspect(self, cfgelement): print '[VideoMode] setting aspect: %s' % cfgelement.value f = open('/proc/stb/video/aspect', 'w') f.write(cfgelement.value) f.close() def setWss(self, cfgelement): if not cfgelement.value: wss = 'auto(4:3_off)' else: wss = 'auto' if os.path.exists('/proc/stb/denc/0/wss'): print '[VideoMode] setting wss: %s' % wss f = open('/proc/stb/denc/0/wss', 'w') f.write(wss) f.close() def setPolicy43(self, cfgelement): print '[VideoMode] setting policy: %s' % cfgelement.value f = open('/proc/stb/video/policy', 'w') f.write(cfgelement.value) f.close() def setPolicy169(self, cfgelement): if os.path.exists('/proc/stb/video/policy2'): print '[VideoMode] setting policy2: %s' % cfgelement.value f = open('/proc/stb/video/policy2', 'w') f.write(cfgelement.value) f.close() def getOutputAspect(self): ret = (16, 9) port = config.av.videoport.value if port not in config.av.videomode: print 'current port not available in getOutputAspect!!! force 16:9' else: mode = config.av.videomode[port].value force_widescreen = self.isWidescreenMode(port, mode) is_widescreen = force_widescreen or config.av.aspect.value in ( '16:9', '16:10') is_auto = config.av.aspect.value == 'auto' if is_widescreen: if force_widescreen: pass else: aspect = { '16:9': '16:9', '16:10': '16:10' }[config.av.aspect.value] if aspect == '16:10': ret = (16, 10) elif is_auto: try: aspect_str = open('/proc/stb/vmpeg/0/aspect', 'r').read() if aspect_str == '1': ret = (4, 3) except IOError: pass else: ret = (4, 3) return ret def getFramebufferScale(self): aspect = self.getOutputAspect() fb_size = getDesktop(0).size() return (aspect[0] * fb_size.height(), aspect[1] * fb_size.width()) def setAspectRatio(self, value): pass def getAspectRatioSetting(self): valstr = config.av.aspectratio.value if valstr == '4_3_letterbox': val = 0 elif valstr == '4_3_panscan': val = 1 elif valstr == '16_9': val = 2 elif valstr == '16_9_always': val = 3 elif valstr == '16_10_letterbox': val = 4 elif valstr == '16_10_panscan': val = 5 elif valstr == '16_9_letterbox': val = 6 return val
def getUserfriendlyDeviceName(self, dev, phys): dev, part = self.splitDeviceName(dev) description = "External Storage %s" % dev have_model_descr = False try: description = readFile("/sys" + phys + "/model") have_model_descr = True except IOError, s: print "couldn't read model: ", s from Tools.HardwareInfo import HardwareInfo if dev.find('sr') == 0 and dev[2].isdigit(): devicedb = DEVICEDB_SR else: devicedb = DEVICEDB for physdevprefix, pdescription in devicedb.get( HardwareInfo().device_name, {}).items(): if phys.startswith(physdevprefix): if have_model_descr: description = pdescription + ' - ' + description else: description = pdescription # not wholedisk and not partition 1 if part and part != 1: description += " (Partition %d)" % part return description def addMountedPartition(self, device, desc): already_mounted = False for x in self.partitions[:]: if x.mountpoint == device: already_mounted = True
def confirm(self, confirmed): if not confirmed: print "not confirmed" self.close() else: var = self["list"].getSelectionIndex() self.rcuv = self.rcuval[var] #if self.rcuv != self.rcuold: copy keymap try: if self.rcuv == 'WeTek Play2 RCU': os.system( "cp -f /etc/amremote/wetek_play2.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'WeTek Play (Classic) RCU': os.system( "cp -f /etc/amremote/wetek1.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'WeTek Play OpenElec RCU': os.system( "cp -f /etc/amremote/wetek3.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'AB IPBox 9900/99/55 HD RCU': os.system( "cp -f /etc/amremote/wetek_ipbox9900remote.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'Alien2/1 RCU': os.system( "cp -f /etc/amremote/alien2.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'Alien1 old RCU': os.system( "cp -f /etc/amremote/alien.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'GI LX3 RCU': os.system( "cp -f /etc/amremote/gilx3.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'Gigablue 800 UE Plus RCU': os.system( "cp -f /etc/amremote/gb800ueplus.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'Mutant HD2400 RCU': os.system( "cp -f /etc/amremote/wetek_hd2400remote.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'Octagon SF8 RCU': os.system( "cp -f /etc/amremote/octagonsf8.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'Technomate Nano RCU': os.system( "cp -f /etc/amremote/wetek_tmnanoremote.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'xtrend ET10000 RCU': os.system( "cp -f /etc/amremote/wetek_et10000remote.conf /etc/amremote/wetek.conf &" ) elif self.rcuv == 'Zgemma Star RCU': os.system( "cp -f /etc/amremote/zgemmastar.conf /etc/amremote/wetek.conf &" ) else: os.system( "cp -f /etc/amremote/wetek2.conf /etc/amremote/wetek.conf &" ) f = open("/etc/amremote/.choice", "w") f.write(self.rcuv) f.close() os.system("killall -9 remotecfg &") boxime = HardwareInfo().get_device_name() if boxime == 'wetekplay2': fin = file('/etc/amremote/wetek.conf') fout = open('/etc/amremote/wetek_tmp.conf', 'w') for line in fin: if 'work_mode' in line: line = 'work_mode = 0\n' fout.write(line) fout.close() os.system( 'mv -f /etc/amremote/wetek_tmp.conf /etc/amremote/wetek.conf &' ) os.system("/usr/bin/remotecfg /etc/amremote/wetek.conf &") if self.rcuold == "WeTek Play OpenElec RCU" or self.rcuv == "WeTek Play OpenElec RCU": if self.rcuold != self.rcuv: if self.rcuv == 'WeTek Play OpenElec RCU': if getImageDistro() == "openspa": os.system( "cp -f /usr/lib/enigma2/python/Plugins/Extensions/RCUSelect/conf/keymap_OpenELEC.xml /usr/share/enigma2/keymap.xml &" ) else: os.system( "cp -f /usr/lib/enigma2/python/Plugins/Extensions/RCUSelect/conf/keymap.OE.xml /usr/share/enigma2/keymap.xml &" ) else: os.system( "cp -f /usr/lib/enigma2/python/Plugins/Extensions/RCUSelect/conf/keymap.orig.xml /usr/share/enigma2/keymap.xml &" ) os.system("killall -9 enigma2 &") else: os.system( "cp -f /usr/lib/enigma2/python/Plugins/Extensions/RCUSelect/conf/keymap.orig.xml /usr/share/enigma2/keymap.xml &" ) except IOError: print "RCU select failed." self.close()
class StreamServerControl(object): FEATURE_SCENE_DETECTION = HardwareInfo().get_device_name() in [ "dm900", "dm920" ] FEATURE_SLICES = HardwareInfo().get_device_name() in ["dm900", "dm920"] FRAME_RATE_25 = "25" FRAME_RATE_30 = "30" FRAME_RATE_50 = "50" FRAME_RATE_60 = "60" FRAME_RATE_23_976 = "23.976" FRAME_RATE_24 = "24" FRAME_RATE_29_97 = "29.97" FRAME_RATE_59_94 = "59.94" FRAME_RATES = [ FRAME_RATE_23_976, FRAME_RATE_24, FRAME_RATE_25, FRAME_RATE_29_97, FRAME_RATE_30, FRAME_RATE_50, FRAME_RATE_59_94, FRAME_RATE_60 ] FRAME_RATE_LUT = { FRAME_RATE_23_976: "23", FRAME_RATE_24: "24", FRAME_RATE_25: "25", FRAME_RATE_29_97: "29", FRAME_RATE_30: "30", FRAME_RATE_50: "50", FRAME_RATE_59_94: "59", FRAME_RATE_60: "60" } FRAME_RATE_LUT_REVERSE = {v: k for k, v in FRAME_RATE_LUT.iteritems()} LEVELS = [ (str(eStreamServer.LEVEL1_1), _("1.1")), (str(eStreamServer.LEVEL1_2), _("1.2")), (str(eStreamServer.LEVEL1_3), _("1.3")), (str(eStreamServer.LEVEL2_0), _("2.0")), (str(eStreamServer.LEVEL2_1), _("2.1")), (str(eStreamServer.LEVEL2_2), _("2.2")), (str(eStreamServer.LEVEL3_0), _("3.0")), (str(eStreamServer.LEVEL3_1), _("3.1")), #default (str(eStreamServer.LEVEL3_2), _("3.2")), (str(eStreamServer.LEVEL4_0), _("4.0")), (str(eStreamServer.LEVEL4_1), _("4.1")), (str(eStreamServer.LEVEL4_2), _("4.2")), ] PROFILES = [ (str(eStreamServer.PROFILE_MAIN), _("main")), (str(eStreamServer.PROFILE_HIGH), _("high")), ] RES_1080 = (1920, 1080) RES_720 = (1280, 720) RES_PAL = (720, 576) RES_KEY_1080P = "1080p" RES_KEY_720P = "720p" RES_KEY_PAL = "576p" RESOLUTIONS = { "1080p": RES_1080, "720p": RES_720, "576p": RES_PAL, } RESOLUTION_KEY = { RES_1080: "1080p", RES_720: "720p", RES_PAL: "576p", } AUDIO_BITRATE_LIMITS = [32, 448] VIDEO_BITRATE_LIMITS = [256, 20000] PORT_LIMITS = [1, 65535] INPUT_MODES = { str(eStreamServer.INPUT_MODE_LIVE): _("Follow Live"), str(eStreamServer.INPUT_MODE_HDMI_IN): _("HDMI Input"), str(eStreamServer.INPUT_MODE_BACKGROUND): _("TV Services") } ENCODER_TARGET = 2 RTSP_STATE_DISABLED = 0 RTSP_STATE_IDLE = 1 RTSP_STATE_RUNNING = 2 UPSTREAM_STATE_DISABLED = eStreamServer.UPSTREAM_STATE_DISABLED UPSTREAM_STATE_CONNECTING = eStreamServer.UPSTREAM_STATE_CONNECTING UPSTREAM_STATE_WAITING = eStreamServer.UPSTREAM_STATE_WAITING UPSTREAM_STATE_TRANSMITTING = eStreamServer.UPSTREAM_STATE_TRANSMITTING UPSTREAM_STATE_OVERLOAD = eStreamServer.UPSTREAM_STATE_OVERLOAD UPSTREAM_STATE_ADJUSTING = eStreamServer.UPSTREAM_STATE_ADJUSTING READABLE_UPSTREAM_STATE = { UPSTREAM_STATE_DISABLED: _("Disabled"), UPSTREAM_STATE_CONNECTING: _("Connecting"), UPSTREAM_STATE_WAITING: _("Waiting for clients"), UPSTREAM_STATE_TRANSMITTING: _("Transmitting"), UPSTREAM_STATE_OVERLOAD: _("Overload"), UPSTREAM_STATE_ADJUSTING: _("Adjusting Bitrate") } URI_PARAM_REF = "ref" URI_PARAM_VIDEO_BITRATE = "video_bitrate" URI_PARAM_AUDIO_BITRATE = "audio_bitrate" ENCODER_SERVICE_SET = 0 ENCODER_SERVICE_ALREADY_ACTIVE = 1 ENCODER_SERVICE_INVALID_MODE = -1 ENCODER_SERVICE_INVALID = -2 ENCODER_SERVICE_INSUFFICIENT_RESOURCES = -3 def __init__(self): self._streamServer = eStreamServer.getInstance() self.setupConfig() self._encoderService = None self._currentService = None self._availabilityChanged_conn = self._streamServer.availabilityChanged.connect( self._onAvailabilityChanged) self._sourceStateChanged_conn = self._streamServer.sourceStateChanged.connect( self._onSourceStateChanged) self._upstreamStateChanged_conn = self._streamServer.upstreamStateChanged.connect( self._onUpstreamStateChanged) self._upstreamBitrateChanged_conn = self._streamServer.upstreamBitrateChanged.connect( self._onUpstreamBitrateChanged) self._rtspClientCountChanged_conn = self._streamServer.rtspClientCountChanged.connect( self._onRtspClientCountChanged) self._onUriParametersChanged_conn = self._streamServer.uriParametersChanged.connect( self._onUriParametersChanged) self._dbusError_conn = self._streamServer.dbusError.connect( self._onDBusError) self._mediatorStateBeforeStandby = self.config.streamserver.mediator.enabled.value self.onAvailabilityChanged = [] self.onSourceStateChanged = [] self.onUpstreamStateChanged = [] self.onUpstreamBitrateChanged = [] self.onRtspClientCountChanged = [] self.onUriParametersChanged = [] self._isRunning = False def setupConfig(self): #Streamserver base config self.config = Config() self.config.streamserver = ConfigSubsection() self.config.streamserver.source = ConfigSelection( StreamServerControl.INPUT_MODES, default=str(eStreamServer.INPUT_MODE_LIVE)) self.config.streamserver.audioBitrate = ConfigInteger( 96, StreamServerControl.AUDIO_BITRATE_LIMITS) self.config.streamserver.videoBitrate = ConfigInteger( 1500, StreamServerControl.VIDEO_BITRATE_LIMITS) self.config.streamserver.autoBitrate = ConfigOnOff(default=False) self.config.streamserver.resolution = ConfigSelection( StreamServerControl.RESOLUTIONS.keys(), default=StreamServerControl.RES_KEY_PAL) self.config.streamserver.framerate = ConfigSelection( StreamServerControl.FRAME_RATES, default=StreamServerControl.FRAME_RATE_23_976) # extended encoder settings self.config.streamserver.gopLength = ConfigInteger( default=eStreamServer.GOP_LENGTH_AUTO, limits=[ eStreamServer.GOP_LENGTH_MIN, eStreamServer.GOP_LENGTH_MAX ]) self.config.streamserver.gopOnSceneChange = ConfigOnOff(default=False) self.config.streamserver.openGop = ConfigOnOff(default=False) self.config.streamserver.bFrames = ConfigInteger( default=eStreamServer.BFRAMES_DEFAULT, limits=[eStreamServer.BFRAMES_MIN, eStreamServer.BFRAMES_MAX]) self.config.streamserver.pFrames = ConfigInteger( default=eStreamServer.PFRAMES_DEFAULT, limits=[eStreamServer.PFRAMES_MIN, eStreamServer.PFRAMES_MAX]) self.config.streamserver.slices = ConfigInteger( default=eStreamServer.SLICES_DEFAULT, limits=[eStreamServer.SLICES_MIN, eStreamServer.SLICES_MAX]) self.config.streamserver.level = ConfigSelection( StreamServerControl.LEVELS, default=str(eStreamServer.LEVEL_DEFAULT)) self.config.streamserver.profile = ConfigSelection( StreamServerControl.PROFILES, default=str(eStreamServer.PROFILE_DEFAULT)) #servers self.config.streamserver.rtsp = ConfigSubsection() self.config.streamserver.rtsp.enabled = ConfigOnOff(default=False) self.config.streamserver.rtsp.port = ConfigInteger( 554, StreamServerControl.PORT_LIMITS) self.config.streamserver.rtsp.path = ConfigText(default="stream", fixed_size=False) self.config.streamserver.rtsp.user = ConfigText(default="", fixed_size=False) self.config.streamserver.rtsp.password = ConfigPassword(default="") self.config.streamserver.hls = ConfigSubsection() self.config.streamserver.hls.enabled = ConfigOnOff(default=False) self.config.streamserver.hls.path = ConfigText(default="stream", fixed_size=False) self.config.streamserver.hls.user = ConfigText(default="", fixed_size=False) self.config.streamserver.hls.password = ConfigPassword(default="") self.config.streamserver.hls.port = ConfigInteger( 8080, StreamServerControl.PORT_LIMITS) self.config.streamserver.lastservice = ConfigText( default=config.tv.lastservice.value) self.config.streamserver.mediator = ConfigSubsection() self.config.streamserver.mediator.enabled = ConfigOnOff(default=False) self.config.streamserver.mediator.boxid = ConfigText() self.config.streamserver.mediator.boxkey = ConfigText() self.config.streamserver.mediator.streaminggroups = ConfigSubsection() self.config.streamserver.mediator.streaminggroups.member_alias = ConfigText( default="dreambox", fixed_size=False) self.config.streamserver.mediator.streaminggroups.stream_alias = ConfigText( default="", fixed_size=False) self.config.streamserver.mediator.streaminggroups.hide_empty = ConfigYesNo( default=False) self.config.streamserver.client = ConfigSubsection() self.config.streamserver.client.boxid = ConfigText(default="", fixed_size=False) self.config.streamserver.client.boxkey = ConfigText(default="", fixed_size=False) self.loadConfig() def loadConfig(self): #Streamserver base config self.config.streamserver.source.value = str( self._streamServer.inputMode()) self.config.streamserver.audioBitrate.value = self._streamServer.audioBitrate( ) self.config.streamserver.videoBitrate.value = self._streamServer.videoBitrate( ) self.config.streamserver.autoBitrate.value = self._streamServer.autoBitrate( ) self.config.streamserver.resolution.value = str( self._streamServer.height()) + "p" self.config.streamserver.framerate.value = str( self._streamServer.framerate()) # extended encoder settings self.config.streamserver.gopLength.value = self._streamServer.gopLength( ) self.config.streamserver.gopOnSceneChange.value = self._streamServer.gopOnSceneChange( ) self.config.streamserver.openGop.value = self._streamServer.openGop() self.config.streamserver.bFrames.value = self._streamServer.bFrames() self.config.streamserver.pFrames.value = self._streamServer.pFrames() self.config.streamserver.slices.value = self._streamServer.slices() self.config.streamserver.level.value = self._streamServer.level() self.config.streamserver.profile.value = self._streamServer.profile() #servers self.config.streamserver.rtsp.enabled.value = self._streamServer.isRTSPEnabled( ) self.config.streamserver.rtsp.path.value = self._streamServer.rtspPath( ) self.config.streamserver.rtsp.user.value = self._streamServer.rtspUsername( ) self.config.streamserver.rtsp.password.value = self._streamServer.rtspPassword( ) self.config.streamserver.hls.enabled.value = self._streamServer.isHLSEnabled( ) self.config.streamserver.hls.path.value = self._streamServer.hlsPath() self.config.streamserver.hls.user.value = self._streamServer.hlsUsername( ) self.config.streamserver.hls.password.value = self._streamServer.hlsPassword( ) #self.config.streamserver.lastservice = ConfigText(default=config.tv.lastservice.value) #TODO #self.config.streamserver.mediator = ConfigSubsection() #self.config.streamserver.mediator.enabled = ConfigOnOff(default=False) #self.config.streamserver.mediator.boxid = ConfigText() #self.config.streamserver.mediator.boxkey = ConfigText() #self.config.streamserver.mediator.streaminggroups = ConfigSubsection() #self.config.streamserver.mediator.streaminggroups.member_alias = ConfigText(default="dreambox", fixed_size=False) #self.config.streamserver.mediator.streaminggroups.stream_alias = ConfigText(default="", fixed_size=False) #self.config.streamserver.mediator.streaminggroups.hide_empty = ConfigYesNo(default=False) #self.config.streamserver.client = ConfigSubsection() #self.config.streamserver.client.boxid = ConfigText(default="", fixed_size=False) #self.config.streamserver.client.boxkey = ConfigText(default="", fixed_size=False) def start(self): if not self._isRunning: self.config.misc.standbyCounter.addNotifier(self._onStandby, initial_call=False) self._isRunning = True else: Log.w( "start was called multiple times, self is not harmful but unneccessary!" ) def _onStandby(self, element): Log.d() from Screens.Standby import inStandby inStandby.onClose.append(self._onLeaveStandby) if self.config.streamserver.source.value == str( eStreamServer.INPUT_MODE_LIVE ) and self.config.streamserver.mediator.enabled.value: Log.i( "Going into Standby, mode is Follow Live, stopping proxy stream" ) self._mediatorStateBeforeStandby = self.config.streamserver.mediator.enabled.value self.config.streamserver.mediator.enabled.value = False def _onLeaveStandby(self): Log.d() if self.config.streamserver.source.value == str( eStreamServer.INPUT_MODE_LIVE ) and self._mediatorStateBeforeStandby: Log.i( "Leaving Standby, mode is Follow live, recovering upload state=%s" % (self._mediatorStateBeforeStandby, )) self.config.streamserver.mediator.enabled.value = self._mediatorStateBeforeStandby def _onAvailabilityChanged(self, available): for fnc in self.onAvailabilityChanged: fnc(available) def _onSourceStateChanged(self, state): Log.i("state=%s" % state) if state == True and streamServerControl.inputMode == eStreamServer.INPUT_MODE_BACKGROUND: self.setEncoderService( eServiceReference(self.config.streamserver.lastservice.value)) else: self.stopEncoderService() for fnc in self.onSourceStateChanged: fnc(state) def _onUpstreamStateChanged(self, state): if state > self._streamServer.UPSTREAM_STATE_WAITING and self._currentService and not self._encoderService: Log.i("Upstream running.") if state <= self._streamServer.UPSTREAM_STATE_WAITING and self._encoderService: Log.i("Upstream idle.") for fnc in self.onUpstreamStateChanged: fnc(state) def _onUpstreamBitrateChanged(self, bitrate): for fnc in self.onUpstreamBitrateChanged: fnc(bitrate) def _onRtspClientCountChanged(self, count, client): Log.i("%s / %s" % (count, client)) for fnc in self.onRtspClientCountChanged: fnc(count, client) def _onUriParametersChanged(self, parameters): Log.i("%s" % (parameters)) params = parse_qs(parameters) self._applyUriParameters(params) for fnc in self.onUriParametersChanged: fnc(params) def _onDBusError(self, error): Log.w("DBUS ERROR! %s" % (error, )) Notifications.AddPopup("%s" % (error, ), MessageBox.TYPE_ERROR, -1, domain=NOTIFICATION_DOMAIN_STREAMSERVER) def _applyUriParameters(self, params): ref = str(params.get(self.URI_PARAM_REF, [""])[0]) ref = eServiceReference(ref) if ref.valid(): Log.i("setting encoder service to %s" % ref.toString()) self.setEncoderService(ref) vb = params.get(self.URI_PARAM_VIDEO_BITRATE, [-1])[0] if vb > 0: try: Log.i("setting video bitrate to %s" % vb) self.videoBitrate = int(vb) except: pass ab = params.get(self.URI_PARAM_AUDIO_BITRATE, [-1])[0] if ab > 0: try: Log.i("setting audio bitrate to %s" % ab) self.audioBitrate = int(ab) except: pass def setEncoderService(self, service): self._currentService = service ref = self._getRef(service) if ref: refstr = ref.toString() self.config.streamserver.lastservice.value = refstr self.config.streamserver.save() return self._startEncoderService(service) return self.ENCODER_SERVICE_INVALID def getEncoderService(self): if self._currentService: return self._getRef(self._currentService) return None encoderService = property(getEncoderService, setEncoderService) def isAnyEnabled(self): return self.config.streamserver.rtsp.enabled.value or self.config.streamserver.hls.enabled.value or self.config.streamserver.mediator.enabled.value def _startEncoderService(self, service): if not self.isAnyEnabled() \ or int(self.config.streamserver.source.value) != eStreamServer.INPUT_MODE_BACKGROUND \ or self.sourceState == False: self.stopEncoderService() Log.i( "Streamserver disabled, not in TV Service mode or source not ready, will not allocate service: (isAnyEnabled, source!=TV_MODE, sourceState) (%s, %s, %s)" % (str(self.isAnyEnabled()), str(self.config.streamserver.source.value), str(self.sourceState))) return self.ENCODER_SERVICE_INVALID_MODE ref = self._getRef(service) if ref: cur_ref = self._encoderService cur_ref = cur_ref and cur_ref.info() cur_ref = cur_ref and cur_ref.getInfoString( iServiceInformation.sServiceref) if cur_ref == ref.toString(): Log.i( "ignore request to play already running background streaming service (%s)" % cur_ref) return self.ENCODER_SERVICE_ALREADY_ACTIVE else: self.stopEncoderService() self._encoderService = eServiceCenter.getInstance().play(ref) if self._encoderService and not self._encoderService.setTarget( self.ENCODER_TARGET): Log.i("Starting encoder service [%s]!" % (service.toCompareString())) self._encoderService.start() return self.ENCODER_SERVICE_SET else: return self.ENCODER_SERVICE_INSUFFICIENT_RESOURCES return self.ENCODER_SERVICE_INVALID def _getRef(self, service): if service and (service.flags & eServiceReference.isGroup): return getBestPlayableServiceReference(service, eServiceReference()) else: return service def stopEncoderService(self): if self._encoderService: Log.i("Stopping encoder service (%s)" % (self._currentService.toCompareString())) self._encoderService.stop() self._encoderService = None def enableRTSP(self, enabled, path, port, user, password): return self._streamServer.enableRTSP(enabled, path, port, user, password) def enableHLS(self, enabled, path, port, user, password): #TODO streamserver has no user/password functionality for hls atm return self._streamServer.enableHLS(enabled, path, port, user, password) def isEnabled(self): return self.isAnyEnabled() enabled = property(isEnabled) def getInputMode(self): return self._streamServer.inputMode() def setInputMode(self, mode): self._streamServer.setInputMode(mode) inputMode = property(getInputMode, setInputMode) def getAudioBitrate(self): return self._streamServer.audioBitrate() def setAudioBitrate(self, bitrate): if bitrate >= self.AUDIO_BITRATE_LIMITS[ 0] and bitrate <= self.AUDIO_BITRATE_LIMITS[1]: self._streamServer.setAudioBitrate(bitrate) self.config.streamserver.audioBitrate.value = bitrate else: Log.w("Desired audio bitrate is out of range! %s %s" % (bitrate, self.VIDEO_BITRATE_LIMITS)) audioBitrate = property(getAudioBitrate, setAudioBitrate) def getVideoBitrate(self): return self._streamServer.videoBitrate() def setVideoBitrate(self, bitrate): if bitrate >= self.VIDEO_BITRATE_LIMITS[ 0] and bitrate <= self.VIDEO_BITRATE_LIMITS[1]: self._streamServer.setVideoBitrate(bitrate) self.config.streamserver.videoBitrate.value = bitrate else: Log.w("Desired video bitrate is out of range! %s %s" % (bitrate, self.VIDEO_BITRATE_LIMITS)) videoBitrate = property(getVideoBitrate, setVideoBitrate) def getAutoBitrate(self): return self._streamServer.autoBitrate() def setAutoBitrate(self, auto): self._streamServer.setAutoBitrate(auto) self.config.streamserver.autoBitrate.value = auto autoBitrate = property(getAutoBitrate, setAutoBitrate) def getGopLength(self): return self._streamServer.gopLength() def setGopLength(self, length): self._streamServer.setGopLength(length) gopLength = property(getGopLength, setGopLength) def getGopOnSceneChange(self): return self._streamServer.gopOnSceneChange() def setGopOnSceneChange(self, enabled): if self.FEATURE_SCENE_DETECTION: self._streamServer.setGopOnSceneChange(enabled) else: Log.w("This device's encoder has no support for scene detection!") gopOnSceneChange = property(getGopOnSceneChange, setGopOnSceneChange) def getOpenGop(self): return self._streamServer.openGop() def setOpenGop(self, enabled): self._streamServer.setOpenGop(enabled) openGop = property(getOpenGop, setOpenGop) def getBFrames(self): return self._streamServer.bFrames() def setBFrames(self, bFrames): self._streamServer.setBFrames(bFrames) bFrames = property(getBFrames, setBFrames) def getPFrames(self): return self._streamServer.pFrames() def setPFrames(self, pFrames): self._streamServer.setPFrames(pFrames) pFrames = property(getPFrames, setPFrames) def getSlices(self): return self._streamServer.slices() def setSlices(self, slices): if self.FEATURE_SLICES: self._streamServer.setSlices(slices) else: Log.w("This device's encoder has no support for setting slices") slices = property(getSlices, setSlices) def getLevel(self): return self._streamServer.level() def setLevel(self, level): self._streamServer.setLevel(level) level = property(getLevel, setLevel) def getProfile(self): return self._streamServer.profile() def setProfile(self, profile): self._streamServer.setProfile(profile) profile = property(getProfile, setProfile) def getFramerate(self): return self.FRAME_RATE_LUT_REVERSE.get( str(self._streamServer.framerate())) def setFramerate(self, rate): Log.w(rate) self._streamServer.setFramerate(int(self.FRAME_RATE_LUT.get( str(rate)))) framerate = property(getFramerate, setFramerate) def getResolution(self): w = self._streamServer.width() h = self._streamServer.height() return w, h def setResolution(self, res): #res = [w, h] self._streamServer.setResolution(res[0], res[1]) resolution = property(getResolution, setResolution) def setUpstream(self, state, host, port, token): return self._streamServer.enableUpstream(state, host, port, token) def getUpstreamState(self): return self._streamServer.upstreamState() upstreamState = property(getUpstreamState) def getSourceState(self): return self._streamServer.sourceState() sourceState = property(getSourceState) def getRtspClientcount(self): return self._streamServer.rtspClientCount() rtspClientCount = property(getRtspClientcount) def zapNext(self): Log.i() from Screens.InfoBar import InfoBar if not InfoBar.instance: Log.i("no infobar") return False input_mode = int(self.config.streamserver.source.value) if input_mode == eStreamServer.INPUT_MODE_LIVE: Log.i("zapping to next live service") InfoBar.instance.zapDown() return True elif input_mode == eStreamServer.INPUT_MODE_BACKGROUND: Log.i("zapping to next background service") oldservice = self.encoderService if not oldservice: return False service = InfoBar.instance.getNextService(oldservice) streamServerControl.setEncoderService(service) return True Log.i("nothing done") return False def zapPrev(self): from Screens.InfoBar import InfoBar if not InfoBar.instance: Log.i("no infobar") return False Log.i(self.config.streamserver.source.value) input_mode = int(self.config.streamserver.source.value) if input_mode == eStreamServer.INPUT_MODE_LIVE: Log.i("zapping to previous live service") InfoBar.instance.zapUp() return True elif input_mode == eStreamServer.INPUT_MODE_BACKGROUND: Log.i("zapping to previous background service") oldservice = self.encoderService if not oldservice: return False service = InfoBar.instance.getPrevService(oldservice) streamServerControl.setEncoderService(service) return True Log.i("nothing done") return False
def VideoChangeDetect(self): config_port = config.av.videoport.value config_mode = str(config.av.videomode[config_port].value).replace( '\n', '') config_res = str(config.av.videomode[config_port].value[:-1]).replace( '\n', '') config_pol = str(config.av.videomode[config_port].value[-1:]).replace( '\n', '') config_rate = str(config.av.videorate[config_mode].value).replace( 'Hz', '').replace('\n', '') f = open("/proc/stb/video/videomode") current_mode = f.read()[:-1].replace('\n', '') f.close() if current_mode.upper() in ('PAL', 'NTSC'): current_mode = current_mode.upper() current_pol = '' if 'i' in current_mode: current_pol = 'i' elif 'p' in current_mode: current_pol = 'p' current_res = current_pol and current_mode.split( current_pol)[0].replace('\n', '') or "" current_rate = current_pol and current_mode.split( current_pol)[0].replace( '\n', '') and current_mode.split(current_pol)[1].replace( '\n', '') or "" video_height = None video_width = None video_pol = None video_rate = None if path.exists("/proc/stb/vmpeg/0/yres"): try: f = open("/proc/stb/vmpeg/0/yres", "r") video_height = int(f.read(), 16) f.close() except: video_height = 0 if path.exists("/proc/stb/vmpeg/0/xres"): try: f = open("/proc/stb/vmpeg/0/xres", "r") video_width = int(f.read(), 16) f.close() except: video_width = 0 if path.exists("/proc/stb/vmpeg/0/progressive"): f = open("/proc/stb/vmpeg/0/progressive", "r") video_pol = "p" if int(f.read(), 16) else "i" f.close() if path.exists("/proc/stb/vmpeg/0/framerate"): f = open("/proc/stb/vmpeg/0/framerate", "r") try: video_rate = int(f.read()) except: video_rate = 50 f.close() if not video_height or not video_width or not video_pol or not video_rate: service = self.session.nav.getCurrentService() if service is not None: info = service.info() else: info = None if info: video_height = int( info.getInfo(iServiceInformation.sVideoHeight)) video_width = int(info.getInfo( iServiceInformation.sVideoWidth)) video_pol = ("i", "p")[info.getInfo( iServiceInformation.sProgressive)] video_rate = int(info.getInfo(iServiceInformation.sFrameRate)) if video_height and video_width and video_pol and video_rate: resolutionlabel["content"].setText( _("Video content: %ix%i%s %iHz") % (video_width, video_height, video_pol, (video_rate + 500) / 1000)) if video_height != -1: if video_height > 720 or video_width > 1280: new_res = "1080" elif (576 < video_height <= 720) or video_width > 1024: new_res = "720" elif (480 < video_height <= 576) or video_width > 720 or video_rate in (25000, 23976, 24000): new_res = "576" else: new_res = "480" else: new_res = config_res if video_rate != -1: if video_rate == 25000 and video_pol == 'i': new_rate = 50000 elif video_rate == 59940 or ( video_rate == 29970 and video_pol == 'i') or (video_rate == 29970 and video_pol == 'p' and config.av.autores.value == 'disabled'): new_rate = 60000 elif video_rate == 23976: new_rate = 24000 elif video_rate == 29970: new_rate = 30000 else: new_rate = video_rate new_rate = str((new_rate + 500) / 1000) else: new_rate = config_rate if video_pol != -1: new_pol = str(video_pol) else: new_pol = config_pol write_mode = None new_mode = None if config_mode in ('PAL', 'NTSC'): write_mode = config_mode elif config.av.autores.value == 'all' or ( config.av.autores.value == 'hd' and int(new_res) >= 720): if (config.av.autores_deinterlace.value and HardwareInfo().is_nextgen()) or ( config.av.autores_deinterlace.value and not HardwareInfo().is_nextgen() and int(new_res) <= 720): new_pol = new_pol.replace('i', 'p') if new_res + new_pol + new_rate in iAVSwitch.modes_available: new_mode = new_res + new_pol + new_rate if new_mode == '720p24': new_mode = config.av.autores_720p24.value if new_mode == '1080p24': new_mode = config.av.autores_1080p24.value if new_mode == '1080p25': new_mode = config.av.autores_1080p25.value if new_mode == '1080p30': new_mode = config.av.autores_1080p30.value elif new_res + new_pol in iAVSwitch.modes_available: new_mode = new_res + new_pol else: write_mode = config_mode + new_rate write_mode = new_mode elif config.av.autores.value == 'hd' and int(new_res) <= 576: if (config.av.autores_deinterlace.value and HardwareInfo().is_nextgen()) or ( config.av.autores_deinterlace.value and not HardwareInfo().is_nextgen() and not config.av.autores_sd.value == '1080i'): new_mode = config.av.autores_sd.value.replace( 'i', 'p') + new_rate else: if new_pol in 'p': new_mode = config.av.autores_sd.value.replace( 'i', 'p') + new_rate else: new_mode = config.av.autores_sd.value + new_rate if new_mode == '720p24': new_mode = config.av.autores_720p24.value if new_mode == '1080p24': new_mode = config.av.autores_1080p24.value if new_mode == '1080p25': new_mode = config.av.autores_1080p25.value if new_mode == '1080p30': new_mode = config.av.autores_1080p30.value write_mode = new_mode else: if path.exists('/proc/stb/video/videomode_%shz' % new_rate) and config_rate == 'multi': f = open("/proc/stb/video/videomode_%shz" % new_rate, "r") multi_videomode = f.read().replace('\n', '') f.close() if multi_videomode and (current_mode != multi_videomode): write_mode = multi_videomode else: write_mode = config_mode + new_rate # workaround for bug, see http://www.opena.tv/forum/showthread.php?1642-Autoresolution-Plugin&p=38836&viewfull=1#post38836 # always use a fixed resolution and frame rate (e.g. 1080p50 if supported) for TV or .ts files # always use a fixed resolution and correct rate (e.g. 1080p24/p50/p60 for all other videos if config.av.smart1080p.value != 'false': print "DEBUG VIDEOMODE/ smart1080p enabled" ref = self.session.nav.getCurrentlyPlayingServiceReference() if ref is not None: try: mypath = ref.getPath() except: mypath = '' else: mypath = '' if new_rate == 'multi': # no frame rate information available, check if filename (or directory name) contains a hint # (allow user to force a frame rate this way): if (mypath.find('p24.') >= 0) or (mypath.find('24p.') >= 0): new_rate = '24' elif (mypath.find('p25.') >= 0) or (mypath.find('25p.') >= 0): new_rate = '25' elif (mypath.find('p30.') >= 0) or (mypath.find('30p.') >= 0): new_rate = '30' elif (mypath.find('p50.') >= 0) or (mypath.find('50p.') >= 0): new_rate = '50' elif (mypath.find('p60.') >= 0) or (mypath.find('60p.') >= 0): new_rate = '60' else: new_rate = '' # omit frame rate specifier, e.g. '1080p' instead of '1080p50' if there is no clue if mypath != '': if mypath.endswith('.ts'): print "DEBUG VIDEOMODE/ playing .ts file" new_rate = '50' # for .ts files else: print "DEBUG VIDEOMODE/ playing other (non .ts) file" # new_rate from above for all other videos else: print "DEBUG VIDEOMODE/ no path or no service reference, presumably live TV" new_rate = '50' # for TV / or no service reference, then stay at 1080p50 new_rate = new_rate.replace('25', '50') new_rate = new_rate.replace('30', '60') if (config.av.smart1080p.value == '1080p50') or ( config.av.smart1080p.value == 'true' ): # for compatibility with old ConfigEnableDisable write_mode = '1080p' + new_rate elif config.av.smart1080p.value == '1080i50': write_mode = '1080i' + new_rate elif config.av.smart1080p.value == '720p50': write_mode = '720p' + new_rate if write_mode and current_mode != write_mode and self.bufferfull: resolutionlabel["restxt"].setText( _("Video mode: %s") % write_mode) if config.av.autores.value != "disabled" and config.av.autores_label_timeout.value != '0': resolutionlabel.show() print "[VideoMode] setMode - port: %s, mode: %s" % ( config_port, write_mode) f = open("/proc/stb/video/videomode", "w") f.write(write_mode) f.close() iAVSwitch.setAspect(config.av.aspect) iAVSwitch.setWss(config.av.wss) iAVSwitch.setPolicy43(config.av.policy_43) iAVSwitch.setPolicy169(config.av.policy_169) self.delay = False self.detecttimer.stop()
################################################### MAIN_PAGE = "http://www.zdf.de" PNG_PATH = resolveFilename(SCOPE_PLUGINS)+"/Extensions/ZDFMediathek/" TYPE_NOTHING = 0 TYPE_MOVIE = 1 TYPE_PODCAST = 2 TYPE_MOVIELIST_CATEGORY = 3 LIST_LEFT = 0 LIST_RIGHT = 1 LIST_NONE = 2 deviceName = HardwareInfo().get_device_name() PLAY_MP4 = False if not deviceName.startswith("dm7025"): try: #FIXMEE add better check ! ? ! for line in popen("opkg info gst-plugin-rtsp").readlines(): if line.find("Version: ") != -1: if line[9:] >= "0.10.23-r7.1": PLAY_MP4 = True except: pass try: from LT.LTStreamPlayer import streamplayer
def updateStatus(self): print "[TVCharts] Status Update ..." self.DBStatusTimer.stop() if not config.plugins.tvcharts.enabled.value or Screens.Standby.inStandby: return # Get Channelname sref = self.session.nav.getCurrentlyPlayingServiceReference() if sref is not None: ref = eServiceReference(sref.toString()) ref.setName("") serviceHandler = eServiceCenter.getInstance() info = serviceHandler.info(ref) channel_name = info and info.getName(ref).replace('\xc2\x86', '').replace('\xc2\x87', '').decode("utf-8", "ignore").encode("utf-8") or "" self.serviceref = ref.toString() else: channel_name = "" self.serviceref = "" # Get Event Info service = self.session.nav.getCurrentService() info = service and service.info() event = info and info.getEvent(0) event_name = event and event.getEventName() or "" event_description = "" event_begin = 0 if event is not None: curEvent = parseEvent(event) event_begin = int(curEvent[0]) + (config.recording.margin_before.value * 60) event_description = event.getExtendedDescription() # Get Box Info self.BoxID = iNetwork.getAdapterAttribute("eth0", "mac") self.DeviceName = HardwareInfo().get_device_name() self.EnigmaVersion = about.getEnigmaVersionString() self.ImageVersion = about.getVersionString() # Get TimerList self.timerlist = "" if config.plugins.tvcharts.submittimers.value and self.LastTimerlistUpdate <= (time() - 1800): self.LastTimerlistUpdate = time() try: for timer in self.recordtimer.timer_list: if timer.disabled == 0 and timer.justplay == 0: self.timerlist += "%s|%s|%s|%s|%s|%s|%s\n" % (timer.eit, str(int(timer.begin) + (config.recording.margin_before.value * 60)), str(int(timer.end) - (config.recording.margin_after.value * 60)), str(timer.service_ref), timer.name, timer.service_ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '').decode("utf-8", "ignore").encode("utf-8"), timer.repeated) except Exception: print "[TVCharts] Error loading timers!" # Get Pluginlist if config.plugins.tvcharts.submitplugins.value and self.pluginlist == "": try: os_system("opkg list_installed | grep enigma2-plugin- > /tmp/plugins.txt") for plugin in open('/tmp/plugins.txt', 'r'): self.pluginlist += plugin[0:plugin.find(' - ')] + "\n" os_system("rm -f /tmp/plugins.txt") except Exception: print "[TVCharts] Error loading plugins!" # Status Update getPage(url='http://www.dreambox-plugins.de/feeds/TVCharts/status.php', agent="Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)", timeout=60, method='POST', headers={'Content-Type': 'application/x-www-form-urlencoded'}, postdata=urlencode({'boxid': self.BoxID, 'devicename': self.DeviceName, 'imageversion': self.ImageVersion, 'enigmaversion': self.EnigmaVersion, 'lastchannel': channel_name, 'lastevent': event_name, 'eventdescr': event_description, 'lastbegin': event_begin, 'lastserviceref': self.serviceref, 'timerlist': self.timerlist, 'pluginlist': self.pluginlist})).addErrback(self.updateError) # Restart Timer self.DBStatusTimer.start(900000, True)
import os import re from Tools.HardwareInfo import HardwareInfo try: device_name = HardwareInfo().get_device_name() except: device_name = None #sfdisk_version_bug = '2.28.1' in os.popen('/usr/sbin/sfdisk -v').read() BOX_NAME = "none" MODEL_NAME = "none" if os.path.exists("/proc/stb/info/boxtype"): BOX_NAME = "all" try: f = open("/proc/stb/info/boxtype") MODEL_NAME = f.read().strip() f.close() except: pass elif os.path.exists("/proc/stb/info/hwmodel"): BOX_NAME = "all" try: f = open("/proc/stb/info/hwmodel") MODEL_NAME = f.read().strip() f.close() except: pass elif os.path.exists("/proc/stb/info/vumodel"): BOX_NAME = "vu"
SystemInfo["NumVideoDecoders"] = getNumVideoDecoders() SystemInfo["Udev"] = not fileExists("/dev/.devfsd") SystemInfo["PIPAvailable"] = getMachineBuild() not in ("i55plus") and SystemInfo["NumVideoDecoders"] > 1 SystemInfo["CanMeasureFrontendInputPower"] = eDVBResourceManager.getInstance().canMeasureFrontendInputPower() SystemInfo["12V_Output"] = Misc_Options.getInstance().detected_12V_output() SystemInfo["ZapMode"] = fileCheck("/proc/stb/video/zapmode") or fileCheck("/proc/stb/video/zapping_mode") SystemInfo["NumFrontpanelLEDs"] = countFrontpanelLEDs() SystemInfo["FrontpanelDisplay"] = fileExists("/dev/dbox/oled0") or fileExists("/dev/dbox/lcd0") SystemInfo["7segment"] = getDisplayType() in ("7segment") SystemInfo["ConfigDisplay"] = SystemInfo["FrontpanelDisplay"] and getDisplayType() not in ("7segment") SystemInfo["LCDSKINSetup"] = pathExists("/usr/share/enigma2/display") and not SystemInfo["7segment"] SystemInfo["OledDisplay"] = fileExists("/dev/dbox/oled0") SystemInfo["LcdDisplay"] = fileExists("/dev/dbox/lcd0") SystemInfo["DisplayLED"] = getBoxType() in ("gb800se", "gb800solo", "gbx1", "gbx2", "gbx3", "gbx3h") SystemInfo["LEDButtons"] = False # getBoxType() == "vuultimo", For some reason this causes a cpp crash on vuultimo (which we no longer build). The cause needs investigating or the dead code in surrounding modules that this change causes should be removed. SystemInfo["DeepstandbySupport"] = HardwareInfo().has_deepstandby() SystemInfo["Fan"] = fileCheck("/proc/stb/fp/fan") SystemInfo["FanPWM"] = SystemInfo["Fan"] and fileCheck("/proc/stb/fp/fan_pwm") SystemInfo["PowerLED"] = fileExists("/proc/stb/power/powerled") SystemInfo["PowerLED2"] = fileExists("/proc/stb/power/powerled2") SystemInfo["StandbyLED"] = fileExists("/proc/stb/power/standbyled") SystemInfo["SuspendLED"] = fileExists("/proc/stb/power/suspendled") SystemInfo["LedPowerColor"] = fileExists("/proc/stb/fp/ledpowercolor") SystemInfo["LedStandbyColor"] = fileExists("/proc/stb/fp/ledstandbycolor") SystemInfo["LedSuspendColor"] = fileExists("/proc/stb/fp/ledsuspendledcolor") SystemInfo["Power24x7On"] = fileExists("/proc/stb/fp/power4x7on") SystemInfo["Power24x7Standby"] = fileExists("/proc/stb/fp/power4x7standby") SystemInfo["Power24x7Suspend"] = fileExists("/proc/stb/fp/power4x7suspend") SystemInfo["WakeOnLAN"] = getBoxType() not in ("et8000", "et10000") and fileCheck("/proc/stb/power/wol") or fileCheck("/proc/stb/fp/wol") SystemInfo["HDMICEC"] = (fileExists("/dev/hdmi_cec") or fileExists("/dev/misc/hdmi_cec0")) and isPluginInstalled("HdmiCEC") SystemInfo["HasHDMI-CEC"] = isPluginInstalled("HdmiCEC")
def startCableTransponderSearch(self, nim_idx): if not self.tryGetRawFrontend(nim_idx): self.session.nav.stopService() if not self.tryGetRawFrontend(nim_idx): if self.session.pipshown: # try to disable pip self.session.pipshown = False del self.session.pip if not self.tryGetRawFrontend(nim_idx): self.cableTransponderSearchFinished() return self.__tlist = [ ] self.remainingdata = "" self.cable_search_container = eConsoleAppContainer() self.cable_search_container.appClosed.append(self.cableTransponderSearchClosed) self.cable_search_container.dataAvail.append(self.getCableTransponderData) cableConfig = config.Nims[nim_idx].cable tunername = nimmanager.getNimName(nim_idx) try: bus = nimmanager.getI2CDevice(nim_idx) if bus is None: print "ERROR: could not get I2C device for nim", nim_idx, "for cable transponder search" bus = 2 except: # older API if nim_idx < 2: if HardwareInfo().get_device_name() == "dm500hd": bus = 2 else: bus = nim_idx else: if nim_idx == 2: bus = 2 # DM8000 first nim is /dev/i2c/2 else: bus = 4 # DM8000 second num is /dev/i2c/4 if tunername == "CXD1981": cmd = "cxd1978 --init --scan --verbose --wakeup --inv 2 --bus %d" % bus elif tunername.startswith("Sundtek"): cmd = "mediaclient --blindscan %d" % nim_idx else: cmd = "tda1002x --init --scan --verbose --wakeup --inv 2 --bus %d" % bus if cableConfig.scan_type.getValue() == "bands": cmd += " --scan-bands " bands = 0 if cableConfig.scan_band_EU_VHF_I.getValue(): bands |= cable_bands["DVBC_BAND_EU_VHF_I"] if cableConfig.scan_band_EU_MID.getValue(): bands |= cable_bands["DVBC_BAND_EU_MID"] if cableConfig.scan_band_EU_VHF_III.getValue(): bands |= cable_bands["DVBC_BAND_EU_VHF_III"] if cableConfig.scan_band_EU_UHF_IV.getValue(): bands |= cable_bands["DVBC_BAND_EU_UHF_IV"] if cableConfig.scan_band_EU_UHF_V.getValue(): bands |= cable_bands["DVBC_BAND_EU_UHF_V"] if cableConfig.scan_band_EU_SUPER.getValue(): bands |= cable_bands["DVBC_BAND_EU_SUPER"] if cableConfig.scan_band_EU_HYPER.getValue(): bands |= cable_bands["DVBC_BAND_EU_HYPER"] if cableConfig.scan_band_US_LOW.getValue(): bands |= cable_bands["DVBC_BAND_US_LO"] if cableConfig.scan_band_US_MID.getValue(): bands |= cable_bands["DVBC_BAND_US_MID"] if cableConfig.scan_band_US_HIGH.getValue(): bands |= cable_bands["DVBC_BAND_US_HI"] if cableConfig.scan_band_US_SUPER.getValue(): bands |= cable_bands["DVBC_BAND_US_SUPER"] if cableConfig.scan_band_US_HYPER.getValue(): bands |= cable_bands["DVBC_BAND_US_HYPER"] cmd += str(bands) else: cmd += " --scan-stepsize " cmd += str(cableConfig.scan_frequency_steps.getValue()) if cableConfig.scan_mod_qam16.getValue(): cmd += " --mod 16" if cableConfig.scan_mod_qam32.getValue(): cmd += " --mod 32" if cableConfig.scan_mod_qam64.getValue(): cmd += " --mod 64" if cableConfig.scan_mod_qam128.getValue(): cmd += " --mod 128" if cableConfig.scan_mod_qam256.getValue(): cmd += " --mod 256" if cableConfig.scan_sr_6900.getValue(): cmd += " --sr 6900000" if cableConfig.scan_sr_6875.getValue(): cmd += " --sr 6875000" if cableConfig.scan_sr_ext1.getValue() > 450: cmd += " --sr " cmd += str(cableConfig.scan_sr_ext1.getValue()) cmd += "000" if cableConfig.scan_sr_ext2.getValue() > 450: cmd += " --sr " cmd += str(cableConfig.scan_sr_ext2.getValue()) cmd += "000" print "TDA1002x CMD is", cmd self.cable_search_container.execute(cmd) tmpstr = _("Try to find used transponders in cable network.. please wait...") tmpstr += "\n\n..." self.cable_search_session = self.session.openWithCallback(self.cableTransponderSearchSessionClosed, MessageBox, tmpstr, MessageBox.TYPE_INFO)
SystemInfo["CI%dRelevantPidsRoutingSupport" % cislot] = fileCheck( "/proc/stb/tsmux/ci%d_relevant_pids_routing" % cislot) SystemInfo["HasSoftcamInstalled"] = hassoftcaminstalled() SystemInfo["NumVideoDecoders"] = getNumVideoDecoders() SystemInfo["PIPAvailable"] = SystemInfo["NumVideoDecoders"] > 1 SystemInfo["CanMeasureFrontendInputPower"] = eDVBResourceManager.getInstance( ).canMeasureFrontendInputPower() SystemInfo["12V_Output"] = Misc_Options.getInstance().detected_12V_output() SystemInfo["ZapMode"] = fileCheck("/proc/stb/video/zapmode") or fileCheck( "/proc/stb/video/zapping_mode") SystemInfo["NumFrontpanelLEDs"] = countFrontpanelLEDs() SystemInfo["FrontpanelDisplay"] = fileExists("/dev/dbox/oled0") or fileExists( "/dev/dbox/lcd0") SystemInfo["LCDsymbol_circle_recording"] = fileCheck( "/proc/stb/lcd/symbol_circle") or HardwareInfo().get_device_model() in ( "hd51", "vs1500") and fileCheck("/proc/stb/lcd/symbol_recording") SystemInfo["LCDsymbol_timeshift"] = fileCheck("/proc/stb/lcd/symbol_timeshift") SystemInfo["LCDshow_symbols"] = ( HardwareInfo().get_device_model().startswith("et9") or HardwareInfo().get_device_model() in ("hd51", "vs1500")) and fileCheck("/proc/stb/lcd/show_symbols") SystemInfo["LCDsymbol_hdd"] = HardwareInfo().get_device_model() in ( "hd51", "vs1500") and fileCheck("/proc/stb/lcd/symbol_hdd") SystemInfo["FrontpanelDisplayGrayscale"] = fileExists("/dev/dbox/oled0") SystemInfo["DeepstandbySupport"] = HardwareInfo().get_device_name() != "dm800" SystemInfo["Fan"] = fileCheck("/proc/stb/fp/fan") SystemInfo["FanPWM"] = SystemInfo["Fan"] and fileCheck("/proc/stb/fp/fan_pwm") SystemInfo["StandbyLED"] = fileCheck("/proc/stb/power/standbyled") SystemInfo["SuspendLED"] = fileCheck("/proc/stb/power/suspendled") SystemInfo["LedPowerColor"] = fileExists("/proc/stb/fp/ledpowercolor")
################################################### MAIN_PAGE = "http://www.zdf.de" PNG_PATH = resolveFilename(SCOPE_PLUGINS)+"/Extensions/ZDFMediathek/" TYPE_NOTHING = 0 TYPE_MOVIE = 1 TYPE_PODCAST = 2 TYPE_MOVIELIST_CATEGORY = 3 LIST_LEFT = 0 LIST_RIGHT = 1 LIST_NONE = 2 deviceName = HardwareInfo().get_device_name() PLAY_MP4 = False PLAY_WMV = False if not deviceName.startswith("dm7025"): PLAY_MP4 = True if deviceName.startswith("dm7020hd"): PLAY_WMV = True try: from LT.LTStreamPlayer import streamplayer except ImportError: try: from Plugins.Extensions.LTMediaCenter.LTStreamPlayer import streamplayer except ImportError: streamplayer = None
class AVSwitch: hw_type = HardwareInfo().get_device_name() rates = { } # high-level, use selectable modes. modes = { } # a list of (high-level) modes for a certain port. rates["PAL"] = { "50Hz": { 50: "pal" }, "60Hz": { 60: "pal60" }, "multi": { 50: "pal", 60: "pal60" } } rates["NTSC"] = { "60Hz": { 60: "ntsc" } } rates["Multi"] = { "multi": { 50: "pal", 60: "ntsc" } } rates["480i"] = { "60Hz": { 60: "480i" } } rates["576i"] = { "50Hz": { 50: "576i" } } rates["480p"] = { "60Hz": { 60: "480p" } } rates["576p"] = { "50Hz": { 50: "576p" } } rates["720p"] = { "50Hz": { 50: "720p50" }, "60Hz": { 60: "720p" }, "multi": { 50: "720p50", 60: "720p" }, "auto": { 50: "720p50", 60: "720p", 24: "720p24" } } rates["1080i"] = { "50Hz": { 50: "1080i50" }, "60Hz": { 60: "1080i" }, "multi": { 50: "1080i50", 60: "1080i" }, "auto": { 50: "1080i50", 60: "1080i", 24: "1080p24" } } rates["1080p"] = { "50Hz": { 50: "1080p50" }, "60Hz": { 60: "1080p" }, "multi": { 50: "1080p50", 60: "1080p" }, "auto": { 50: "1080p50", 60: "1080p", 24: "1080p24" } } if getBoxType().startswith('dm9'): rates["2160p"] = { "50Hz": { 50: "2160p50" }, "60Hz": { 60: "2160p60" }, "multi": { 50: "2160p50", 60: "2160p60" }, "auto": { 50: "2160p50", 60: "2160p60", 24: "2160p24" } } else: rates["2160i"] = { "50Hz": { 50: "2160i50" }, "60Hz": { 60: "2160i" }, "multi": { 50: "2160i50", 60: "2160i" }, "auto": { 50: "2160i50", 60: "2160i", 24: "2160i24" } } rates["2160p"] = { "50Hz": { 50: "2160p50" }, "60Hz": { 60: "2160p" }, "multi": { 50: "2160p50", 60: "2160p" }, "auto": { 50: "2160p50", 60: "2160p", 24: "2160p24" } } rates["2160p30"] = { "25Hz": { 50: "2160p25" }, "30Hz": { 60: "2160p30"} , "multi": { 50: "2160p25", 60: "2160p30" }, "auto": { 50: "2160p25", 60: "2160p30", 24: "2160p24" } } rates["PC"] = { "1024x768": { 60: "1024x768" }, # not possible on DM7025 "800x600" : { 60: "800x600" }, # also not possible "720x480" : { 60: "720x480" }, "720x576" : { 60: "720x576" }, "1280x720": { 60: "1280x720" }, "1280x720 multi": { 50: "1280x720_50", 60: "1280x720" }, "1920x960" : { 60: "1920x960" }, "1920x960 multi": { 50: "1920x960_50", 60: "1920x960" }, "1920x1080": { 60: "1920x1080"}, "1920x1080 multi": { 50: "1920x1080", 60: "1920x1080_50" }, "2560x1440": { 60: "2560x1440"}, "2560x1440 multi": { 50: "2560x1440", 60: "2560x1440_50" }, "3840x2160": { 60: "3840x2160"}, "3840x2160 multi": { 50: "3840x2160", 60: "3840x2160_50" }, "4096x2160": { 60: "4096x2160"}, "4096x2160 multi": { 50: "4096x2160", 60: "4096x2160_50" }, "4096x3072": { 60: "4096x3072"}, "5120x2160": { 60: "5120x2160"}, "5120x2160 multi": { 50: "5120x2160", 60: "5120x2160_50" }, "5120x2880": { 60: "5120x2880"}, "7680x4320": { 60: "7680x4320"}, "7680x4320 multi": { 50: "7680x4320", 60: "7680x4320_50" }, "1280x1024": { 60: "1280x1024"}, "1280x1024 multi": { 50: "1280x1024", 60: "1280x1024_50" }, "1366x768" : { 60: "1366x768"}, "1366x768 multi": { 50: "1366x768", 60: "1366x768_50" }, "1440x900" : { 60: "1440x900"}, "1440x900 multi": { 50: "1440x900", 60: "1440x900_50" }, "1600x900" : { 60: "1600x900"}, "1600x900 multi": { 50: "1600x900", 60: "1600x900_50" }, "1680x1050" : { 60: "1680x1050"}, "1280x768": { 60: "1280x768" }, "1280x800": { 60: "1280x800" }, "640x480" : { 60: "640x480" } } modes["Scart"] = ["PAL", "NTSC", "Multi"] # modes["DVI-PC"] = ["PC"] if (about.getChipSetString() in ('5272s', '7366', '7376', '7444', '7445', '7445s')): modes["HDMI"] = ["720p", "1080p", "2160i", "2160p", "2160p30", "1080i", "576p", "576i", "480p", "480i"] widescreen_modes = {"720p", "1080p", "1080i", "2160i", "2160p"} elif (about.getChipSetString() in ('7252', '7251', '7251S', '7252S', '7251s', '7252s', '7444s', '3798mv200', '3798cv200', 'hi3798mv200', 'hi3798cv200')): modes["HDMI"] = ["720p", "1080p", "2160i", "2160p", "2160p30", "1080i", "576p", "576i", "480p", "480i"] widescreen_modes = {"720p", "1080p", "1080i", "2160i", "2160p", "2160p30"} elif (about.getChipSetString() in ('7111', '7162', '7241', '7346', '7356', '7358', '7362', '73565', '73625', '7424', '7425', '7435', '7552', '7581', '7584', '75845', '7585', 'pnx8493')) or (getBrandOEM() in ('azbox')): modes["HDMI"] = ["720p", "1080p", "1080i", "576p", "576i", "480p", "480i"] widescreen_modes = {"720p", "1080p", "1080i"} elif about.getChipSetString() in ('meson-6'): modes["HDMI"] = ["720p", "1080p", "1080i"] widescreen_modes = {"720p", "1080p", "1080i"} elif about.getChipSetString() in ('meson-64','S905D'): modes["HDMI"] = ["720p", "1080p", "2160p", "2160p30", "2160i", "1080i"] widescreen_modes = {"720p", "1080p", "2160p", "2160p30", "2160i", "1080i"} else: modes["HDMI"] = ["720p", "1080i", "576p", "576i", "480p", "480i"] widescreen_modes = {"720p", "1080i"} modes["YPbPr"] = modes["HDMI"] if getBoxType() in ('dm500hd', 'dm800', 'vuuno', 'vusolo', 'vusolo2', 'vuultimo', 'vuduo', 'vuduo2'): modes["Scart-YPbPr"] = modes["HDMI"] # if "DVI-PC" in modes and not getModeList("DVI-PC"): # print "[AVSwitch] remove DVI-PC because of not existing modes" # del modes["DVI-PC"] if "YPbPr" in modes and getBoxType() in ('alien5', 'osninopro','protek4k','viperslim','axashis4kcombo','axashis4kcomboplus','dinobot4kplus','dinobot4kmini','zgemmah9t','zgemmah9s','zgemmah9splus','vuzero4k','vuuno4kse','anadol4k','mediabox4k','dinobot4kl','dinobot4k','dinobot4kse','lunix','purehdse','lunix34k','sf5008','et13000','zgemmah6','vipert2c','vipercombo','vipercombohdd','e4hdultra','evoslimse','evoslimt2c','beyonwizu4','zgemmah4','osnino','osninoplus','axultra','gbue4k','spycat4kcombo','spycat4k','valalinux','formuler4ip','formuler3ip','tm4ksuper','galaxy4k','zgemmah52splus','zgemmah2splus','zgemmah7','zgemmah32tc','zgemmah52tc','alphatriple','gi11000','spycat4kmini','tmtwin4k','tmnanom3','tiviarmin','vimastec1000','vimastec1500', 'gbquad4k','revo4k','force3uhdplus','force3uhd','force2nano','evoslim','zgemmah5ac', 'zgemmah3ac', 'bre2zet2c', 'dm900', 'dm920', 'wetekplay', 'wetekplay2', 'wetekhub', 'bre2ze4k', 'vuuno4k', 'vuultimo4k', 'sf4008', 'e4hdcombo', 'ultrabox', 'osmega', 'tmnano3t', 'novaip', 'novacombo', 'novatwin', 'dm520', 'dm525', 'megaforce2', 'purehd', 'sf128', 'sf138', 'mutant11', 'xpeedlxpro', 'mbtwinplus', 'mutant51', 'ax51', 'twinboxlcdci5' , 'twinboxlcdci', 'singleboxlcd', 'formuler4', 'formuler4turbo', 'zgemmah5', 'zgemmah52s', 'zgemmai55', 'sf98', 'odinplus', 'zgemmaslc', '9900lx', '9910lx', '9911lx', 'vusolo4k', 'et7x00mini', 'evomini', 'evominiplus', 'zgemmahs', 'zgemmah2s', 'zgemmah2h', 't2cable', 'xpeedlxcs2', 'xpeedlxcc', 'osmini', 'osminiplus', 'gbx1', 'gbx2', 'gbx3', 'gbx3h', 'sf3038', 'spycat', 'bwidowx', 'bwidowx2', 'fegasusx3', 'fegasusx5s', 'fegasusx5t', 'force2', 'force2plus', 'force2plushv', 'optimussos', 'tmnanose', 'tmnanosem2', 'tmnanosem2plus', 'tmnanocombo', 'zgemmash1', 'zgemmash2', 'zgemmas2s', 'zgemmass', 'mago', 'enibox', 'sf108', 'x1plus', 'xcombo', 'mutant1100', 'mutant1200', 'mutant1265', 'mutant1500', 'mutant500c', 'mutant530c', 'et4x00', 'et7500', 'et7000', 'et7100', 'et8500', 'et8500s', 'xp1000mk', 'xp1000max', 'xp1000plus', 'sf8', 'tm2t', 'tmsingle', 'vusolo2', 'tmnano', 'iqonios300hd', 'iqonios300hdv2', 'classm', 'axodin', 'axodinc', 'genius', 'evo', 'galaxym6', 'geniuse3hd', 'evoe3hd', 'axase3', 'axase3c', 'dm500hdv2', 'dm500hd', 'dm800', 'mixosf7', 'mixoslumi', 'mixosf5mini', 'gi9196lite', 'ixusszero', 'optimussos1', 'enfinity', 'marvel1', 'bre2ze', 'sezam1000hd', 'mbmini', 'atemio5x00', 'xpeedlx1', 'xpeedlx2', 'vusolose', 'gbipbox', 'formuler3', 'optimussos3plus', 'force1plus', 'vuzero', 'vizyonvita') or (about.getModelString() == 'ini-3000'): del modes["YPbPr"] if "Scart" in modes and getBoxType() in ('alien5','osninopro','protek4k','vuzero4k','vuuno4kse','lunix','purehdse','sf5008','et13000','e4hdultra','beyonwizu4','osnino','osninoplus','axultra','gbue4k','gi11000','spycat4kmini','tmtwin4k','tmnanom3','gbquad4k','revo4k','force3uhd','force2nano','dm900', 'dm920', 'wetekplay', 'wetekplay2', 'wetekhub', 'bre2ze4k', 'vuuno4k', 'vuultimo4k', 'sf4008', 'novaip', 'dm520', 'dm525', 'purehd', 'vusolo4k', 'fusionhdse', 'fusionhd', 'force2', 'force2plus', 'force2plushv', 'optimussos', 'tmnanose', 'tmnanosecombo', 'gbx1', 'gbx2', 'gbx3', 'gbx3h', 'gbultraue', 'gbultraueh', 'zgemmai55', 'mutant1500'): del modes["Scart"] if getBoxType() in ('mutant2400'): f = open("/proc/stb/info/board_revision", "r").read() if f >= "2": del modes["YPbPr"] def __init__(self): self.last_modes_preferred = [ ] self.on_hotplug = CList() self.current_mode = None self.current_port = None self.readAvailableModes() self.is24hzAvailable() self.readPreferredModes() self.createConfig() def readAvailableModes(self): try: f = open("/proc/stb/video/videomode_choices") modes = f.read()[:-1] f.close() except IOError: print "[AVSwitch] couldn't read available videomodes." self.modes_available = [ ] return self.modes_available = modes.split(' ') def readPreferredModes(self): if config.av.edid_override.value == False: try: f = open("/proc/stb/video/videomode_edid") modes = f.read()[:-1] f.close() self.modes_preferred = modes.split(' ') print "[AVSwitch] reading edid modes: ", self.modes_preferred except IOError: print "[AVSwitch] reading edid modes failed, using all modes" try: f = open("/proc/stb/video/videomode_preferred") modes = f.read()[:-1] f.close() self.modes_preferred = modes.split(' ') print "[AVSwitch] reading _preferred modes: ", self.modes_preferred except IOError: print "[AVSwitch] reading preferred modes failed, using all modes" self.modes_preferred = self.modes_available else: self.modes_preferred = self.modes_available print "[AVSwitch] used default modes: ", self.modes_preferred if len(self.modes_preferred) <= 2: print "[AVSwitch] preferend modes not ok, possible driver failer, len=", len(self.modes_preferred) self.modes_preferred = self.modes_available if self.modes_preferred != self.last_modes_preferred: self.last_modes_preferred = self.modes_preferred self.on_hotplug("HDMI") # must be HDMI def is24hzAvailable(self): try: self.has24pAvailable = os.access("/proc/stb/video/videomode_24hz", os.W_OK) and True or False except IOError: print "[AVSwitch] failed to read video choices 24hz ." self.has24pAvailable = False SystemInfo["have24hz"] = self.has24pAvailable # check if a high-level mode with a given rate is available. def isModeAvailable(self, port, mode, rate): rate = self.rates[mode][rate] for mode in rate.values(): if port == "DVI": if getBrandOEM() in ('azbox'): if mode not in self.modes_preferred and not config.av.edid_override.value: print "[AVSwitch] no, not preferred" return False if port != "HDMI": if mode not in self.modes_available: return False elif mode not in self.modes_preferred: return False return True def isWidescreenMode(self, port, mode): return mode in self.widescreen_modes def setMode(self, port, mode, rate, force = None): print "[AVSwitch] setMode - port: %s, mode: %s, rate: %s" % (port, mode, rate) # config.av.videoport.setValue(port) # we can ignore "port" self.current_mode = mode self.current_port = port modes = self.rates[mode][rate] mode_50 = modes.get(50) mode_60 = modes.get(60) mode_24 = modes.get(24) if mode_50 is None or force == 60: mode_50 = mode_60 if mode_60 is None or force == 50: mode_60 = mode_50 if mode_24 is None or force: mode_24 = mode_60 if force == 50: mode_24 = mode_50 try: f = open("/proc/stb/video/videomode_50hz", "w") f.write(mode_50) f.close() f = open("/proc/stb/video/videomode_60hz", "w") f.write(mode_60) f.close() except IOError: try: # fallback if no possibility to setup 50/60 hz mode f = open("/proc/stb/video/videomode", "w") f.write(mode_50) f.close() except IOError: print "[AVSwitch] setting videomode failed." if SystemInfo["have24hz"]: try: open("/proc/stb/video/videomode_24hz", "w").write(mode_24) except IOError: print "[VideoHardware] cannot open /proc/stb/video/videomode_24hz" if getBrandOEM() in ('gigablue'): try: # use 50Hz mode (if available) for booting f = open("/etc/videomode", "w") f.write(mode_50) f.close() except IOError: print "[AVSwitch] writing initial videomode to /etc/videomode failed." map = {"cvbs": 0, "rgb": 1, "svideo": 2, "yuv": 3} self.setColorFormat(map[config.av.colorformat.value]) if about.getCPUString().startswith('STx'): #call setResolution() with -1,-1 to read the new scrren dimensions without changing the framebuffer resolution from enigma import gMainDC gMainDC.getInstance().setResolution(-1, -1) def saveMode(self, port, mode, rate): config.av.videoport.setValue(port) config.av.videoport.save() if port in config.av.videomode: config.av.videomode[port].setValue(mode) config.av.videomode[port].save() if mode in config.av.videorate: config.av.videorate[mode].setValue(rate) config.av.videorate[mode].save() def isPortAvailable(self, port): # fixme return True def isPortUsed(self, port): if port == "HDMI": self.readPreferredModes() return len(self.modes_preferred) != 0 else: return True def getPortList(self): return [port for port in self.modes if self.isPortAvailable(port)] # get a list with all modes, with all rates, for a given port. def getModeList(self, port): res = [ ] for mode in self.modes[port]: # list all rates which are completely valid rates = [rate for rate in self.rates[mode] if self.isModeAvailable(port, mode, rate)] # if at least one rate is ok, add this mode if len(rates): res.append( (mode, rates) ) return res def createConfig(self, *args): hw_type = HardwareInfo().get_device_name() has_hdmi = HardwareInfo().has_hdmi() lst = [] config.av.videomode = ConfigSubDict() config.av.autores_mode_sd = ConfigSubDict() config.av.autores_mode_hd = ConfigSubDict() config.av.autores_mode_fhd = ConfigSubDict() config.av.autores_mode_uhd = ConfigSubDict() config.av.videorate = ConfigSubDict() config.av.autores_rate_sd = ConfigSubDict() config.av.autores_rate_hd = ConfigSubDict() config.av.autores_rate_fhd = ConfigSubDict() config.av.autores_rate_uhd = ConfigSubDict() # create list of output ports portlist = self.getPortList() for port in portlist: descr = port if 'HDMI' in port: lst.insert(0, (port, descr)) else: lst.append((port, descr)) modes = self.getModeList(port) if len(modes): config.av.videomode[port] = ConfigSelection(choices = [mode for (mode, rates) in modes]) config.av.autores_mode_sd[port] = ConfigSelection(choices = [mode for (mode, rates) in modes]) config.av.autores_mode_hd[port] = ConfigSelection(choices = [mode for (mode, rates) in modes]) config.av.autores_mode_fhd[port] = ConfigSelection(choices = [mode for (mode, rates) in modes]) config.av.autores_mode_uhd[port] = ConfigSelection(choices = [mode for (mode, rates) in modes]) for (mode, rates) in modes: ratelist = [] for rate in rates: if rate in ("auto") and not SystemInfo["have24hz"]: continue ratelist.append((rate, rate)) config.av.videorate[mode] = ConfigSelection(choices = ratelist) config.av.autores_rate_sd[mode] = ConfigSelection(choices = ratelist) config.av.autores_rate_hd[mode] = ConfigSelection(choices = ratelist) config.av.autores_rate_fhd[mode] = ConfigSelection(choices = ratelist) config.av.autores_rate_uhd[mode] = ConfigSelection(choices = ratelist) config.av.videoport = ConfigSelection(choices = lst) def setInput(self, input): INPUT = { "ENCODER": 0, "SCART": 1, "AUX": 2 } eAVSwitch.getInstance().setInput(INPUT[input]) def setColorFormat(self, value): if not self.current_port: self.current_port = config.av.videoport.value if self.current_port in ("YPbPr", "Scart-YPbPr"): eAVSwitch.getInstance().setColorFormat(3) elif self.current_port in ("RCA"): eAVSwitch.getInstance().setColorFormat(0) else: eAVSwitch.getInstance().setColorFormat(value) def setConfiguredMode(self): port = config.av.videoport.value if port not in config.av.videomode: print "[AVSwitch] current port not available, not setting videomode" return mode = config.av.videomode[port].value if mode not in config.av.videorate: print "[AVSwitch] current mode not available, not setting videomode" return rate = config.av.videorate[mode].value self.setMode(port, mode, rate) def setAspect(self, cfgelement): print "[AVSwitch] setting aspect: %s" % cfgelement.value try: f = open("/proc/stb/video/aspect", "w") f.write(cfgelement.value) f.close() except IOError: print "[AVSwitch] setting aspect failed." def setWss(self, cfgelement): if not cfgelement.value: wss = "auto(4:3_off)" else: wss = "auto" if os.path.exists("/proc/stb/denc/0/wss"): print "[AVSwitch] setting wss: %s" % wss f = open("/proc/stb/denc/0/wss", "w") f.write(wss) f.close() def setPolicy43(self, cfgelement): print "[AVSwitch] setting policy: %s" % cfgelement.value arw = "0" try: if about.getChipSetString() in ('meson-6', 'meson-64'): if cfgelement.value == "panscan" : arw = "11" if cfgelement.value == "letterbox" : arw = "12" if cfgelement.value == "bestfit" : arw = "10" open("/sys/class/video/screen_mode", "w").write(arw) else: f = open("/proc/stb/video/policy", "w") f.write(cfgelement.value) f.close() except IOError: print "[AVSwitch] setting policy43 failed." def setPolicy169(self, cfgelement): if os.path.exists("/proc/stb/video/policy2"): print "[AVSwitch] setting policy2: %s" % cfgelement.value f = open("/proc/stb/video/policy2", "w") f.write(cfgelement.value) f.close() def getOutputAspect(self): ret = (16,9) port = config.av.videoport.value if port not in config.av.videomode: print "current port not available in getOutputAspect!!! force 16:9" else: mode = config.av.videomode[port].value force_widescreen = self.isWidescreenMode(port, mode) is_widescreen = force_widescreen or config.av.aspect.value in ("16:9", "16:10") is_auto = config.av.aspect.value == "auto" if is_widescreen: if force_widescreen: pass else: aspect = {"16:9": "16:9", "16:10": "16:10"}[config.av.aspect.value] if aspect == "16:10": ret = (16,10) elif is_auto: try: if "1" in open("/proc/stb/vmpeg/0/aspect", "r").read(): # 4:3 ret = (4,3) except IOError: pass else: # 4:3 ret = (4,3) return ret def getFramebufferScale(self): aspect = self.getOutputAspect() fb_size = getDesktop(0).size() return aspect[0] * fb_size.height(), aspect[1] * fb_size.width() def setAspectRatio(self, value): eAVSwitch.getInstance().setAspectRatio(value) def getAspectRatioSetting(self): valstr = config.av.aspectratio.value if valstr == "4_3_letterbox": val = 0 elif valstr == "4_3_panscan": val = 1 elif valstr == "16_9": val = 2 elif valstr == "16_9_always": val = 3 elif valstr == "16_10_letterbox": val = 4 elif valstr == "16_10_panscan": val = 5 elif valstr == "16_9_letterbox": val = 6 return val
def parse_ecm(filename): addr = caid = pid = provid = port = reader = protocol = cw0 = cw1 = '' source = ecmtime = hops = 0 try: file = open(filename) for line in file.readlines(): line = line.strip() if line.find('CaID') >= 0: x = line.split(' ') caid = x[x.index('CaID') + 1].split(',')[0].strip() elif line.find('caid') >= 0: x = line.split(':', 1) caid = x[1].strip() if line.find('pid:') >= 0: x = line.split(':', 1) pid = x[1].strip() elif line.find('pid') >= 0: x = line.split(' ') pid = x[x.index('pid') + 1].strip() if line.find('prov:') >= 0: x = line.split(':', 1) provid = x[1].strip().split(',')[0] elif line.find('provid:') >= 0: x = line.split(':', 1) provid = x[1].strip() if line.find('msec') >= 0: x = line.split(' ', 1) ecmtime = int(x[0].strip()) elif line.find('ecm time:') >= 0: x = line.split(':', 1) if x[1].strip() == 'nan': ecmtime = 0 else: try: ecmtime = int(float(x[1].strip()) * 1000) except: y = x[1].strip().split(' ', 1) ecmtime = int(float(y[0].strip())) if line.find('hops:') >= 0: x = line.split(':', 1) hops = int(x[1].strip()) if line.find('reader:') >= 0: x = line.split(':', 1) reader = x[1].strip() if line.find('protocol:') >= 0: x = line.split(':', 1) protocol = x[1].strip() if line.find('using:') >= 0: x = line.split(':', 1) if x[1].strip() == 'emu': source = 1 elif x[1].strip() == 'net' or x[1].strip() == 'newcamd' or x[ 1].strip() == 'CCcam-s2s' or x[1].strip() == 'gbox': source = 2 elif line.find('source:') >= 0: x = line.split(':') if x[1].strip() == 'emu': source = 1 elif x[1].find('net') >= 0: source = 2 port = x[2].strip().split(')')[0] addr = x[1].split(' ')[4] elif x[1].strip() == 'newcamd': source = 2 elif line.find('address:') >= 0: x = line.split(':') if x[1].strip() != '': if x[1].find('/dev/sci0') >= 0: source = 4 elif x[1].find('/dev/sci1') >= 0: source = 5 elif x[1].find('local') >= 0: source = 1 elif x[1].find('/dev/ttyUSB0') >= 0: source = 6 elif x[1].find('/dev/ttyUSB1') >= 0: source = 7 else: try: addr = x[1].strip() port = x[2].strip() except: addr = x[1].strip() elif line.find('from:') >= 0: if line.find('local') >= 0: source = 3 else: source = 2 x = line.split(':') addr = x[1].strip() elif line.find('slot-1') >= 0: source = 4 if HardwareInfo().get_device_name() == 'dm800se': source = 5 elif line.find('slot-2') >= 0: source = 5 if HardwareInfo().get_device_name() == 'dm800se': source = 4 elif line.find('decode:') >= 0: if line.find('Internal') >= 0: source = 1 elif line.find('Network') >= 0: source = 2 elif line.find('/dev/sci0') >= 0: source = 4 if HardwareInfo().get_device_name() == 'dm800se': source = 5 elif line.find('/dev/sci1') >= 0: source = 5 if HardwareInfo().get_device_name() == 'dm800se': source = 4 else: source = 2 x = line.split(':') if x[1].strip() != '': try: addr = x[1].strip() port = x[2].strip() except: addr = x[1].strip() if line.find('cw0:') >= 0: x = line.split(':', 1) cw0 = x[1].strip() if line.find('cw1:') >= 0: x = line.split(':', 1) cw1 = x[1].strip() file.close() return (caid, pid, provid, ecmtime, source, addr, port, hops, reader, protocol, cw0, cw1) except: return 0
class AC3delay: def __init__(self): self.iService = None self.iServiceReference = None self.isStreamService = False self.iAudioDelay = None self.channelAudio = AC3 self.whichAudio = AC3 self.bIsRecording = False # Current audio- delay self.systemDelay = {} self.getAudioInformation() self.activateTimer = eTimer() self.activateTimer.callback.append(self.activateDelay) self.activateWait = config.plugins.AC3LipSync.activationDelay.getValue() # Current value for movie start behaviour self.movieStart = config.usage.on_movie_start.getValue() # find out box type self.oHWInfo = HardwareInfo() self.bHasToRestartService = self.oHWInfo.get_device_name() == "dm7025" def initAudio(self): self.iService = NavigationInstance.instance.getCurrentService() self.iServiceReference = NavigationInstance.instance.getCurrentlyPlayingServiceReference() self.isStreamService = self.iServiceReference and '%3a//' in self.iServiceReference.toString() self.iAudioDelay = self.iService and self.iService.audioDelay() self.iSeek = self.iService and self.iService.seek() def deleteAudio(self): self.iService = None self.iAudioDelay = None self.iSeek = None def setChannelAudio(self, sAudio): self.channelAudio = sAudio def delayedActivateDelay(self): if self.activateTimer.isActive: self.activateTimer.stop() self.activateTimer.start(self.activateWait, True) def activateDelay(self): # This activation code is only neccessary for DM7025. # DM800, DM8000 and DM500HD directly activate the delay after using "setAC3Delay" and "setPCMDelay", they don't need the service restart if self.activateTimer.isActive: self.activateTimer.stop() if self.bHasToRestartService == True: bInitialized = False if self.iService is None: self.initAudio() bInitialized = True if self.iServiceReference is not None: lCurPosition = self.cueGetCurrentPosition() self.deleteAudio() if self.whichAudio == self.channelAudio: config.usage.on_movie_start.setValue("beginning") NavigationInstance.instance.stopService() NavigationInstance.instance.playService(self.iServiceReference) config.usage.on_movie_start.setValue(self.movieStart) if lCurPosition is not None: self.lCurPosition = lCurPosition self.timer = eTimer() self.timer.callback.append(self.seekAfterWait) self.timer.start(200, True) else: self.deleteAudio() def seekAfterWait(self): self.timer.stop() self.initAudio() if self.iSeek is not None: self.iSeek.seekTo(self.lCurPosition) self.deleteAudio() def cueGetCurrentPosition(self): if self.iSeek is None: return None r = self.iSeek.getPlayPosition() if r[0]: return None return long(r[1]) def getSystemDelay(self, sAudio): bInitialized = False if self.iService is None: self.initAudio() bInitialized = True iDelay = 0 if self.iAudioDelay is not None: if sAudio == AC3: iDelay = self.iAudioDelay.getAC3Delay() elif sAudio == PCM: iDelay = self.iAudioDelay.getPCMDelay() elif sAudio == AC3GLOB: iDelay = config.av.generalAC3delay.getValue() else: iDelay = config.av.generalPCMdelay.getValue() if bInitialized == True: self.deleteAudio() if iDelay == -1: iDelay = 0 return iDelay def setSystemDelay(self, sAudio, iDelay, bDelayStart): bInitialized = False if self.iService is None: self.initAudio() bInitialized = True if self.iAudioDelay is not None: iDelayLameDb = iDelay if iDelayLameDb == 0: iDelayLameDb = -1 if sAudio == AC3: self.iAudioDelay.setAC3Delay(iDelayLameDb) elif sAudio == PCM: self.iAudioDelay.setPCMDelay(iDelayLameDb) elif sAudio == AC3GLOB: config.av.generalAC3delay.setValue(iDelay) config.av.generalAC3delay.save() #Setting the global delay does not activate it, so now we call setAC3Delay to activate the new delay.. self.iAudioDelay.setAC3Delay(self.systemDelay[AC3]) else: config.av.generalPCMdelay.setValue(iDelay) config.av.generalPCMdelay.save() #Setting the global delay does not activate it, so now we call setPCMDelay to activate the new delay.. self.iAudioDelay.setPCMDelay(self.systemDelay[PCM]) if bInitialized == True: self.deleteAudio() if bDelayStart == True: self.delayedActivateDelay() else: self.activateDelay() def getAudioInformation(self): bInitialized = False if self.iService is None: self.initAudio() bInitialized = True # check if we are in a recording lCurPosition = self.cueGetCurrentPosition() if lCurPosition is not None: self.bIsRecording = True # check if downmix is enabled try: bDownmixEnabled = config.av.downmix_ac3.value except: bDownmixEnabled = False oAudioTracks = self.iService and self.iService.audioTracks() n = oAudioTracks and oAudioTracks.getNumberOfTracks() or 0 tlist = [] self.selectedAudioIndex = self.selectedAudioInfo = None if n: self.selectedAudioIndex = oAudioTracks.getCurrentTrack() for x in range(n): i = oAudioTracks.getTrackInfo(x) language = i.getLanguage() description = i.getDescription() if LanguageCodes.has_key(language): language = LanguageCodes[language][0] if len(description): description += " (" + language + ")" else: description = language tlist.append((description, x)) if x == self.selectedAudioIndex: if ((description.find("AC3") != -1 or description.find("AC-3") != -1 or description.find("AC3+") != -1) and not bDownmixEnabled) or description.find("DTS") != -1 or description.find("DTS-HD") != -1: self.whichAudio = AC3 self.channelAudio = AC3 else: self.whichAudio = PCM self.channelAudio = PCM self.selectedAudioInfo = (description, x) tlist.sort(key=lambda x: x[0]) self.audioTrackList = tlist for sAudio in AC3PCM: self.systemDelay[sAudio]=self.getSystemDelay(sAudio) del oAudioTracks if bInitialized == True: self.deleteAudio()
def runSetup(self): ###### chwilowe dane do wyboru mapy lircd MyKeymap = [] self.list = [] for file in listdir("/etc/"): #print os_path.join("/etc/", file) if file.startswith("lircd") and file.endswith(".conf"): #print os_path.join("/etc/", file) MyKeymap.append((os_path.join("/etc/", file), file)) config.GOSsettings.lircdCONF = NoSave( ConfigSelection(default="lircd.conf", choices=MyKeymap)) GOSsettings_list.append( (config.GOSsettings.lircdCONF, "lircdCONF", "CONFIG")) ##### KONIEC DEFINICJI ##### self.list.append( getConfigListEntry(_("--- Standard settings ---"), config.GOSsettings.separator)) try: self.list.append( getConfigListEntry(_("Selected terminal:"), config.GOSsettings.sshd)) except: pass if HardwareInfo().get_device_name() == 'nbox': self.list.append( getConfigListEntry("Czytnik kart:", config.GOSsettings.sci)) self.list.append( getConfigListEntry("Wyświetlacz LED:", config.GOSsettings.led)) self.list.append( getConfigListEntry("Wyświetlacz VFD:", config.GOSsettings.vfd)) self.list.append( getConfigListEntry(_("Checking file system during boot?"), config.GOSsettings.fscheck)) #wybor e2 if fileExists("/usr/bin/enigma2-multiframework"): self.list.append( getConfigListEntry(_("openPLI uses:"), config.GOSsettings.activeOpenPLI)) #drzewo okpg if fileExists("/etc/opkg/opkg.conf"): self.list.append( getConfigListEntry(_("OPKG branch:"), config.GOSsettings.opkg)) ###################### ustawienia TYLKO dla SPARK7162 ############################# if GOSHardwareInfo().get_rcstype() == 'SPARK7162': self.list.append( getConfigListEntry(" ", config.GOSsettings.separator)) self.list.append( getConfigListEntry("--- Spark7162/Triplex/AA2 settings ---", config.GOSsettings.separator)) self.list.append( getConfigListEntry(_("Air head mode:"), config.GOSsettings.SPARK7162tunerType) ) # zapisywane w /etc/sysctl.gos self.list.append( getConfigListEntry(_("Time also on main VFD:"), config.GOSsettings.SPARK7162vfdtime) ) # zapisywane w /etc/sysctl.gos ###### ADDITIONAL SETTINGS ##### self.list.append(getConfigListEntry(" ", config.GOSsettings.separator)) self.list.append( getConfigListEntry(_("--- Additional settings ---"), config.GOSsettings.separator)) self.list.append( getConfigListEntry(_("Enable skins-HD support"), config.GOSsettings.EnableSkinHD)) self.list.append( getConfigListEntry(_("Emergency tuner restart"), config.GOSsettings.POWERx5) ) # własna procedura nie wykonywana, bo to tak tylko informacyjnie self.list.append( getConfigListEntry(_("Time synchronization:"), config.GOSsettings.useTransponderTime) ) # zapisywane w /etc/sysctl.gos self.list.append( getConfigListEntry(_("Shutdown type:"), config.GOSsettings. ModerateShutDown)) # moderate gdzie nie ma deep if config.GOSsettings.ModerateShutDown.value == "on": self.list.append( getConfigListEntry(_("Show clock:"), config.GOSsettings.clockINmoderate)) self.list.append( getConfigListEntry(_("Set icon:"), config.GOSsettings.iconINmoderate)) #zmienne globalne z openPLI, generalnie powinny byc zdefiniowane w UsageConfig.py try: self.list.append( getConfigListEntry(_("Volume controlled in TV:"), config.hdmicec.volume_forwarding)) except: pass ###### KONIFGURACJA PILOTA ##### self.list.append(getConfigListEntry(" ", config.GOSsettings.separator)) self.list.append( getConfigListEntry(_("--- Remote control settings ---"), config.GOSsettings.separator)) self.list.append( getConfigListEntry( _("Lircd settings:"), config.GOSsettings.lircdCONF)) # zapisywane w /etc/sysctl.gos #self.list.append(getConfigListEntry(_("evremote2 mode:"), config.GOSsettings.useLircdName)) # zapisywane w /etc/sysctl.gos #if config.GOSsettings.useLircdName.value == "on": self.list.append( getConfigListEntry(_("Blinking icon:"), config.GOSsettings.blinkingIcon)) self.list.append( getConfigListEntry( _("Max. key press time (90-250, standard 130ms):"), config.GOSsettings.usePeriod)) # zapisywane w /etc/sysctl.gos self.list.append( getConfigListEntry( _("Delay (10-100, standard 20ms):"), config.GOSsettings.useDelay)) # zapisywane w /etc/sysctl.gos #Advanced settings self.list.append(getConfigListEntry(" ", config.GOSsettings.separator)) self.list.append( getConfigListEntry(_("--- Advanced settings ---"), config.GOSsettings.separator)) if fileExists("/lib/modules/cpu_frequ.ko") or fileExists( "/lib/modules/cpu_freq.ko"): mySPEED = "(---)" if fileExists("/proc/cpu_frequ/pll0_ndiv_mdiv"): with open("/proc/cpu_frequ/pll0_ndiv_mdiv", "r") as mySPEEDfile: for line in mySPEEDfile: if line.startswith( 'SH4') and not line.startswith('SH4_'): mySPEED = _("(now %sMHz)") % line.split()[2] break mySPEEDfile.close() self.list.append( getConfigListEntry( _("CPU speed %s:") % mySPEED, config.GOSsettings.cpuFREQ)) self.list.append( getConfigListEntry(_("Write debug logs?"), config.GOSsettings.oPLIdbg)) self.list.append( getConfigListEntry(_("timestamp each item?"), config.GOSsettings.oPLIdbgtimestamp)) self.list.append( getConfigListEntry(_("Debug logs in:"), config.GOSsettings.oPLIdbgFolder)) self.list.append( getConfigListEntry(_("Keep old logs?"), config.GOSsettings.oPLIdbgArchive)) self.list.append( getConfigListEntry(_("Automatically share GS during boot?"), config.GOSsettings.ReportGS)) #outdated? #self.list.append(getConfigListEntry("Serwer z listą kanałów:", config.GOSsettings.SERWER)) #self.list.append(getConfigListEntry("Archiwum listy kanałów:", config.GOSsettings.NAZWA_PLIKU)) self["config"].list = self.list self["config"].setList(self.list)
def getImagesList(self): def getImages(path, files, folder=None): for file in [ x for x in files if os.path.splitext(x)[1] == ".zip" and model in x ]: try: folder = "Image backups" if folder == "imagebackups" else "Downloaded Images" if checkimagefiles([ x.split(os.sep)[-1] for x in zipfile.ZipFile(file).namelist() ]): if folder not in self.imagesList: self.imagesList[folder] = {} self.imagesList[folder][file] = { 'link': file, 'name': file.split(os.sep)[-1] } except: pass model = HardwareInfo().get_machine_name() if not self.imagesList: if not self.jsonlist: try: self.jsonlist = dict( json.load( urllib2.urlopen( 'http://downloads.openpli.org/json/%s' % model))) if config.usage.alternative_imagefeed.value: self.jsonlist.update( dict( json.load( urllib2.urlopen( '%s%s' % (config.usage.alternative_imagefeed. value, model))))) except: pass self.imagesList = dict(self.jsonlist) for media in ['/media/%s' % x for x in os.listdir('/media')] + ([ '/media/net/%s' % x for x in os.listdir('/media/net') ] if os.path.isdir('/media/net') else []): try: getImages(media, [ os.path.join(media, x) for x in os.listdir(media) if os.path.splitext(x)[1] == ".zip" and model in x ]) for folder in [ "images", "downloaded_images", "imagebackups" ]: if folder in os.listdir(media): media = os.path.join(media, folder) if os.path.isdir(media) and not os.path.islink( media) and not os.path.ismount(media): getImages(media, [ os.path.join(media, x) for x in os.listdir(media) if os.path.splitext(x)[1] == ".zip" and model in x ], folder) for dir in [ dir for dir in [ os.path.join(media, dir) for dir in os.listdir(media) ] if os.path.isdir(dir) and os.path.splitext(dir)[1] == ".unzipped" ]: shutil.rmtree(dir) except: pass list = [] for catagorie in reversed(sorted(self.imagesList.keys())): if catagorie in self.expanded: list.append( ChoiceEntryComponent('expanded', ((str(catagorie)), "Expander"))) for image in reversed(sorted( self.imagesList[catagorie].keys())): list.append( ChoiceEntryComponent( 'verticalline', ((str(self.imagesList[catagorie][image]['name'])), str(self.imagesList[catagorie][image]['link'])))) else: for image in self.imagesList[catagorie].keys(): list.append( ChoiceEntryComponent('expandable', ((str(catagorie)), "Expander"))) break if list: self["list"].setList(list) if self.setIndex: self["list"].moveToIndex( self.setIndex if self.setIndex < len(list) else len(list) - 1) if self["list"].l.getCurrentSelection()[0][1] == "Expander": self.setIndex -= 1 if self.setIndex: self["list"].moveToIndex(self.setIndex if self.setIndex < len(list) else len(list) - 1) self.setIndex = 0 self.selectionChanged() else: self.session.openWithCallback( self.close, MessageBox, _("Cannot find images - please try later"), type=MessageBox.TYPE_ERROR, timeout=3)
class NFIFlash(Screen): skin = """ <screen name="NFIFlash" position="90,95" size="560,420" title="Image flash utility"> <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" /> <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" /> <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#a08500" transparent="1" /> <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#18188b" transparent="1" /> <widget source="listlabel" render="Label" position="16,44" size="200,21" valign="center" font="Regular;18" /> <widget name="filelist" position="0,68" size="260,260" scrollbarMode="showOnDemand" /> <widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" /> <widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" /> <widget source="job_progresslabel" render="Label" position="180,378" zPosition="2" font="Regular;18" halign="center" transparent="1" size="200,22" foregroundColor="#000000" /> <widget source="statusbar" render="Label" position="10,404" size="540,16" font="Regular;16" foregroundColor="#cccccc" /> </screen>""" def __init__(self, session, cancelable = True, close_on_finish = False): self.skin = NFIFlash.skin Screen.__init__(self, session) self["job_progressbar"] = Progress() self["job_progresslabel"] = StaticText("") self["finished"] = Boolean() self["infolabel"] = StaticText("") self["statusbar"] = StaticText(_("Please select .NFI flash image file from medium")) self["listlabel"] = StaticText(_("select .NFI flash file")+":") self["key_green"] = StaticText() self["key_yellow"] = StaticText() self["key_blue"] = StaticText() self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions"], { "green": self.ok, "yellow": self.reboot, "ok": self.ok, "left": self.left, "right": self.right, "up": self.up, "down": self.down }, -1) currDir = "/media/usb/" self.filelist = FileList(currDir, matchingPattern = "^.*\.(nfi|NFI)") self["filelist"] = self.filelist self.nfifile = "" self.md5sum = "" self.job = None self.box = HardwareInfo().get_device_name() def closeCB(self): if ( self.job is None or self.job.status is not self.job.IN_PROGRESS ) and not self.no_autostart: self.close() #else: #if self.cancelable: #self.cancel() def up(self): self["filelist"].up() self.check_for_NFO() def down(self): self["filelist"].down() self.check_for_NFO() def right(self): self["filelist"].pageDown() self.check_for_NFO() def left(self): self["filelist"].pageUp() self.check_for_NFO() def check_for_NFO(self): self.session.summary.setText(self["filelist"].getFilename()) if self["filelist"].getFilename() is None: return if self["filelist"].getCurrentDirectory() is not None: self.nfifile = self["filelist"].getCurrentDirectory()+self["filelist"].getFilename() if self.nfifile.upper().endswith(".NFI"): self["key_green"].text = _("Flash") nfofilename = self.nfifile[0:-3]+"nfo" if fileExists(nfofilename): nfocontent = open(nfofilename, "r").read() self["infolabel"].text = nfocontent pos = nfocontent.find("MD5:") if pos > 0: self.md5sum = nfocontent[pos+5:pos+5+32] + " " + self.nfifile else: self.md5sum = "" else: self["infolabel"].text = _("No details for this image file") + ":\n" + self["filelist"].getFilename() self.md5sum = "" else: self["infolabel"].text = "" self["key_green"].text = "" def ok(self): if self.job is None or self.job.status is not self.job.IN_PROGRESS: if self["filelist"].canDescent(): # isDir self["filelist"].descent() self.session.summary.setText(self["filelist"].getFilename()) self.check_for_NFO() else: self.queryFlash() def queryFlash(self): fd = open(self.nfifile, 'r') print fd sign = fd.read(11) print sign if sign.find("NFI1" + self.box + "\0") == 0: if self.md5sum != "": self["statusbar"].text = ("Please wait for md5 signature verification...") self.session.summary.setText(("Please wait for md5 signature verification...")) self.container = eConsoleAppContainer() self.container.setCWD(self["filelist"].getCurrentDirectory()) self.container.appClosed.append(self.md5finished) self.container.dataSent.append(self.md5ready) self.container.execute("md5sum -cw -") self.container.write(self.md5sum) else: self.session.openWithCallback(self.queryCB, MessageBox, _("This .NFI file does not have a md5sum signature and is not guaranteed to work. Do you really want to burn this image to flash memory?"), MessageBox.TYPE_YESNO) else: self.session.open(MessageBox, (_("This .NFI file does not contain a valid %s image!") % (self.box.upper())), MessageBox.TYPE_ERROR) def md5ready(self, retval): self.container.sendEOF() def md5finished(self, retval): if retval==0: self.session.openWithCallback(self.queryCB, MessageBox, _("This .NFI file has a valid md5 signature. Continue programming this image to flash memory?"), MessageBox.TYPE_YESNO) else: self.session.openWithCallback(self.queryCB, MessageBox, _("The md5sum validation failed, the file may be corrupted! Are you sure that you want to burn this image to flash memory? You are doing this at your own risk!"), MessageBox.TYPE_YESNO) def queryCB(self, answer): if answer == True: self.createJob() else: self["statusbar"].text = _("Please select .NFI flash image file from medium") def createJob(self): self.job = Job("Image flashing job") param = [self.nfifile] writeNAND(self.job,param,self.box) #writeNAND2(self.job,param) #writeNAND3(self.job,param) self.job.state_changed.append(self.update_job) self.job.end = 540 self.cwd = self["filelist"].getCurrentDirectory() self["job_progressbar"].range = self.job.end self.startJob() def startJob(self): self["key_blue"].text = "" self["key_yellow"].text = "" self["key_green"].text = "" #self["progress0"].show() #self["progress1"].show() self.job.start(self.jobcb) def update_job(self): j = self.job #print "[job state_changed]" if j.status == j.IN_PROGRESS: self.session.summary["job_progressbar"].value = j.progress self.session.summary["job_progressbar"].range = j.end self.session.summary["job_progresslabel"].text = "%.2f%%" % (100*j.progress/float(j.end)) self["job_progressbar"].range = j.end self["job_progressbar"].value = j.progress #print "[update_job] j.progress=%f, j.getProgress()=%f, j.end=%d, text=%f" % (j.progress, j.getProgress(), j.end, (100*j.progress/float(j.end))) self["job_progresslabel"].text = "%.2f%%" % (100*j.progress/float(j.end)) self.session.summary.setText(j.tasks[j.current_task].name) self["statusbar"].text = (j.tasks[j.current_task].name) elif j.status == j.FINISHED: self["statusbar"].text = _("Writing NFI image file to flash completed") self.session.summary.setText(_("NFI image flashing completed. Press Yellow to Reboot!")) self["key_yellow"].text = _("Reboot") elif j.status == j.FAILED: self["statusbar"].text = j.tasks[j.current_task].name + " " + _("failed") self.session.open(MessageBox, (_("Flashing failed") + ":\n" + j.tasks[j.current_task].name + ":\n" + j.tasks[j.current_task].output_line), MessageBox.TYPE_ERROR) def jobcb(self, jobref, fasel, blubber): print "[jobcb] %s %s %s" % (jobref, fasel, blubber) self["key_green"].text = _("Flash") def reboot(self): if self.job.status == self.job.FINISHED: self["statusbar"].text = ("rebooting...") TryQuitMainloop(self.session,2) def createSummary(self): return NFISummary