From d732b430ccc1d1a78e666f16553b2e3c5dd131a8 Mon Sep 17 00:00:00 2001 From: ghost Date: Sun, 16 Nov 2008 13:12:56 +0100 Subject: work on asynchron pic loading... to get rid of spinning wheels --- lib/python/Components/AVSwitch.py | 15 +++++++++++++++ lib/python/enigma_python.i | 1 + 2 files changed, 16 insertions(+) (limited to 'lib/python') diff --git a/lib/python/Components/AVSwitch.py b/lib/python/Components/AVSwitch.py index 8f99b98e..7ac2bb98 100644 --- a/lib/python/Components/AVSwitch.py +++ b/lib/python/Components/AVSwitch.py @@ -28,6 +28,21 @@ class AVSwitch: def setSystem(self, value): eAVSwitch.getInstance().setVideomode(value) + def getOutputAspect(self): + if valstr in ("4_3_letterbox", "4_3_panscan"): # 4:3 + return 1.333333333 + elif valstr == "16_9": # auto ... 4:3 or 16:9 + # TODO: here we must retrieve the current video aspect ratio... + # because the TV can run in 4:3 or in 16:9 mode.. (switched by wss or scart pin8) + # until we have done this we always return the scale value for 16:9!! + return 1.777777778 + elif valstr in ("16_9_always", "16_9_letterbox"): # 16:9 + return 1.777777778 + elif valstr in ("16_10_letterbox", "16_10_panscan"): # 16:10 + return 1.6 + print "unknown output aspect!" + return 1.0000 + def getAspectRatioSetting(self): valstr = config.av.aspectratio.value if valstr == "4_3_letterbox": diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i index 7de05d2b..84936375 100644 --- a/lib/python/enigma_python.i +++ b/lib/python/enigma_python.i @@ -141,6 +141,7 @@ typedef long time_t; %include // TODO: embed these... +%immutable ePicLoad::PictureData; %immutable eButton::selected; %immutable eInput::changed; %immutable eComponentScan::statusChanged; -- cgit v1.2.3 From 94913d0f73c36623ae19916d79cee759b7f6bc98 Mon Sep 17 00:00:00 2001 From: ghost Date: Sun, 16 Nov 2008 13:14:59 +0100 Subject: change pictureplayer to use async pic loading --- .../Plugins/Extensions/PicturePlayer/plugin.py | 901 +++++++++++---------- 1 file changed, 464 insertions(+), 437 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py index ea906f0d..7d62d2be 100644 --- a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py +++ b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py @@ -1,318 +1,511 @@ -from enigma import eTimer, loadPic, getExif +from enigma import ePicLoad, eTimer, getDesktop + from Screens.Screen import Screen -from Screens.ServiceInfo import ServiceInfoList, ServiceInfoListEntry -from Components.ActionMap import ActionMap, NumberActionMap +from Tools.Directories import resolveFilename, pathExists, SCOPE_MEDIA +from Plugins.Plugin import PluginDescriptor + from Components.Pixmap import Pixmap, MovingPixmap +from Components.ActionMap import ActionMap, NumberActionMap from Components.Label import Label - -from Components.ConfigList import ConfigList -from Components.config import * - -from Tools.Directories import resolveFilename, fileExists, pathExists, createDir, SCOPE_MEDIA +from Components.Button import Button from Components.FileList import FileList from Components.AVSwitch import AVSwitch +from Components.Sources.List import List +from Components.ConfigList import ConfigList -from Plugins.Plugin import PluginDescriptor +from Components.config import config, ConfigSubsection, ConfigInteger, ConfigSelection, ConfigText, ConfigEnableDisable, KEY_LEFT, KEY_RIGHT, KEY_0, getConfigListEntry + +def getAspectforPic(): + return AVSwitch().getFramebufferScale() config.pic = ConfigSubsection() -config.pic.slidetime = ConfigInteger(default=10, limits=(5, 60)) -config.pic.resize = ConfigSelection(default="0", choices = [("0", _("simple")), ("1", _("better"))]) +config.pic.framesize = ConfigInteger(default=30, limits=(5, 99)) +config.pic.slidetime = ConfigInteger(default=10, limits=(10, 60)) +config.pic.resize = ConfigSelection(default="1", choices = [("0", _("simple")), ("1", _("better"))]) config.pic.cache = ConfigEnableDisable(default=True) config.pic.lastDir = ConfigText(default=resolveFilename(SCOPE_MEDIA)) -config.pic.rotate = ConfigSelection(default="0", choices = [("0", _("none")), ("1", _("manual")), ("2", _("by Exif"))]) +config.pic.infoline = ConfigEnableDisable(default=True) +config.pic.loop = ConfigEnableDisable(default=True) +config.pic.bgcolor = ConfigSelection(default="#00000000", choices = [("#00000000", _("black")),("#009eb9ff", _("blue")),("#00ff5a51", _("red")), ("#00ffe875", _("yellow")), ("#0038FF48", _("green"))]) +config.pic.textcolor = ConfigSelection(default="#0038FF48", choices = [("#00000000", _("black")),("#009eb9ff", _("blue")),("#00ff5a51", _("red")), ("#00ffe875", _("yellow")), ("#0038FF48", _("green"))]) -def getAspect(): - val = AVSwitch().getAspectRatioSetting() - return val/2 +class picshow(Screen): + def __init__(self, session): + self.skin = """ + + + + + + + + + + + + """ -#------------------------------------------------------------------------------------------ + Screen.__init__(self, session) + + self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions"], + { + "cancel": self.KeyExit, + "red": self.KeyRed, + "yellow": self.KeyYellow, + "blue": self.KeyBlue, + "ok": self.KeyOk + }, -1) + + self["key_red"] = Button(_("Thumbnails")) + self["key_green"] = Button() + self["key_yellow"] = Button(_("Exif")) + self["key_blue"] = Button(_("Setup")) + self["label"] = Label() + self["thn"] = Pixmap() -class ThumbView(Screen): - skin = """ - - - - - - - - - - - - - - - - """ + currDir = config.pic.lastDir.value + if not pathExists(currDir): + currDir = "/" + + self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(jpeg|jpg|jpe|png|bmp|gif)") + self["filelist"] = self.filelist + self["filelist"].onSelectionChanged.append(self.selectionChanged) + + self.ThumbTimer = eTimer() + self.ThumbTimer.callback.append(self.showThumb) + + self.picload = ePicLoad() + self.picload.PictureData.get().append(self.showPic) + + self.onLayoutFinish.append(self.setConf) + + def showPic(self, picInfo=""): + ptr = self.picload.getData() + if ptr != None: + self["thn"].instance.setPixmap(ptr.__deref__()) + self["thn"].show() + + text = picInfo.split('\n',1) + self["label"].setText(text[1]) + self["label"].show() + + def showThumb(self): + if not self.filelist.canDescent(): + if self.picload.getThumbnail(self.filelist.getCurrentDirectory() + self.filelist.getFilename()) == 1: + self.ThumbTimer.start(500, True) + + def selectionChanged(self): + if not self.filelist.canDescent(): + self.ThumbTimer.start(500, True) + else: + self["label"].hide() + self["thn"].hide() + + def KeyRed(self): + #if not self.filelist.canDescent(): + self.session.openWithCallback(self.callbackView, Pic_Thumb, self.filelist.getFileList(), self.filelist.getSelectionIndex(), self.filelist.getCurrentDirectory()) + + def KeyYellow(self): + if not self.filelist.canDescent(): + self.session.open(Pic_Exif, self.picload.getInfo(self.filelist.getCurrentDirectory() + self.filelist.getFilename())) - def __init__(self, session, filelist, name, path): - self.skin = ThumbView.skin + def KeyBlue(self): + self.session.openWithCallback(self.setConf ,Pic_Setup) + + def KeyOk(self): + if self.filelist.canDescent(): + self.filelist.descent() + else: + self.session.openWithCallback(self.callbackView, Pic_Full_View, self.filelist.getFileList(), self.filelist.getSelectionIndex(), self.filelist.getCurrentDirectory()) + + def setConf(self): + #0=Width 1=Height 2=Aspect 3=use_cache 4=resize_type 5=Background(#AARRGGBB) + self.picload.setPara([self["thn"].instance.size().width(), self["thn"].instance.size().height(), getAspectforPic(), config.pic.cache.value, int(config.pic.resize.value), "#00000000"]) + + def callbackView(self, val=0): + if val > 0: + self.filelist.moveToIndex(val) + + def KeyExit(self): + del self.picload + + if self.filelist.getCurrentDirectory() is None: + config.pic.lastDir.value = "/" + else: + config.pic.lastDir.value = self.filelist.getCurrentDirectory() + + config.pic.save() + self.close() + +#------------------------------------------------------------------------------------------ + +class Pic_Setup(Screen): + def __init__(self, session): + self.skin = """ + + """ + Screen.__init__(self, session) + + self["actions"] = NumberActionMap(["SetupActions"], + { + "cancel": self.close, + "left": self.keyLeft, + "right": self.keyRight, + "0": self.keyNumber, + "1": self.keyNumber, + "2": self.keyNumber, + "3": self.keyNumber, + "4": self.keyNumber, + "5": self.keyNumber, + "6": self.keyNumber, + "7": self.keyNumber, + "8": self.keyNumber, + "9": self.keyNumber + }, -1) + + list = [] + self["liste"] = ConfigList(list) + list.append(getConfigListEntry(_("Slideshow Interval (sec.)"), config.pic.slidetime)) + list.append(getConfigListEntry(_("Scaling Mode"), config.pic.resize)) + list.append(getConfigListEntry(_("Cache Thumbnails"), config.pic.cache)) + list.append(getConfigListEntry(_("show Infoline"), config.pic.infoline)) + list.append(getConfigListEntry(_("Frame size in full view"), config.pic.framesize)) + list.append(getConfigListEntry(_("slide picture in loop"), config.pic.loop)) + list.append(getConfigListEntry(_("backgroundcolor"), config.pic.bgcolor)) + list.append(getConfigListEntry(_("textcolor"), config.pic.textcolor)) + + def keyLeft(self): + self["liste"].handleKey(KEY_LEFT) + + def keyRight(self): + self["liste"].handleKey(KEY_RIGHT) + + def keyNumber(self, number): + self["liste"].handleKey(KEY_0 + number) + +#--------------------------------------------------------------------------- + +class Pic_Exif(Screen): + def __init__(self, session, exiflist): + self.skin = """ + + + {"template": [ MultiContentEntryText(pos = (5, 5), size = (250, 30), flags = RT_HALIGN_LEFT, text = 0), MultiContentEntryText(pos = (260, 5), size = (290, 30), flags = RT_HALIGN_LEFT, text = 1)], "fonts": [gFont("Regular", 20)], "itemHeight": 30 } + + + """ Screen.__init__(self, session) - self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "MovieSelectionActions"], + self["actions"] = ActionMap(["OkCancelActions"], + { + "cancel": self.close + }, -1) + + exifdesc = [_("Filename:"), "EXIF-Version:", "Make:", "Camera:", "Date/Time:", "Width / Height:", "Flash used:", "Orientation:", "User Comments:", "Metering Mode:", "Exposure Program:", "Light Source:", "CompressedBitsPerPixel:", "ISO Speed Rating:", "X-Resolution:", "Y-Resolution:", "Resolution Unit:", "Brightness:", "Exposure Time:", "Exposure Bias:", "Distance:", "CCD-Width:", "ApertureFNumber:"] + list = [] + + for x in range(len(exiflist)): + if x>0: + list.append((exifdesc[x], exiflist[x])) + else: + name = exiflist[x].split('/')[-1] + list.append((exifdesc[x], name)) + self["menu"] = List(list) + +#---------------------------------------------------------------------------------------- + +T_INDEX = 0 +T_FRAME_POS = 1 +T_PAGE = 2 +T_NAME = 3 +T_FULL = 4 + +class Pic_Thumb(Screen): + def __init__(self, session, piclist, lastindex, path): + + self.textcolor = config.pic.textcolor.value + self.color = config.pic.bgcolor.value + textsize = 20 + self.spaceX = 35 + self.picX = 190 + self.spaceY = 30 + self.picY = 200 + + size_w = getDesktop(0).size().width() + size_h = getDesktop(0).size().height() + self.thumbsX = size_w / (self.spaceX + self.picX) # thumbnails in X + self.thumbsY = size_h / (self.spaceY + self.picY) # thumbnails in Y + self.thumbsC = self.thumbsX * self.thumbsY # all thumbnails + + self.positionlist = [] + skincontent = "" + + posX = -1 + for x in range(self.thumbsC): + posY = x / self.thumbsX + posX += 1 + if posX >= self.thumbsX: + posX = 0 + + absX = self.spaceX + (posX*(self.spaceX + self.picX)) + absY = self.spaceY + (posY*(self.spaceY + self.picY)) + self.positionlist.append((absX, absY)) + skincontent += "" + + skincontent += "" + + + # Screen, backgroundlabel and MovingPixmap + self.skin = " \ + " + skincontent + "" + + Screen.__init__(self, session) + + self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions", "MovieSelectionActions"], { "cancel": self.Exit, "ok": self.KeyOk, - "showEventInfo": self.StartExif, - "right": self.key_right, "left": self.key_left, + "right": self.key_right, "up": self.key_up, - "down": self.key_down + "down": self.key_down, + "showEventInfo": self.StartExif, }, -1) - for x in range(6): + self["frame"] = MovingPixmap() + for x in range(self.thumbsC): self["label"+str(x)] = Label() self["thumb"+str(x)] = Pixmap() - self["frame"] = MovingPixmap() - - self.aspect = getAspect() - self.path = path - self.filelist = filelist + + self.Thumbnaillist = [] + self.filelist = [] self.currPage = -1 - self.index = 0 - self.old_index = 0 - self.thumblist = [] - self.thumbindex = 0 - self.list = [] - self.poslist = [[50,63],[265,63],[480,63],[50,288],[265,288],[480,288]] - - count=0 - pos=0 - for x in self.filelist: + self.dirlistcount = 0 + self.path = path + + index = 0 + framePos = 0 + Page = 0 + for x in piclist: if x[0][1] == False: - self.list.append((x[0][0], self.path + x[0][0], count/6, pos, "(" + str(count+1) + ") ")) - pos += 1 - if pos == 6: - pos = 0 - if x[0][0] == name: - self.index = count - count += 1 - self.maxentry = len(self.list)-1 + self.filelist.append((index, framePos, Page, x[0][0], path + x[0][0])) + index += 1 + framePos += 1 + if framePos > (self.thumbsC -1): + framePos = 0 + Page += 1 + else: + self.dirlistcount += 1 - if self.maxentry < 0: - self["label0"].setText(_("no Picture found")) + self.maxentry = len(self.filelist)-1 + self.index = lastindex - self.dirlistcount + if self.index < 0: + self.index = 0 + + self.picload = ePicLoad() + self.picload.PictureData.get().append(self.showPic) + + self.onLayoutFinish.append(self.setPicloadConf) self.ThumbTimer = eTimer() - self.ThumbTimer.callback.append(self.showThumb) + self.ThumbTimer.callback.append(self.showPic) - self.fillPage() + def setPicloadConf(self): + self.picload.setPara([self["thumb0"].instance.size().width(), self["thumb0"].instance.size().height(), getAspectforPic(), config.pic.cache.value, int(config.pic.resize.value), self.color]) + self.paintFrame() + + def paintFrame(self): + #print "index=" + str(self.index) + if self.maxentry < self.index or self.index < 0: + return + + pos = self.positionlist[self.filelist[self.index][T_FRAME_POS]] + self["frame"].moveTo( pos[0], pos[1], 1) + self["frame"].startMoving() + + if self.currPage != self.filelist[self.index][T_PAGE]: + self.currPage = self.filelist[self.index][T_PAGE] + self.newPage() + + def newPage(self): + self.Thumbnaillist = [] + #clear Labels and Thumbnail + for x in range(self.thumbsC): + self["label"+str(x)].setText("") + self["thumb"+str(x)].hide() + #paint Labels and fill Thumbnail-List + for x in self.filelist: + if x[T_PAGE] == self.currPage: + self["label"+str(x[T_FRAME_POS])].setText("(" + str(x[T_INDEX]+1) + ") " + x[T_NAME]) + self.Thumbnaillist.append([0, x[T_FRAME_POS], x[T_FULL]]) + + #paint Thumbnail start + self.showPic() + + def showPic(self, picInfo=""): + for x in range(len(self.Thumbnaillist)): + if self.Thumbnaillist[x][0] == 0: + if self.picload.getThumbnail(self.Thumbnaillist[x][2]) == 1: #zu tun probier noch mal + self.ThumbTimer.start(500, True) + else: + self.Thumbnaillist[x][0] = 1 + break + elif self.Thumbnaillist[x][0] == 1: + self.Thumbnaillist[x][0] = 2 + ptr = self.picload.getData() + if ptr != None: + self["thumb" + str(self.Thumbnaillist[x][1])].instance.setPixmap(ptr.__deref__()) + self["thumb" + str(self.Thumbnaillist[x][1])].show() + def key_left(self): self.index -= 1 if self.index < 0: self.index = self.maxentry - self.fillPage() + self.paintFrame() def key_right(self): self.index += 1 if self.index > self.maxentry: self.index = 0 - self.fillPage() + self.paintFrame() def key_up(self): - self.index -= 3 + self.index -= self.thumbsX if self.index < 0: - self.index = 0 - self.fillPage() + self.index =self.maxentry + self.paintFrame() def key_down(self): - self.index += 3 + self.index += self.thumbsX if self.index > self.maxentry: - self.index = self.maxentry - self.fillPage() - - def fillPage(self): - if self.maxentry < 0: - return + self.index = 0 + self.paintFrame() - self["frame"].moveTo(self.poslist[self.list[self.index][3]][0], self.poslist[self.list[self.index][3]][1], 1) - self["frame"].startMoving() - - if self.list[self.index][2] != self.currPage: - self.currPage = self.list[self.index][2] - textlist = ["","","","","",""] - self.thumblist = ["","","","","",""] - - for x in self.list: - if x[2] == self.currPage: - textlist[x[3]] = x[4] + x[0] - self.thumblist[x[3]] = x[0] - - for x in range(6): - self["label"+str(x)].setText(textlist[x]) - self["thumb"+str(x)].hide() - - self.ThumbTimer.start(500, True) - - def showThumb(self): - if self.thumblist[self.thumbindex] != "": - cachefile = "" - if config.pic.cache.value: - cachedir = self.path + ".Thumbnails/" - cachefile = cachedir + self.thumblist[self.thumbindex] + str(180) + str(160) + str(self.aspect) - if not pathExists(cachedir): - if not createDir(cachedir): - cachefile = "" - - ptr = loadPic(self.path + self.thumblist[self.thumbindex], 180, 160, self.aspect, int(config.pic.resize.value), int(config.pic.rotate.value), 1, cachefile, 1) - if ptr != None: - self["thumb"+str(self.thumbindex)].show() - self["thumb"+str(self.thumbindex)].instance.setPixmap(ptr) - - self.thumbindex += 1 - if self.thumbindex < 6: - self.ThumbTimer.start(500, True) - else: - self.thumbindex = 0 - else: - self.thumbindex = 0 - def StartExif(self): if self.maxentry < 0: return - - self.session.open(ExifView, self.list[self.index][1], self.list[self.index][0]) + self.session.open(Pic_Exif, self.picload.getInfo(self.filelist[self.index][T_FULL])) def KeyOk(self): if self.maxentry < 0: return - self.old_index = self.index - self.session.openWithCallback(self.returnView ,PicView, self.filelist, self.list[self.index][0], self.path) - - def returnView(self, val=0): + self.session.openWithCallback(self.callbackView, Pic_Full_View, self.filelist, self.index, self.path) + + def callbackView(self, val=0): self.index = val if self.old_index != self.index: - self.fillPage() - + self.paintFrame() def Exit(self): - self.close(self.index) + del self.picload + self.close(self.index + self.dirlistcount) -#------------------------------------------------------------------------------------------ +#--------------------------------------------------------------------------- -class PicView(Screen): - skin = """ - - - - - - - - - - - """ - - def __init__(self, session, filelist, name, path): - self.skin = PicView.skin - Screen.__init__(self, session) +class Pic_Full_View(Screen): + def __init__(self, session, filelist, index, path): - self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "MovieSelectionActions"], + self.textcolor = config.pic.textcolor.value + self.bgcolor = config.pic.bgcolor.value + space = config.pic.framesize.value + size_w = getDesktop(0).size().width() + size_h = getDesktop(0).size().height() + + self.skin = " \ + \ + \ + \ + " + + Screen.__init__(self, session) + + self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions", "MovieSelectionActions"], { "cancel": self.Exit, - "showEventInfo": self.StartExif, - "green": self.Play, - "yellow": self.Pause, + "green": self.PlayPause, + "yellow": self.PlayPause, "blue": self.nextPic, - "red": self.prevPic + "red": self.prevPic, + "left": self.prevPic, + "right": self.nextPic, + "showEventInfo": self.StartExif, }, -1) - - self.aspect = getAspect() - self.blinking = False - self.autoShow = True - self.slideOn = False - self.pauseOn = False - self.index = 0 - self.old = 0 - self.list = [] - count=0 - for x in filelist: - if x[0][1] == False: - self.list.append((x[0][0], path + x[0][0], 0)) - if x[0][0] == name: - self.index = count - count += 1 - self.maxentry = len(self.list)-1 - - self["file"] = Label(_("please wait, loading picture...")) - self["picture"] = Pixmap() self["point"] = Pixmap() - self["play"] = Pixmap() - self["pause"] = Pixmap() + self["pic"] = Pixmap() + self["play_icon"] = Pixmap() + self["file"] = Label(_("please wait, loading picture...")) - self.decodeTimer = eTimer() - self.decodeTimer.callback.append(self.decodePic) - self.decodeTimer.start(300, True) + self.old_index = 0 + self.filelist = [] + self.lastindex = index + self.currPic = [] + self.shownow = True + self.dirlistcount = 0 - self.slideTimer = eTimer() - self.slideTimer.callback.append(self.slidePic) - - - def Pause(self): - if self.slideOn: - if self.pauseOn: - self.pauseOn=False - self["pause"].show() - else: - self.pauseOn=True - self["play"].show() - self.slideValue = 0 - - def Play(self): - if self.pauseOn == False: - if self.slideOn: - self.slideOn=False - self["play"].show() - else: - self.slideOn=True - self.slideTimer.start(1000, True) - - self.slideValue = int(config.pic.slidetime.value) + for x in filelist: + if len(filelist[0]) == 3: #orig. filelist + if x[0][1] == False: + self.filelist.append(path + x[0][0]) + else: + self.dirlistcount += 1 + else: # thumbnaillist + self.filelist.append(x[T_FULL]) + + self.maxentry = len(self.filelist)-1 + self.index = index - self.dirlistcount + if self.index < 0: + self.index = 0 - def slidePic(self): - if self.slideOn == True and self.pauseOn == False: - self.blinkingWidget("play") - self.slideValue -= 1 - if self.slideValue <= 0: - self.slideValue = int(config.pic.slidetime.value) - self.nextPic() + self.picload = ePicLoad() + self.picload.PictureData.get().append(self.finish_decode) - self.slideTimer.start(1000, True) + self.slideTimer = eTimer() + self.slideTimer.callback.append(self.slidePic) - if self.pauseOn: - self.blinkingWidget("pause") - self.slideTimer.start(1000, True) + if self.maxentry >= 0: + self.onLayoutFinish.append(self.setPicloadConf) - def decodePic(self): - self.currPic = loadPic(self.list[self.index][1], 560, 450, self.aspect, int(config.pic.resize.value), int(config.pic.rotate.value),1) - self["point"].hide() - if self.autoShow: - self.showPic() - self.autoShow = False + def setPicloadConf(self): + self.picload.setPara([self["pic"].instance.size().width(), self["pic"].instance.size().height(), getAspectforPic(), 0, int(config.pic.resize.value), self.bgcolor]) - def showPic(self): - if self.currPic != None: - self.old = self.index - self["file"].setText(self.list[self.old][0] + " (" + str(self.old+1) + "/" + str(self.maxentry+1) + ")") - self["picture"].instance.setPixmap(self.currPic) + self["play_icon"].hide() + if config.pic.infoline.value == False: + self["file"].hide() + self.start_decode() - self.next() - self["point"].show() - self.decodeTimer.start(300, True) - - def nextPic(self): - self.showPic() - - def prevPic(self): - self.index = self.old - self.prev() - self.autoShow = True + def ShowPicture(self): + if self.shownow and len(self.currPic): + self.shownow = False + self["file"].setText(self.currPic[0]) + self.lastindex = self.currPic[1] + self["pic"].instance.setPixmap(self.currPic[2].__deref__()) + self.currPic = [] + + self.next() + self.start_decode() + + def finish_decode(self, picInfo=""): + self["point"].hide() + ptr = self.picload.getData() + if ptr != None: + text = "" + try: + text = picInfo.split('\n',1) + text = "(" + str(self.index+1) + "/" + str(self.maxentry+1) + ") " + text[0].split('/')[-1] + except: + pass + self.currPic = [] + self.currPic.append(text) + self.currPic.append(self.index) + self.currPic.append(ptr) + self.ShowPicture() + + def start_decode(self): + self.picload.startDecode(self.filelist[self.index]) self["point"].show() - self.decodeTimer.start(300, True) - + def next(self): self.index += 1 if self.index > self.maxentry: @@ -322,218 +515,52 @@ class PicView(Screen): self.index -= 1 if self.index < 0: self.index = self.maxentry - - def blinkingWidget(self, name): - if self.blinking: - self.blinking=False - self[name].show() - else: - self.blinking=True - self[name].hide() - - def StartExif(self): - if self.pauseOn == False: - self.Pause() - self.session.openWithCallback(self.StopExif ,ExifView, self.list[self.old][1], self.list[self.old][0]) - - def StopExif(self): - if self.pauseOn: - self.Pause() - - def Exit(self): - self.close(self.old) - -#------------------------------------------------------------------------------------------ -class ExifView(Screen): - skin = """ - - - """ - - def __init__(self, session, fullname, name): - self.skin = ExifView.skin - Screen.__init__(self, session) - - self["actions"] = ActionMap(["OkCancelActions"], - { - "cancel": self.close - }, -1) - - dlist = ["Name:", "EXIF-Version:", "Camera-Make:", "Camera-Model:", "Date/Time:", "User Comments:", "Width / Height:", "Orientation:", "Metering Mode:", "Exposure Program:", "Light Source:", "Flash used:", "CompressedBitsPerPixel:", "ISO Speed Rating:", "X-Resolution:", "Y-Resolution:", "Resolution Unit:", "Brightness:", "Exposure Time:", "Exposure Bias:", "Distance:", "CCD-Width:", "ApertureFNumber:"] - tlist = [ ] - self["exiflist"] = ServiceInfoList(tlist) - tlist.append(ServiceInfoListEntry(dlist[0], name)) - count=1 - for x in getExif(fullname): - tlist.append(ServiceInfoListEntry(dlist[count], x)) - count += 1 - -#------------------------------------------------------------------------------------------ - -class PicSetup(Screen): - skin = """ - - - """ - - def __init__(self, session): - self.skin = PicSetup.skin - Screen.__init__(self, session) - - self["actions"] = NumberActionMap(["SetupActions"], - { - "cancel": self.close, - "left": self.keyLeft, - "right": self.keyRight, - "0": self.keyNumber, - "1": self.keyNumber, - "2": self.keyNumber, - "3": self.keyNumber, - "4": self.keyNumber, - "5": self.keyNumber, - "6": self.keyNumber, - "7": self.keyNumber, - "8": self.keyNumber, - "9": self.keyNumber - }, -1) - - self.list = [] - self["liste"] = ConfigList(self.list) - self.list.append(getConfigListEntry(_("Slideshow Interval (sec.)"), config.pic.slidetime)) - self.list.append(getConfigListEntry(_("Scaling Mode"), config.pic.resize)) - self.list.append(getConfigListEntry(_("Cache Thumbnails"), config.pic.cache)) - #self.list.append(getConfigListEntry(_("Rotate Picture"), config.pic.rotate)) - - def keyLeft(self): - self["liste"].handleKey(KEY_LEFT) - - def keyRight(self): - self["liste"].handleKey(KEY_RIGHT) - - def keyNumber(self, number): - self["liste"].handleKey(KEY_0 + number) - - -#------------------------------------------------------------------------------------------ - -class picmain(Screen): - skin = """ - - - - - - - - - - """ - - def __init__(self, session): - self.skin = picmain.skin - Screen.__init__(self, session) - - self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ColorActions", "MovieSelectionActions"], - { - "ok": self.KeyOk, - "cancel": self.Exit, - "right": self.rightDown, - "left": self.leftUp, - "up": self.up, - "down": self.down, - "showEventInfo": self.StartExif, - "contextMenu": self.Settings, - "red": self.StartThumb - }, -1) - - self.aspect = getAspect() - currDir = config.pic.lastDir.value - if not pathExists(currDir): - currDir = "/" - - self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(jpeg|jpg|jpe|png|bmp|gif)") - self["filelist"] = self.filelist - self["thumbnail"] = Pixmap() - - self.ThumbTimer = eTimer() - self.ThumbTimer.callback.append(self.showThumb) - self.ThumbTimer.start(500, True) - - def up(self): - self["filelist"].up() - self.ThumbTimer.start(1500, True) - - def down(self): - self["filelist"].down() - self.ThumbTimer.start(1500, True) - - def leftUp(self): - self["filelist"].pageUp() - self.ThumbTimer.start(1500, True) - - def rightDown(self): - self["filelist"].pageDown() - self.ThumbTimer.start(1500, True) - - def showThumb(self): - if not self.filelist.canDescent(): - cachefile = "" - if config.pic.cache.value: - cachedir = self.filelist.getCurrentDirectory() + ".Thumbnails/" - cachefile = cachedir + self.filelist.getFilename() + str(180) + str(160) + str(self.aspect) - if not pathExists(cachedir): - if not createDir(cachedir): - cachefile = "" - - ptr = loadPic(self.filelist.getCurrentDirectory() + self.filelist.getFilename(), 180, 160, self.aspect, int(config.pic.resize.value), 0, 0, cachefile, 1) - if ptr != None: - self["thumbnail"].show() - self["thumbnail"].instance.setPixmap(ptr) - else: - self["thumbnail"].hide() - - def KeyOk(self): - if self.filelist.canDescent(): - self.filelist.descent() + def slidePic(self): + print "slide to next Picture index=" + str(self.lastindex) + if config.pic.loop.value==False and self.lastindex == self.maxentry: + self.PlayPause() + self.shownow = True + self.ShowPicture() + + def PlayPause(self): + if self.slideTimer.isActive(): + self.slideTimer.stop() + self["play_icon"].hide() else: - self.session.openWithCallback(self.returnVal, PicView, self.filelist.getFileList(), self.filelist.getFilename(), self.filelist.getCurrentDirectory()) - - def StartThumb(self): - self.session.openWithCallback(self.returnVal, ThumbView, self.filelist.getFileList(), self.filelist.getFilename(), self.filelist.getCurrentDirectory()) + self.slideTimer.start(config.pic.slidetime.value*1000) + self["play_icon"].show() + self.nextPic() - def returnVal(self, val=0): - if val > 0: - for x in self.filelist.getFileList(): - if x[0][1] == True: - val += 1 - self.filelist.moveToIndex(val) + def prevPic(self): + self.currPic = [] + self.index = self.lastindex + self.prev() + self.start_decode() + self.shownow = True + def nextPic(self): + self.shownow = True + self.ShowPicture() + def StartExif(self): - if not self.filelist.canDescent(): - self.session.open(ExifView, self.filelist.getCurrentDirectory() + self.filelist.getFilename(), self.filelist.getFilename()) + if self.maxentry < 0: + return + self.session.open(Pic_Exif, self.picload.getInfo(self.filelist[self.lastindex])) - def Settings(self): - self.session.open(PicSetup) - def Exit(self): - if self.filelist.getCurrentDirectory() is None: - config.pic.lastDir.value = "/" - else: - config.pic.lastDir.value = self.filelist.getCurrentDirectory() - - config.pic.save() - self.close() + del self.picload + self.close(self.lastindex + self.dirlistcount) #------------------------------------------------------------------------------------------ def main(session, **kwargs): - session.open(picmain) + session.open(picshow) def filescan_open(list, session, **kwargs): # Recreate List as expected by PicView filelist = [((file.path, False), None) for file in list] - session.open(PicView, filelist, "", "") + session.open(Pic_Full_View, filelist, 0, file.path) def filescan(**kwargs): from Components.Scanner import Scanner, ScanPath @@ -557,5 +584,5 @@ def filescan(**kwargs): def Plugins(**kwargs): return \ - [PluginDescriptor(name="PicturePlayer", description="Picture Viewer (BMP, PNG, JPG, GIF)", icon="pictureplayer.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main), - PluginDescriptor(name="PicturePlayer", where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)] + [PluginDescriptor(name=_("PicturePlayer"), description=_("fileformats (BMP, PNG, JPG, GIF)"), icon="pictureplayer.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main), + PluginDescriptor(name=_("PicturePlayer"), where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)] -- cgit v1.2.3 From 5bbb74ccef1fe4bd524a5cd6427d3c7b803fe82e Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 17 Nov 2008 08:44:20 +0100 Subject: remove hotplugNotifier on every way of exiting --- lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py b/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py index 836c9fbd..162bf352 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py @@ -50,7 +50,7 @@ class DVDToolbox(Screen): "green": self.update, "yellow": self.format, #"blue": self.eject, - "cancel": self.close, + "cancel": self.exit, "pageUp": self.pageUp, "pageDown": self.pageDown }) -- cgit v1.2.3 From 083c49ace50d1aa702cf47785e0d38966f8e71a1 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 17 Nov 2008 10:01:47 +0100 Subject: allow blanking DVD-RAM media. the burn tool however only writes disc-at-once. --- lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py b/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py index 162bf352..b88dbb3f 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py @@ -89,7 +89,7 @@ class DVDToolbox(Screen): for line in mediuminfo.splitlines(): if line.find("Mounted Media:") > -1: mediatype = line.rsplit(',',1)[1][1:] - if mediatype.find("RW") > 0: + if mediatype.find("RW") > 0 or mediatype.find("RAM") > 0: self.formattable = True else: self.formattable = False @@ -186,7 +186,7 @@ class DVDformatTask(Task): if line.startswith("- media is already formatted"): self.error = self.ERROR_ALREADYFORMATTED self.retryargs = [ "-force" ] - if line.startswith("- media is not blank"): + if line.startswith("- media is not blank") or line.startswith(" -format=full to perform full (lengthy) reformat;"): self.error = self.ERROR_ALREADYFORMATTED self.retryargs = [ "-blank" ] if line.startswith(":-( mounted media doesn't appear to be"): -- cgit v1.2.3 From b19b6c15482681e331f346acb56b1566102e1418 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 17 Nov 2008 10:10:39 +0100 Subject: actually exit dvd player on pressing exit key in exit choicebox --- lib/python/Plugins/Extensions/DVDPlayer/plugin.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/DVDPlayer/plugin.py b/lib/python/Plugins/Extensions/DVDPlayer/plugin.py index cb5f0e0d..593d4d2e 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/DVDPlayer/plugin.py @@ -491,7 +491,7 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP def askLeavePlayer(self): choices = [(_("Continue playing"), "play"), (_("Exit"), "exit")] if not self.physicalDVD: - choices.insert(1,(_("Return to file browser"), "browser")) + choices.insert(1,(_("Return to file browser"), "browser")) self.session.openWithCallback(self.exitCB, ChoiceBox, title=_("Leave DVD Player?"), list = choices) def sendKey(self, key): @@ -590,19 +590,16 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP print "cur_dlg", self.session.current_dialog def exitCB(self, answer): - if answer is not None: - if answer[1] == "exit": - if self.service: - self.service = None - self.close() - if answer[1] == "browser": + if not answer or answer and answer[1] == "exit": + if self.service: + self.service = None + self.close() + if answer and answer[1] == "browser": #TODO check here if a paused dvd playback is already running... then re-start it... #else - if self.service: - self.service = None - self.showFileBrowser() - else: - pass + if self.service: + self.service = None + self.showFileBrowser() def __onClose(self): for i in (("/proc/stb/video/aspect", self.old_aspect), ("/proc/stb/video/policy", self.old_policy), ("/proc/stb/denc/0/wss", self.old_wss)): -- cgit v1.2.3 From 9ccb92fb3eaca35ec60c1a596db9620f9f302044 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 17 Nov 2008 21:17:34 +0100 Subject: more changes for async picture decode support --- lib/gdi/picload.cpp | 109 +++++++++++++++------ lib/gdi/picload.h | 5 + lib/python/Components/AVSwitch.py | 16 ++- .../SystemPlugins/Videomode/VideoHardware.py | 29 ++++++ 4 files changed, 125 insertions(+), 34 deletions(-) (limited to 'lib/python') diff --git a/lib/gdi/picload.cpp b/lib/gdi/picload.cpp index 2ef901f5..b1dfd1a1 100644 --- a/lib/gdi/picload.cpp +++ b/lib/gdi/picload.cpp @@ -569,19 +569,29 @@ ePicLoad::ePicLoad() m_conf.thumbnailsize = 180; } -ePicLoad::~ePicLoad() +void ePicLoad::waitFinished() { msg_thread.send(Message(Message::quit)); kill(); +} +ePicLoad::~ePicLoad() +{ + if (threadrunning) + waitFinished(); if(m_filepara != NULL) delete m_filepara; } +void ePicLoad::thread_finished() +{ + threadrunning=false; +} void ePicLoad::thread() { hasStarted(); + threadrunning=true; nice(4); runLoop(); } @@ -759,7 +769,6 @@ void ePicLoad::gotMessage(const Message &msg) break; case Message::decode_finished: // called from main thread //eDebug("[Picload] decode finished... %s", m_filepara->file); - threadrunning=false; if(m_filepara->callback) { PictureData(m_filepara->picinfo.c_str()); @@ -824,7 +833,6 @@ int ePicLoad::startThread(int what, const char *file, int x, int y) return 1; } - threadrunning=true; if(what==1) msg_thread.send(Message(Message::decode_Pic)); else @@ -843,33 +851,6 @@ RESULT ePicLoad::getThumbnail(const char *file, int x, int y) return startThread(0, file, x, y); } -RESULT ePicLoad::setPara(PyObject *val) -{ - if (!PyList_Check(val)) - return 0; - if (PyList_Size(val) < 6) - return 0; - - m_conf.max_x = PyInt_AsLong( PyList_GET_ITEM(val, 0)); - m_conf.max_y = PyInt_AsLong( PyList_GET_ITEM(val, 1)); - m_conf.aspect_ratio = PyFloat_AsDouble( PyList_GET_ITEM(val, 2)); - m_conf.usecache = PyInt_AsLong( PyList_GET_ITEM(val, 3)); - m_conf.resizetype = PyInt_AsLong( PyList_GET_ITEM(val, 4)); - const char *bg_str = PyString_AsString( PyList_GET_ITEM(val, 5)); - - if(bg_str[0] == '#' && strlen(bg_str)==9) - { - int bg = strtoul(bg_str+1, NULL, 16); - m_conf.background[0] = bg&0xFF; //BB - m_conf.background[1] = (bg>>8)&0xFF; //GG - m_conf.background[2] = (bg>>16)&0xFF; //RR - m_conf.background[3] = bg>>24; //AA - } - - eDebug("[Picload] setPara max-X=%d max-Y=%d aspect_ratio=%lf cache=%d resize=%d bg=#%02X%02X%02X%02X", m_conf.max_x, m_conf.max_y, m_conf.aspect_ratio, (int)m_conf.usecache, (int)m_conf.resizetype, m_conf.background[3], m_conf.background[2], m_conf.background[1], m_conf.background[0]); - return 1; -} - PyObject *ePicLoad::getInfo(const char *filename) { ePyObject list; @@ -935,6 +916,7 @@ PyObject *ePicLoad::getInfo(const char *filename) int ePicLoad::getData(ePtr &result) { + result = 0; if(m_filepara->pic_buffer == NULL) return 0; m_filepara->pic_buffer = conv24to32(m_filepara->pic_buffer, m_filepara->ox * m_filepara->oy); @@ -1015,3 +997,70 @@ int ePicLoad::getData(ePtr &result) return 0; } + +RESULT ePicLoad::setPara(PyObject *val) +{ + if (!PyList_Check(val)) + return 0; + if (PyList_Size(val) < 6) + return 0; + + m_conf.max_x = PyInt_AsLong( PyList_GET_ITEM(val, 0)); + m_conf.max_y = PyInt_AsLong( PyList_GET_ITEM(val, 1)); + m_conf.aspect_ratio = PyFloat_AsDouble( PyList_GET_ITEM(val, 2)); + m_conf.usecache = PyInt_AsLong( PyList_GET_ITEM(val, 3)); + m_conf.resizetype = PyInt_AsLong( PyList_GET_ITEM(val, 4)); + const char *bg_str = PyString_AsString( PyList_GET_ITEM(val, 5)); + + if(bg_str[0] == '#' && strlen(bg_str)==9) + { + int bg = strtoul(bg_str+1, NULL, 16); + m_conf.background[0] = bg&0xFF; //BB + m_conf.background[1] = (bg>>8)&0xFF; //GG + m_conf.background[2] = (bg>>16)&0xFF; //RR + m_conf.background[3] = bg>>24; //AA + } + + eDebug("[Picload] setPara max-X=%d max-Y=%d aspect_ratio=%lf cache=%d resize=%d bg=#%02X%02X%02X%02X", m_conf.max_x, m_conf.max_y, m_conf.aspect_ratio, (int)m_conf.usecache, (int)m_conf.resizetype, m_conf.background[3], m_conf.background[2], m_conf.background[1], m_conf.background[0]); + return 1; +} + +//------------------------------------------------------------------------------------ + +//for old plugins +SWIG_VOID(int) loadPic(ePtr &result, std::string filename, int x, int y, int aspect, int resize_mode, int rotate, int background, std::string cachefile) +{ + result = 0; + eDebug("deprecated loadPic function used!!! please use the non blocking version! you can see demo code in Pictureplayer plugin... this function is removed in the near future!"); + ePicLoad mPL; + + double aspect_ratio; + switch(aspect) + { + case 1: aspect_ratio = 1.778 / ((double)720/576); break; //16:9 + case 2: aspect_ratio = 1.600 / ((double)720/576); break; //16:10 + case 3: aspect_ratio = 1.250 / ((double)720/576); break; //5:4 + default: aspect_ratio = 1.333 / ((double)720/576); //4:3 + } + + ePyObject list = PyList_New(6); + PyList_SET_ITEM(list, 0, PyLong_FromLong(x)); + PyList_SET_ITEM(list, 1, PyLong_FromLong(y)); + PyList_SET_ITEM(list, 2, PyFloat_FromDouble(aspect_ratio)); + PyList_SET_ITEM(list, 3, PyLong_FromLong(0)); + PyList_SET_ITEM(list, 4, PyLong_FromLong(resize_mode)); + if(background) + PyList_SET_ITEM(list, 5, PyString_FromString("#ff000000")); + else + PyList_SET_ITEM(list, 5, PyString_FromString("#00000000")); + + mPL.setPara(list); + + if(!mPL.startDecode(filename.c_str())) + { + mPL.waitFinished(); // this blocks until the thread is finished + mPL.getData(result); + } + + return 0; +} diff --git a/lib/gdi/picload.h b/lib/gdi/picload.h index a85567c0..6a0f70b9 100644 --- a/lib/gdi/picload.h +++ b/lib/gdi/picload.h @@ -86,7 +86,9 @@ class ePicLoad: public eMainloop, public eThread, public Object, public iObject void gotMessage(const Message &message); void thread(); int startThread(int what, const char *file, int x, int y); + void thread_finished(); public: + void waitFinished(); PSignal1 PictureData; ePicLoad(); @@ -99,4 +101,7 @@ public: SWIG_VOID(int) getData(ePtr &SWIG_OUTPUT); }; +//for old plugins +SWIG_VOID(int) loadPic(ePtr &SWIG_OUTPUT, std::string filename, int x, int y, int aspect, int resize_mode=0, int rotate=0, int background=0, std::string cachefile=""); + #endif // __picload_h__ diff --git a/lib/python/Components/AVSwitch.py b/lib/python/Components/AVSwitch.py index 7ac2bb98..19aca24d 100644 --- a/lib/python/Components/AVSwitch.py +++ b/lib/python/Components/AVSwitch.py @@ -1,5 +1,5 @@ from config import config, ConfigSlider, ConfigSelection, ConfigYesNo, ConfigEnableDisable, ConfigSubsection, ConfigBoolean -from enigma import eAVSwitch +from enigma import eAVSwitch, getDesktop from SystemInfo import SystemInfo class AVSwitch: @@ -32,9 +32,12 @@ class AVSwitch: if valstr in ("4_3_letterbox", "4_3_panscan"): # 4:3 return 1.333333333 elif valstr == "16_9": # auto ... 4:3 or 16:9 - # TODO: here we must retrieve the current video aspect ratio... - # because the TV can run in 4:3 or in 16:9 mode.. (switched by wss or scart pin8) - # until we have done this we always return the scale value for 16:9!! + try: + aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read() + if aspect_str == "1": # 4:3 + return 1.333333333 + except IOError: + pass return 1.777777778 elif valstr in ("16_9_always", "16_9_letterbox"): # 16:9 return 1.777777778 @@ -43,6 +46,11 @@ class AVSwitch: print "unknown output aspect!" return 1.0000 + def getFramebufferScale(self): + aspect = self.getOutputAspect() + fb_size = getDesktop(0).size() + return aspect / ((1.0 * fb_size.width()) / fb_size.height()) + def getAspectRatioSetting(self): valstr = config.av.aspectratio.value if valstr == "4_3_letterbox": diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py index 2422475e..5e38f3e6 100644 --- a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py +++ b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py @@ -59,6 +59,34 @@ class VideoHardware: widescreen_modes = set(["720p", "1080i"]) + def getOutputAspect(self): + ret = 1.777777778 # 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 = 1.6 + elif is_auto: + try: + aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read() + if aspect_str == "1": # 4:3 + ret = 1.333333333 + except IOError: + pass + else: # 4:3 + ret = 1.333333333 + return ret + def __init__(self): self.last_modes_preferred = [ ] self.on_hotplug = CList() @@ -80,6 +108,7 @@ class VideoHardware: config.av.tvsystem.notifiers = [ ] config.av.wss.notifiers = [ ] AVSwitch.setInput = self.AVSwitchSetInput + AVSwitch.getOutputAspect = self.getOutputAspect config.av.aspect.addNotifier(self.updateAspect) config.av.wss.addNotifier(self.updateAspect) -- cgit v1.2.3 From cd51d1c8a2ec341b4202689e693b7bf012610d0d Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 17 Nov 2008 23:17:46 +0100 Subject: change hotplugNotifier to return correct state transition for cd-rom type and flash type devices --- lib/python/Plugins/SystemPlugins/Hotplug/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py b/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py index 97ddf4a1..e593e942 100644 --- a/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py +++ b/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py @@ -53,7 +53,7 @@ class Hotplug(Protocol): for callback in hotplugNotifier: try: - callback(dev, media_state) + callback(dev, action or media_state) except AttributeError: hotplugNotifier.remove(callback) -- cgit v1.2.3 From 53a9e8c65ffb3c83736be784c894c57beca5bde5 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 17 Nov 2008 23:20:56 +0100 Subject: use new hotplugNotifier return value to clear playlist if audio CD was removed --- .../Plugins/Extensions/MediaPlayer/plugin.py | 27 +++++++++++++--------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index 0d5305d7..babef3e7 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -863,17 +863,22 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self.session.open(Subtitles) def hotplugCB(self, dev, media_state): - if dev == harddiskmanager.getCD(): - from Components.Scanner import scanDevice - devpath = harddiskmanager.getAutofsMountpoint(harddiskmanager.getCD()) - self.cdAudioTrackFiles = [] - res = scanDevice(devpath) - list = [ (r.description, r, res[r], self.session) for r in res ] - if list: - (desc, scanner, files, session) = list[0] - for file in files: - if file.mimetype == "audio/x-cda": - self.cdAudioTrackFiles.append(file.path) + if dev == harddiskmanager.getCD(): + if media_state == "1": + from Components.Scanner import scanDevice + devpath = harddiskmanager.getAutofsMountpoint(harddiskmanager.getCD()) + self.cdAudioTrackFiles = [] + res = scanDevice(devpath) + list = [ (r.description, r, res[r], self.session) for r in res ] + if list: + (desc, scanner, files, session) = list[0] + for file in files: + if file.mimetype == "audio/x-cda": + self.cdAudioTrackFiles.append(file.path) + else: + self.cdAudioTrackFiles = [] + if self.isAudioCD: + self.clear_playlist() class MediaPlayerLCDScreen(Screen): skin = """ -- cgit v1.2.3 From 95b10a03763a432c7d5940cc83d9e4fa9ed3cc7c Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 17 Nov 2008 23:22:01 +0100 Subject: use hotplugNotifier to ease use of NFIFlash plugin. change some excess status bar translatables to static english. --- .../Plugins/SystemPlugins/NFIFlash/downloader.py | 50 +++++++++------------- .../Plugins/SystemPlugins/NFIFlash/flasher.py | 10 ++--- 2 files changed, 25 insertions(+), 35 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py b/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py index c2046af7..7e34d2bb 100644 --- a/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py +++ b/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py @@ -18,6 +18,7 @@ import urllib from twisted.web import client from twisted.internet import reactor, defer from twisted.python import failure +from Plugins.SystemPlugins.Hotplug.plugin import hotplugNotifier class UserRequestedCancel(Exception): pass @@ -335,7 +336,7 @@ class NFIDownload(Screen): self.download = self.nfo_download self.downloading(True) client.getPage(nfourl).addCallback(self.nfo_finished).addErrback(self.nfo_failed) - self["statusbar"].text = _("Downloading image description...") + self["statusbar"].text = ("Downloading image description...") def nfo_failed(self, failure_instance): print "[nfo_failed] " + str(failure_instance) @@ -400,7 +401,7 @@ class NFIDownload(Screen): pos = self.nfo.find("MD5:") if pos > 0 and len(self.nfo) >= pos+5+32: - self["statusbar"].text = _("Please wait for md5 signature verification...") + self["statusbar"].text = ("Please wait for md5 signature verification...") cmd = "md5sum -c -" md5 = self.nfo[pos+5:pos+5+32] + " " + self.nfilocal print cmd, md5 @@ -489,33 +490,22 @@ class NFIDownload(Screen): def umount_finished(self, retval): self.container.appClosed.remove(self.umount_finished) - self.session.openWithCallback(self.dmesg_clear, MessageBox, _("To make sure you intend to do this, please remove the target USB stick now and stick it back in upon prompt. Press OK when you have taken the stick out."), MessageBox.TYPE_INFO) - - def dmesg_clear(self, answer): self.container.appClosed.append(self.dmesg_cleared) self.taskstring = "" self.cmd = "dmesg -c" print "executing " + self.cmd self.container.execute(self.cmd) - def dmesg_cleared(self, retval): + def dmesg_cleared(self, answer): self.container.appClosed.remove(self.dmesg_cleared) - self.session.openWithCallback(self.stick_back_in, MessageBox, (_("Now please insert the USB stick (minimum size is 64 MB) that you want to format and use as .NFI image flasher. Press OK after you've put the stick back in.")), MessageBox.TYPE_INFO) - - def stick_back_in(self, answer): - self["statusbar"].text = _("Waiting for USB stick to settle...") - self.delayTimer = eTimer() - self.delayTimer.callback.append(self.waiting_for_stick) - self.delayCount = -1 - self.delayTimer.start(1000) - - def waiting_for_stick(self): - self.delayCount += 1 - self["job_progressbar"].range = 6 - self["job_progressbar"].value = self.delayCount - self["job_progresslabel"].text = "-%d s" % (6-self.delayCount) - if self.delayCount > 5: - self.delayTimer.stop() + self.msgbox = self.session.open(MessageBox, _("Please disconnect all USB devices from your Dreambox and (re-)attach the target USB stick (minimum size is 64 MB) now!"), MessageBox.TYPE_INFO) + hotplugNotifier.append(self.hotplugCB) + + def hotplugCB(self, dev, action): + print "[hotplugCB]", dev, action + if dev.startswith("sd") and action == "add": + self.msgbox.close() + hotplugNotifier.remove(self.hotplugCB) self.container.appClosed.append(self.dmesg_scanned) self.taskstring = "" self.cmd = "dmesg" @@ -539,8 +529,8 @@ class NFIDownload(Screen): self.session.openWithCallback(self.fdisk_query, MessageBox, (_("The following device was found:\n\n%s\n\nDo you want to write the USB flasher to this stick?") % self.devicetext), MessageBox.TYPE_YESNO) def fdisk_query(self, answer): - if answer == True: - self["statusbar"].text = _("Partitioning USB stick...") + if answer == True and self.stickdevice: + self["statusbar"].text = ("Partitioning USB stick...") self["job_progressbar"].range = 1000 self["job_progressbar"].value = 100 self["job_progresslabel"].text = "5.00%" @@ -562,7 +552,7 @@ class NFIDownload(Screen): self.tar_finished(0) self["job_progressbar"].value = 700 else: - self["statusbar"].text = _("Decompressing USB stick flasher boot image...") + self["statusbar"].text = ("Decompressing USB stick flasher boot image...") self.taskstring = "" self.container.appClosed.append(self.tar_finished) self.container.setCWD("/tmp") @@ -588,7 +578,7 @@ class NFIDownload(Screen): self.container.appClosed.remove(self.tar_finished) if retval == 0: self.imagefilename = "/tmp/nfiflash_" + self.box + ".img" - self["statusbar"].text = _("Copying USB flasher boot image to stick...") + self["statusbar"].text = ("Copying USB flasher boot image to stick...") self.taskstring = "" self.container.appClosed.append(self.dd_finished) self.cmd = "dd if=%s of=%s" % (self.imagefilename,self.stickdevice+"/part1") @@ -607,7 +597,7 @@ class NFIDownload(Screen): if retval == 0: self["job_progressbar"].value = 950 self["job_progresslabel"].text = "95.00%" - self["statusbar"].text = _("Remounting stick partition...") + self["statusbar"].text = ("Remounting stick partition...") self.taskstring = "" self.container.appClosed.append(self.mount_finished) self.cmd = "mount %s /mnt/usb -o rw,sync" % (self.stickdevice+"/part1") @@ -622,7 +612,7 @@ class NFIDownload(Screen): if retval == 0: self["job_progressbar"].value = 1000 self["job_progresslabel"].text = "100.00%" - self["statusbar"].text = _(".NFI Flasher bootable USB stick successfully created.") + self["statusbar"].text = (".NFI Flasher bootable USB stick successfully created.") self.session.openWithCallback(self.remove_img, MessageBox, _("The .NFI Image flasher USB stick is now ready to use. Please download an .NFI image file from the feed server and save it on the stick. Then reboot and hold the 'Down' key on the front panel to boot the .NFI flasher from the stick!"), MessageBox.TYPE_INFO) self["destlist"].changeDir("/mnt/usb") else: @@ -659,8 +649,8 @@ def filescan(**kwargs): Scanner(mimetypes = ["application/x-dream-image"], paths_to_scan = [ - ScanPath(path = "", with_subdirs = False), + ScanPath(path = "", with_subdirs = False), ], name = "NFI", - description = (_("Download .NFI-Files for USB-Flasher")+"..."), + description = (_("Download .NFI-Files for USB-Flasher")+"..."), openfnc = filescan_open, ) diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py b/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py index 6a982c58..860efc02 100644 --- a/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py +++ b/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py @@ -17,7 +17,7 @@ import re class writeNAND(Task): def __init__(self,job,param,box): - Task.__init__(self,job, _("Writing image file to NAND Flash")) + Task.__init__(self,job, ("Writing image file to NAND Flash")) self.setTool("/usr/lib/enigma2/python/Plugins/SystemPlugins/NFIFlash/mywritenand") if box == "dm7025": self.end = 256 @@ -26,7 +26,7 @@ class writeNAND(Task): if box == "dm8000": self.setTool("/usr/lib/enigma2/python/Plugins/SystemPlugins/NFIFlash/dm8000_writenand") self.args += param - self.weighting = 1 + self.weighting = 1 def processOutput(self, data): print "[writeNand] " + data @@ -174,8 +174,8 @@ class NFIFlash(Screen): 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["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) @@ -252,7 +252,7 @@ class NFIFlash(Screen): def reboot(self): if self.job.status == self.job.FINISHED: - self["statusbar"].text = _("rebooting...") + self["statusbar"].text = ("rebooting...") TryQuitMainloop(self.session,2) def createSummary(self): -- cgit v1.2.3 From e7364f6c8cd59562884f895042980b88a962c945 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 17 Nov 2008 23:24:20 +0100 Subject: show dvd burn jobs running in background in main menu and fix potential crash on aborting during CheckDiskspaceTask --- lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py b/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py index b88dbb3f..ce16259e 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py @@ -63,7 +63,7 @@ class DVDToolbox(Screen): def pageDown(self): self["details"].pageDown() - def update(self, dev="", media_state=""): + def update(self, dev="", action=""): self["space_label"].text = _("Please wait... Loading list...") self["info"].text = "" self["details"].setText("") -- cgit v1.2.3 From c2ec827d12f170cb4bee1a42be9e454c7174207b Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 17 Nov 2008 23:29:31 +0100 Subject: show dvd burn jobs running in background in main menu and fix potential crash on aborting during CheckDiskspaceTask --- lib/python/Plugins/Extensions/DVDBurn/Process.py | 3 +++ lib/python/Plugins/Extensions/DVDBurn/TitleList.py | 22 ++++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/DVDBurn/Process.py b/lib/python/Plugins/Extensions/DVDBurn/Process.py index 89ca90fd..946b44ad 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/Process.py +++ b/lib/python/Plugins/Extensions/DVDBurn/Process.py @@ -368,6 +368,9 @@ class CheckDiskspaceTask(Task): self.global_preconditions.append(DiskspacePrecondition(diskSpaceNeeded)) self.weighting = 5 + def abort(self): + self.finish(aborted = True) + def run(self, callback): failed_preconditions = self.checkPreconditions(True) + self.checkPreconditions(False) if len(failed_preconditions): diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py index 345af877..537da0dd 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py +++ b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py @@ -74,9 +74,22 @@ class TitleList(Screen, HelpableScreen): self["titles"] = List(list = [ ], enableWrapAround = True, item_height=30, fonts = [gFont("Regular", 20)]) self.updateTitleList() - + + def checkBackgroundJobs(self): + for job in job_manager.getPendingJobs(): + print "type(job):", type(job) + print "Process.DVDJob:", Process.DVDJob + if type(job) == Process.DVDJob: + self.backgroundJob = job + return + self.backgroundJob = None + def showMenu(self): menu = [] + self.checkBackgroundJobs() + if self.backgroundJob: + j = self.backgroundJob + menu.append(("%s: %s (%d%%)" % (j.getStatustext(), j.name, int(100*j.progress/float(j.end))), self.showBackgroundJob)) if self.project.settings.output.getValue() == "dvd": menu.append((_("Burn DVD"), self.burnProject)) elif self.project.settings.output.getValue() == "iso": @@ -97,6 +110,11 @@ class TitleList(Screen, HelpableScreen): if choice: choice[1]() + def showBackgroundJob(self): + job_manager.in_background = False + self.session.openWithCallback(self.JobViewCB, JobView, self.backgroundJob) + self.backgroundJob = None + def titleProperties(self): if self.getCurrentTitle(): self.session.openWithCallback(self.updateTitleList, TitleProperties.TitleProperties, self, self.project, self["titles"].getIndex()) @@ -217,7 +235,7 @@ class TitleList(Screen, HelpableScreen): totalsize += title.estimatedDiskspace self["titles"].list = res self.updateSize(totalsize) - + def updateSize(self, totalsize): size = int((totalsize/1024)/1024) max_SL = 4370 -- cgit v1.2.3 From a8e2ae086f201762677d9f926b75285d1c299ab2 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 17 Nov 2008 23:29:39 +0100 Subject: remove superfluous import --- lib/python/Screens/InfoBarGenerics.py | 1 - 1 file changed, 1 deletion(-) (limited to 'lib/python') diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index cdaa2c1e..eb79c74e 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -1312,7 +1312,6 @@ class InfoBarJobman: self.session.openWithCallback(self.JobViewCB, JobView, job) def JobViewCB(self, in_background): - from Screens.TaskView import JobView job_manager.in_background = in_background # depends on InfoBarExtensions -- cgit v1.2.3 From f38670a4ea4d6dc6206e6bd99ad25943d0bf3602 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 17 Nov 2008 23:33:56 +0100 Subject: do remove elementary stream files... and do it correctly! --- lib/python/Plugins/Extensions/DVDBurn/Process.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/DVDBurn/Process.py b/lib/python/Plugins/Extensions/DVDBurn/Process.py index 946b44ad..750e9d9b 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/Process.py +++ b/lib/python/Plugins/Extensions/DVDBurn/Process.py @@ -165,7 +165,7 @@ class DemuxTask(Task): def cleanup(self, failed): if failed: import os - for file in self.generated_files.itervalues(): + for file in self.generated_files: os.remove(file) class MplexTaskPostcondition(Condition): @@ -220,7 +220,7 @@ class RemoveESFiles(Task): def prepare(self): self.args += ["-f"] - self.args += self.demux_task.generated_files.values() + self.args += self.demux_task.generated_files self.args += [self.demux_task.cutfile] class DVDAuthorTask(Task): @@ -794,7 +794,7 @@ class DVDJob(Job): demux = DemuxTask(self, link_name) self.mplextask = MplexTask(self, outputfile=title_filename, demux_task=demux) self.mplextask.end = self.estimateddvdsize - #RemoveESFiles(self, demux) + RemoveESFiles(self, demux) WaitForResidentTasks(self) PreviewTask(self, self.workspace + "/dvd/VIDEO_TS/") output = self.project.settings.output.getValue() -- cgit v1.2.3 From 5aa89f34249397330995cc0ab1e080c1f567e174 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 17 Nov 2008 23:34:41 +0100 Subject: get rid of some floating point values --- lib/gdi/picload.cpp | 35 +++++++++++----------- lib/python/Components/AVSwitch.py | 14 ++++----- .../Plugins/Extensions/PicturePlayer/plugin.py | 14 +++++---- .../SystemPlugins/Videomode/VideoHardware.py | 8 ++--- 4 files changed, 36 insertions(+), 35 deletions(-) (limited to 'lib/python') diff --git a/lib/gdi/picload.cpp b/lib/gdi/picload.cpp index f67507ca..375f33fb 100644 --- a/lib/gdi/picload.cpp +++ b/lib/gdi/picload.cpp @@ -1011,16 +1011,16 @@ RESULT ePicLoad::setPara(PyObject *val) { if (!PySequence_Check(val)) return 0; - if (PySequence_Size(val) < 6) + if (PySequence_Size(val) < 7) return 0; else { ePyObject fast = PySequence_Fast(val, ""); m_conf.max_x = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 0)); m_conf.max_y = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 1)); - m_conf.aspect_ratio = PyFloat_AsDouble( PySequence_Fast_GET_ITEM(val, 2)); - m_conf.usecache = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 3)); - m_conf.resizetype = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 4)); - const char *bg_str = PyString_AsString( PySequence_Fast_GET_ITEM(val, 5)); + m_conf.aspect_ratio = (double)PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 2)) / PyInt_AsLong(PySequence_Fast_GET_ITEM(val, 3)); + m_conf.usecache = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 4)); + m_conf.resizetype = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 5)); + const char *bg_str = PyString_AsString( PySequence_Fast_GET_ITEM(val, 6)); if(bg_str[0] == '#' && strlen(bg_str)==9) { @@ -1040,29 +1040,30 @@ RESULT ePicLoad::setPara(PyObject *val) //for old plugins SWIG_VOID(int) loadPic(ePtr &result, std::string filename, int x, int y, int aspect, int resize_mode, int rotate, int background, std::string cachefile) { + long asp1, asp2; result = 0; eDebug("deprecated loadPic function used!!! please use the non blocking version! you can see demo code in Pictureplayer plugin... this function is removed in the near future!"); ePicLoad mPL; - double aspect_ratio; switch(aspect) { - case 1: aspect_ratio = 1.778 / ((double)720/576); break; //16:9 - case 2: aspect_ratio = 1.600 / ((double)720/576); break; //16:10 - case 3: aspect_ratio = 1.250 / ((double)720/576); break; //5:4 - default: aspect_ratio = 1.333 / ((double)720/576); //4:3 + case 1: asp1 = 16*576, asp2 = 9*720; break; //16:9 + case 2: asp1 = 16*576, asp2 = 10*720; break; //16:10 + case 3: asp1 = 5*576, asp2 = 4*720; break; //5:4 + default: asp1 = 4*576, asp2 = 3*720; break; //4:3 } - - ePyObject tuple = PyTuple_New(6); + + ePyObject tuple = PyTuple_New(7); PyTuple_SET_ITEM(tuple, 0, PyLong_FromLong(x)); PyTuple_SET_ITEM(tuple, 1, PyLong_FromLong(y)); - PyTuple_SET_ITEM(tuple, 2, PyFloat_FromDouble(aspect_ratio)); - PyTuple_SET_ITEM(tuple, 3, PyLong_FromLong(0)); - PyTuple_SET_ITEM(tuple, 4, PyLong_FromLong(resize_mode)); + PyTuple_SET_ITEM(tuple, 2, PyLong_FromLong(asp1)); + PyTuple_SET_ITEM(tuple, 3, PyLong_FromLong(asp2)); + PyTuple_SET_ITEM(tuple, 4, PyLong_FromLong(0)); + PyTuple_SET_ITEM(tuple, 5, PyLong_FromLong(resize_mode)); if(background) - PyTuple_SET_ITEM(tuple, 5, PyString_FromString("#ff000000")); + PyTuple_SET_ITEM(tuple, 6, PyString_FromString("#ff000000")); else - PyTuple_SET_ITEM(tuple, 5, PyString_FromString("#00000000")); + PyTuple_SET_ITEM(tuple, 6, PyString_FromString("#00000000")); mPL.setPara(tuple); diff --git a/lib/python/Components/AVSwitch.py b/lib/python/Components/AVSwitch.py index 19aca24d..00350cbb 100644 --- a/lib/python/Components/AVSwitch.py +++ b/lib/python/Components/AVSwitch.py @@ -30,26 +30,24 @@ class AVSwitch: def getOutputAspect(self): if valstr in ("4_3_letterbox", "4_3_panscan"): # 4:3 - return 1.333333333 + return (4,3) elif valstr == "16_9": # auto ... 4:3 or 16:9 try: aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read() if aspect_str == "1": # 4:3 - return 1.333333333 + return (4,3) except IOError: pass - return 1.777777778 elif valstr in ("16_9_always", "16_9_letterbox"): # 16:9 - return 1.777777778 + pass elif valstr in ("16_10_letterbox", "16_10_panscan"): # 16:10 - return 1.6 - print "unknown output aspect!" - return 1.0000 + return (16,10) + return (16,9) def getFramebufferScale(self): aspect = self.getOutputAspect() fb_size = getDesktop(0).size() - return aspect / ((1.0 * fb_size.width()) / fb_size.height()) + return (aspect[0] * fb_size.height(), aspect[1] * fb_size.width()) def getAspectRatioSetting(self): valstr = config.av.aspectratio.value diff --git a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py index 7d62d2be..0cdab563 100644 --- a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py +++ b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py @@ -15,7 +15,7 @@ from Components.ConfigList import ConfigList from Components.config import config, ConfigSubsection, ConfigInteger, ConfigSelection, ConfigText, ConfigEnableDisable, KEY_LEFT, KEY_RIGHT, KEY_0, getConfigListEntry -def getAspectforPic(): +def getScale(): return AVSwitch().getFramebufferScale() config.pic = ConfigSubsection() @@ -119,8 +119,9 @@ class picshow(Screen): self.session.openWithCallback(self.callbackView, Pic_Full_View, self.filelist.getFileList(), self.filelist.getSelectionIndex(), self.filelist.getCurrentDirectory()) def setConf(self): + sc = getScale() #0=Width 1=Height 2=Aspect 3=use_cache 4=resize_type 5=Background(#AARRGGBB) - self.picload.setPara([self["thn"].instance.size().width(), self["thn"].instance.size().height(), getAspectforPic(), config.pic.cache.value, int(config.pic.resize.value), "#00000000"]) + self.picload.setPara((self["thn"].instance.size().width(), self["thn"].instance.size().height(), sc[0], sc[1], config.pic.cache.value, int(config.pic.resize.value), "#00000000")) def callbackView(self, val=0): if val > 0: @@ -311,10 +312,10 @@ class Pic_Thumb(Screen): self.ThumbTimer.callback.append(self.showPic) def setPicloadConf(self): - self.picload.setPara([self["thumb0"].instance.size().width(), self["thumb0"].instance.size().height(), getAspectforPic(), config.pic.cache.value, int(config.pic.resize.value), self.color]) + sc = getScale() + self.picload.setPara([self["thumb0"].instance.size().width(), self["thumb0"].instance.size().height(), sc[0], sc[1], config.pic.cache.value, int(config.pic.resize.value), self.color]) self.paintFrame() - - + def paintFrame(self): #print "index=" + str(self.index) if self.maxentry < self.index or self.index < 0: @@ -468,7 +469,8 @@ class Pic_Full_View(Screen): self.onLayoutFinish.append(self.setPicloadConf) def setPicloadConf(self): - self.picload.setPara([self["pic"].instance.size().width(), self["pic"].instance.size().height(), getAspectforPic(), 0, int(config.pic.resize.value), self.bgcolor]) + sc = getScale() + self.picload.setPara([self["pic"].instance.size().width(), self["pic"].instance.size().height(), sc[0], sc[1], 0, int(config.pic.resize.value), self.bgcolor]) self["play_icon"].hide() if config.pic.infoline.value == False: diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py index 5e38f3e6..02fdf9a5 100644 --- a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py +++ b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py @@ -60,7 +60,7 @@ class VideoHardware: widescreen_modes = set(["720p", "1080i"]) def getOutputAspect(self): - ret = 1.777777778 # 16:9 + 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" @@ -75,16 +75,16 @@ class VideoHardware: else: aspect = {"16_9": "16:9", "16_10": "16:10"}[config.av.aspect.value] if aspect == "16:10": - ret = 1.6 + ret = (16,10) elif is_auto: try: aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read() if aspect_str == "1": # 4:3 - ret = 1.333333333 + ret = (4,3) except IOError: pass else: # 4:3 - ret = 1.333333333 + ret = (4,3) return ret def __init__(self): -- cgit v1.2.3 From 5cb7cb980986fe89da490d8d5c2a73b935844724 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Tue, 18 Nov 2008 13:04:38 +0100 Subject: use already translated string --- lib/python/Plugins/Extensions/PicturePlayer/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py index 0cdab563..aeca12dc 100644 --- a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py +++ b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py @@ -202,7 +202,7 @@ class Pic_Exif(Screen): "cancel": self.close }, -1) - exifdesc = [_("Filename:"), "EXIF-Version:", "Make:", "Camera:", "Date/Time:", "Width / Height:", "Flash used:", "Orientation:", "User Comments:", "Metering Mode:", "Exposure Program:", "Light Source:", "CompressedBitsPerPixel:", "ISO Speed Rating:", "X-Resolution:", "Y-Resolution:", "Resolution Unit:", "Brightness:", "Exposure Time:", "Exposure Bias:", "Distance:", "CCD-Width:", "ApertureFNumber:"] + exifdesc = [_("filename")+':', "EXIF-Version:", "Make:", "Camera:", "Date/Time:", "Width / Height:", "Flash used:", "Orientation:", "User Comments:", "Metering Mode:", "Exposure Program:", "Light Source:", "CompressedBitsPerPixel:", "ISO Speed Rating:", "X-Resolution:", "Y-Resolution:", "Resolution Unit:", "Brightness:", "Exposure Time:", "Exposure Bias:", "Distance:", "CCD-Width:", "ApertureFNumber:"] list = [] for x in range(len(exiflist)): -- cgit v1.2.3 From 623abfc754b4a95f79f90cf0498300d16b52f894 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Tue, 18 Nov 2008 13:14:46 +0100 Subject: scroll to bottom of output after execution --- lib/python/Screens/Console.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/python') diff --git a/lib/python/Screens/Console.py b/lib/python/Screens/Console.py index b57f2400..c6b156cf 100644 --- a/lib/python/Screens/Console.py +++ b/lib/python/Screens/Console.py @@ -55,6 +55,7 @@ class Console(Screen): str = self["text"].getText() str += _("Execution finished!!"); self["text"].setText(str) + self["text"].lastPage() if self.finishedCallback is not None: self.finishedCallback() if not retval and self.closeOnSuccess: @@ -67,4 +68,4 @@ class Console(Screen): self.container.dataAvail.remove(self.dataAvail) def dataAvail(self, str): - self["text"].setText(self["text"].getText() + str) + self["text"].setText(self["text"].getText() + str) \ No newline at end of file -- cgit v1.2.3 From 219e5a3edf67e060c751b70419a8a5293fea169a Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Tue, 18 Nov 2008 13:15:12 +0100 Subject: add isMount encapsulation --- lib/python/Tools/Directories.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib/python') diff --git a/lib/python/Tools/Directories.py b/lib/python/Tools/Directories.py index 2b60924c..0d238b30 100644 --- a/lib/python/Tools/Directories.py +++ b/lib/python/Tools/Directories.py @@ -126,6 +126,9 @@ def resolveFilename(scope, base = "", path_prefix = None): def pathExists(path): return os_path.exists(path) +def isMount(path): + return os_path.ismount(path) + def createDir(path, makeParents = False): try: if makeParents: -- cgit v1.2.3 From 0753892fd72a1aad2ae5bf9592786ab962622e5d Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Tue, 18 Nov 2008 13:15:33 +0100 Subject: add automatic downloading of latest image and possibility of backing up configuration to the bootable usb sticks --- .../Plugins/SystemPlugins/NFIFlash/downloader.py | 60 ++++++++++++++++++---- 1 file changed, 50 insertions(+), 10 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py b/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py index 7e34d2bb..160620fd 100644 --- a/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py +++ b/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py @@ -120,10 +120,10 @@ class NFIDownload(Screen): - - - - + + + + @@ -170,6 +170,7 @@ class NFIDownload(Screen): 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"], { @@ -206,7 +207,7 @@ class NFIDownload(Screen): self["key_yellow"].text = (_("Change dir.")) else: self["key_yellow"].text = (_("Select image")) - self["key_blue"].text = (_("Fix USB stick")) + self["key_blue"].text = (_("USB stick wizard")) def switchList(self,to_where=None): if self.download or not self["feedlist"].isValid(): @@ -400,7 +401,7 @@ class NFIDownload(Screen): print "couldn't save nfo file " + self.nfofilename pos = self.nfo.find("MD5:") - if pos > 0 and len(self.nfo) >= pos+5+32: + if pos > 0 and len(self.nfo) >= pos+5+32: self["statusbar"].text = ("Please wait for md5 signature verification...") cmd = "md5sum -c -" md5 = self.nfo[pos+5:pos+5+32] + " " + self.nfilocal @@ -416,6 +417,8 @@ class NFIDownload(Screen): else: self["statusbar"].text = "Download completed." self.downloading(False) + if self.wizard_mode: + self.configBackup() def md5ready(self, retval): self.download_container.sendEOF() @@ -424,9 +427,12 @@ class NFIDownload(Screen): print "[md5finished]: " + str(retval) self.download_container.appClosed.remove(self.md5finished) if retval==0: - self["statusbar"].text = _(".NFI file passed md5sum signature check. You can safely flash this image!") - self.switchList(self.LIST_SOURCE) self.downloading(False) + if self.wizard_mode: + self.configBackup() + else: + self["statusbar"].text = _(".NFI file passed md5sum signature check. You can safely flash this image!") + self.switchList(self.LIST_SOURCE) else: self.session.openWithCallback(self.nfi_remove, MessageBox, (_("The md5sum validation failed, the file may be downloaded incompletely or be corrupted!") + "\n" + _("Remove the broken .NFI file?")), MessageBox.TYPE_YESNO) @@ -613,10 +619,11 @@ class NFIDownload(Screen): self["job_progressbar"].value = 1000 self["job_progresslabel"].text = "100.00%" self["statusbar"].text = (".NFI Flasher bootable USB stick successfully created.") - self.session.openWithCallback(self.remove_img, MessageBox, _("The .NFI Image flasher USB stick is now ready to use. Please download an .NFI image file from the feed server and save it on the stick. Then reboot and hold the 'Down' key on the front panel to boot the .NFI flasher from the stick!"), MessageBox.TYPE_INFO) + self.session.openWithCallback(self.flasherFinishedCB, MessageBox, _("The USB stick is now bootable. Do you want to download the latest image from the feed server and save it on the stick?"), type = MessageBox.TYPE_YESNO) self["destlist"].changeDir("/mnt/usb") else: - self.session.openWithCallback(self.remove_img, MessageBox, (self.cmd + " " + _("failed") + ":\n" + str(self.taskstring)), MessageBox.TYPE_ERROR) + self.session.openWithCallback(self.flasherFinishedCB, MessageBox, (self.cmd + " " + _("failed") + ":\n" + str(self.taskstring)), MessageBox.TYPE_ERROR) + self.remove_img(True) def remove_img(self, answer): if fileExists("/tmp/nfiflasher_image.tar.bz2"): @@ -626,6 +633,39 @@ class NFIDownload(Screen): self.downloading(False) self.switchList(self.LIST_SOURCE) + def flasherFinishedCB(self, answer): + if answer == True: + self.wizard_mode = True + self["feedlist"].moveSelection(0) + self["path_bottom"].text = str(self["destlist"].getCurrentDirectory()) + self.nfo_download() + self.nfi_download() + + def configBackup(self): + self.session.openWithCallback(self.runBackup, MessageBox, _("The wizard can backup your current settings. Do you want to do a backup now?")) + + def runBackup(self, result=None): + from Tools.Directories import createDir, isMount, pathExists + from time import localtime + from datetime import date + from Screens.Console import Console + if result: + if isMount("/mnt/usb/"): + if (pathExists("/mnt/usb/backup") == False): + createDir("/mnt/usb/backup", True) + d = localtime() + dt = date(d.tm_year, d.tm_mon, d.tm_mday) + self.backup_file = "backup/" + str(dt) + "_settings_backup.tar.gz" + self.session.open(Console, title = "Backup running", cmdlist = ["tar -czvf " + "/mnt/usb/" + self.backup_file + " /etc/enigma2/ /etc/network/interfaces /etc/wpa_supplicant.conf"], finishedCallback = self.backup_finished, closeOnSuccess = True) + + def backup_finished(self): + wizardfd = open("/mnt/usb/wizard.nfo", "w") + if wizardfd: + wizardfd.write("image: "+self["feedlist"].getNFIname()+'\n') + wizardfd.write("configuration: "+self.backup_file+'\n') + wizardfd.close() + self.session.open(MessageBox, _("To update your Dreambox firmware, please follow these steps:\n1) Turn off your box with the rear power switch and plug in the bootable USB stick.\n2) Turn mains back on and hold the DOWN button on the front panel pressed for 10 seconds.\n3) Wait for bootup and follow instructions of the wizard."), type = MessageBox.TYPE_INFO) + def closeCB(self): if self.download: self.download.stop() -- cgit v1.2.3 From d924772eeced2429c007e51ce6dcb50dadec2836 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Tue, 18 Nov 2008 15:47:32 +0100 Subject: don't try to look for python files when handling a C++ crash --- lib/base/eerror.cpp | 4 ++-- lib/python/python.cpp | 16 ++++++++-------- main/bsod.cpp | 51 ++++++++++++++++++++++++++++----------------------- main/bsod.h | 2 +- main/enigma.cpp | 2 +- 5 files changed, 40 insertions(+), 35 deletions(-) (limited to 'lib/python') diff --git a/lib/base/eerror.cpp b/lib/base/eerror.cpp index 7ebac213..4c4d6551 100644 --- a/lib/base/eerror.cpp +++ b/lib/base/eerror.cpp @@ -77,7 +77,7 @@ int logOutputConsole=1; static pthread_mutex_t DebugLock = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP; -extern void bsodFatal(); +extern void bsodFatal(const char *component); void eFatal(const char* fmt, ...) { @@ -91,7 +91,7 @@ void eFatal(const char* fmt, ...) logOutput(lvlFatal, "FATAL: " + std::string(buf) + "\n"); fprintf(stderr, "FATAL: %s\n",buf ); } - bsodFatal(); + bsodFatal("enigma2"); } #ifdef DEBUG diff --git a/lib/python/python.cpp b/lib/python/python.cpp index 50b66103..c5faeed4 100644 --- a/lib/python/python.cpp +++ b/lib/python/python.cpp @@ -5,7 +5,7 @@ extern "C" void init_enigma(); extern "C" void eBaseInit(void); extern "C" void eConsoleInit(void); -extern void bsodFatal(); +extern void bsodFatal(const char *component); #define SKIP_PART2 #include @@ -44,7 +44,7 @@ ePyObject::operator PyObject*() if (m_file) eDebug("last modified in file %s line %d from %d to %d", m_file, m_line, m_from, m_to); - bsodFatal(); + bsodFatal("enigma2, refcnt"); } return 0; } @@ -57,7 +57,7 @@ void ePyObject::incref(const char *file, int line) if (m_file) eDebug("last modified in file %s line %d from %d to %d", m_file, m_line, m_from, m_to); - bsodFatal(); + bsodFatal("enigma2, refcnt"); } if (m_erased || m_ob->ob_refcnt <= 0) { @@ -66,7 +66,7 @@ void ePyObject::incref(const char *file, int line) if (m_file) eDebug("last modified in file %s line %d from %d to %d", m_file, m_line, m_from, m_to); - bsodFatal(); + bsodFatal("enigma2, refcnt"); } if (m_ob->ob_refcnt == 0x7FFFFFFF) { @@ -75,7 +75,7 @@ void ePyObject::incref(const char *file, int line) if (m_file) eDebug("last modified in file %s line %d from %d to %d", m_file, m_line, m_from, m_to); - bsodFatal(); + bsodFatal("enigma2, refcnt"); } m_file = file; m_line = line; @@ -92,7 +92,7 @@ void ePyObject::decref(const char *file, int line) if (m_file) eDebug("last modified in file %s line %d from %d to %d", m_file, m_line, m_from, m_to); - bsodFatal(); + bsodFatal("enigma2, refcnt"); } if (m_erased || m_ob->ob_refcnt <= 0) { @@ -101,7 +101,7 @@ void ePyObject::decref(const char *file, int line) if (m_file) eDebug("last modified in file %s line %d from %d to %d", m_file, m_line, m_from, m_to); - bsodFatal(); + bsodFatal("enigma2, refcnt"); } m_file = file; m_line = line; @@ -207,7 +207,7 @@ int ePython::call(ePyObject pFunc, ePyObject pArgs) eDebug("(PyObject_CallObject(%s,%s) failed)", PyString_AS_STRING(FuncStr), PyString_AS_STRING(ArgStr)); Py_DECREF(FuncStr); Py_DECREF(ArgStr); - bsodFatal(); + bsodFatal(0); } } return res; diff --git a/main/bsod.cpp b/main/bsod.cpp index 173a2cce..583107d7 100644 --- a/main/bsod.cpp +++ b/main/bsod.cpp @@ -67,7 +67,7 @@ extern std::string getLogBuffer(); #define INFOFILE "/maintainer.info" -void bsodFatal() +void bsodFatal(const char *component) { char logfile[128]; sprintf(logfile, "/media/hdd/enigma2_crash_%u.log", (unsigned int)time(0)); @@ -81,30 +81,35 @@ void bsodFatal() char crash_emailaddr[256] = CRASH_EMAILADDR; char crash_component[256] = "enigma2"; - while ((start = lines.find("\n File \"", start)) != std::string::npos) + if (component) + snprintf(crash_component, 256, component); + else { - start += 9; - size_t end = lines.find("\"", start); - if (end == std::string::npos) - break; - end = lines.rfind("/", end); - if (end == std::string::npos) - break; - if (end - start >= (256 - strlen(INFOFILE))) - continue; - char filename[256]; - snprintf(filename, 256, "%s%s", lines.substr(start, end - start).c_str(), INFOFILE); - FILE *cf = fopen(filename, "r"); - if (cf) + while ((start = lines.find("\n File \"", start)) != std::string::npos) { - fgets(crash_emailaddr, sizeof crash_emailaddr, cf); - if (*crash_emailaddr && crash_emailaddr[strlen(crash_emailaddr)-1] == '\n') - crash_emailaddr[strlen(crash_emailaddr)-1] = 0; + start += 9; + size_t end = lines.find("\"", start); + if (end == std::string::npos) + break; + end = lines.rfind("/", end); + if (end == std::string::npos) + break; + if (end - start >= (256 - strlen(INFOFILE))) + continue; + char filename[256]; + snprintf(filename, 256, "%s%s", lines.substr(start, end - start).c_str(), INFOFILE); + FILE *cf = fopen(filename, "r"); + if (cf) + { + fgets(crash_emailaddr, sizeof crash_emailaddr, cf); + if (*crash_emailaddr && crash_emailaddr[strlen(crash_emailaddr)-1] == '\n') + crash_emailaddr[strlen(crash_emailaddr)-1] = 0; - fgets(crash_component, sizeof crash_component, cf); - if (*crash_component && crash_component[strlen(crash_component)-1] == '\n') - crash_component[strlen(crash_component)-1] = 0; - fclose(cf); + fgets(crash_component, sizeof crash_component, cf); + if (*crash_component && crash_component[strlen(crash_component)-1] == '\n') + crash_component[strlen(crash_component)-1] = 0; + fclose(cf); + } } } @@ -242,7 +247,7 @@ void handleFatalSignal(int signum, siginfo_t *si, void *ctx) oops(uc->uc_mcontext, signum == SIGSEGV || signum == SIGABRT); #endif eDebug("-------"); - bsodFatal(); + bsodFatal("enigma2, signal"); } void bsodCatchSignals() diff --git a/main/bsod.h b/main/bsod.h index aa8cfb74..4ee4c48b 100644 --- a/main/bsod.h +++ b/main/bsod.h @@ -3,6 +3,6 @@ void bsodLogInit(); void bsodCatchSignals(); -void bsodFatal(); +void bsodFatal(const char *component); #endif diff --git a/main/enigma.cpp b/main/enigma.cpp index 0893b035..98175c49 100644 --- a/main/enigma.cpp +++ b/main/enigma.cpp @@ -248,7 +248,7 @@ int main(int argc, char **argv) if (exit_code == 5) /* python crash */ { eDebug("(exit code 5)"); - bsodFatal(); + bsodFatal(0); } dsk.paint(); -- cgit v1.2.3 From ac28912f03ba943cce61b30df2014f06dd499ba7 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Wed, 19 Nov 2008 09:58:34 +0100 Subject: fix filelist crash, add necessary import for hotplug --- lib/python/Plugins/Extensions/PicturePlayer/plugin.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py index aeca12dc..e9da3e2f 100644 --- a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py +++ b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py @@ -1,7 +1,7 @@ from enigma import ePicLoad, eTimer, getDesktop from Screens.Screen import Screen -from Tools.Directories import resolveFilename, pathExists, SCOPE_MEDIA +from Tools.Directories import resolveFilename, pathExists, fileExists, SCOPE_MEDIA from Plugins.Plugin import PluginDescriptor from Components.Pixmap import Pixmap, MovingPixmap @@ -91,8 +91,9 @@ class picshow(Screen): def showThumb(self): if not self.filelist.canDescent(): - if self.picload.getThumbnail(self.filelist.getCurrentDirectory() + self.filelist.getFilename()) == 1: - self.ThumbTimer.start(500, True) + if self.filelist.getCurrentDirectory() and self.filelist.getFilename(): + if self.picload.getThumbnail(self.filelist.getCurrentDirectory() + self.filelist.getFilename()) == 1: + self.ThumbTimer.start(500, True) def selectionChanged(self): if not self.filelist.canDescent(): -- cgit v1.2.3 From e09c5aad8f93dab13e7b981a75c4d5473ea1376c Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Wed, 19 Nov 2008 12:42:52 +0100 Subject: update MediaPlayer to use new async ePicLoad function for cover artwork. currently no transparent background possible though :/ --- lib/python/Plugins/Extensions/MediaPlayer/plugin.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index babef3e7..981f08cb 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -1,6 +1,6 @@ from os import path as os_path, remove as os_remove, listdir as os_listdir from time import strftime -from enigma import iPlayableService, eTimer, eServiceCenter, iServiceInformation, loadPic +from enigma import iPlayableService, eTimer, eServiceCenter, iServiceInformation, ePicLoad from ServiceReference import ServiceReference from Screens.Screen import Screen from Screens.HelpMenu import HelpableScreen @@ -171,6 +171,9 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self.currList = "filelist" self.coverArtFileName = "" + self.picload = ePicLoad() + self.picload.PictureData.get().append(self.paintCoverArtPixmapCB) + self.isAudioCD = False self.AudioCD_albuminfo = {} self.cdAudioTrackFiles = [] @@ -206,6 +209,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB config.mediaplayer.defaultDir.setValue(self.filelist.getCurrentDirectory()) config.mediaplayer.defaultDir.save() hotplugNotifier.remove(self.hotplugCB) + del self.picload self.close() def checkSkipShowHideLock(self): @@ -294,9 +298,15 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB new_coverArtFileName = path + filename if self.coverArtFileName != new_coverArtFileName: self.coverArtFileName = new_coverArtFileName - pixmap = loadPic(self.coverArtFileName, 116, 116, AVSwitch().getAspectRatioSetting()/2,1,0,0) - if pixmap is not None: - self["coverArt"].instance.setPixmap(pixmap.__deref__()) + sc = AVSwitch().getFramebufferScale() + #0=Width 1=Height 2=Aspect 3=use_cache 4=resize_type 5=Background(#AARRGGBB) + self.picload.setPara((self["coverArt"].instance.size().width(), self["coverArt"].instance.size().height(), sc[0], sc[1], False, 1, "#ff000000")) + self.picload.startDecode(self.coverArtFileName) + + def paintCoverArtPixmapCB(self, picInfo=None): + ptr = self.picload.getData() + if ptr != None: + self["coverArt"].instance.setPixmap(ptr.__deref__()) def leftDown(self): self.lefttimer = True -- cgit v1.2.3 From 5e6249693c0c59f61dce4a14ad0902fd9d78769a Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Wed, 19 Nov 2008 17:13:33 +0100 Subject: correctly use new ePicLoad. keep "no cover art" pixmap resident the whole time instead of reloading it. move entire cover art functionality into MediaPixmap class. --- .../Plugins/Extensions/MediaPlayer/plugin.py | 83 +++++++++++++--------- 1 file changed, 48 insertions(+), 35 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index 981f08cb..8477ecc1 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -35,18 +35,58 @@ class MyPlayList(PlayList): self.oldCurrPlaying = -1 class MediaPixmap(Pixmap): + def __init__(self): + Pixmap.__init__(self) + self.coverArtFileName = "" + self.picload = ePicLoad() + self.picload.PictureData.get().append(self.paintCoverArtPixmapCB) + self.coverFileNames = ["folder.png", "folder.jpg"] + def applySkin(self, desktop, screen): - self.default_pixmap = None + from Tools.LoadPixmap import LoadPixmap if self.skinAttributes is not None: for (attrib, value) in self.skinAttributes: if attrib == "pixmap": - self.default_pixmap = value + noCoverFile = value break - if self.default_pixmap is None: - self.default_pixmap = resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/no_coverArt.png") - self.coverFileNames = ["folder.png", "folder.jpg"] + if noCoverFile is None: + noCoverFile = resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/no_coverArt.png") + self.noCoverPixmap = LoadPixmap(noCoverFile) return Pixmap.applySkin(self, desktop, screen) + def onShow(self): + Pixmap.onShow(self) + sc = AVSwitch().getFramebufferScale() + #0=Width 1=Height 2=Aspect 3=use_cache 4=resize_type 5=Background(#AARRGGBB) + self.picload.setPara((self.instance.size().width(), self.instance.size().height(), sc[0], sc[1], False, 1, "#00000000")) + + def paintCoverArtPixmapCB(self, picInfo=None): + ptr = self.picload.getData() + if ptr != None: + self.instance.setPixmap(ptr.__deref__()) + + def updateCoverArt(self, path): + while not path.endswith("/"): + path = path[:-1] + new_coverArtFileName = None + for filename in self.coverFileNames: + if fileExists(path + filename): + new_coverArtFileName = path + filename + if self.coverArtFileName != new_coverArtFileName: + self.coverArtFileName = new_coverArtFileName + if new_coverArtFileName: + self.picload.startDecode(self.coverArtFileName) + else: + self.showDefaultCover() + + def showDefaultCover(self): + self.instance.setPixmap(self.noCoverPixmap) + + #def destroy(self): + #Pixmap.destroy(self) + #print "mediapixmap ***********+ destroy" + + class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport, HelpableScreen): ALLOW_SUSPEND = True ENABLE_RESUME_SUPPORT = True @@ -74,7 +114,6 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self["filelist"] = self.filelist self.playlist = MyPlayList() - #self.playlist = PlayList() self.is_closing = False self.delname = "" self["playlist"] = self.playlist @@ -169,11 +208,6 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self.leftKeyTimer.callback.append(self.leftTimerFire) self.currList = "filelist" - - self.coverArtFileName = "" - self.picload = ePicLoad() - self.picload.PictureData.get().append(self.paintCoverArtPixmapCB) - self.isAudioCD = False self.AudioCD_albuminfo = {} self.cdAudioTrackFiles = [] @@ -209,7 +243,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB config.mediaplayer.defaultDir.setValue(self.filelist.getCurrentDirectory()) config.mediaplayer.defaultDir.save() hotplugNotifier.remove(self.hotplugCB) - del self.picload + del self["coverArt"].picload self.close() def checkSkipShowHideLock(self): @@ -289,25 +323,6 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB if self[name].getText() != info: self[name].setText(info) - def updateCoverArtPixmap(self, path): - while not path.endswith("/"): - path = path[:-1] - new_coverArtFileName = self["coverArt"].default_pixmap - for filename in self["coverArt"].coverFileNames: - if fileExists(path + filename): - new_coverArtFileName = path + filename - if self.coverArtFileName != new_coverArtFileName: - self.coverArtFileName = new_coverArtFileName - sc = AVSwitch().getFramebufferScale() - #0=Width 1=Height 2=Aspect 3=use_cache 4=resize_type 5=Background(#AARRGGBB) - self.picload.setPara((self["coverArt"].instance.size().width(), self["coverArt"].instance.size().height(), sc[0], sc[1], False, 1, "#ff000000")) - self.picload.startDecode(self.coverArtFileName) - - def paintCoverArtPixmapCB(self, picInfo=None): - ptr = self.picload.getData() - if ptr != None: - self["coverArt"].instance.setPixmap(ptr.__deref__()) - def leftDown(self): self.lefttimer = True self.leftKeyTimer.start(1000) @@ -835,11 +850,9 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self.unPauseService() if needsInfoUpdate == True: path = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()].getPath() - self.updateCoverArtPixmap(path) + self["coverArt"].updateCoverArt(path) else: - pngname = self["coverArt"].default_pixmap - self.coverArtFileName = pngname - self["coverArt"].instance.setPixmapFromFile(self.coverArtFileName) + self["coverArt"].showDefaultCover() self.readTitleInformation() def updatedSeekState(self): -- cgit v1.2.3 From 5474861f9be0b88428d490b45625d1a65575c020 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Wed, 19 Nov 2008 17:39:20 +0100 Subject: fix mediascanner list handling, thx to mechatron --- lib/python/Plugins/Extensions/PicturePlayer/plugin.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py index e9da3e2f..05adb633 100644 --- a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py +++ b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py @@ -452,6 +452,11 @@ class Pic_Full_View(Screen): self.filelist.append(path + x[0][0]) else: self.dirlistcount += 1 + elif len(filelist[0]) == 2: #scanlist + if x[0][1] == False: + self.filelist.append(x[0][0]) + else: + self.dirlistcount += 1 else: # thumbnaillist self.filelist.append(x[T_FULL]) -- cgit v1.2.3 From 5a626462406c008da1c81cf304a448d9abd19576 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Thu, 20 Nov 2008 12:17:28 +0100 Subject: decode id3 cover art images embedded into mp3 files and show them in mediaplayer --- lib/python/Plugins/Extensions/MediaPlayer/plugin.py | 11 ++++++----- lib/service/servicemp3.cpp | 14 +++++++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index 8477ecc1..b6d87a6e 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -82,10 +82,10 @@ class MediaPixmap(Pixmap): def showDefaultCover(self): self.instance.setPixmap(self.noCoverPixmap) - #def destroy(self): - #Pixmap.destroy(self) - #print "mediapixmap ***********+ destroy" - + def embeddedCoverArt(self): + print "[embeddedCoverArt] found" + self.coverArtFileName = "/tmp/.id3coverart" + self.picload.startDecode(self.coverArtFileName) class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport, HelpableScreen): ALLOW_SUSPEND = True @@ -224,7 +224,8 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB { iPlayableService.evUpdatedInfo: self.__evUpdatedInfo, iPlayableService.evUser+11: self.__evDecodeError, - iPlayableService.evUser+12: self.__evPluginError + iPlayableService.evUser+12: self.__evPluginError, + iPlayableService.evUser+13: self["coverArt"].embeddedCoverArt }) def doNothing(self): diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 19b7735b..017c58f0 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -16,6 +16,7 @@ #include /* for subtitles */ #include +#include // eServiceFactoryMP3 @@ -944,6 +945,17 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) m_audioStreams.push_back(audio); } + GValue *gv_image = gst_tag_list_get_value_index(tags, GST_TAG_IMAGE, 0); + if ( gv_image ) + { + GstBuffer *buf_image; + buf_image = gst_value_get_buffer (gv_image); + int fd = open("/tmp/.id3coverart", O_CREAT|O_WRONLY|O_TRUNC, 0644); + int ret = write(fd, GST_BUFFER_DATA(buf_image), GST_BUFFER_SIZE(buf_image)); + close(fd); + m_event((iPlayableService*)this, evUser+13); + } + gst_tag_list_free(tags); m_event((iPlayableService*)this, evUpdatedInfo); break; @@ -984,7 +996,7 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) { if ( gst_is_missing_plugin_message(msg) ) { - gchar *description = gst_missing_plugin_message_get_description(msg); + gchar *description = gst_missing_plugin_message_get_description(msg); if ( description ) { m_error_message = "GStreamer plugin " + (std::string)description + " not available!\n"; -- cgit v1.2.3 From 60fc8afd61923e8bbf949d04b73491862390b65f Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Thu, 20 Nov 2008 22:54:11 +0100 Subject: fix keymap associations with INFO button --- data/keymap.xml | 2 +- lib/python/Screens/InfoBarGenerics.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/data/keymap.xml b/data/keymap.xml index 6b8b583d..0a0dc867 100644 --- a/data/keymap.xml +++ b/data/keymap.xml @@ -77,7 +77,7 @@ - + diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index eb79c74e..b923340c 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -403,7 +403,7 @@ class InfoBarEPG: self.eventView = None self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions", { - "showEventView": (self.openEventView, _("show EPG...")), + "showEventInfo": (self.openEventView, _("show EPG...")), "showEventInfoPlugin": (self.showEventInfoPlugins, _("show single service EPG...")), "showInfobarOrEpgWhenInfobarAlreadyVisible": self.showEventInfoWhenNotVisible, }) -- cgit v1.2.3 From 7b99a1af4abb7fdd77889feabe6bbd08d6c1d343 Mon Sep 17 00:00:00 2001 From: ghost Date: Sat, 22 Nov 2008 09:23:16 +0100 Subject: AVSwitch.py: fix getOutputAspect function --- lib/python/Components/AVSwitch.py | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/python') diff --git a/lib/python/Components/AVSwitch.py b/lib/python/Components/AVSwitch.py index 00350cbb..1f529cfd 100644 --- a/lib/python/Components/AVSwitch.py +++ b/lib/python/Components/AVSwitch.py @@ -29,6 +29,7 @@ class AVSwitch: eAVSwitch.getInstance().setVideomode(value) def getOutputAspect(self): + valstr = config.av.aspectratio.value if valstr in ("4_3_letterbox", "4_3_panscan"): # 4:3 return (4,3) elif valstr == "16_9": # auto ... 4:3 or 16:9 -- cgit v1.2.3 From 74837aa1b9a2d0ee3cd630b74abcb224272290ab Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 24 Nov 2008 09:57:14 +0100 Subject: re-introduce consistent EXIT key behaviour. sort "quit" entry to the top though. --- lib/python/Plugins/Extensions/DVDPlayer/plugin.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/DVDPlayer/plugin.py b/lib/python/Plugins/Extensions/DVDPlayer/plugin.py index 593d4d2e..b7d66a82 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/DVDPlayer/plugin.py @@ -489,7 +489,7 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP self.doShow() def askLeavePlayer(self): - choices = [(_("Continue playing"), "play"), (_("Exit"), "exit")] + choices = [(_("Exit"), "exit"), (_("Continue playing"), "play")] if not self.physicalDVD: choices.insert(1,(_("Return to file browser"), "browser")) self.session.openWithCallback(self.exitCB, ChoiceBox, title=_("Leave DVD Player?"), list = choices) @@ -590,16 +590,19 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP print "cur_dlg", self.session.current_dialog def exitCB(self, answer): - if not answer or answer and answer[1] == "exit": - if self.service: - self.service = None - self.close() - if answer and answer[1] == "browser": + if answer is not None: + if answer[1] == "exit": + if self.service: + self.service = None + self.close() + if answer[1] == "browser": #TODO check here if a paused dvd playback is already running... then re-start it... #else - if self.service: - self.service = None - self.showFileBrowser() + if self.service: + self.service = None + self.showFileBrowser() + else: + pass def __onClose(self): for i in (("/proc/stb/video/aspect", self.old_aspect), ("/proc/stb/video/policy", self.old_policy), ("/proc/stb/denc/0/wss", self.old_wss)): -- cgit v1.2.3 From 4faf769dd3aa03a1ccce0df36beecb4d5f57cffb Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 24 Nov 2008 19:09:45 +0100 Subject: delete file, shuffle, save & delete playlist and settings screen only for intermediate+ users --- lib/python/Plugins/Extensions/MediaPlayer/plugin.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index b6d87a6e..607294ba 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -482,17 +482,20 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB else: menu.append((_("add files to playlist"), "copyfiles")) menu.append((_("switch to playlist"), "playlist")) - menu.append((_("delete file"), "deletefile")) + if config.usage.setup_level.index >= 1: # intermediate+ + menu.append((_("delete file"), "deletefile")) else: menu.append((_("switch to filelist"), "filelist")) - menu.append((_("shuffle playlist"), "shuffle")) - menu.append((_("Delete entry"), "deleteentry")) menu.append((_("clear playlist"), "clear")) + menu.append((_("Delete entry"), "deleteentry")) + if config.usage.setup_level.index >= 1: # intermediate+ + menu.append((_("shuffle playlist"), "shuffle")) menu.append((_("hide player"), "hide")); - menu.append((_("save playlist"), "saveplaylist")); menu.append((_("load playlist"), "loadplaylist")); - menu.append((_("delete saved playlist"), "deleteplaylist")); - menu.append((_("Edit settings"), "settings")) + if config.usage.setup_level.index >= 1: # intermediate+ + menu.append((_("save playlist"), "saveplaylist")); + menu.append((_("delete saved playlist"), "deleteplaylist")); + menu.append((_("Edit settings"), "settings")) self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu) def menuCallback(self, choice): -- cgit v1.2.3 From 2dbd18117bf8519ea700c7f87424eaa2e5a794fa Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 25 Nov 2008 21:15:42 +0100 Subject: add possibility to always switch to 13V before do sec commands --- lib/dvb/sec.cpp | 17 ++++++++++----- lib/dvb/sec.h | 2 +- lib/python/Components/NimManager.py | 42 ++++++++++++++++++++++++------------- 3 files changed, 40 insertions(+), 21 deletions(-) (limited to 'lib/python') diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 2b7f717b..39124b34 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -388,6 +388,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA iDVBFrontend *sec_fe=&frontend; eDVBRegisteredFrontend *linked_fe = 0; eDVBSatelliteDiseqcParameters::t_diseqc_mode diseqc_mode = di_param.m_diseqc_mode; + eDVBSatelliteSwitchParameters::t_voltage_mode voltage_mode = sw_param.m_voltage_mode; + bool diseqc13V = voltage_mode == eDVBSatelliteSwitchParameters::HV_13; + + if (diseqc13V) + voltage_mode = eDVBSatelliteSwitchParameters::HV; frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr); @@ -437,13 +442,13 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical)) band |= 2; - if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_14V + if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V || ( sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical - && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) + && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) voltage = VOLTAGE(13); - else if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_18V + else if ( voltage_mode == eDVBSatelliteSwitchParameters::_18V || ( !(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical) - && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) + && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) voltage = VOLTAGE(18); if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON) || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && (band&1) ) ) @@ -597,7 +602,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) ); - if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) + if (diseqc13V) + vlt = iDVBFrontend::voltage13; + else if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) { if (rotor_param.m_inputpower_parameters.m_use) vlt = VOLTAGE(18); // in input power mode set 18V for measure input power diff --git a/lib/dvb/sec.h b/lib/dvb/sec.h index e68ed167..27dcedd5 100644 --- a/lib/dvb/sec.h +++ b/lib/dvb/sec.h @@ -170,7 +170,7 @@ class eDVBSatelliteSwitchParameters #endif public: enum t_22khz_signal { HILO=0, ON=1, OFF=2 }; // 22 Khz - enum t_voltage_mode { HV=0, _14V=1, _18V=2, _0V=3 }; // 14/18 V + enum t_voltage_mode { HV=0, _14V=1, _18V=2, _0V=3, HV_13=4 }; // 14/18 V #ifndef SWIG t_voltage_mode m_voltage_mode; t_22khz_signal m_22khz_signal; diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index f4e91083..edd3bbbb 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -39,7 +39,7 @@ class SecConfigure: sec.addSatellite(orbpos) self.configuredSatellites.add(orbpos) - def addLNBSimple(self, sec, slotid, diseqcmode, toneburstmode = diseqcParam.NO, diseqcpos = diseqcParam.SENDNO, orbpos = 0, longitude = 0, latitude = 0, loDirection = 0, laDirection = 0, turningSpeed = rotorParam.FAST, useInputPower=True, inputPowerDelta=50, fastDiSEqC = False, setVoltageTone = True): + def addLNBSimple(self, sec, slotid, diseqcmode, toneburstmode = diseqcParam.NO, diseqcpos = diseqcParam.SENDNO, orbpos = 0, longitude = 0, latitude = 0, loDirection = 0, laDirection = 0, turningSpeed = rotorParam.FAST, useInputPower=True, inputPowerDelta=50, fastDiSEqC = False, setVoltageTone = True, diseqc13V = False): if orbpos is None or orbpos == 3601: return #simple defaults @@ -70,7 +70,10 @@ class SecConfigure: if 0 <= diseqcmode < 3: self.addSatellite(sec, orbpos) if setVoltageTone: - sec.setVoltageMode(switchParam.HV) + if diseqc13V: + sec.setVoltageMode(switchParam.HV_13) + else: + sec.setVoltageMode(switchParam.HV) sec.setToneMode(switchParam.HILO) else: sec.setVoltageMode(switchParam._14V) @@ -90,7 +93,10 @@ class SecConfigure: for x in self.NimManager.satList: print "Add sat " + str(x[0]) self.addSatellite(sec, int(x[0])) - sec.setVoltageMode(switchParam.HV) + if diseqc13V: + sec.setVoltageMode(switchParam.HV_13) + else: + sec.setVoltageMode(switchParam.HV) sec.setToneMode(switchParam.HILO) sec.setRotorPosNum(0) # USALS @@ -172,24 +178,24 @@ class SecConfigure: print "diseqcmode: ", nim.diseqcMode.value if nim.diseqcMode.value == "single": #single if nim.simpleSingleSendDiSEqC.value: - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, diseqc13V = nim.diseqc13V.value) else: - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.NONE, diseqcpos = diseqcParam.SENDNO) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.NONE, diseqcpos = diseqcParam.SENDNO, diseqc13V = nim.diseqc13V.value) elif nim.diseqcMode.value == "toneburst_a_b": #Toneburst A/B - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.A, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.B, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.A, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO, diseqc13V = nim.diseqc13V.value) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.B, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO, diseqc13V = nim.diseqc13V.value) elif nim.diseqcMode.value == "diseqc_a_b": #DiSEqC A/B fastDiSEqC = nim.simpleDiSEqCOnlyOnSatChange.value setVoltageTone = nim.simpleDiSEqCSetVoltageTone.value - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) elif nim.diseqcMode.value == "diseqc_a_b_c_d": #DiSEqC A/B/C/D fastDiSEqC = nim.simpleDiSEqCOnlyOnSatChange.value setVoltageTone = nim.simpleDiSEqCSetVoltageTone.value - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcC.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcD.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcC.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcD.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) elif nim.diseqcMode.value == "positioner": #Positioner if nim.latitudeOrientation.value == "north": laValue = rotorParam.NORTH @@ -219,7 +225,8 @@ class SecConfigure: laDirection = laValue, turningSpeed = turning_speed, useInputPower = useInputPower, - inputPowerDelta = inputPowerDelta) + inputPowerDelta = inputPowerDelta, + diseqc13V = nim.diseqc13V.value) elif nim.configMode.value == "advanced": #advanced config self.updateAdvanced(sec, x) print "sec config completed" @@ -383,7 +390,10 @@ class SecConfigure: satpos = y currSat = config.Nims[slotid].advanced.sat[satpos] if currSat.voltage.value == "polarization": - sec.setVoltageMode(switchParam.HV) + if config.Nims[slotid].diseqc13V.value: + sec.setVoltageMode(switchParam.HV_13) + else: + sec.setVoltageMode(switchParam.HV) elif currSat.voltage.value == "13V": sec.setVoltageMode(switchParam._14V) elif currSat.voltage.value == "18V": @@ -902,6 +912,8 @@ def InitNimManager(nimmgr): # nim.configMode.value = "simple" # nim.configMode.save() + nim.diseqc13V = ConfigYesNo(default = False) + nim.diseqcMode = ConfigSelection( choices = [ ("single", _("Single")), -- cgit v1.2.3 From 04b3fc4ece96fd8dc6c7d53bd55e9ee1b7bf8b3b Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Wed, 26 Nov 2008 13:31:41 +0100 Subject: add frisian language, update language cache --- data/countries/x-fy.png | Bin 0 -> 2685 bytes lib/python/Components/Language.py | 1 + lib/python/Components/language_cache.py | 140 +- po/Makefile.am | 2 +- po/fy.po | 4615 +++++++++++++++++++++++++++++++ 5 files changed, 4737 insertions(+), 21 deletions(-) create mode 100644 data/countries/x-fy.png create mode 100644 po/fy.po (limited to 'lib/python') diff --git a/data/countries/x-fy.png b/data/countries/x-fy.png new file mode 100644 index 00000000..ac32ca28 Binary files /dev/null and b/data/countries/x-fy.png differ diff --git a/lib/python/Components/Language.py b/lib/python/Components/Language.py index 6d1e31f3..395f6829 100644 --- a/lib/python/Components/Language.py +++ b/lib/python/Components/Language.py @@ -36,6 +36,7 @@ class Language: self.addLanguage(_("Swedish"), "sv", "SE") self.addLanguage(_("Turkish"), "tr", "TR") self.addLanguage(_("Ukrainian"), "uk", "UA") + self.addLanguage(_("Frisian"), "fy", "x-FY") # there is no separate country for frisian self.callbacks = [] diff --git a/lib/python/Components/language_cache.py b/lib/python/Components/language_cache.py index 046f281d..a9c02bc0 100644 --- a/lib/python/Components/language_cache.py +++ b/lib/python/Components/language_cache.py @@ -4,6 +4,7 @@ LANG_TEXT = { "fr_FR": "French", "fi_FI": "Finnish", "pt_PT": "Portuguese", + "fy_x-FY": "Frisian", "it_IT": "Italian", "no_NO": "Norwegian", "nl_NL": "Dutch", @@ -21,6 +22,7 @@ LANG_TEXT = { "tr_TR": "Turkish", "de_DE": "German", "ar_AE": "Arabic", + "uk_UA": "Ukrainian", "sv_SE": "Swedish", "pl_PL": "Polish", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -30,6 +32,7 @@ LANG_TEXT = { "fr_FR": "Französisch", "fi_FI": "Finnisch", "pt_PT": "portugiesisch", + "fy_x-FY": "Frisian", "it_IT": "Italienisch", "no_NO": "Norwegisch", "nl_NL": "Holländisch", @@ -47,6 +50,7 @@ LANG_TEXT = { "tr_TR": "Türkisch", "de_DE": "Deutsch", "ar_AE": "Arabisch", + "uk_UA": "Ukrainian", "sv_SE": "Schwedisch", "pl_PL": "Polnisch", "T1": "Bitte benutzen Sie die Hoch/Runter-Tasten, um Ihre Sprache auszuwählen. Danach drücken Sie bitte OK.", @@ -56,6 +60,7 @@ LANG_TEXT = { "fr_FR": "French", "fi_FI": "Finnish", "pt_PT": "Portuguese", + "fy_x-FY": "Frisian", "it_IT": "Italian", "no_NO": "Norwegian", "nl_NL": "Dutch", @@ -73,6 +78,7 @@ LANG_TEXT = { "tr_TR": "Turkish", "de_DE": "المانـى", "ar_AE": "Arabic", + "uk_UA": "Ukrainian", "sv_SE": "Swedish", "pl_PL": "Polish", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -82,6 +88,7 @@ LANG_TEXT = { "fr_FR": "Francès", "fi_FI": "Finlandès", "pt_PT": "Portuguès", + "fy_x-FY": "Frisian", "it_IT": "Italià", "no_NO": "Noruec", "nl_NL": "Holandès", @@ -99,6 +106,7 @@ LANG_TEXT = { "tr_TR": "Turc", "de_DE": "Alemany", "ar_AE": "Àrab", + "uk_UA": "Ukrainian", "sv_SE": "Suec", "pl_PL": "Polish", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -108,6 +116,7 @@ LANG_TEXT = { "fr_FR": "Francuski", "fi_FI": "Finski", "pt_PT": "Portugalski", + "fy_x-FY": "Frisian", "it_IT": "Talijanski", "no_NO": "NorveÅ¡ki", "nl_NL": "Nizozemski", @@ -125,6 +134,7 @@ LANG_TEXT = { "tr_TR": "Turski", "de_DE": "NjemaÄki", "ar_AE": "Arabski", + "uk_UA": "Ukrainian", "sv_SE": "Å vedski", "pl_PL": "Poljski", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -134,6 +144,7 @@ LANG_TEXT = { "fr_FR": "Francouzsky", "fi_FI": "Finsky", "pt_PT": "Portugalsky", + "fy_x-FY": "Frisian", "it_IT": "Italsky", "no_NO": "Norsky", "nl_NL": "Holandsky", @@ -151,6 +162,7 @@ LANG_TEXT = { "tr_TR": "Turecky", "de_DE": "NÄ›mecky", "ar_AE": "Arabsky", + "uk_UA": "Ukrainian", "sv_SE": "Å védsky", "pl_PL": "Polsky", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -160,6 +172,7 @@ LANG_TEXT = { "fr_FR": "Fransk", "fi_FI": "Finsk", "pt_PT": "Portugisisk", + "fy_x-FY": "Frisian", "it_IT": "Italiensk", "no_NO": "Norsk", "nl_NL": "Hollandsk", @@ -177,6 +190,7 @@ LANG_TEXT = { "tr_TR": "Tyrkisk", "de_DE": "Tysk", "ar_AE": "Arabisk", + "uk_UA": "Ukrainian", "sv_SE": "Svensk", "pl_PL": "Polsk", "T1": "Benyt venligst OP og NED tasten til at vælge sprog. Tryk bagefter pÃ¥ OK knappen.", @@ -186,6 +200,7 @@ LANG_TEXT = { "fr_FR": "Frans", "fi_FI": "Fins", "pt_PT": "Portugees", + "fy_x-FY": "Frisian", "it_IT": "Italiaans", "no_NO": "Noors", "nl_NL": "Nederlands", @@ -203,6 +218,7 @@ LANG_TEXT = { "tr_TR": "Turks", "de_DE": "Duits", "ar_AE": "Arabisch", + "uk_UA": "Ukrainian", "sv_SE": "Zweeds", "pl_PL": "Pools", "T1": "Gebruik de omhoog/omlaag toeten om de gewenste taal te selecteren. Druk daarna op OK.", @@ -212,6 +228,7 @@ LANG_TEXT = { "fr_FR": "Ranska", "fi_FI": "Suomi", "pt_PT": "Portugali", + "fy_x-FY": "Frisian", "it_IT": "Italia", "no_NO": "Norja", "nl_NL": "Hollanti", @@ -229,15 +246,17 @@ LANG_TEXT = { "tr_TR": "Turkki", "de_DE": "Saksa", "ar_AE": "Arabia", + "uk_UA": "Ukrainian", "sv_SE": "Ruotsi", "pl_PL": "Puola", - "T1": "Valitse kieli ylös/alas nappuloilla ja paina OK.", + "T1": "Valitse kieli ylös/alas näppäimillä ja paina OK-näppäintä.", "T2": "Kielivalinta", }, "fr_FR": { "fr_FR": "Français", "fi_FI": "Finlandais", "pt_PT": "Portugais", + "fy_x-FY": "Frisian", "it_IT": "Italien", "no_NO": "Norvégien", "nl_NL": "Hollandais", @@ -255,6 +274,7 @@ LANG_TEXT = { "tr_TR": "Turke", "de_DE": "Allemand", "ar_AE": "Arabe", + "uk_UA": "Ukrainian", "sv_SE": "Suédois", "pl_PL": "Polonais", "T1": "Veuillez utiliser les touches HAUT et BAS pour choisir votre langage. Ensuite presser le bouton OK.", @@ -264,6 +284,7 @@ LANG_TEXT = { "fr_FR": "Γαλλικά", "fi_FI": "Φιλλανδικά", "pt_PT": "ΠοÏτογαλλικά", + "fy_x-FY": "Frisian", "it_IT": "Ιταλικά", "no_NO": "ÎοÏβηφικά", "nl_NL": "Ολλανδικά", @@ -281,6 +302,7 @@ LANG_TEXT = { "tr_TR": "ΤοÏÏκικα", "de_DE": "ΓεÏμανικά", "ar_AE": "ΑÏαβικά", + "uk_UA": "Ukrainian", "sv_SE": "Σουιδεζικά", "pl_PL": "Πολωνικά", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -290,6 +312,7 @@ LANG_TEXT = { "fr_FR": "Francia", "fi_FI": "Finn", "pt_PT": "Portugál", + "fy_x-FY": "Frisian", "it_IT": "Olasz", "no_NO": "Norvég", "nl_NL": "Holland", @@ -307,6 +330,7 @@ LANG_TEXT = { "tr_TR": "Török", "de_DE": "Német", "ar_AE": "Arab", + "uk_UA": "Ukrainian", "sv_SE": "Svéd", "pl_PL": "Lengyel", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -316,6 +340,7 @@ LANG_TEXT = { "fr_FR": "PrancÅ«zų", "fi_FI": "Suomių", "pt_PT": "Portugalų", + "fy_x-FY": "Frisian", "it_IT": "Italų", "no_NO": "Norvegų", "nl_NL": "Olandų", @@ -333,6 +358,7 @@ LANG_TEXT = { "tr_TR": "Turkų", "de_DE": "VokieÄių", "ar_AE": "Arabų", + "uk_UA": "UkrainieÄių", "sv_SE": "Å vedų", "pl_PL": "Lenkų", "T1": "PraÅ¡ome naudoti AUKÅ TYN IR ŽEMYN mygtukus, kad iÅ¡sirinktumÄ—te savo kalbÄ…. Po to spauskite OK mygtukÄ….", @@ -342,6 +368,7 @@ LANG_TEXT = { "fr_FR": "Franska", "fi_FI": "Finnska", "pt_PT": "Portúgalska", + "fy_x-FY": "Frisian", "it_IT": "Ãtalska", "no_NO": "Norska", "nl_NL": "Hollenska", @@ -359,15 +386,17 @@ LANG_TEXT = { "tr_TR": "Tyrkneska", "de_DE": "Þýska", "ar_AE": "Arabíska", + "uk_UA": "Ukrainian", "sv_SE": "Sænskt", "pl_PL": "Pólska", - "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", + "T1": "Vinsamlega notið UP og NIÃUR takka til að velja tungumál. Ãttu svo á OK til að nota.", "T2": "Val tungumáls", }, "it_IT": { "fr_FR": "Francese", "fi_FI": "Finlandese", "pt_PT": "Portoghese", + "fy_x-FY": "Frisian", "it_IT": "Italiano", "no_NO": "Norvegese", "nl_NL": "Olandese", @@ -385,6 +414,7 @@ LANG_TEXT = { "tr_TR": "Turco", "de_DE": "Tedesco", "ar_AE": "Arabo", + "uk_UA": "Ucraino", "sv_SE": "Svedese", "pl_PL": "Polacco", "T1": "Selezionare la propria lingua utilizzando i tasti Sù/Giù. Premere OK per confermare.", @@ -394,6 +424,7 @@ LANG_TEXT = { "fr_FR": "Fransk", "fi_FI": "Finsk", "pt_PT": "Portugisisk", + "fy_x-FY": "Frisian", "it_IT": "Italiensk", "no_NO": "Norsk", "nl_NL": "Nederlandsk", @@ -411,6 +442,7 @@ LANG_TEXT = { "tr_TR": "Tyrkisk", "de_DE": "Tysk", "ar_AE": "Arabisk", + "uk_UA": "Ukrainian", "sv_SE": "Svensk", "pl_PL": "Polsk", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -420,6 +452,7 @@ LANG_TEXT = { "fr_FR": "Francuski", "fi_FI": "FiÅ„ski", "pt_PT": "Portugalski", + "fy_x-FY": "Frisian", "it_IT": "WÅ‚oski", "no_NO": "Norweski", "nl_NL": "Holenderski", @@ -437,6 +470,7 @@ LANG_TEXT = { "tr_TR": "Turecki", "de_DE": "Niemiecki", "ar_AE": "Arabski", + "uk_UA": "Ukrainian", "sv_SE": "Szwedzki", "pl_PL": "Polski", "T1": "W celu wyboru jÄ™zyka użyj klawiszy GÓRA i DÓÅ. Nastepnie nacisnij przycisk OK.", @@ -446,6 +480,7 @@ LANG_TEXT = { "fr_FR": "Francês", "fi_FI": "Finlandês", "pt_PT": "Português", + "fy_x-FY": "Frisian", "it_IT": "Italiano", "no_NO": "Norueguês", "nl_NL": "Holandês", @@ -463,6 +498,7 @@ LANG_TEXT = { "tr_TR": "Turco", "de_DE": "Alemão", "ar_AE": "Arabe", + "uk_UA": "Ukrainian", "sv_SE": "Sueco", "pl_PL": "Polaco", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -472,6 +508,7 @@ LANG_TEXT = { "fr_FR": "ФранцузÑкий", "fi_FI": "Окончание", "pt_PT": "Portuguese", + "fy_x-FY": "Frisian", "it_IT": "ИтальÑнÑкий", "no_NO": "ÐорвежÑкий", "nl_NL": "ÐидерландÑкий", @@ -489,6 +526,7 @@ LANG_TEXT = { "tr_TR": "Турецкий", "de_DE": "Ðемецкий", "ar_AE": "ÐрабÑкий", + "uk_UA": "Ukrainian", "sv_SE": "ШведÑкий", "pl_PL": "Polish", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -498,6 +536,7 @@ LANG_TEXT = { "fr_FR": "Francés", "fi_FI": "Finlandés", "pt_PT": "Portugués", + "fy_x-FY": "Frisian", "it_IT": "Italiano", "no_NO": "Noruego", "nl_NL": "Alemán", @@ -515,6 +554,7 @@ LANG_TEXT = { "tr_TR": "Turco", "de_DE": "Alemán", "ar_AE": "Arábigo", + "uk_UA": "Ukrainian", "sv_SE": "Sueco", "pl_PL": "Polaco", "T1": "Use las teclas ARRIBA y ABAJO para seleccionar su idioma. Después, pulse el botón OK.", @@ -524,6 +564,7 @@ LANG_TEXT = { "fr_FR": "Franska", "fi_FI": "Finska", "pt_PT": "Portugisiska", + "fy_x-FY": "Frisian", "it_IT": "Italienska", "no_NO": "Norska", "nl_NL": "Holländska", @@ -541,6 +582,7 @@ LANG_TEXT = { "tr_TR": "Turkiska", "de_DE": "Tyska", "ar_AE": "Arabiska", + "uk_UA": "Ukrainian", "sv_SE": "Svenska", "pl_PL": "Polska", "T1": "Vänligen använd UPP och NER pil för att välja sprÃ¥k. Efter val tryck pÃ¥ OK knappen.", @@ -548,28 +590,86 @@ LANG_TEXT = { }, "tr_TR": { "fr_FR": "Fransızca", - "fi_FI": "BitiÅŸ", - "pt_PT": "Portuguese", - "it_IT": "İtalya", - "no_NO": "Norveç", - "nl_NL": "Almanca", + "fi_FI": "Fince", + "pt_PT": "Portekizce", + "fy_x-FY": "Frisian", + "it_IT": "İtalyanca", + "no_NO": "Norveççe", + "nl_NL": "Flemenkçe", "el_GR": "Greek", - "hu_HU": "Hungarian", - "lt_LT": "Lithuanian", - "hr_HR": "Croatian", + "hu_HU": "Macarca", + "lt_LT": "Litvanyaca", + "hr_HR": "Hırvatça", "en_EN": "İngilizce", "es_ES": "İspanyolca", - "ca_AD": "Catalan", - "ru_RU": "Russian", - "is_IS": "izlanda", - "da_DK": "Çanak", - "cs_CZ": "Czech", - "tr_TR": "Turkish", - "de_DE": "Alman", + "ca_AD": "Katalanca", + "ru_RU": "Rusça", + "is_IS": "İzlandaca", + "da_DK": "Danca", + "cs_CZ": "Çekçe", + "tr_TR": "Türkçe", + "de_DE": "Almanca", "ar_AE": "Arapça", - "sv_SE": "İsveç", + "uk_UA": "Ukraynaca", + "sv_SE": "İsveççe", "pl_PL": "Polish", - "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", - "T2": "Lisan Seçimi", + "T1": "Dil seçiminizi, yapmak için YUKARI ve AÅžAÄžI tuÅŸlarını, onaylamak için OK tuÅŸunu kullanın.", + "T2": "Dil seçimi", +}, +"uk_UA": { + "fr_FR": "Французька", + "fi_FI": "ФінÑька", + "pt_PT": "ПортугальÑька", + "fy_x-FY": "Frisian", + "it_IT": "ІталійÑька", + "no_NO": "ÐорвежÑька", + "nl_NL": "ДанÑька", + "el_GR": "Грецька", + "hu_HU": "УгорÑька", + "lt_LT": "ЛитовÑька", + "hr_HR": "ХорватьÑка", + "en_EN": "ÐнглійÑька", + "es_ES": "ІÑпанÑька", + "ca_AD": "КаталонÑька", + "ru_RU": "РоÑійÑька", + "is_IS": "ІÑландÑька", + "da_DK": "ДанÑька", + "cs_CZ": "ЧешÑька", + "tr_TR": "Турецька", + "de_DE": "Ðімецька", + "ar_AE": "ÐрабÑький", + "uk_UA": "Ukrainian", + "sv_SE": "ШведÑька", + "pl_PL": "ПольÑька", + "T1": "ВикориÑтовуйте кнопки ВВЕРХ Ñ– Ð’ÐИЗ, щоб вибрати Вашу мову. ПіÑÐ»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ натиÑніть OK.", + "T2": "Вибір мови", +}, +"fy_x-FY": { + "fr_FR": "Frans", + "fi_FI": "Finsk", + "pt_PT": "Portugeesk", + "fy_x-FY": "Frisian", + "it_IT": "Italiaansk", + "no_NO": "Noarsk", + "nl_NL": "Nederlansk", + "el_GR": "Gryks", + "hu_HU": "Hongaarsk", + "lt_LT": "Lithuaniansk", + "hr_HR": "Kroatysk", + "en_EN": "Engelsk", + "es_ES": "Spaans", + "ca_AD": "Catalânsk", + "ru_RU": "Russysk", + "is_IS": "Iislansk", + "da_DK": "Deensk", + "cs_CZ": "Tsjechysk", + "tr_TR": "Turks", + "de_DE": "Dúts", + "ar_AE": "Arabysk", + "uk_UA": "Ukrainian", + "sv_SE": "Zweeds", + "pl_PL": "Poolsk", + "T1": "Brúk de op en del toets om jo taal te kiezen. Dernei druk op OK", + "T2": "Taal Kieze", }, } diff --git a/po/Makefile.am b/po/Makefile.am index 02727930..26518b56 100644 --- a/po/Makefile.am +++ b/po/Makefile.am @@ -5,7 +5,7 @@ GETTEXT=xgettext #MSGFMT = ./msgfmt.py MSGFMT = msgfmt -LANGS := de en ar nl es is it da sv no fr fi tr ca cs hr hu ru pt el lt pl uk +LANGS := ar ca cs da de el en es fi fr fy hr hu is it lt nl no pl pt ru sv tr uk LANGPO := $(foreach LANG, $(LANGS),$(LANG).po) LANGMO := $(foreach LANG, $(LANGS),$(LANG).mo) diff --git a/po/fy.po b/po/fy.po new file mode 100644 index 00000000..af5e21ad --- /dev/null +++ b/po/fy.po @@ -0,0 +1,4615 @@ +# translation of fy.po to gerrit +# Copyright (C) 2005 THE tuxbox-enigma'S COPYRIGHT HOLDER +# This file is distributed under the same license as the tuxbox-enigma package. +# +# Automatically generated, 2005. +# Gerrit , 2007, 2008. +# gerrit , 2008. +msgid "" +msgstr "" +"Project-Id-Version: fy\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-11-26 13:07+0100\n" +"PO-Revision-Date: 2008-11-15 09:40+0100\n" +"Last-Translator: gerrit \n" +"Language-Team: gerrit \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: Nederlands\n" +"X-Poedit-Country: NEDERLAND\n" +"X-Poedit-SourceCharset: iso-8859-15\n" +"X-Generator: KBabel 1.11.4\n" + +msgid " " +msgstr " " + +msgid "#000000" +msgstr "#000000" + +msgid "#0064c7" +msgstr "#0064c7" + +msgid "#25062748" +msgstr "#25062748" + +msgid "#389416" +msgstr "#389416" + +msgid "#80000000" +msgstr "#80000000" + +msgid "#80ffffff" +msgstr "#80ffffff" + +msgid "#bab329" +msgstr "#bab329" + +msgid "#f23d21" +msgstr "#f23d21" + +msgid "#ffffff" +msgstr "#ffffff" + +msgid "#ffffffff" +msgstr "#ffffffff" + +msgid "%H:%M" +msgstr "%H:%M" + +#, python-format +msgid "%d jobs are running in the background!" +msgstr "%d processen rinne op 'e eftergrûn" + +#, python-format +msgid "%d min" +msgstr "%d min" + +#, python-format +msgid "%d services found!" +msgstr "%d services fûn" + +msgid "%d.%B %Y" +msgstr "%d.%B %Y" + +#, python-format +msgid "" +"%s\n" +"(%s, %d MB free)" +msgstr "" +"%s\n" +"(%s, %d MB frij)" + +#, python-format +msgid "%s (%s)\n" +msgstr "%s (%s)\n" + +msgid "(ZAP)" +msgstr "(ZAP)" + +msgid "(empty)" +msgstr "(leech)" + +msgid "(show optional DVD audio menu)" +msgstr "(opsje DVD lûd menu sjen litte)" + +msgid "* Only available if more than one interface is active." +msgstr "" + +msgid "* Only available when entering hidden SSID or network key" +msgstr "" + +msgid ".NFI Download failed:" +msgstr "flater by it binnenhelje fan .NFI triem." + +msgid "" +".NFI file passed md5sum signature check. You can safely flash this image!" +msgstr "" +".NFI triem goedkarre by de md5sum kontrole. Dit image kin feilich nei flash " +"skreawn wurde." + +msgid "/usr/share/enigma2 directory" +msgstr "/usr/share/enigma2 map" + +msgid "/var directory" +msgstr "/var map" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1.0" +msgstr "1.0" + +msgid "1.1" +msgstr "1.1" + +msgid "1.2" +msgstr "1.2" + +msgid "12V output" +msgstr "12V útgong" + +msgid "13 V" +msgstr "13 V" + +msgid "16:10" +msgstr "16:10" + +msgid "16:10 Letterbox" +msgstr "16:10 Letterbox" + +msgid "16:10 PanScan" +msgstr "16:10 PanScan" + +msgid "16:9" +msgstr "16:9" + +msgid "16:9 Letterbox" +msgstr "16:9 Letterbox" + +msgid "16:9 always" +msgstr "altiid 16:9" + +msgid "18 V" +msgstr "18 V" + +msgid "2" +msgstr "2" + +msgid "3" +msgstr "3" + +msgid "30 minutes" +msgstr "30 minuten" + +msgid "4" +msgstr "4" + +msgid "4:3" +msgstr "4:3" + +msgid "4:3 Letterbox" +msgstr "4:3 Letterbox" + +msgid "4:3 PanScan" +msgstr "4:3 PanScan" + +msgid "5" +msgstr "5" + +msgid "5 minutes" +msgstr "5 minuten" + +msgid "50 Hz" +msgstr "50 Hz" + +msgid "6" +msgstr "6" + +msgid "60 minutes" +msgstr "60 minuten" + +msgid "7" +msgstr "7" + +msgid "8" +msgstr "8" + +msgid "9" +msgstr "9" + +msgid "" +msgstr "" + +msgid "??" +msgstr "??" + +msgid "A" +msgstr "A" + +#, python-format +msgid "" +"A configuration file (%s) was modified since Installation.\n" +"Do you want to keep your version?" +msgstr "" +"In konfiguraasje triem (%s) wie feroare nei ynstalaasje.\n" +"Wolle jo jo ferzje hâlde ?" + +msgid "" +"A finished record timer wants to set your\n" +"Dreambox to standby. Do that now?" +msgstr "" +"In tiidsbarren wol de Dreambox yn sliipstand\n" +"skeakelje... No nei de sliipstand ?" + +msgid "" +"A finished record timer wants to shut down\n" +"your Dreambox. Shutdown now?" +msgstr "" +"In tiidsbarren wol de Dreambox\n" +"útskeakelje... No útskeakelje ?" + +msgid "A graphical EPG for all services of an specific bouquet" +msgstr "In grafyske EPG foar alle kanalen fan in spesifyk bouquet" + +#, python-format +msgid "" +"A record has been started:\n" +"%s" +msgstr "" +"In opnimmen is start:\n" +"%s" + +msgid "" +"A recording is currently running.\n" +"What do you want to do?" +msgstr "" +"In opnimmen is dwaande.\n" +"Wat wolle jo dwaan ?" + +msgid "" +"A recording is currently running. Please stop the recording before trying to " +"configure the positioner." +msgstr "" +"Opnimmen is dwaande. Stopje it opnimmen earst foar jo de rotor-ynstellingen " +"wizigje." + +msgid "" +"A recording is currently running. Please stop the recording before trying to " +"start the satfinder." +msgstr "" +"Opnimmen is dwaande. Stopje it opnimmen earst, foar jo de satfyner brûke." + +#, python-format +msgid "A required tool (%s) was not found." +msgstr "In benedicht programma (%s) wie net fûn" + +msgid "" +"A sleep timer wants to set your\n" +"Dreambox to standby. Do that now?" +msgstr "" +"In sliiptiidsbarren wol de Dreambox yn paraatstand sette\n" +"Dit no dwaan ?" + +msgid "" +"A sleep timer wants to shut down\n" +"your Dreambox. Shutdown now?" +msgstr "" +"In sliiptiidsbarren wol de Dreambox útskeakelje\n" +"No útskeakelje ?" + +msgid "" +"A timer failed to record!\n" +"Disable TV and try again?\n" +msgstr "" +"In tiidsbarren koe net opnimme!\n" +"TV utskeakelje en opnei besykje ?\n" + +msgid "A/V Settings" +msgstr "A/F ynstellingen" + +msgid "AA" +msgstr "AA" + +msgid "AB" +msgstr "AB" + +msgid "AC3 default" +msgstr "AC3 standert" + +msgid "AC3 downmix" +msgstr "AC3 downmix" + +msgid "AGC" +msgstr "AGC" + +msgid "AGC:" +msgstr "AGC:" + +msgid "About" +msgstr "Oer" + +msgid "About..." +msgstr "Oer...." + +msgid "Action on long powerbutton press" +msgstr "Aksje by lang yndrukken oanknop" + +msgid "Action:" +msgstr "Aksje:" + +msgid "Activate Picture in Picture" +msgstr "PIP ynskeakelje" + +msgid "Activate network settings" +msgstr "Netwurk ynstellingen aktief meitsje" + +msgid "Adapter settings" +msgstr "Adapter ynstellingen" + +msgid "Add" +msgstr "Tafoegje" + +msgid "Add Bookmark" +msgstr "In blêdwizer tafoegje" + +msgid "Add a mark" +msgstr "In merker tafoegje" + +msgid "Add a new title" +msgstr "In nije titel tafoegje" + +msgid "Add timer" +msgstr "In tiidsbarren tafoegje" + +msgid "Add title" +msgstr "In titel tafoegje" + +msgid "Add to bouquet" +msgstr "Oan in boeket tafoegje" + +msgid "Add to favourites" +msgstr "Oan favorieten tafoegje" + +msgid "" +"Adjust the color settings so that all the color shades are distinguishable, " +"but appear as saturated as possible. If you are happy with the result, press " +"OK to close the video fine-tuning, or use the number keys to select other " +"test screens." +msgstr "" +"Feroarje de ynstellingen sa, da't alle skaad fan 'e kleur fuort is, mar wol " +"fol fan kleur binne. Ot jo lokkig binne mei it einresultaat, druk OK om " +"fideo ôfstellen ôf te slúten, of brûk de nûmmer toetsen foar in oar test " +"skerm." + +msgid "Advanced" +msgstr "Afansjearre" + +msgid "Advanced Video Setup" +msgstr "Afansjearre Fideo Ynstellingen" + +msgid "After event" +msgstr "Nei it barren" + +msgid "" +"After the start wizard is completed, you need to protect single services. " +"Refer to your dreambox's manual on how to do that." +msgstr "" +"Ot de startgucheler klear is, kinne jo in service befeilichje. Sjoch yn 'e " +"hânlieding foar ynformaasje." + +msgid "Album:" +msgstr "Album:" + +msgid "All" +msgstr "Alles" + +msgid "All Satellites" +msgstr "Alle Satellyten" + +msgid "Alpha" +msgstr "Alpha" + +msgid "Alternative radio mode" +msgstr "Oare Radio mode" + +msgid "Alternative services tuner priority" +msgstr "Alternatief kanaal tuner prioriteit" + +msgid "An empty filename is illegal." +msgstr "Gjin triemnamme is net tastien" + +msgid "An unknown error occured!" +msgstr "In unbekende flater !" + +msgid "Arabic" +msgstr "Arabysk" + +msgid "" +"Are you sure you want to activate this network configuration?\n" +"\n" +msgstr "" + +msgid "" +"Are you sure you want to restart your network interfaces?\n" +"\n" +msgstr "" +"Wolle jo de netwurk interfaces nij starte?\n" +"\n" + +msgid "Artist:" +msgstr "Artyst:" + +msgid "Ask before shutdown:" +msgstr "Freechje foar it útskeakeljen:" + +msgid "Ask user" +msgstr "freechje gebrûker" + +msgid "Aspect Ratio" +msgstr "Aspect ratio" + +msgid "Audio" +msgstr "Lûd" + +msgid "Audio Options..." +msgstr "Lûd opsjes..." + +msgid "Authoring mode" +msgstr "Authentikaasje troch" + +msgid "Auto" +msgstr "Auto" + +msgid "Auto chapter split every ? minutes (0=never)" +msgstr "Haadstik automatysk eltse ? minuten splitse (0=nea)" + +msgid "Auto scart switching" +msgstr "Auto scart skeakelje" + +msgid "Automatic" +msgstr "Automatysk" + +msgid "Automatic Scan" +msgstr "Automatysk sykjen" + +msgid "Available format variables" +msgstr "Beskikbere variabele formaten" + +msgid "B" +msgstr "B" + +msgid "BA" +msgstr "BA" + +msgid "BB" +msgstr "BB" + +msgid "BER" +msgstr "BER" + +msgid "BER:" +msgstr "BER:" + +msgid "Back" +msgstr "Werom" + +msgid "Background" +msgstr "Eftergrûn" + +msgid "Backup" +msgstr "Backup" + +msgid "Backup Location" +msgstr "Backup Lokaasje" + +msgid "Backup Mode" +msgstr "Backup Mode" + +msgid "Backup is done. Please press OK to see the result." +msgstr "Backup is klear. Druk Ok foar útfier" + +msgid "Band" +msgstr "Bân" + +msgid "Bandwidth" +msgstr "Bânbridte" + +msgid "Begin time" +msgstr "Begjin tiid" + +msgid "Behavior of 'pause' when paused" +msgstr "Gedrach fan 'pause' yn pause mode" + +msgid "Behavior of 0 key in PiP-mode" +msgstr "Gedrach fan 0 toets yn PiP mode" + +msgid "Behavior when a movie is started" +msgstr "Gedrach wannear in film start is" + +msgid "Behavior when a movie is stopped" +msgstr "Gedrach wannear in film stoppe is" + +msgid "Behavior when a movie reaches the end" +msgstr "Gedrach wannear in film bijna op syn ein is." + +msgid "Bookmarks" +msgstr "Boekmerkers" + +msgid "Brightness" +msgstr "Helderens" + +msgid "Burn DVD" +msgstr "In DVD brâne" + +msgid "Burn existing image to DVD" +msgstr "Besteand Image op DVD skiif brâne" + +msgid "Burn to DVD..." +msgstr "Nei DVD brâne" + +msgid "Bus: " +msgstr "Bus: " + +msgid "" +"By pressing the OK Button on your remote control, the info bar is being " +"displayed." +msgstr "By de Ok toets op jo ôfstansbetsjinning, wurd de ynfo balke toant" + +msgid "C" +msgstr "C" + +msgid "C-Band" +msgstr "C-Bân" + +msgid "CF Drive" +msgstr "CF Drive" + +msgid "CVBS" +msgstr "CVBS" + +msgid "Cable" +msgstr "Kabel" + +msgid "Cache Thumbnails" +msgstr "Cache Plaatsjes" + +msgid "Call monitoring" +msgstr "Skille monitor" + +msgid "Cancel" +msgstr "Ôfbrekke" + +msgid "Cannot parse feed directory" +msgstr "Kin feed map net ferwurkje" + +msgid "Capacity: " +msgstr "Skiif-grutte:" + +msgid "Card" +msgstr "Kaart" + +msgid "Catalan" +msgstr "Catalânsk" + +msgid "Change bouquets in quickzap" +msgstr "Feroarje fan boeket yn quickzap" + +msgid "Change dir." +msgstr "Feroarje dir." + +msgid "Change pin code" +msgstr "Feroarje pinkode" + +msgid "Change service pin" +msgstr "Feroarje service pin" + +msgid "Change service pins" +msgstr "Feroarje service pins" + +msgid "Change setup pin" +msgstr "Feroarje ynstellingen pin" + +msgid "Channel" +msgstr "Kanaal" + +msgid "Channel Selection" +msgstr "Kanaal seleksje" + +msgid "Channel:" +msgstr "Kanaal:" + +msgid "Channellist menu" +msgstr "Kanaal-lyst menu" + +msgid "Chap." +msgstr "Haads." + +msgid "Chapter" +msgstr "Haadstik" + +msgid "Chapter:" +msgstr "Haadstik:" + +msgid "Check" +msgstr "Neisjen" + +msgid "Checking Filesystem..." +msgstr "Bestânsysteem neisjen" + +msgid "Choose Tuner" +msgstr "Kies Tuner" + +msgid "Choose bouquet" +msgstr "Kies bouquet" + +msgid "Choose source" +msgstr "Kies bron" + +msgid "Choose target folder" +msgstr "Kies doel map" + +msgid "Choose your Skin" +msgstr "Kies Oanklaaiing" + +msgid "Cleanup" +msgstr "Opskjinje" + +msgid "Clear before scan" +msgstr "Wiskje foar sykjen ?" + +msgid "Clear log" +msgstr "Log wiskje" + +msgid "Close" +msgstr "Slúte" + +msgid "Code rate high" +msgstr "Kode faasje heech" + +msgid "Code rate low" +msgstr "Kode faasje leech" + +msgid "Coderate HP" +msgstr "Kode faasje HP" + +msgid "Coderate LP" +msgstr "Kode faasje LP" + +msgid "Collection name" +msgstr "Kolleksje namme" + +msgid "Collection settings" +msgstr "Kolleksje ynstellingen" + +msgid "Color Format" +msgstr "Kleur formaat" + +msgid "Command execution..." +msgstr "Kommando útfiere" + +msgid "Command order" +msgstr "Kommando folgoarde" + +msgid "Committed DiSEqC command" +msgstr "Oanwizen DiSEqC kommando" + +msgid "Common Interface" +msgstr "Common Interface" + +msgid "Compact Flash" +msgstr "Compact flash" + +msgid "Compact flash card" +msgstr "Compact flash kaart" + +msgid "Complete" +msgstr "Kompleet" + +msgid "Complex (allows mixing audio tracks and aspects)" +msgstr "" + +msgid "Configuration Mode" +msgstr "Ynstellingen modus" + +msgid "Configuring" +msgstr "Oan it ynstellen" + +msgid "Conflicting timer" +msgstr "Tiidsbarren konflikt" + +msgid "Connected to" +msgstr "Ferbûn mei" + +msgid "Connected to Fritz!Box!" +msgstr "Ferbûn mei Fritz!Box!" + +msgid "Connecting to Fritz!Box..." +msgstr "Ferbine mei Fritz!Box..." + +#, python-format +msgid "" +"Connection to Fritz!Box\n" +"failed! (%s)\n" +"retrying..." +msgstr "" +"Ferbine mei Fritz!Box\n" +"mislearre ! (%s)\n" +"Besykje opnei ..." + +msgid "Constellation" +msgstr "Himmel" + +msgid "Content does not fit on DVD!" +msgstr "Ynhald past net op in DVD !" + +msgid "Continue in background" +msgstr "Fjierder gean yn 'e eftergrûn" + +msgid "Continue playing" +msgstr "Kontinu spielje" + +msgid "Contrast" +msgstr "Kontrast" + +msgid "Could not connect to Dreambox .NFI Image Feed Server:" +msgstr "Kin net ferbine mei Dreambox .NFI Image feed server:" + +msgid "Could not load Medium! No disc inserted?" +msgstr "Koe medium net lade ! Is der wol in disc oanwezig ?" + +msgid "Create DVD-ISO" +msgstr "Meitsje DVD-ISO" + +msgid "Create movie folder failed" +msgstr "Meitjse fan film map mislearre" + +#, python-format +msgid "Creating directory %s failed." +msgstr "Meitjse fan map %s is mislearre" + +msgid "Creating partition failed" +msgstr "Meitsjen fan partisje is mislearre" + +msgid "Croatian" +msgstr "Kroatysk" + +msgid "Current Transponder" +msgstr "Hjoeddeiske Transponder" + +msgid "Current settings:" +msgstr "Hjoeddeiske ynstellingen:" + +msgid "Current version:" +msgstr "Hjoeddeiske ferzje :" + +msgid "Custom skip time for '1'/'3'-keys" +msgstr "Brûker spring tiid foar knoppen 1-3" + +msgid "Custom skip time for '4'/'6'-keys" +msgstr "Brûker spring tiid foar knoppen 4-6" + +msgid "Custom skip time for '7'/'9'-keys" +msgstr "Brûker spring tiid foar knoppen 7-9" + +msgid "Customize" +msgstr "Oanpasse" + +msgid "Cut" +msgstr "Knip" + +msgid "Cutlist editor..." +msgstr "Kniplyst bewurker..." + +msgid "Czech" +msgstr "Tsjechysk" + +msgid "D" +msgstr "D" + +msgid "DHCP" +msgstr "DHCP" + +msgid "DVB-S" +msgstr "DVB-S" + +msgid "DVB-S2" +msgstr "DVB-S2" + +msgid "DVD Player" +msgstr "DVD Spieler" + +msgid "DVD media toolbox" +msgstr "DVD media arkbak" + +msgid "Danish" +msgstr "Deensk" + +msgid "Date" +msgstr "Datum" + +msgid "Deep Standby" +msgstr "Sliip stand" + +msgid "Default services lists" +msgstr "Standert ynstellingen lysten" + +msgid "Default settings" +msgstr "Standert ynstellingen" + +msgid "Delay" +msgstr "Fertraging" + +msgid "Delete" +msgstr "Ferwiderje" + +msgid "Delete entry" +msgstr "Ferwiderje ynfier" + +msgid "Delete failed!" +msgstr "Ferwiderjen mislearre!" + +#, python-format +msgid "" +"Delete no more configured satellite\n" +"%s?" +msgstr "" +"Ferwiderje de net brûkte satellyt\n" +"%s?" + +msgid "Description" +msgstr "Beskriuwing" + +msgid "Destination directory" +msgstr "Doel Directory" + +msgid "Detected HDD:" +msgstr "Fûne hurde skiif:" + +msgid "Detected NIMs:" +msgstr "Fûne Tuners:" + +msgid "DiSEqC" +msgstr "DiSEqC" + +msgid "DiSEqC A/B" +msgstr "DiSEqC A/B" + +msgid "DiSEqC A/B/C/D" +msgstr "DiSEqC A/B/C/D" + +msgid "DiSEqC mode" +msgstr "DiSEqC-Mode" + +msgid "DiSEqC repeats" +msgstr "DiSEqC herhellingen" + +msgid "Direct playback of linked titles without menu" +msgstr "Direkt ôfspielje fan keppele titels sûnder menu" + +#, python-format +msgid "Directory %s nonexistent." +msgstr "Map %s bestiit net" + +msgid "Disable" +msgstr "Utskeakelje" + +msgid "Disable Picture in Picture" +msgstr "PIP utskeakelje" + +msgid "Disable Subtitles" +msgstr "Undertitels út" + +msgid "Disable timer" +msgstr "Tiidstjoering útskeakelje" + +msgid "Disabled" +msgstr "Utskeakele" + +#, python-format +msgid "" +"Disconnected from\n" +"Fritz!Box! (%s)\n" +"retrying..." +msgstr "" +"Ferbining ferbrutsen mei\n" +"Fritz!Box! (%s)\n" +"besyket nochris..." + +msgid "Dish" +msgstr "Panne" + +msgid "Display 16:9 content as" +msgstr "16:9 ynhâld sjen litte as" + +msgid "Display 4:3 content as" +msgstr "4:3 ynhâld sjen litte as" + +msgid "Display Setup" +msgstr "Ynstellingen sjen litte" + +#, python-format +msgid "" +"Do you really want to REMOVE\n" +"the plugin \"%s\"?" +msgstr "Wolle jo wier de plugin \"%s\" ferwiderje ?" + +msgid "" +"Do you really want to check the filesystem?\n" +"This could take lots of time!" +msgstr "Wolle jo echt it bestânsysteem neisjen ?
Dit kin lang duorje !" + +#, python-format +msgid "Do you really want to delete %s?" +msgstr "Wolle jo wier %s ferwiderje?" + +#, python-format +msgid "" +"Do you really want to download\n" +"the plugin \"%s\"?" +msgstr "Wolle jo wier de plugin \"%s\" binnenhelje ?" + +msgid "" +"Do you really want to initialize the harddisk?\n" +"All data on the disk will be lost!" +msgstr "" + +#, python-format +msgid "Do you really want to remove directory %s from the disk?" +msgstr "Wolle jo echt map %s ferwiderje van skiif ?" + +#, python-format +msgid "Do you really want to remove your bookmark of %s?" +msgstr "Wolle jo echt boekmerk fan %s ferwiderje ?" + +msgid "" +"Do you want to backup now?\n" +"After pressing OK, please wait!" +msgstr "" +"Wolle jo no in backup meitsje?\n" +"Nei OK, eefkes wachtsje" + +msgid "Do you want to burn this collection to DVD medium?" +msgstr "Wolle jo dizze kolleksje nei DVD brâne ?" + +msgid "Do you want to do a service scan?" +msgstr "Wolle jo no nei kanalen sykje ?" + +msgid "Do you want to do another manual service scan?" +msgstr "Wolle jo opnei mei de hân sykje ?" + +msgid "Do you want to enable the parental control feature on your dreambox?" +msgstr "Wolle jo it berne slot ynskeakelje ?" + +msgid "Do you want to install default sat lists?" +msgstr "Wolle jo de standert sat lysten installearje ?" + +msgid "Do you want to play DVD in drive?" +msgstr "Wolle jo de DVD ôfspielje ?" + +msgid "Do you want to preview this DVD before burning?" +msgstr "Wolle jo de DVD besjen foar it brânen ?" + +msgid "Do you want to restore your settings?" +msgstr "Wolle jo jo ynstellingen wêrom sette ?" + +msgid "Do you want to resume this playback?" +msgstr "Wolle jo dit opnimmen fjierder ôfspielje ?" + +msgid "" +"Do you want to update your Dreambox?\n" +"After pressing OK, please wait!" +msgstr "" +"Wolle jo jo dreambox bywurkje ?\n" +"Nei Ok, eefkes geduld !" + +msgid "Do you want to view a tutorial?" +msgstr "Wolle jo in foarbyld sjen ?" + +msgid "Don't stop current event but disable coming events" +msgstr "Dit barren net stopje, maar oankommende barren útskeakelje" + +#, python-format +msgid "Done - Installed or upgraded %d packages" +msgstr "Dien - %d paket(ten) ynstalllearre of bywurke" + +#, python-format +msgid "Done - Installed or upgraded %d packages with %d errors" +msgstr "Klear - %d paket(ten) ynstallearre of bywurke mei %d flaters" + +msgid "Download" +msgstr "Binnenhelje" + +msgid "Download .NFI-Files for USB-Flasher" +msgstr "Binnenhelje fan .NFI triemen foar USB Flasher" + +msgid "Download Plugins" +msgstr "Ynstekkers binnenhelje" + +msgid "Download of USB flasher boot image failed: " +msgstr "Binnenhelje fan USB boot image misljearre:" + +msgid "Downloadable new plugins" +msgstr "Binnen te heljen nije ynstekkers" + +msgid "Downloadable plugins" +msgstr "Binnen te heljen ynstekkers" + +msgid "Downloading" +msgstr "Binnenheljen fan" + +msgid "Downloading plugin information. Please wait..." +msgstr "Binnenheljen fan ynstekker ynformaasje..." + +msgid "Dreambox format data DVD (HDTV compatible)" +msgstr "Dreambox yndieling data DVD (HDTV geskikt)" + +msgid "Dutch" +msgstr "Nederlansk" + +msgid "E" +msgstr "E" + +msgid "EPG Selection" +msgstr "EPG Seleksje" + +#, python-format +msgid "ERROR - failed to scan (%s)!" +msgstr "Flater - Sykjen mislearre (%s)!" + +msgid "East" +msgstr "East" + +msgid "Edit" +msgstr "" + +msgid "Edit DNS" +msgstr "Wyzigje de DNS" + +msgid "Edit Title" +msgstr "" + +msgid "Edit chapters of current title" +msgstr "Bewurkje haadstik fan dizze titel" + +msgid "Edit services list" +msgstr "Wyzigje kanaallyst" + +msgid "Edit settings" +msgstr "Wyzigje ynstellingen" + +msgid "Edit the Nameserver configuration of your Dreambox.\n" +msgstr "Bewrukje de nammeserver ynstellingen fan de Dreambox.\n" + +msgid "Edit the network configuration of your Dreambox.\n" +msgstr "Bewurkje de netwurk ynstellingen fan de Dreambox.\n" + +msgid "Edit title" +msgstr "Bewukje titel" + +msgid "Electronic Program Guide" +msgstr "Elektroniske Programma Gids" + +msgid "Enable" +msgstr "Ynskeakelje" + +msgid "Enable 5V for active antenna" +msgstr "5V ynskeakelje foar hjoeddeiske antenne" + +msgid "Enable multiple bouquets" +msgstr "Mear boeketten sjen litte" + +msgid "Enable parental control" +msgstr "Alderlik tasjoch ynskeakelje" + +msgid "Enable timer" +msgstr "Tiidsjtoering ynskeakelje" + +msgid "Enabled" +msgstr "Ynskeakele" + +msgid "Encryption" +msgstr "Encryption" + +msgid "Encryption Key" +msgstr "Encryption Kaai" + +msgid "Encryption Keytype" +msgstr "" + +msgid "Encryption Type" +msgstr "Encryption Type" + +msgid "End time" +msgstr "Eintiid" + +msgid "EndTime" +msgstr "Eintiid" + +msgid "English" +msgstr "Engelsk" + +msgid "" +"Enigma2 Skinselector v0.5 BETA\n" +"\n" +"If you experience any problems please contact\n" +"stephan@reichholf.net\n" +"\n" +"© 2006 - Stephan Reichholf" +msgstr "" +"Enigma2 Skinselector v0.5 BETA\n" +"\n" +"Ot jo problemen hawwe, kinne jo stephan@reichholf.net\n" +"probearje te beriken\n" +"© 2006 - Stephan Reichholf" + +#. TRANSLATORS: Note that "Enter" in the two strings below should *not* +#. be interpreted as "Give speed as input". The intended meaning is +#. instead "Initial speed when starting winding", i.e. the speed at +#. which "winding mode" is entered when first pressing "rewind" or +#. "fast forward". +msgid "Enter Fast Forward at speed" +msgstr "Ynjefte rap foarút by faasje" + +msgid "Enter Rewind at speed" +msgstr "Ynjefte rap efterút by faasje" + +msgid "Enter WLAN network name/SSID:" +msgstr "" + +msgid "Enter WLAN passphrase/key:" +msgstr "" + +msgid "Enter main menu..." +msgstr "Nei it haadmenu..." + +msgid "Enter the service pin" +msgstr "Fier de service pin yn" + +msgid "Error" +msgstr "Flater" + +msgid "Error executing plugin" +msgstr "Flater by útfieren fan ynstekker" + +#, python-format +msgid "" +"Error: %s\n" +"Retry?" +msgstr "" +"Flater: %s\n" +"Opnei ?" + +msgid "Eventview" +msgstr "Barren oersjoch" + +msgid "Everything is fine" +msgstr "Alles is goed" + +msgid "Execution Progress:" +msgstr "Utfieren foarutgong:" + +msgid "Execution finished!!" +msgstr "Utfiering klear.." + +msgid "Exif" +msgstr "" + +msgid "Exit" +msgstr "ofslúte" + +msgid "Exit editor" +msgstr "Bewurker ofslúte" + +msgid "Exit the wizard" +msgstr "De gucheler ofslúte" + +msgid "Exit wizard" +msgstr "Gucheler ofslúte" + +msgid "Expert" +msgstr "Avansearre" + +msgid "Extended Networksetup Plugin..." +msgstr "Utwreide Netwurkynstellingen Ynstekker..." + +msgid "Extended Setup..." +msgstr "Utwreide Ynstellingen..." + +msgid "Extensions" +msgstr "Utwreidingen" + +msgid "FEC" +msgstr "FEC" + +msgid "Factory reset" +msgstr "Fabryks ynstellingen" + +msgid "Failed" +msgstr "mislearre" + +msgid "Fast" +msgstr "Rap" + +msgid "Fast DiSEqC" +msgstr "Rappe DiSEqC" + +msgid "Fast Forward speeds" +msgstr "Rap foarút faasje" + +msgid "Fast epoch" +msgstr "Snelle epoch" + +msgid "Favourites" +msgstr "Favoryten" + +msgid "Filesystem Check..." +msgstr "Bestânsysteem Neisjen..." + +msgid "Filesystem contains uncorrectable errors" +msgstr "It bestânsysteem hat grutte flaters" + +msgid "Finetune" +msgstr "Fyn ôfstemme" + +msgid "Finished" +msgstr "Ofrûn" + +msgid "Finished configuring your network" +msgstr "" + +msgid "Finished restarting your network" +msgstr "" + +msgid "Finnish" +msgstr "Finsk" + +msgid "" +"First we need to download the latest boot environment for the USB flasher." +msgstr "" +"Earst moat de lêste opstart triemen binnenhelle wurde foar de USB flasher." + +msgid "Flash" +msgstr "Flash" + +msgid "Flashing failed" +msgstr "Flashen misljearre" + +msgid "Font size" +msgstr "Font grutte" + +msgid "Format" +msgstr "Formaat" + +msgid "Frame repeat count during non-smooth winding" +msgstr "Byld herhelling by net glêd foar/efterút spielen" + +msgid "Frame size in full view" +msgstr "" + +msgid "French" +msgstr "Frans" + +msgid "Frequency" +msgstr "Frekwinsje" + +msgid "Frequency bands" +msgstr "Frekwinsje bânnen" + +msgid "Frequency scan step size(khz)" +msgstr "Frekwinsje sykjen stap grutte(kHz)" + +msgid "Frequency steps" +msgstr "Oantal Frekwinsje stappen" + +msgid "Fri" +msgstr "Fre" + +msgid "Friday" +msgstr "Freed" + +msgid "Frisian" +msgstr "" + +msgid "Fritz!Box FON IP address" +msgstr "Fritz!Box FON IP adres" + +#, python-format +msgid "Frontprocessor version: %d" +msgstr "Foarprocessor ferzje: %d" + +msgid "Fsck failed" +msgstr "mislearre fsck" + +msgid "Function not yet implemented" +msgstr "Nog net ynbouwde funksje" + +msgid "" +"GUI needs a restart to apply a new skin\n" +"Do you want to Restart the GUI now?" +msgstr "" +"De GUI moat opnij starte fan wege de nije skin\n" +"Wolle jo de GUI no opnei starte ?" + +msgid "Gateway" +msgstr "Gateway" + +msgid "Genre:" +msgstr "Sjenre:" + +msgid "German" +msgstr "Dúts" + +msgid "Getting plugin information. Please wait..." +msgstr "Binnenhelje fan ynstekker ynformaasje...." + +msgid "Goto 0" +msgstr "Gjin nei 0" + +msgid "Goto position" +msgstr "Gjin nei posysje" + +msgid "Graphical Multi EPG" +msgstr "Grafyske Multi EPG" + +msgid "Greek" +msgstr "Gryks" + +msgid "Guard Interval" +msgstr "ynterfal yn 'e gaten halde" + +msgid "Guard interval mode" +msgstr "Ynterfal modus yn 'e gaten halde" + +msgid "Harddisk" +msgstr "Hurde skiif" + +msgid "Harddisk setup" +msgstr "Hurde skiif ynstellingen" + +msgid "Harddisk standby after" +msgstr "Hurde skiif yn sliipstand nei" + +msgid "Hidden network SSID" +msgstr "" + +msgid "Hierarchy Information" +msgstr "Hiërarchie Ynformaasje" + +msgid "Hierarchy mode" +msgstr "Hiërarchie mode" + +msgid "How many minutes do you want to record?" +msgstr "Hoe folle minuten wolle jo opnimme?" + +msgid "Hungarian" +msgstr "Hongaarsk" + +msgid "IP Address" +msgstr "IP Adres" + +msgid "ISO file is too large for this filesystem!" +msgstr "" + +msgid "ISO path" +msgstr "ISO paad" + +msgid "Icelandic" +msgstr "Iislansk" + +msgid "If you can see this page, please press OK." +msgstr "Kinne dizze side sjen, druk dan op OK" + +msgid "" +"If you see this, something is wrong with\n" +"your scart connection. Press OK to return." +msgstr "" +"Ot jo dit leze, is der iets raar skeef mei\n" +"jo skart oansluting. Druk OK om werom te gean." + +msgid "" +"If your TV has a brightness or contrast enhancement, disable it. If there is " +"something called \"dynamic\", set it to standard. Adjust the backlight level " +"to a value suiting your taste. Turn down contrast on your TV as much as " +"possible.\n" +"Then turn the brightness setting as low as possible, but make sure that the " +"two lowermost shades of gray stay distinguishable.\n" +"Do not care about the bright shades now. They will be set up in the next " +"step.\n" +"If you are happy with the result, press OK." +msgstr "" +"Skeakelje in helderens of kontrast ferbettering op jo TV út. Is der iets mei " +"de namme \"dynamysk\", set it nei standert. Set it eftergrûn helderens nivo " +"nei jo eigen smaak. Set it konstrast sa leech mooglik op jo TV.\n" +"Dan, set it helderens nivo sa leech as mooglik, mar soargje dat de twa " +"leechste griistinten krek anwêzig bliuwe\n" +"Meitsje jo net drok om de helderenstinten no. Die komme werom yn de folgende " +"stap\n" +"Binne jo tefreden mei it resultaat, druk OK" + +msgid "Image flash utility" +msgstr "Image flash ark" + +msgid "Image-Upgrade" +msgstr "Byld-bywurkje" + +msgid "In Progress" +msgstr "Dwaande" + +msgid "" +"In order to record a timer, the TV was switched to the recording service!\n" +msgstr "Op in barren op te nimmen, wurd de TV nei opnimmen skeakele!\n" + +msgid "Increased voltage" +msgstr "Ferheeche spanning" + +msgid "Index" +msgstr "Yndex" + +msgid "InfoBar" +msgstr "Ynfobalke" + +msgid "Infobar timeout" +msgstr "Ynfobalke tiid" + +msgid "Information" +msgstr "Ynformaasje" + +msgid "Init" +msgstr "Initialisearje" + +msgid "Initialization..." +msgstr "Formattearje..." + +msgid "Initialize" +msgstr "Formattearje HDD" + +msgid "Initializing Harddisk..." +msgstr "" + +msgid "Input" +msgstr "Ynfier" + +msgid "Installing" +msgstr "Oan it ynstallearjen" + +msgid "Installing Software..." +msgstr "Software oan it ynstallearjen..." + +msgid "Installing default sat lists... Please wait..." +msgstr "Standert sat lyst oan it ynstalearjen... " + +msgid "Installing defaults... Please wait..." +msgstr "Standert waarden an it ynstellen..." + +msgid "Installing package content... Please wait..." +msgstr "Pakket ynhald an it ynstallearjen... Eefkes wachtsje" + +msgid "Instant Record..." +msgstr "In direct opnimmen..." + +msgid "Integrated Ethernet" +msgstr "Integreerd Ethernet" + +msgid "Integrated Wireless" +msgstr "Integreerd Triidloas" + +msgid "Intermediate" +msgstr "Yntermediate" + +msgid "Internal Flash" +msgstr "Ynterne Flash" + +msgid "Invalid Location" +msgstr "Plak net tastien" + +#, python-format +msgid "Invalid directory selected: %s" +msgstr "Unjildige map selektearre: %s" + +msgid "Inversion" +msgstr "Infertearring" + +msgid "Invert display" +msgstr "Infertearje LCD" + +msgid "Italian" +msgstr "Italiaansk" + +msgid "Job View" +msgstr "Opdracht oansjoch" + +#. TRANSLATORS: (aspect ratio policy: display as fullscreen, even if this breaks the aspect) +msgid "Just Scale" +msgstr "Alinne skale" + +msgid "Keyboard Map" +msgstr "Toetseboerd Map" + +msgid "Keyboard Setup" +msgstr "Toetseboerd Ynstellingen" + +msgid "Keymap" +msgstr "Toetsebord yndieling" + +msgid "LAN Adapter" +msgstr "LAN oanslúting" + +msgid "LNB" +msgstr "LNB" + +msgid "LOF" +msgstr "LOF" + +msgid "LOF/H" +msgstr "LOF/H" + +msgid "LOF/L" +msgstr "LOF/L" + +msgid "Language selection" +msgstr "Taal Kieze" + +msgid "Language..." +msgstr "Taal..." + +msgid "Last speed" +msgstr "Lêste faasje" + +msgid "Latitude" +msgstr "Bridtegraad" + +msgid "Leave DVD Player?" +msgstr "DVD Spieler ôfslúte ?" + +msgid "Left" +msgstr "Links" + +#. TRANSLATORS: (aspect ratio policy: black bars on top/bottom) in doubt, keep english term. +msgid "Letterbox" +msgstr "Letterbox" + +msgid "Limit east" +msgstr "Limyt east" + +msgid "Limit west" +msgstr "Limyt west" + +msgid "Limits off" +msgstr "Limyten út" + +msgid "Limits on" +msgstr "Limyt oan" + +msgid "Link:" +msgstr "Link:" + +msgid "Linked titles with a DVD menu" +msgstr "Keppele titels mei in DVD menu" + +msgid "List of Storage Devices" +msgstr "Lyst Opslach Apparatuur" + +msgid "Lithuanian" +msgstr "Lithuaniansk" + +msgid "Load" +msgstr "Laad" + +msgid "Load Length of Movies in Movielist" +msgstr "Laad lengte fan films yn filmlyst" + +msgid "Local Network" +msgstr "Lokaal netwurk" + +msgid "Location" +msgstr "Doel" + +msgid "Lock:" +msgstr "Slot:" + +msgid "Long Keypress" +msgstr "Lang taste yndrukken" + +msgid "Longitude" +msgstr "Lingtegraad" + +msgid "MMC Card" +msgstr "MMC kaart" + +msgid "MORE" +msgstr "MEER" + +msgid "Main menu" +msgstr "Haad menu" + +msgid "Mainmenu" +msgstr "HaadMenu" + +msgid "Make this mark an 'in' point" +msgstr "Markeer dit as in 'yn' punt" + +msgid "Make this mark an 'out' point" +msgstr "Markeer dit as in 'út' punt" + +msgid "Make this mark just a mark" +msgstr "Meitsje dit in gewoan markeer punt" + +msgid "Manual Scan" +msgstr "Hanmatig sykje" + +msgid "Manual transponder" +msgstr "Hanmatige transponder" + +msgid "Margin after record" +msgstr "Extra tiid nei by it opnimmen" + +msgid "Margin before record (minutes)" +msgstr "Extra tiid foar by it opnimmen" + +msgid "Media player" +msgstr "Media Spieler" + +msgid "MediaPlayer" +msgstr "MediaSpieler" + +msgid "Medium is not a writeable DVD!" +msgstr "Medium is net in skriuwbêre DVD!" + +msgid "Medium is not empty!" +msgstr "Medium is net leech!" + +msgid "Menu" +msgstr "Menu" + +msgid "Message" +msgstr "Berjocht" + +msgid "Mkfs failed" +msgstr "Mkfs mislearre" + +msgid "Mode" +msgstr "Moadus" + +msgid "Model: " +msgstr "Model: " + +msgid "Modulation" +msgstr "Modulaasje" + +msgid "Modulator" +msgstr "Modulator" + +msgid "Mon" +msgstr "Moan" + +msgid "Mon-Fri" +msgstr "Moan - Fre" + +msgid "Monday" +msgstr "Moandei" + +msgid "Mount failed" +msgstr "Oankeppeljen mislearre" + +msgid "Move Picture in Picture" +msgstr "Ferpleats Byld yn Byld" + +msgid "Move east" +msgstr "Draai nei east" + +msgid "Move west" +msgstr "Draai nei west" + +msgid "Movielist menu" +msgstr "Filmlyst menu" + +msgid "Multi EPG" +msgstr "Multi EPG" + +msgid "Multiple service support" +msgstr "Kin meardere utstjoeringen oan" + +msgid "Multisat" +msgstr "Multisat" + +msgid "Mute" +msgstr "Mute" + +msgid "N/A" +msgstr "Net oanwêzig" + +msgid "NEXT" +msgstr "Folgende" + +msgid "NFI image flashing completed. Press Yellow to Reboot!" +msgstr "NFI image flashen is klear. Druk giel om nei te starten!" + +msgid "NOW" +msgstr "No" + +msgid "NTSC" +msgstr "NTSC" + +msgid "Name" +msgstr "Namme" + +msgid "Nameserver" +msgstr "Nammeserver" + +#, python-format +msgid "Nameserver %d" +msgstr "Nammeserver %d" + +msgid "Nameserver Setup" +msgstr "Nammeserver Ynstellingen" + +msgid "Nameserver settings" +msgstr "Nammeserver ynstellingen" + +msgid "Netmask" +msgstr "Netmasker" + +msgid "Network Configuration..." +msgstr "Netwurk configuraasje" + +msgid "Network Mount" +msgstr "Netwurk oankeppelingen" + +msgid "Network SSID" +msgstr "Netwurk SSID" + +msgid "Network Setup" +msgstr "Netwurk Ynstellingen" + +msgid "Network scan" +msgstr "Netwurk ôfsykje" + +msgid "Network setup" +msgstr "Netwurk ynstellingen" + +msgid "Network test" +msgstr "Netwurk test" + +msgid "Network test..." +msgstr "Netwurk test..." + +msgid "Network..." +msgstr "Netwurk..." + +msgid "Network:" +msgstr "Netwurk:" + +msgid "NetworkWizard" +msgstr "Netwurk gûcheler" + +msgid "New" +msgstr "Nij" + +msgid "New pin" +msgstr "Nije pin" + +msgid "New version:" +msgstr "Nije ferzje:" + +msgid "Next" +msgstr "Folgende" + +msgid "No" +msgstr "Nee" + +msgid "No (supported) DVDROM found!" +msgstr "Gjin (ondersteunde) DVDROM fûn!" + +msgid "No 50 Hz, sorry. :(" +msgstr "Gjin 50 Hz, sorry. :(" + +msgid "No HDD found or HDD not initialized!" +msgstr "Gjin hurde skiif fûn of HDD net formatearre!" + +msgid "No Networks found" +msgstr "" + +msgid "No backup needed" +msgstr "Gjin backup nedich" + +msgid "" +"No data on transponder!\n" +"(Timeout reading PAT)" +msgstr "" +"Gjin data op transponder\n" +"(tiid fan lêzen PAT)" + +msgid "No details for this image file" +msgstr "Gjin details beskikber foar dit image triem" + +msgid "No event info found, recording indefinitely." +msgstr "Gjin barren ynfo fûn, giit foar altiid troch mei opnimmen.." + +msgid "No free tuner!" +msgstr "Gjin tuner oer" + +msgid "" +"No packages were upgraded yet. So you can check your network and try again." +msgstr "Pakketten bin net bywurke. Besjoch it netwurk en besykje opnei." + +msgid "No picture on TV? Press EXIT and retry." +msgstr "Gjin plaatsje op TV? Druk EXIT en probearje opnei" + +msgid "No positioner capable frontend found." +msgstr "Gjin posysjesyker foarein fûn." + +msgid "No satellite frontend found!!" +msgstr "Gjin sattelyt foarein fûn." + +msgid "No tags are set on these movies." +msgstr "" + +msgid "No tuner is configured for use with a diseqc positioner!" +msgstr "Der is gjin tuner ynsteld foar gebrûk mei in diseqc posysje syker!" + +msgid "" +"No tuner is enabled!\n" +"Please setup your tuner settings before you start a service scan." +msgstr "" +"Gjin tuner aktief!\n" +"Stel dizze earst yn foar jo kanalen sykje kinne." + +msgid "No useable USB stick found" +msgstr "Gjin brûkbere USB stick fûn" + +msgid "" +"No valid service PIN found!\n" +"Do you like to change the service PIN now?\n" +"When you say 'No' here the service protection stay disabled!" +msgstr "" +"Gjin jildige service PIN fûn !\n" +"Wolle jo dizze no ynstelle ?\n" +"By 'nee' wurd de service befeiliging útskeakele !" + +msgid "" +"No valid setup PIN found!\n" +"Do you like to change the setup PIN now?\n" +"When you say 'No' here the setup protection stay disabled!" +msgstr "" +"Gjin jildige ynstellingen PIN fûn !\n" +"Wolle jo dizze no ynstelle ?\n" +"By 'nee' wurd de ynstellingen befeiliging útskeakele !" + +msgid "" +"No working local network adapter found.\n" +"Please verify that you have attached a network cable and your network is " +"configured correctly." +msgstr "" + +msgid "" +"No working wireless network adapter found.\n" +"Please verify that you have attached a compatible WLAN device and your " +"network is configured correctly." +msgstr "" + +msgid "" +"No working wireless network interface found.\n" +" Please verify that you have attached a compatible WLAN device or enable " +"your local network interface." +msgstr "" + +msgid "No, but restart from begin" +msgstr "Nee, mar start fanôf it begjin" + +msgid "No, do nothing." +msgstr "Nee, doch neat.." + +msgid "No, just start my dreambox" +msgstr "Nee, allinne myn box starte" + +msgid "No, scan later manually" +msgstr "Nee, letter mei de hân sykje" + +msgid "None" +msgstr "Gjin" + +#. TRANSLATORS: (aspect ratio policy: display as fullscreen, with stretching the left/right) +msgid "Nonlinear" +msgstr "Net lineair" + +msgid "North" +msgstr "Noard" + +msgid "Norwegian" +msgstr "Noarsk" + +#, python-format +msgid "" +"Not enough diskspace. Please free up some diskspace and try again. (%d MB " +"required, %d MB available)" +msgstr "" +"Net genôch diskrûmte. Rûmje wat rotzooi op en besykje opnei. (%d MB nedich, %" +"d oanwêzich)" + +msgid "" +"Nothing to scan!\n" +"Please setup your tuner settings before you start a service scan." +msgstr "" +"Neat te sykjen\n" +"Earst de tuner ynstellingen dwaan, foar jo senders sykje kinne." + +msgid "Now Playing" +msgstr "No oan it ôfspieljen" + +msgid "" +"Now, use the contrast setting to turn up the brightness of the background as " +"much as possible, but make sure that you can still see the difference " +"between the two brightest levels of shades.If you have done that, press OK." +msgstr "" +"No, feroare it helderens nivo en set it sa heech, mar wêz seker dat jo " +"altiid nog it ferskil sjogge tusken de twa helderste skaadnivos.Binne jo " +"klear, druk OK" + +msgid "OK" +msgstr "Ok" + +msgid "OK, guide me through the upgrade process" +msgstr "Ok, rin troch it bywurkjen proces" + +msgid "OSD Settings" +msgstr "OSD-ynstellingen" + +msgid "OSD visibility" +msgstr "OSD sichtberhiid" + +msgid "Off" +msgstr "Ut" + +msgid "On" +msgstr "Oan" + +msgid "One" +msgstr "Ien" + +msgid "Online-Upgrade" +msgstr "Online-Bywurkje" + +msgid "Only Free scan" +msgstr "Allinne Freie útstjoeringen" + +msgid "Orbital Position" +msgstr "Rumtelyke posisje" + +msgid "PAL" +msgstr "PAL" + +msgid "PIDs" +msgstr "PIDs" + +msgid "Package list update" +msgstr "Bywurkje pakketlyst " + +msgid "Packet management" +msgstr "Pakket beheer" + +msgid "Page" +msgstr "Side" + +#. TRANSLATORS: (aspect ratio policy: cropped content on left/right) in doubt, keep english term +msgid "Pan&Scan" +msgstr "Pan&Scan" + +msgid "Parent Directory" +msgstr "Boppelizzende map" + +msgid "Parental control" +msgstr "Alderlik tasjoch" + +msgid "Parental control services Editor" +msgstr "Alderlik tasjoch bewurker" + +msgid "Parental control setup" +msgstr "Alderlik tasjoch" + +msgid "Parental control type" +msgstr "Alderlik tasjoch type" + +msgid "Pause movie at end" +msgstr "Film op pause by ein" + +msgid "PiPSetup" +msgstr "PIP Ynstellingen" + +msgid "PicturePlayer" +msgstr "" + +#. TRANSLATORS: (aspect ratio policy: black bars on left/right) in doubt, keep english term. +msgid "Pillarbox" +msgstr "Pillar box" + +msgid "Pilot" +msgstr "Pilot" + +msgid "Pin code needed" +msgstr "Pinkode is needich" + +msgid "Play" +msgstr "Ofspylje" + +msgid "Play Audio-CD..." +msgstr "Ofspylje fan Audio-CD..." + +msgid "Play recorded movies..." +msgstr "Opname films ôfspielje..." + +msgid "Please Reboot" +msgstr "Start Dreambox opnei" + +msgid "Please Select Medium to be Scanned" +msgstr "Graach Medium kieze om ôf te sykjen" + +msgid "Please change recording endtime" +msgstr "Graach eintiid fan it opnimmen feroarje." + +msgid "Please check your network settings!" +msgstr "Graach netwurk ynstellingen neisjen!" + +msgid "Please choose .NFI image file from feed server to download" +msgstr "Graach .NFI image triem kize fan feed server om binnen te heljen" + +msgid "Please choose an extension..." +msgstr "Kies in uitbreiding..." + +msgid "Please choose he package..." +msgstr "Kies it pakket..." + +msgid "Please choose the default services lists you want to install." +msgstr "Kies de standert lysts, welk jo ynstallearje wolle." + +msgid "" +"Please disconnect all USB devices from your Dreambox and (re-)attach the " +"target USB stick (minimum size is 64 MB) now!" +msgstr "" + +msgid "Please do not change any values unless you know what you are doing!" +msgstr "Feroarje gjin waarden, wannear jo net witte wat jo dogge!" + +msgid "Please enter a name for the new bouquet" +msgstr "Namme ynjefte foar it nije bouquet" + +msgid "Please enter a name for the new marker" +msgstr "Namme ynjefte foar in nije markering" + +msgid "Please enter a new filename" +msgstr "Jou in nije bestânnamme yn" + +msgid "Please enter filename (empty = use current date)" +msgstr "Jou in triemnamme yn (leech = datum fan hjoed)" + +msgid "Please enter name of the new directory" +msgstr "Jou in namme yn foar de nije map" + +msgid "Please enter the correct pin code" +msgstr "Graach de júste pinkode yn jaan" + +msgid "Please enter the old pin code" +msgstr "De âlde pinkode graach yn jaan" + +msgid "Please follow the instructions on the TV" +msgstr "Folgje de ynstruksjes op TV" + +msgid "" +"Please note that the previously selected media could not be accessed and " +"therefore the default directory is being used instead." +msgstr "" +"Tink der om dat de foarige selektearre media net oansprutsen wurde koe, en " +"dêrom de standert map brûkt wurd." + +msgid "Please press OK to continue." +msgstr "Druk OK om fierder te gean." + +msgid "Please press OK!" +msgstr "Druk Ok!" + +msgid "Please select .NFI flash image file from medium" +msgstr "Selektearje in .NFI flash image triem fan medium" + +msgid "Please select a playlist to delete..." +msgstr "Selektearje in ofspiellyst om te ferwiderjen..." + +msgid "Please select a playlist..." +msgstr "Selektearje in ofspiellyst" + +msgid "Please select a subservice to record..." +msgstr "Jou in undersender op, om op te nimmen." + +msgid "Please select a subservice..." +msgstr "Selektearje in undersender..." + +msgid "Please select tag to filter..." +msgstr "" + +msgid "Please select target directory or medium" +msgstr "Selektearje doel map of medium" + +msgid "Please select the movie path..." +msgstr "Selektearje it paad nei de film" + +msgid "Please set up tuner B" +msgstr "ynstelle fan tuner B" + +msgid "Please set up tuner C" +msgstr "ynstelle fan tuner C" + +msgid "Please set up tuner D" +msgstr "ynstelle fan tuner D" + +msgid "" +"Please use direction keys to move the PiP window.\n" +"Press Bouquet +/- to resize the window.\n" +"Press OK to go back to the TV mode or EXIT to cancel the moving." +msgstr "" +"Pylkje knoppen om BIB finster te ferskowen.\n" +"Druk Bouquet +/- om finstergrutte te feroarjen" + +msgid "" +"Please use the UP and DOWN keys to select your language. Afterwards press " +"the OK button." +msgstr "Brúk de op en del toets om jo taal te kiezen. Dernei druk op OK" + +msgid "Please wait for activation of your network configuration..." +msgstr "" + +msgid "Please wait while we configure your network..." +msgstr "" + +msgid "Please wait while your network is restarting..." +msgstr "" + +msgid "Please wait..." +msgstr "" + +msgid "Please wait... Loading list..." +msgstr "Lyst wurd laden..." + +msgid "Plugin browser" +msgstr "Ynstekker browser" + +msgid "Plugins" +msgstr "Ynstekkers" + +msgid "Polarity" +msgstr "Polariteit" + +msgid "Polarization" +msgstr "Polarisaasje" + +msgid "Polish" +msgstr "Poolsk" + +msgid "Port A" +msgstr "Poort A" + +msgid "Port B" +msgstr "Poort B" + +msgid "Port C" +msgstr "Poort C" + +msgid "Port D" +msgstr "Poort D" + +msgid "Portuguese" +msgstr "Portugeesk" + +msgid "Positioner" +msgstr "Rotor" + +msgid "Positioner fine movement" +msgstr "Fyn ôfstelling rotor" + +msgid "Positioner movement" +msgstr "Rotor beweging" + +msgid "Positioner setup" +msgstr "Rotor ynstellingen" + +msgid "Positioner storage" +msgstr "Rotor positie opslach" + +msgid "Power threshold in mA" +msgstr "Stroom nivo yn mA" + +msgid "Predefined transponder" +msgstr "Foarôf ynstelde transponder" + +msgid "Preparing... Please wait" +msgstr "Foarbereide fan... Eefkes wachtsje" + +msgid "Press OK on your remote control to continue." +msgstr "Druk OK op of ôfstandsbestjinning om fierder te gean." + +msgid "Press OK to activate the settings." +msgstr "Druk Ok om ynstellingen aktief te meitsjen." + +msgid "Press OK to edit the settings." +msgstr "Druk OK om dizze ynstellingen te bewurkjen" + +msgid "Press OK to scan" +msgstr "Druk Ok om te sykjen" + +msgid "Press OK to start the scan" +msgstr "Druk Ok om sykjen te starten" + +msgid "Prev" +msgstr "Foarige" + +msgid "Preview menu" +msgstr "Foarige menu" + +msgid "Primary DNS" +msgstr "Eerste DNS" + +msgid "Properties of current title" +msgstr "" + +msgid "Protect services" +msgstr "Befeilich kanalen" + +msgid "Protect setup" +msgstr "Ynstellingen befeiligje" + +msgid "Provider" +msgstr "Leveransier" + +msgid "Provider to scan" +msgstr "Utstjoerder ôfsykje" + +msgid "Providers" +msgstr "Providers" + +msgid "Quickzap" +msgstr "Rapzappe" + +msgid "RC Menu" +msgstr "Ofstandsbetsjinnings menu" + +msgid "RF output" +msgstr "RF Ynstellingen" + +msgid "RGB" +msgstr "RGB" + +msgid "RSS Feed URI" +msgstr "RSS Feed URI" + +msgid "Radio" +msgstr "Radio" + +msgid "Ram Disk" +msgstr "Ram Disk" + +msgid "Really close without saving settings?" +msgstr "Slúte sunder op te slaan ?" + +msgid "Really delete done timers?" +msgstr "Ferwiderje diene tiidsbarren?" + +msgid "Really delete this timer?" +msgstr "Dit tiidsbarren ferwiderje?" + +msgid "Really exit the subservices quickzap?" +msgstr "De undersender rapzap ôfslúte?" + +msgid "Really reboot now?" +msgstr "Wier no kompleet opnei starte ?" + +msgid "Really restart now?" +msgstr "Wier no nei starte ?" + +msgid "Really shutdown now?" +msgstr "Wier no kompleet útskeakelje ?" + +msgid "Reboot" +msgstr "kompleet nei starte" + +msgid "Reception Settings" +msgstr "Untfangst Ynstellingen" + +msgid "Record" +msgstr "Opnimme" + +msgid "Recorded files..." +msgstr "Opnâme bestannen..." + +msgid "Recording" +msgstr "An it opnimmen" + +msgid "Recording(s) are in progress or coming up in few seconds!" +msgstr "In Opnimmen is dwaande of start binnen in pear sekonden!" + +msgid "Recordings always have priority" +msgstr "Opnimmen hat altiid foarrang" + +msgid "Reenter new pin" +msgstr "pin opnei ynjaan" + +msgid "Refresh Rate" +msgstr "Fernij faasje" + +msgid "Refresh rate selection." +msgstr "Fernij faasje seleksje" + +msgid "Remove Bookmark" +msgstr "Ferwiderje boekmerk" + +msgid "Remove Plugins" +msgstr "Ferwiderje ynstekkers" + +msgid "Remove a mark" +msgstr "Ferwiderje in Markeerder" + +msgid "Remove currently selected title" +msgstr "Ferwiderje it selektearre bestan" + +msgid "Remove plugins" +msgstr "Ferwiderje ynstekker" + +msgid "Remove the broken .NFI file?" +msgstr "Foute .NFI triem fuortsmite ?" + +msgid "Remove the incomplete .NFI file?" +msgstr "Net komplete .NFI triem fuortsmite ?" + +msgid "Remove title" +msgstr "Ferwiderje de titel" + +#, python-format +msgid "Removing directory %s failed. (Maybe not empty.)" +msgstr "Ferwiderje fan map %s mislearre ( miskien is der net leech )" + +msgid "Rename" +msgstr "Omneame" + +msgid "Repeat" +msgstr "Herhelje" + +msgid "Repeat Type" +msgstr "Herhelje Type" + +msgid "Repeating event currently recording... What do you want to do?" +msgstr "Herhelle barren an it opnimmen... Wat wolle jo dwaan ?" + +msgid "Repeats" +msgstr "Herhellingen" + +msgid "Reset" +msgstr "Reset" + +msgid "Reset and renumerate title names" +msgstr "" + +msgid "Resolution" +msgstr "Skermresolusje" + +msgid "Restart" +msgstr "Opnij starte" + +msgid "Restart GUI" +msgstr "" + +msgid "Restart GUI now?" +msgstr "GUI no opnij starte?" + +msgid "Restart network" +msgstr "Netwurk nij starte" + +msgid "Restart test" +msgstr "Test nij starte" + +msgid "Restart your network connection and interfaces.\n" +msgstr "netwurk oanslúting en interfaces nij starte.\n" + +msgid "Restore" +msgstr "Werom sette" + +msgid "" +"Restoring the settings is done. Please press OK to activate the restored " +"settings now." +msgstr "" +"Werom sette fan ynstellingen is klear. Druk Ok om ynstellingen aktief te " +"meitsjen" + +msgid "Resume from last position" +msgstr "Fierder gean fanôf lêste posysje" + +#. TRANSLATORS: The string "Resuming playback" flashes for a moment +#. TRANSLATORS: at the start of a movie, when the user has selected +#. TRANSLATORS: "Resume from last position" as start behavior. +#. TRANSLATORS: The purpose is to notify the user that the movie starts +#. TRANSLATORS: in the middle somewhere and not from the beginning. +#. TRANSLATORS: (Some translators seem to have interpreted it as a +#. TRANSLATORS: question or a choice, but it is a statement.) +msgid "Resuming playback" +msgstr "Fierder gean mei ôfspieljen" + +msgid "Return to file browser" +msgstr "Werom nei triem browser" + +msgid "Return to movie list" +msgstr "Werom nei de film lyst" + +msgid "Return to previous service" +msgstr "Werom nei foariche service" + +msgid "Rewind speeds" +msgstr "Werom spiel faasje" + +msgid "Right" +msgstr "Rjochts" + +msgid "Rolloff" +msgstr "Utrolje" + +msgid "Rotor turning speed" +msgstr "Rotor rotaasje faasje" + +msgid "Running" +msgstr "Dwaande" + +msgid "Russian" +msgstr "Russysk" + +msgid "S-Video" +msgstr "S Video" + +msgid "SNR" +msgstr "SNR" + +msgid "SNR:" +msgstr "SNR:" + +msgid "Sat" +msgstr "Sneon" + +msgid "Sat / Dish Setup" +msgstr "Sat / Panne Ynstellingen" + +msgid "Satellite" +msgstr "Satellyt" + +msgid "Satellite Equipment Setup" +msgstr "Satellyt ynstellingen" + +msgid "Satellites" +msgstr "Satellyten" + +msgid "Satfinder" +msgstr "Sat syker" + +msgid "Sats" +msgstr "Sats" + +msgid "Saturday" +msgstr "Sneon" + +msgid "Save" +msgstr "Opslaan" + +msgid "Save Playlist" +msgstr "Ofspiellyst opslaan" + +msgid "Scaling Mode" +msgstr "Skaal Moadus" + +msgid "Scan " +msgstr "Sykje" + +msgid "Scan QAM128" +msgstr "Sykje QAM128" + +msgid "Scan QAM16" +msgstr "Sykje QAM16" + +msgid "Scan QAM256" +msgstr "Sykje QAM256" + +msgid "Scan QAM32" +msgstr "Sykje QAM32" + +msgid "Scan QAM64" +msgstr "Sykje QAM64" + +msgid "Scan SR6875" +msgstr "Sykje SR6875" + +msgid "Scan SR6900" +msgstr "Sykje SR6900" + +msgid "Scan Wireless Networks" +msgstr "Sykje Triitloaze netwerken" + +msgid "Scan additional SR" +msgstr "Sykje op in oanfullende SR" + +msgid "Scan band EU HYPER" +msgstr "Sykje op bân EU HYPER" + +msgid "Scan band EU MID" +msgstr "Sykje op bân EU MID" + +msgid "Scan band EU SUPER" +msgstr "Sykje op bân EU SUPER" + +msgid "Scan band EU UHF IV" +msgstr "Sykje op bân EU UHF IV" + +msgid "Scan band EU UHF V" +msgstr "Sykje op bân EU UHF V" + +msgid "Scan band EU VHF I" +msgstr "Sykje op bân EU VHF I" + +msgid "Scan band EU VHF III" +msgstr "Sykje op bân EU VHF III" + +msgid "Scan band US HIGH" +msgstr "Sykje op bân US HIGH" + +msgid "Scan band US HYPER" +msgstr "Sykje op bân US HYPER" + +msgid "Scan band US LOW" +msgstr "Sykje op bân US LOW" + +msgid "Scan band US MID" +msgstr "Sykje op bân US MID" + +msgid "Scan band US SUPER" +msgstr "Sykje op bân US SUPER" + +msgid "" +"Scan your network for wireless Access Points and connect to them using your " +"WLAN USB Stick\n" +msgstr "" +"Sykje nei triidloaze oankeppel punten en ferbyn der mei troch de WLAN USB " +"stick\n" + +msgid "" +"Scans default lamedbs sorted by satellite with a connected dish positioner" +msgstr "" +"Sykje standert lame dbs, neffens de sattelyt mei in oanslúten panne ôfsteller" + +msgid "Search east" +msgstr "Sykje east" + +msgid "Search west" +msgstr "Sykje west" + +msgid "Secondary DNS" +msgstr "Twadde DNS" + +msgid "Seek" +msgstr "Sykje" + +msgid "Select HDD" +msgstr "" + +msgid "Select Location" +msgstr "Kies Lokaasje" + +msgid "Select Network Adapter" +msgstr "Kies Netwurk Adapter" + +msgid "Select a movie" +msgstr "Kies in film" + +msgid "Select audio mode" +msgstr "Kies lûd mode" + +msgid "Select audio track" +msgstr "Kies lûd spoor" + +msgid "Select channel to record from" +msgstr "Kies kanaal om fan op te nimmen" + +msgid "Select image" +msgstr "Kies image" + +msgid "Select refresh rate" +msgstr "Kies faasje fan fernije" + +msgid "Select video input" +msgstr "Kies fideo yngong" + +msgid "Select video mode" +msgstr "Kies fideo moadus" + +msgid "Selected source image" +msgstr "Koazen bron image" + +msgid "Send DiSEqC" +msgstr "" + +msgid "Send DiSEqC only on satellite change" +msgstr "" + +msgid "Seperate titles with a main menu" +msgstr "Aparte triemen mei in haad menu" + +msgid "Sequence repeat" +msgstr "folch oarde herhelling" + +msgid "Service" +msgstr "Kanaal ynfo" + +msgid "Service Scan" +msgstr "Kanaal sykje" + +msgid "Service Searching" +msgstr "Kanalen sykje" + +msgid "Service has been added to the favourites." +msgstr "Kanaal is tafoege oan favorieten." + +msgid "Service has been added to the selected bouquet." +msgstr "Kanaal is tafoege oan selektearre bouquet." + +msgid "" +"Service invalid!\n" +"(Timeout reading PMT)" +msgstr "" +"Kanaal net jildig!\n" +"(Tiidsoerskriding lêzen fan PMT)" + +msgid "" +"Service not found!\n" +"(SID not found in PAT)" +msgstr "" +"Service net fûn!\n" +"(SID net fûn yn PAT)" + +msgid "Service scan" +msgstr "Kanaal sykje" + +msgid "" +"Service unavailable!\n" +"Check tuner configuration!" +msgstr "Kanaal net beskikber!
Sjoch tuner ynstellingen nei." + +msgid "Serviceinfo" +msgstr "Kanaal ynformaasje" + +msgid "Services" +msgstr "Kanalen" + +msgid "Set Voltage and 22KHz" +msgstr "" + +msgid "Set as default Interface" +msgstr "Ynstelle as standert ynterface" + +msgid "Set interface as default Interface" +msgstr "" + +msgid "Set limits" +msgstr "Set limyten" + +msgid "Settings" +msgstr "Ynstellingen" + +msgid "Setup" +msgstr "Ynstelle" + +msgid "Setup Mode" +msgstr "Ynstellingen Moadus" + +msgid "Show Info" +msgstr "Ynformaasje sjen litte" + +msgid "Show WLAN Status" +msgstr "WLAN status sjen litte" + +msgid "Show blinking clock in display during recording" +msgstr "Lit klok knipperje yn display by opnimmen" + +msgid "Show infobar on channel change" +msgstr "Ynfobalke sjen litte by kanaal wiksel" + +msgid "Show infobar on event change" +msgstr "Ynfobalke sjen litte by barren wiksel" + +msgid "Show infobar on skip forward/backward" +msgstr "Ynfobalke sjen by rap foarút / efterút" + +msgid "Show positioner movement" +msgstr "Rotor beweching sjen litte" + +msgid "Show services beginning with" +msgstr "Kanalen sjen litte beginnent mei" + +msgid "Show the radio player..." +msgstr "Radio spieler sjen litte..." + +msgid "Show the tv player..." +msgstr "TV Spieler sjen litte..." + +msgid "Shows the state of your wireless LAN connection.\n" +msgstr "Status fan WLAN sjen litte.\n" + +msgid "Shutdown Dreambox after" +msgstr "Dreambox útskeakelje nei" + +msgid "Similar" +msgstr "Gelykese" + +msgid "Similar broadcasts:" +msgstr "Gelykese utsjoeringen" + +msgid "Simple" +msgstr "Simpel" + +msgid "Simple titleset (compatibility for legacy players)" +msgstr "" + +msgid "Single" +msgstr "Inkel" + +msgid "Single EPG" +msgstr "Inkele EPG" + +msgid "Single satellite" +msgstr "Ien satellyt" + +msgid "Single transponder" +msgstr "Ien transponder" + +msgid "Singlestep (GOP)" +msgstr "Ien stap (GOP)" + +msgid "Skin..." +msgstr "Oanklaaiing" + +msgid "Sleep Timer" +msgstr "Tiidstjoering" + +msgid "Sleep timer action:" +msgstr "Sleep tiid barren aksje:" + +msgid "Slideshow Interval (sec.)" +msgstr "Slide foarstelling tiid (sec.)" + +#, python-format +msgid "Slot %d" +msgstr "Slot %d" + +msgid "Slow" +msgstr "Langsaam" + +msgid "Slow Motion speeds" +msgstr "Langsaam beweechjen faasje" + +msgid "Some plugins are not available:\n" +msgstr "Inkele ynstekkers binne net anwêzig:\n" + +msgid "Somewhere else" +msgstr "Ergens oars" + +msgid "" +"Sorry your Backup destination does not exist\n" +"\n" +"Please choose an other one." +msgstr "" +"Sorry.. Jo Reserve kopie plak bestiit net\n" +"\n" +"Kies in oar plak aub..." + +#. TRANSLATORS: This must fit into the header button in the EPG-List +msgid "Sort A-Z" +msgstr "Sorteer op A-Z" + +#. TRANSLATORS: This must fit into the header button in the EPG-List +msgid "Sort Time" +msgstr "Sorteer op Tiid" + +msgid "Sound" +msgstr "Lûd" + +msgid "Soundcarrier" +msgstr "Lûd-drager" + +msgid "South" +msgstr "Sud" + +msgid "Spanish" +msgstr "Spaans" + +msgid "Standby" +msgstr "Paraatmode" + +msgid "Standby / Restart" +msgstr "Paraatmode / Nijstart" + +msgid "Start from the beginning" +msgstr "Start fanôf it begjin" + +msgid "Start recording?" +msgstr "Start opnimmen?" + +msgid "Start test" +msgstr "Start test" + +msgid "StartTime" +msgstr "Starttiid" + +msgid "Starting on" +msgstr "Starte op" + +msgid "Step east" +msgstr "Stap nei east" + +msgid "Step west" +msgstr "Stap nei west" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Stop" +msgstr "Stop" + +msgid "Stop Timeshift?" +msgstr "Tiidsskowen stopje?" + +msgid "Stop current event and disable coming events" +msgstr "Stopje hjoeddeiske en ankommend barren" + +msgid "Stop current event but not coming events" +msgstr "Stopje hjoeddeiske mar net ankommend barren" + +msgid "Stop playing this movie?" +msgstr "Stopje ôfspieljen fan dizze film?" + +msgid "Stop test" +msgstr "Stop test" + +msgid "Store position" +msgstr "Posysje opslaan" + +msgid "Stored position" +msgstr "Opsleine posysje" + +msgid "Subservice list..." +msgstr "UnderSender lyst..." + +msgid "Subservices" +msgstr "UnderSender" + +msgid "Subtitle selection" +msgstr "Undertitel seleksje" + +msgid "Subtitles" +msgstr "Undertitels" + +msgid "Sun" +msgstr "Sne" + +msgid "Sunday" +msgstr "Snein" + +msgid "Swap Services" +msgstr "Kanalen wikselje" + +msgid "Swedish" +msgstr "Zweeds" + +msgid "Switch to next subservice" +msgstr "Gjin nei folgende undersender" + +msgid "Switch to previous subservice" +msgstr "Gjin nei foarige undersender" + +msgid "Symbol Rate" +msgstr "Symbool faasje" + +msgid "Symbolrate" +msgstr "Symboolfaasje" + +msgid "System" +msgstr "Systeem" + +#. TRANSLATORS: Add here whatever should be shown in the "translator" about screen, up to 6 lines (use \n for newline) +msgid "TRANSLATOR_INFO" +msgstr "Oersetter ynfo" + +msgid "TS file is too large for ISO9660 level 1!" +msgstr "" + +msgid "TV System" +msgstr "TV Systeem" + +msgid "Table of content for collection" +msgstr "Ynhalds tabel foar kolleksje" + +msgid "Tag 1" +msgstr "" + +msgid "Tag 2" +msgstr "" + +msgid "Tags" +msgstr "" + +msgid "Terrestrial" +msgstr "Ether" + +msgid "Terrestrial provider" +msgstr "Ether útstjoerder" + +msgid "Test mode" +msgstr "Test moadus" + +msgid "Test the network configuration of your Dreambox.\n" +msgstr "Test de netwurk konfiguraasje fan de Dreambox.\n" + +msgid "Test-Messagebox?" +msgstr "Test-Berjochtbox?" + +msgid "" +"Thank you for using the wizard. Your box is now ready to use.\n" +"Please press OK to start using your Dreambox." +msgstr "" +"Bedankt foar it brûken fan de gucheler. Jo box is no klear om te brûken.\n" +"Druk OK om mei de Dreambox te begjinnen." + +msgid "" +"The DVD standard doesn't support H.264 (HDTV) video streams. Do you want to " +"create a Dreambox format data DVD (which will not play in stand-alone DVD " +"players) instead?" +msgstr "" +"De DVD standert kin gjin H.264 (HDTV) fideo streams an. Wolle jo dan in " +"Dreambox formaat data DVD meitsje ? Tink der om, dizze kin net in gewoane " +"DVD spielers ôfspiele wurde !" + +msgid "" +"The USB stick is now bootable. Do you want to download the latest image from " +"the feed server and save it on the stick?" +msgstr "" + +msgid "The backup failed. Please choose a different backup location." +msgstr "Backup is mislearre. Kies in oare backup lokaasje." + +#, python-format +msgid "" +"The following device was found:\n" +"\n" +"%s\n" +"\n" +"Do you want to write the USB flasher to this stick?" +msgstr "" +"It folgende apparaat wie fûn:\n" +"\n" +"%s\n" +"\n" +"Wolle jo de USB flasher nei dizze stick skriuwe ?" + +msgid "" +"The input port should be configured now.\n" +"You can now configure the screen by displaying some test pictures. Do you " +"want to do that now?" +msgstr "" +"De yngongs poort moat no ynstelt wurde\n" +"Ynstelle kin mei it sjen litten fan in oantal bylden. No dwaan ?" + +msgid "The installation of the default services lists is finished." +msgstr "Ynstalaasje fan standert ynstellingen is klear." + +msgid "" +"The installation of the default settings is finished. You can now continue " +"configuring your Dreambox by pressing the OK button on the remote control." +msgstr "" +"Standert ynstellingen binne werom set. Jo kinne fierder gean mei it " +"ynstellen fan de Dreambox troch OK te drukken op de ôfstandsbetsjinning" + +msgid "" +"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!" +msgstr "" +"De md5sum misljearre, de triem is blikber Korrupt. Wolle jo wier dit byld yn " +"it flash geheugen sette ? Dit gjid op eigen risiko !" + +msgid "" +"The md5sum validation failed, the file may be downloaded incompletely or be " +"corrupted!" +msgstr "" +"De md5sum misljearre. De triem mei net kompleet binnen helle wêze of gewoan " +"korrupt weze !" + +msgid "The package doesn't contain anything." +msgstr "It pakket hat gjin ynhâld" + +#, python-format +msgid "The path %s already exists." +msgstr "It paad %s bestiit al." + +msgid "The pin code has been changed successfully." +msgstr "De pinkode is mei sukses feroare." + +msgid "The pin code you entered is wrong." +msgstr "De ynjûne pinkode is ferkeard." + +msgid "The pin codes you entered are different." +msgstr "De pinkodes binne net gelyk." + +msgid "The sleep timer has been activated." +msgstr "De sliep tiid klok is aktiveert." + +msgid "The sleep timer has been disabled." +msgstr "De sliep tiid klok is útskeakele" + +msgid "The timer file (timers.xml) is corrupt and could not be loaded." +msgstr "De tiidsbarrenlyst is korrupt en koe net laden wurde." + +msgid "" +"The wireless LAN plugin is not installed!\n" +"Please install it." +msgstr "" +"De WLAN ynstekker is net ynstallearre!\n" +"Ynstallearje dizze earst." + +msgid "" +"The wizard can backup your current settings. Do you want to do a backup now?" +msgstr "" +"De gucheler kin jo ynstellingen efterút sette. Wolle jo no een backup " +"meitsje ?" + +msgid "The wizard is finished now." +msgstr "De gucheler is klear." + +msgid "There are no default services lists in your image." +msgstr "Der binne gjin standert lysts yn de Dreambox" + +msgid "There are no default settings in your image." +msgstr "Der binne gjin standert ynstellingen yn jo byld" + +msgid "" +"There might not be enough Space on the selected Partition.\n" +"Do you really want to continue?" +msgstr "" +"Blikber is der net genôch rûmte op de koazen partysje.\n" +"Wolle jo trochgean ?" + +#, python-format +msgid "This .NFI file does not contain a valid %s image!" +msgstr "Dizze .NFI triem hat net in jildich %s image!" + +msgid "" +"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?" +msgstr "" +"Dizze .NFI triem had gjin md5sum kontrolesom en mei misskien net wurkje. " +"Wolle jo wier dit byld yn flash geheugen sette ?" + +msgid "" +"This .NFI file has a valid md5 signature. Continue programming this image to " +"flash memory?" +msgstr "" +"Dit .NFI triem hat it jildige md5 kontrolesom. Fjierder gean mei it nei " +"flash skriuwen fan dit byld ?" + +msgid "" +"This DVD RW medium is already formatted - reformatting will erase all " +"content on the disc." +msgstr "" +"Dit DVD RW medium is al formattearre. Wer opnei dwaan sil alle gegevens op " +"disk wiskje." + +#, python-format +msgid "This Dreambox can't decode %s video streams!" +msgstr "De Dreambox kin %s fideo streams net oan !" + +msgid "This is step number 2." +msgstr "Dit is stap nûmer 2." + +msgid "This is unsupported at the moment." +msgstr "Dit wurd no nog net ondersteund." + +msgid "" +"This test checks for configured Nameservers.\n" +"If you get a \"unconfirmed\" message:\n" +"- please check your DHCP, cabling and Adapter setup\n" +"- if you configured your Nameservers manually please verify your entries in " +"the \"Nameserver\" Configuration" +msgstr "" +"Dizze test sjocht nei ynstelde nammeservers.\n" +"Krije jo in \"net befestige\" berjocht :\n" +"- Sjoch nei de DHCP, kabels/tridden en adapter ynstellingen\n" +"- By hânmatig ynstellen fan nammeservers, sjoch nei de ynjeftes yn de " +"\"nammeservers\" konfiguraasje" + +msgid "" +"This test checks whether a network cable is connected to your LAN-Adapter.\n" +"If you get a \"disconnected\" message:\n" +"- verify that a network cable is attached\n" +"- verify that the cable is not broken" +msgstr "" +"Dizze test sjocht nei in oanslúten LAN adapter.\n" +"Krije jo in \"net oanslúten\" berjocht :\n" +"- Sjoch nei wol of net oanslúten kabels/tridden\n" +"- Sjoch ot de kabel miskien net brutsen is" + +msgid "" +"This test checks whether a valid IP Address is found for your LAN Adapter.\n" +"If you get a \"unconfirmed\" message:\n" +"- no valid IP Address was found\n" +"- please check your DHCP, cabling and adapter setup" +msgstr "" +"Dizze test sjocht nei ynstelde IP adressen foar de LAN adapter.\n" +"Krije jo in \"net befestige\" berjocht :\n" +"- Is der in jildig IP adres ynstelt ?\n" +"- Sjoch nei de DHCP, kabels/tridden en adapter ynstellingen" + +msgid "" +"This test checks whether your LAN Adapter is set up for automatic IP Address " +"configuration with DHCP.\n" +"If you get a \"disabled\" message:\n" +" - then your LAN Adapter is configured for manual IP Setup\n" +"- verify thay you have entered correct IP informations in the AdapterSetup " +"dialog.\n" +"If you get an \"enabeld\" message:\n" +"-verify that you have a configured and working DHCP Server in your network." +msgstr "" +"Dizze test sjocht ot de LAN adapter ynsteld is foar automatysk IP Adres " +"ferkrije troch DHCP.\n" +"Krije jo in \"útskeakele\" berjocht :\n" +"- In hânmatig IP adres is ynstelt ?\n" +"- Is de ynjûne IP ynformaasje goed, yn it Adapterynstellingen menu ?\n" +"Krije jo in \"ynskeakele\" berjocht :\n" +"- Is der ek een DHCP server aktyf yn jo netwurk ?" + +msgid "This test detects your configured LAN-Adapter." +msgstr "Dizze test syket nei de ynstelde LAN-Adapter" + +msgid "Three" +msgstr "Trije" + +msgid "Threshold" +msgstr "Drompel" + +msgid "Thu" +msgstr "Tong" + +msgid "Thumbnails" +msgstr "" + +msgid "Thursday" +msgstr "Tongersdei" + +msgid "Time" +msgstr "Tiid" + +msgid "Time/Date Input" +msgstr "Tiid / Dei ynjefte" + +msgid "Timer" +msgstr "Tiidssjtoering" + +msgid "Timer Edit" +msgstr "Tiidsbarren bewurkje" + +msgid "Timer Editor" +msgstr "Tiidsbarren bewurker" + +msgid "Timer Type" +msgstr "Tiidsbarren type" + +msgid "Timer entry" +msgstr "Tiidsbarren item" + +msgid "Timer log" +msgstr "Tiidsbarren log" + +msgid "" +"Timer overlap in timers.xml detected!\n" +"Please recheck it!" +msgstr "" +"Tiidstjoerings conflicten fûn yn timers.xml\n" +"Graach nei sjen en meitsje!" + +msgid "Timer sanity error" +msgstr "Tiidsbarren kontrole flater" + +msgid "Timer selection" +msgstr "Tiidsbarren seleksje" + +msgid "Timer status:" +msgstr "Tiidsbarren status:" + +msgid "Timeshift" +msgstr "Tiidsskowen" + +msgid "Timeshift not possible!" +msgstr "Tiidsskowen is net mooglik !" + +msgid "Timeshift path..." +msgstr "" + +msgid "Timezone" +msgstr "Tiidszone" + +msgid "Title" +msgstr "Titel" + +msgid "Title properties" +msgstr "" + +msgid "Title:" +msgstr "Titel:" + +msgid "Titleset mode" +msgstr "" + +msgid "" +"To update your Dreambox firmware, please follow these steps:\n" +"1) Turn off your box with the rear power switch and plug in the bootable USB " +"stick.\n" +"2) Turn mains back on and hold the DOWN button on the front panel pressed " +"for 10 seconds.\n" +"3) Wait for bootup and follow instructions of the wizard." +msgstr "" + +msgid "Today" +msgstr "Hjoed" + +msgid "Tone mode" +msgstr "Toan moadus" + +msgid "Toneburst" +msgstr "Toan piek" + +msgid "Toneburst A/B" +msgstr "Toneburst A/B" + +msgid "Track" +msgstr "Nummer" + +msgid "Translation" +msgstr "Oersetting" + +msgid "Translation:" +msgstr "Oersetting:" + +msgid "Transmission Mode" +msgstr "Oerstjoeren moadus" + +msgid "Transmission mode" +msgstr "Oerstjoeren type" + +msgid "Transponder" +msgstr "Transponder" + +msgid "Transponder Type" +msgstr "Transponder type" + +msgid "Tries left:" +msgstr "Oantal kearen besykjen oer:" + +msgid "Try to find used Transponders in cable network.. please wait..." +msgstr "Besykje brûkte transponders te finen yn kabel netwurk.. " + +msgid "Try to find used transponders in cable network.. please wait..." +msgstr "Besykje brûkte transponders te finen yn kabel netwurk.. " + +msgid "Tue" +msgstr "Tiis" + +msgid "Tuesday" +msgstr "Tiisdei" + +msgid "Tune" +msgstr "Ofstimme" + +msgid "Tune failed!" +msgstr "Ofstimme mislearre !" + +msgid "Tuner" +msgstr "Tuner" + +msgid "Tuner " +msgstr "Tuner" + +msgid "Tuner Slot" +msgstr "Tuner Slot" + +msgid "Tuner configuration" +msgstr "Tuner ynstellingen" + +msgid "Tuner status" +msgstr "Tuner status" + +msgid "Turkish" +msgstr "Turks" + +msgid "Two" +msgstr "Twa" + +msgid "Type of scan" +msgstr "Type fan sykjen" + +msgid "USALS" +msgstr "USALS" + +msgid "USB" +msgstr "USB" + +msgid "USB Stick" +msgstr "USB Stick" + +msgid "USB stick wizard" +msgstr "" + +msgid "Ukrainian" +msgstr "" + +msgid "" +"Unable to complete filesystem check.\n" +"Error: " +msgstr "" +"Net yn steat om bestânsysteem nei te sjen\n" +"Flater: " + +msgid "" +"Unable to initialize harddisk.\n" +"Error: " +msgstr "" + +msgid "Uncommitted DiSEqC command" +msgstr "Net oanwizen DiSEqC kommando" + +msgid "Universal LNB" +msgstr "Unifersele LNB" + +msgid "Unmount failed" +msgstr "Ofkeppeljen mislearre" + +msgid "Update" +msgstr "Bywurkje" + +msgid "Updates your receiver's software" +msgstr "UntfangerSoftware bywurkje" + +msgid "Updating finished. Here is the result:" +msgstr "Klear met bywurkjen. Dit hat allegear bart :" + +msgid "Updating... Please wait... This can take some minutes..." +msgstr "Bywurkjen is dwaande. Waachtje even. Dit kin inkele minuten duorje." + +msgid "Upgrade finished. Do you want to reboot your Dreambox?" +msgstr "Klear mei bywurkjen. Wolle jo de Dreambox opnij starte?" + +msgid "Upgrading" +msgstr "An it bywurkjen" + +msgid "Upgrading Dreambox... Please wait" +msgstr "Dreambox an it bywurkjen..." + +msgid "Use" +msgstr "" + +msgid "Use DHCP" +msgstr "DHCP brûke" + +msgid "Use Interface" +msgstr "Brûk ynterface" + +msgid "Use Power Measurement" +msgstr "Bruk Enerzy behear" + +msgid "Use a gateway" +msgstr "In gateway brûke" + +#. TRANSLATORS: The effect of "Non-smooth winding" is that rather +#. than using ordinary "continuous" or "smooth" winding, a fast +#. sequence of stills is shown when winding at high speeds. This +#. makes it much easier too follow when almost each frame comes from +#. a new scene. The effect is achieved by repeating each shown frame +#. a couple of times. The settings control both at which speed this +#. winding mode sets in, and how many times each frame should be +#. repeated. This was previously called "Discontinuous playback" +#. which was incomprehensible. "Non-smooth winding" may be a better +#. term, but note that there is nothing irregular about it. Synonyms +#. better suited for translation to other languages may be "stepwise +#. winding/playback", or "winding/playback using stills". +msgid "Use non-smooth winding at speeds above" +msgstr "Brûk net glêd spielen by faasjes heecher" + +msgid "Use power measurement" +msgstr "Fermogensmjitting brûke" + +msgid "Use the Networkwizard to configure your Network\n" +msgstr "Bruk de netwurk gûcheler om it netwurk yn te stellen\n" + +msgid "" +"Use the left and right buttons to change an option.\n" +"\n" +"Please set up tuner A" +msgstr "" +"Knoppen links en rjochts brûke om in opsje te feroarjen.\n" +"\n" +"Stel tuner A yn" + +msgid "" +"Use the up/down keys on your remote control to select an option. After that, " +"press OK." +msgstr "Knoppen op en del brûke om in opsje te kiezen. Dêrnei druk Ok" + +msgid "Use usals for this sat" +msgstr "USALS foar dizze satellyt brûke" + +msgid "Use wizard to set up basic features" +msgstr "Gucheler foar basis ynstellingen brûke" + +msgid "Used service scan type" +msgstr "Brukte type kanaal sykjen" + +msgid "User defined" +msgstr "Gebruker ynstelling" + +msgid "VCR scart" +msgstr "VCR scart" + +msgid "VMGM (intro trailer)" +msgstr "VMGM (yntro fan film)" + +msgid "Video Fine-Tuning" +msgstr "Fideo fyn ynstellen" + +msgid "Video Fine-Tuning Wizard" +msgstr "Fideo fyn ynstel gucheler" + +msgid "Video Output" +msgstr "Fideo útgong" + +msgid "Video Setup" +msgstr "Fideo ynstellingen" + +msgid "Video Wizard" +msgstr "Fideo gucheler" + +msgid "" +"Video input selection\n" +"\n" +"Please press OK if you can see this page on your TV (or select a different " +"input port).\n" +"\n" +"The next input port will be automatically probed in 10 seconds." +msgstr "" +"Fideo yngong seleksje\n" +"\n" +"Druk OK wannear jo dit sjen kinne op jo TV (of kies in oare yngong).\n" +"\n" +"De folgende yngong wurd automatysk probearre yn 10 seconden." + +msgid "Video mode selection." +msgstr "Fideo moadus seleksje" + +msgid "View Rass interactive..." +msgstr "Rass interaktief sjen litte" + +msgid "View teletext..." +msgstr "tiletekst toane..." + +msgid "Virtual KeyBoard" +msgstr "" + +msgid "Voltage mode" +msgstr "Spanning mode" + +msgid "Volume" +msgstr "Lûdsterkte" + +msgid "W" +msgstr "W" + +msgid "WEP" +msgstr "WEP" + +msgid "WPA" +msgstr "WPA" + +msgid "WPA or WPA2" +msgstr "" + +msgid "WPA2" +msgstr "WPA2" + +msgid "WSS on 4:3" +msgstr "WSS by 4:3" + +msgid "Waiting" +msgstr "Oan it wachtsjen" + +msgid "" +"We will now test if your TV can also display this resolution at 50hz. If " +"your screen goes black, wait 20 seconds and it will switch back to 60hz.\n" +"Please press OK to begin." +msgstr "" +"Wy probearje no of jo TV dizze resolusje dwaan kin by 50 Hz. Giet jo skerm " +"op swart, wachtsje 20 sec. en it giet werom nei 60 Hz.\n" +"Druk OK om te begjinnen." + +msgid "Wed" +msgstr "Woa" + +msgid "Wednesday" +msgstr "Woansdei" + +msgid "Weekday" +msgstr "Wiekdei" + +msgid "" +"Welcome to the Cutlist editor.\n" +"\n" +"Seek to the start of the stuff you want to cut away. Press OK, select 'start " +"cut'.\n" +"\n" +"Then seek to the end, press OK, select 'end cut'. That's it." +msgstr "" +"Wolkom by de Cutlist bewurker.\n" +"\n" +"Sykje oant it begjin fan wat jo fuorthelje wolle. Druk OK, kies start cut.\n" +"\n" +"Dan kies oant it ein, druk OK, kies ein cut. Klear.." + +msgid "" +"Welcome to the Image upgrade wizard. The wizard will assist you in upgrading " +"the firmware of your Dreambox by providing a backup facility for your " +"current settings and a short explanation of how to upgrade your firmware." +msgstr "" +"Wolkom by de byld bywurkje gucheler. De gucheler helpt jo by it bywurkjen " +"fan de software yn jo Dreambox, in backup mochelikhiid foar jo ynstellingen " +"en in koarte útlis fan hoe de software by te wurkjen." + +msgid "" +"Welcome.\n" +"\n" +"This start wizard will guide you through the basic setup of your Dreambox.\n" +"Press the OK button on your remote control to move to the next step." +msgstr "" +"Wolkom.\n" +"\n" +"Dizze gucheler helpt jo troch de basis ynstellingen fan jo Dreambox.\n" +"Druk Ok op jo ôfstandsbetsjinning om nei de folgende stap te gean." + +msgid "Welcome..." +msgstr "Wolkom..." + +msgid "West" +msgstr "West" + +msgid "What do you want to scan?" +msgstr "Wat wolle jo ôfsykje ?" + +msgid "Where do you want to backup your settings?" +msgstr "Wêr wolle jo de gegevens opslaan?" + +msgid "Where to save temporary timeshift recordings?" +msgstr "" + +msgid "Wireless" +msgstr "Triitloas" + +msgid "Wireless Network" +msgstr "Triidloas netwurk" + +msgid "Write error while recording. Disk full?\n" +msgstr "Skriuw flater by it opnimmen. Skiif fol ?\n" + +msgid "Write failed!" +msgstr "Skriuw flater!" + +msgid "Writing NFI image file to flash completed" +msgstr "Skriuwen fan NFI byld nei flash is klear" + +msgid "YPbPr" +msgstr "YPbPr" + +msgid "Year:" +msgstr "Jier:" + +msgid "Yes" +msgstr "Ja" + +msgid "Yes, and delete this movie" +msgstr "Ja, en ferwiderje dizze film" + +msgid "Yes, backup my settings!" +msgstr "Ja, myn ynstellingen extra bewarje" + +msgid "Yes, do a manual scan now" +msgstr "Ja, no hânmatig sykje" + +msgid "Yes, do an automatic scan now" +msgstr "Ja, no automatysk sykje" + +msgid "Yes, do another manual scan now" +msgstr "Ja, no nochris hânmatig sykje" + +msgid "Yes, perform a shutdown now." +msgstr "Ja, no útskeakelje" + +msgid "Yes, restore the settings now" +msgstr "Ja, no de ynstellingen werom sette" + +msgid "Yes, returning to movie list" +msgstr "Ja, werom nei de film lyst" + +msgid "Yes, view the tutorial" +msgstr "Ja, besjoch de hânlieding" + +msgid "" +"You can choose some default settings now. Please select the settings you " +"want to be installed." +msgstr "" +"Jo kinne inkele ynstellingen dwaan no. Kies de ynstellingen die't jo " +"ynstallearje wolle" + +msgid "You can choose, what you want to install..." +msgstr "Jo kinne kieze wat te ynstallearen" + +msgid "You cannot delete this!" +msgstr "Jo kinne dit net ferwiderje!" + +msgid "You chose not to install any default services lists." +msgstr "Jo hawwe koazen gjin standert kanaallysten te ynstallearjen." + +msgid "" +"You chose not to install any default settings. You can however install the " +"default settings later in the settings menu." +msgstr "" +"Jo hawwe koazen gjin standert ynstellingen te ynstallearjen. Jo kinne letter " +"dit altiid nog dwaan in it ynstellingen menu" + +msgid "" +"You chose not to install anything. Please press OK finish the install wizard." +msgstr "" +"Jo hawwe koazen neat te ynstallearjen. Druk OK om de gucheler ôf te slúten." + +msgid "" +"You do not seem to have a harddisk in your Dreambox. So backing up to a " +"harddisk is not an option for you." +msgstr "" +"Jo hawwe blykber gjin hurde skiif yn jo Dreambox. Extra bewarje fan " +"ynstellingen nei in hurde skiif kin net by jo." + +msgid "" +"You have chosen to backup to a compact flash card. The card must be in the " +"slot. We do not verify if it is really used at the moment. So better backup " +"to the harddisk!\n" +"Please press OK to start the backup now." +msgstr "" +"Jo wolle de ynstellingen extra bewarje op in compact flash kaart. De kaart " +"moat oanwezig weze. Wy sjogge net nei, at it ek werkelijk brukt wurd. It is " +"better om op hurde skiif te bewarjen.\n" +"Druk Ok om de ynstellingen extra op te slaan." + +msgid "" +"You have chosen to backup to an usb drive. Better backup to the harddisk!\n" +"Please press OK to start the backup now." +msgstr "" +"Jo wolle de ynstellingen extra bewarje op in USB skiif. It is better om dit " +"nei hurde skiif te dwaan\n" +"Druk Ok om de ynstellingen extra te bewarjen." + +msgid "" +"You have chosen to backup to your harddisk. Please press OK to start the " +"backup now." +msgstr "" +"Jo wolle de ynstellingen extra bewarje op hurde skiif.Druk Ok om de " +"ynstellingen extra te bewarjen." + +msgid "" +"You have chosen to create a new .NFI flasher bootable USB stick. This will " +"repartition the USB stick and therefore all data on it will be erased." +msgstr "" +"Jo hawwe koazen in neie .NFI opstart USB stick te meitsjen. Dit sil de USB " +"opnei partitionearje en sa sil alle data ferlên gean." + +#, python-format +msgid "You have to wait %s!" +msgstr "Jo moatte %s wachtsje!" + +msgid "" +"You need a PC connected to your dreambox. If you need further instructions, " +"please visit the website http://www.dm7025.de.\n" +"Your dreambox will now be halted. After you have performed the update " +"instructions from the website, your new firmware will ask you to restore " +"your settings." +msgstr "" +"De moat in PC oan de dreambox ansluten weze. Foar mear ynstruktiessjoch op " +"de webside http://www.dm7025.de.\n" +"Jo dreambox sil no stopje. Nei it bywurkjen neffens de webside, de neie " +"software sil jo freegje om de oarspronkelike ynstellingen werom te setten." + +msgid "" +"You need to set a pin code and hide it from your children.\n" +"\n" +"Do you want to set the pin now?" +msgstr "" +"In pincode moat brûkt wurde om of te sluten foar bern.\n" +"\n" +"No in pinkode ynstelle ?" + +msgid "Your Dreambox will restart after pressing OK on your remote control." +msgstr "Jo D" + +msgid "Your TV works with 50 Hz. Good!" +msgstr "Jo TV wurket goed mei 50 Hz. Ok !" + +msgid "" +"Your backup succeeded. We will now continue to explain the further upgrade " +"process." +msgstr "" +"It extra bewarjen is slagge. Wy gjinne jo fierder mei utlizzen fan it bywurk " +"proces." + +msgid "Your dreambox is shutting down. Please stand by..." +msgstr "Jo Dreambox wurd no ôfsluten. Eefkes wachtsje..." + +msgid "" +"Your dreambox isn't connected to the internet properly. Please check it and " +"try again." +msgstr "" +"Jo Dreambox is net goed ferbun mei it internet. Kontrolearje en besykje " +"opnij." + +msgid "" +"Your frontprocessor firmware must be upgraded.\n" +"Press OK to start upgrade." +msgstr "" +"Jo foarprocessor software moat bywurke wurde\n" +"Druk Ok om te begjinnen." + +msgid "Your network configuration has been activated." +msgstr "" + +msgid "" +"Your network configuration has been activated.\n" +"A second configured interface has been found.\n" +"\n" +"Do you want to disable the second network interface?" +msgstr "" + +msgid "Zap back to service before positioner setup?" +msgstr "Werom zappe nei kanaal foar rotor ynstellingen?" + +msgid "Zap back to service before satfinder?" +msgstr "Werom zappe nei kanaal foar satellytsyker?" + +msgid "[alternative edit]" +msgstr "[alternatief bewurkje]" + +msgid "[bouquet edit]" +msgstr "[bouquet bewurkje]" + +msgid "[favourite edit]" +msgstr "[favorieten bewurkje]" + +msgid "[move mode]" +msgstr "[Ferpleats moadus]" + +msgid "abort alternatives edit" +msgstr "alternatieven bewurkjen ôfbrekke" + +msgid "abort bouquet edit" +msgstr "boeket bewurkjen ôfbrekke" + +msgid "abort favourites edit" +msgstr "favoriet bewurkje ôfbrekke" + +msgid "about to start" +msgstr "op it punt om te starten" + +msgid "activate current configuration" +msgstr "" + +msgid "add a nameserver entry" +msgstr "" + +msgid "add alternatives" +msgstr "alernatief tafoegje" + +msgid "add bookmark" +msgstr "boekmerk tafoegje" + +msgid "add bouquet" +msgstr "boeket tafoegje" + +msgid "add directory to playlist" +msgstr "map oan ofspiellyst tafoegje" + +msgid "add file to playlist" +msgstr "triem oan ofspiellyst tafoegje" + +msgid "add files to playlist" +msgstr "triemen tafoegje an ôfspiellyst" + +msgid "add marker" +msgstr "marker tafoegje" + +msgid "add recording (enter recording duration)" +msgstr "opnimmen tafoegje (opnimtiid)" + +msgid "add recording (enter recording endtime)" +msgstr "opnimmen tafoegje (eintiid opnimmen ynjaan)" + +msgid "add recording (indefinitely)" +msgstr "opnimmen tafoegje (foar altiid trochgean)" + +msgid "add recording (stop after current event)" +msgstr "opnimmen tafoegje (stopje nei dit barren)" + +msgid "add service to bouquet" +msgstr "kanaal tafoegje oan bouquet" + +msgid "add service to favourites" +msgstr "kanaal tafoegje oan favorieten" + +msgid "add to parental protection" +msgstr "âlderlik tasjoch tafoegje " + +msgid "advanced" +msgstr "afansjearre" + +msgid "alphabetic sort" +msgstr "sortearje op alfabet" + +msgid "" +"are you sure you want to restore\n" +"following backup:\n" +msgstr "" +"witte jo seker dizze werom te setten\n" +"de extra kopie:\n" + +#, python-format +msgid "audio track (%s) format" +msgstr "" + +#, python-format +msgid "audio track (%s) language" +msgstr "" + +msgid "audio tracks" +msgstr "audio spoor" + +msgid "back" +msgstr "werom" + +msgid "background image" +msgstr "Eftergrûn ôfbylding" + +msgid "backgroundcolor" +msgstr "" + +msgid "better" +msgstr "better" + +msgid "black" +msgstr "" + +msgid "blacklist" +msgstr "swarte lyst" + +msgid "blue" +msgstr "" + +#, python-format +msgid "burn audio track (%s)" +msgstr "" + +msgid "change recording (duration)" +msgstr "feroarje opnim tiiden" + +msgid "change recording (endtime)" +msgstr "wizigje opnimmen (eintiid)" + +msgid "chapters" +msgstr "Haadstikken" + +msgid "choose destination directory" +msgstr "kies doel map" + +msgid "circular left" +msgstr "circular links" + +msgid "circular right" +msgstr "circular rjochts" + +msgid "clear playlist" +msgstr "ofspiellyst leeg meitsje" + +msgid "color" +msgstr "kleur" + +msgid "complex" +msgstr "complex" + +msgid "config menu" +msgstr "konfiguraasje menu" + +msgid "confirmed" +msgstr "befestigt" + +msgid "connected" +msgstr "oanslúten" + +msgid "continue" +msgstr "gjea fierder" + +msgid "copy to bouquets" +msgstr "kopieer nei boeketten" + +msgid "create directory" +msgstr "map meitsje" + +msgid "daily" +msgstr "eltse dei" + +msgid "day" +msgstr "dei" + +msgid "delete cut" +msgstr "ferwiderje stik" + +msgid "delete file" +msgstr "" + +msgid "delete playlist entry" +msgstr "ofspiellyst rigele ferwiderje" + +msgid "delete saved playlist" +msgstr "ferwiderje opsleine ofspiellyst" + +msgid "delete..." +msgstr "ferwiderje..." + +msgid "disable" +msgstr "utskeakelje" + +msgid "disable move mode" +msgstr "ferpleats modus útskeakelje" + +msgid "disabled" +msgstr "útskeakele" + +msgid "disconnected" +msgstr "net oanslúten" + +msgid "do not change" +msgstr "net feroarje" + +msgid "do nothing" +msgstr "doch neat" + +msgid "don't record" +msgstr "net opnimme" + +msgid "done!" +msgstr "Klear!" + +msgid "edit alternatives" +msgstr "bewurkje alternatief" + +msgid "empty" +msgstr "leeg" + +msgid "enable" +msgstr "ynskeakelje" + +msgid "enable bouquet edit" +msgstr "bewurkjen boeket oan" + +msgid "enable favourite edit" +msgstr "bewurkjen favorieten oan" + +msgid "enable move mode" +msgstr "ferpleatsen mode oan" + +msgid "enabled" +msgstr "ynskeakele" + +msgid "end alternatives edit" +msgstr "bewurkjen alternatief út" + +msgid "end bouquet edit" +msgstr "bewurkjen boeket út" + +msgid "end cut here" +msgstr "stop stik hjirre" + +msgid "end favourites edit" +msgstr "bewurkjen favoriet út" + +msgid "enigma2 and network" +msgstr "" + +msgid "equal to" +msgstr "gelyk oan" + +msgid "exceeds dual layer medium!" +msgstr "te grut foar 2 laags medium!" + +msgid "exit DVD player or return to file browser" +msgstr "DVD spieler ferlitte en werom nei triem browser" + +msgid "exit mediaplayer" +msgstr "mediaspieler ferlitte" + +msgid "exit movielist" +msgstr "filmlyst ferlitte" + +msgid "exit nameserver configuration" +msgstr "" + +msgid "exit network adapter configuration" +msgstr "" + +msgid "exit network adapter setup menu" +msgstr "" + +msgid "exit network interface list" +msgstr "" + +msgid "exit networkadapter setup menu" +msgstr "" + +msgid "failed" +msgstr "mislearre" + +msgid "fileformats (BMP, PNG, JPG, GIF)" +msgstr "" + +msgid "filename" +msgstr "triemnamme" + +msgid "fine-tune your display" +msgstr "it skerm fyn tune" + +msgid "font face" +msgstr "font ansjoch" + +msgid "forward to the next chapter" +msgstr "foarút nei it folgende haadstik" + +msgid "free" +msgstr "frij" + +msgid "free diskspace" +msgstr "freie skiif rûmte" + +msgid "go to deep standby" +msgstr "gean nei djip paraatstand" + +msgid "go to standby" +msgstr "gean nei paraatstand" + +msgid "green" +msgstr "" + +msgid "headline" +msgstr "koptekst" + +msgid "hear radio..." +msgstr "nei radio harkje..." + +msgid "help..." +msgstr "help..." + +msgid "hidden network" +msgstr "" + +msgid "hide extended description" +msgstr "utbreide beskriuwing ferbergje" + +msgid "hide player" +msgstr "spieler ferbergje" + +msgid "highlighted button" +msgstr "oarskleurde knop" + +msgid "horizontal" +msgstr "horizontal" + +msgid "hour" +msgstr "oere" + +msgid "hours" +msgstr "oeren" + +msgid "immediate shutdown" +msgstr "direkt útskeakelje" + +#, python-format +msgid "" +"incoming call!\n" +"%s calls on %s!" +msgstr "" +"binnenkommend gesprek!\n" +"%s skillet nei %s!" + +msgid "init module" +msgstr "CI-Module initialisearje" + +msgid "insert mark here" +msgstr "tuskenfoegje marker" + +msgid "jump back to the previous title" +msgstr "werom nei de foarige titel" + +msgid "jump forward to the next title" +msgstr "foarút nei de folgende titel" + +msgid "jump to listbegin" +msgstr "spring nei begjin fan lyst" + +msgid "jump to listend" +msgstr "spring nei ein fan lyst" + +msgid "jump to next marked position" +msgstr "spring nei folgende index punt" + +msgid "jump to previous marked position" +msgstr "spring nei foarige index punt" + +msgid "leave movie player..." +msgstr "film ôfspieljen ferlitte..." + +msgid "left" +msgstr "links" + +msgid "length" +msgstr "lengte" + +msgid "list style compact" +msgstr "lyst styl kompakt" + +msgid "list style compact with description" +msgstr "lyst styl kompakt mei beskriuwing" + +msgid "list style default" +msgstr "lyst styl standert" + +msgid "list style single line" +msgstr "lyst styl ien rigele" + +msgid "load playlist" +msgstr "ofspiellyst lade" + +msgid "locked" +msgstr "op slot" + +msgid "loopthrough to" +msgstr "trochskeakele nei" + +msgid "manual" +msgstr "hânmatig" + +msgid "menu" +msgstr "menu" + +msgid "menulist" +msgstr "menulyst" + +msgid "mins" +msgstr "min" + +msgid "minute" +msgstr "minuut" + +msgid "minutes" +msgstr "minuten" + +msgid "month" +msgstr "maand" + +msgid "move PiP to main picture" +msgstr "ferplaats PiP nei haad skerm" + +msgid "move down to last entry" +msgstr "" + +msgid "move down to next entry" +msgstr "" + +msgid "move up to first entry" +msgstr "" + +msgid "move up to previous entry" +msgstr "" + +msgid "movie list" +msgstr "film lyst" + +msgid "multinorm" +msgstr "multinorm" + +msgid "never" +msgstr "nea" + +msgid "next channel" +msgstr "folgend kanaal" + +msgid "next channel in history" +msgstr "set folgende kanaal in skiednis" + +msgid "no" +msgstr "nee" + +msgid "no HDD found" +msgstr "" + +msgid "no module found" +msgstr "gjin CI-Module fûn" + +msgid "no standby" +msgstr "gjin paraatstand" + +msgid "no timeout" +msgstr "gjin tiidslimyt" + +msgid "none" +msgstr "gjin" + +msgid "not locked" +msgstr "net op slot" + +msgid "nothing connected" +msgstr "neat anslúten" + +msgid "of a DUAL layer medium used." +msgstr "fan in DUAL layer medium brûkt" + +msgid "of a SINGLE layer medium used." +msgstr "fan in SINGLE layer medium brûkt" + +msgid "off" +msgstr "uit" + +msgid "on" +msgstr "oan" + +msgid "on READ ONLY medium." +msgstr "fan in ALLINNE-LEZE medium" + +msgid "once" +msgstr "ienmalig" + +msgid "open nameserver configuration" +msgstr "" + +msgid "open servicelist" +msgstr "iepenje kanaallyst" + +msgid "open servicelist(down)" +msgstr "iepenje kanaallyst (nei beneden)" + +msgid "open servicelist(up)" +msgstr "iepenje kanaallyst (nei boppe)" + +msgid "open virtual keyboard input help" +msgstr "" + +msgid "pass" +msgstr "trochgean" + +msgid "pause" +msgstr "pause" + +msgid "play entry" +msgstr "rigele ofspielje" + +msgid "play from next mark or playlist entry" +msgstr "Spielje fanôf it folgende punt of ôfspiellyst rigele" + +msgid "play from previous mark or playlist entry" +msgstr "Spielje fanôf it foarige punt of ôfspiellyst rigele" + +msgid "please press OK when ready" +msgstr "druk Ok wanneer klear" + +msgid "please wait, loading picture..." +msgstr "plaatsje wurd laden..." + +msgid "previous channel" +msgstr "foariche kanaal" + +msgid "previous channel in history" +msgstr "set foarich kanaal yn skiednis" + +msgid "record" +msgstr "opnimme" + +msgid "recording..." +msgstr "an it opnimmen..." + +msgid "red" +msgstr "" + +msgid "remove a nameserver entry" +msgstr "" + +msgid "remove after this position" +msgstr "nei dizze posysje alles ferwiderje" + +msgid "remove all alternatives" +msgstr "ferwiderje alle alternatieven" + +msgid "remove all new found flags" +msgstr "ferwiderje nij fûn flaggen" + +msgid "remove before this position" +msgstr "foar dizze posysje alles ferwiderje" + +msgid "remove bookmark" +msgstr "boekmerk ferwiderje" + +msgid "remove directory" +msgstr "map ferwiderje" + +msgid "remove entry" +msgstr "ferwiderje yngong" + +msgid "remove from parental protection" +msgstr "ferwiderje út alderlik tasjoch" + +msgid "remove new found flag" +msgstr "ferwiderje nij fun flagge" + +msgid "remove selected satellite" +msgstr "selektearre sat ferwiderje" + +msgid "remove this mark" +msgstr "ferwiderje punt" + +msgid "repeat playlist" +msgstr "ôfspyllyst opnei spylje" + +msgid "repeated" +msgstr "herhelle" + +msgid "rewind to the previous chapter" +msgstr "werom spile nei it foarige haadstik" + +msgid "right" +msgstr "rjochts" + +msgid "save last directory on exit" +msgstr "" + +msgid "save playlist" +msgstr "ofspiellyst opslaan" + +msgid "save playlist on exit" +msgstr "" + +msgid "scan done!" +msgstr "sykjen klear !" + +#, python-format +msgid "scan in progress - %d%% done!" +msgstr "sykjen dwaande - %d%% klear!" + +msgid "scan state" +msgstr "sykjen status" + +msgid "second" +msgstr "seconde" + +msgid "second cable of motorized LNB" +msgstr "twadde kabel fan LNB-motor" + +msgid "seconds" +msgstr "seconden" + +msgid "select" +msgstr "kies" + +msgid "select .NFI flash file" +msgstr "kies .NFI flash triem" + +msgid "select image from server" +msgstr "kies byld fan server" + +msgid "select interface" +msgstr "" + +msgid "select menu entry" +msgstr "" + +msgid "select movie" +msgstr "kies film" + +msgid "select the movie path" +msgstr "kies it film paad" + +msgid "service pin" +msgstr "service pin" + +msgid "setup pin" +msgstr "pin ynstellingen" + +msgid "show DVD main menu" +msgstr "DVD haadmenu sjen litte" + +msgid "show EPG..." +msgstr "EPG sjen litte..." + +msgid "show Infoline" +msgstr "" + +msgid "show all" +msgstr "alles sjen litte" + +msgid "show alternatives" +msgstr "alternatieven sjen litte" + +msgid "show event details" +msgstr "EPG details sjen litte" + +msgid "show extended description" +msgstr "útbreide beskriuwing sjen litte" + +msgid "show first selected tag" +msgstr "" + +msgid "show second selected tag" +msgstr "" + +msgid "show shutdown menu" +msgstr "útskeakel menu sjen litte" + +msgid "show single service EPG..." +msgstr "ien kanaals EPG sjen litte" + +msgid "show tag menu" +msgstr "label menu sjen litte" + +msgid "show transponder info" +msgstr "transponder ynfo sjen litte" + +msgid "shuffle playlist" +msgstr "meitsje willekeurige ôfspiellyst" + +msgid "shutdown" +msgstr "útskeakelje" + +msgid "simple" +msgstr "simpel" + +msgid "skip backward" +msgstr "efterút oerslaan" + +msgid "skip backward (enter time)" +msgstr "efterút oerslaan (tiid ynjaan)" + +msgid "skip forward" +msgstr "foarút oerslaan" + +msgid "skip forward (enter time)" +msgstr "foarút oerslaan (tiid ynjaan)" + +msgid "slide picture in loop" +msgstr "" + +msgid "sort by date" +msgstr "sortearje op datum" + +msgid "spaces (top, between rows, left)" +msgstr "spaties (top, tusken rigels, links)" + +msgid "standard" +msgstr "standert" + +msgid "standby" +msgstr "paraatstand" + +msgid "start cut here" +msgstr "start stik hjirre" + +msgid "start directory" +msgstr "" + +msgid "start timeshift" +msgstr "tiidskowen starte" + +msgid "stereo" +msgstr "stereo" + +msgid "stop PiP" +msgstr "stopje PiP" + +msgid "stop entry" +msgstr "stopje rigele" + +msgid "stop recording" +msgstr "stopje opnimmen" + +msgid "stop timeshift" +msgstr "tiidskowen stopje" + +msgid "swap PiP and main picture" +msgstr "Pip en haad skerm wikselje" + +msgid "switch to bookmarks" +msgstr "skeakelje nei boekmerkers" + +msgid "switch to filelist" +msgstr "skeakelje nei triemlyst" + +msgid "switch to playlist" +msgstr "skeakelje nei ofspiellyst" + +msgid "switch to the next audio track" +msgstr "skeakelje nei it folgende lûd spoor" + +msgid "switch to the next subtitle language" +msgstr "skeakelje nei de folgende undertiteling taal" + +msgid "text" +msgstr "tekst" + +msgid "textcolor" +msgstr "" + +msgid "this recording" +msgstr "dit opnimmen" + +msgid "this service is protected by a parental control pin" +msgstr "dit kanaal is net beskikber troch it alderlik tasjoch." + +msgid "toggle a cut mark at the current position" +msgstr "merker oan/út op dizze posysje" + +msgid "toggle time, chapter, audio, subtitle info" +msgstr "tiid, haadstik, lûd en undertiteling ynfo omskeakelje" + +msgid "unconfirmed" +msgstr "net befestigt" + +msgid "unknown service" +msgstr "unbeneame kanaal" + +msgid "until restart" +msgstr "oant nijstart ta" + +msgid "user defined" +msgstr "brûkers ynstelling" + +msgid "vertical" +msgstr "ferticaal" + +msgid "view extensions..." +msgstr "lit útbreidingen sjen..." + +msgid "view recordings..." +msgstr "lit opname triemen sjen..." + +msgid "wait for ci..." +msgstr "wachtsje op ci..." + +msgid "wait for mmi..." +msgstr "wachtsje op mmi" + +msgid "waiting" +msgstr "oan it wachtsjen" + +msgid "weekly" +msgstr "wikeliks" + +msgid "whitelist" +msgstr "wyte lyst" + +msgid "year" +msgstr "jier" + +msgid "yellow" +msgstr "" + +msgid "yes" +msgstr "ja" + +msgid "yes (keep feeds)" +msgstr "ja (feeds hâlde)" + +msgid "" +"your dreambox might be unusable now. Please consult the manual for further " +"assistance before rebooting your dreambox." +msgstr "" +"jo Dreambox is miskien no net brûkber. sjoch yn de hanlieding foar jo jo " +"Dreambox opnij starte." + +msgid "zap" +msgstr "knip" + +msgid "zapped" +msgstr "knipt" -- cgit v1.2.3 From 9846407eaa878cb717ae15faba55a13079b2c212 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 1 Dec 2008 20:30:11 +0100 Subject: graphmultiepg: fix crash when press red on channel without epg --- lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py index 1af90f13..7f422c96 100644 --- a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py +++ b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py @@ -489,7 +489,8 @@ class GraphMultiEPG(Screen): if self.zapFunc and self["key_red"].getText() == "Zap": self.closeRecursive = True ref = self["list"].getCurrent()[1] - self.zapFunc(ref.ref) + if ref: + self.zapFunc(ref.ref) def eventSelected(self): self.infoKeyPressed() -- cgit v1.2.3 From 34c1ccf6eaef6f2e8535cb3c0cbe6390835086ef Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 1 Dec 2008 20:30:34 +0100 Subject: graphmultiepg: also show plugin in extensions menu --- lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py b/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py index 21d1bfe8..0ebcafca 100644 --- a/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py +++ b/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py @@ -93,4 +93,5 @@ def main(session, servicelist, **kwargs): def Plugins(**kwargs): name = _("Graphical Multi EPG") descr = _("A graphical EPG for all services of an specific bouquet") - return [ PluginDescriptor(name=name, description=descr, where = PluginDescriptor.WHERE_EVENTINFO, fnc=main) ] + return [ PluginDescriptor(name=name, description=descr, where = PluginDescriptor.WHERE_EVENTINFO, fnc=main), + PluginDescriptor(name=name, description=descr, where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=main) ] -- cgit v1.2.3 From 4030160e538a616edfd896c5cf6481bb458aaabe Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 2 Dec 2008 00:07:43 +0100 Subject: fix disc handling for /dev/discs/disc in fstab ... --- lib/python/Components/Harddisk.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index f7c3a7cb..febd16dd 100644 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -19,20 +19,22 @@ class Harddisk: s_minor = int(tmp[1]) for disc in listdir("/dev/discs"): path = readlink('/dev/discs/'+disc) - devidex = '/dev'+path[2:]+'/' - disc = devidex+'disc' + devidex = '/dev/discs/'+disc+'/' + devidex2 = '/dev'+path[2:]+'/' + disc = devidex2+'disc' ret = stat(disc).st_rdev if s_major == major(ret) and s_minor == minor(ret): self.devidex = devidex - print "new Harddisk", device, self.devidex + self.devidex2 = devidex2 + print "new Harddisk", device, '->', self.devidex, '->', self.devidex2 break def __lt__(self, ob): return self.device < ob.device def bus(self): - ide_cf = self.device.find("hd") == 0 and self.devidex.find("host0") == -1 # 7025 specific - internal = self.device.find("hd") == 0 and self.devidex + ide_cf = self.device.find("hd") == 0 and self.devidex2.find("host0") == -1 # 7025 specific + internal = self.device.find("hd") == 0 if ide_cf: ret = "External (CF)" elif internal: -- cgit v1.2.3 From 819285a4572823e343f0d1ab88e2c68c2caf2677 Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 2 Dec 2008 00:14:00 +0100 Subject: add "divx" as known file extension --- lib/python/Components/FileList.py | 1 + lib/python/Plugins/Extensions/MediaPlayer/plugin.py | 2 +- lib/service/servicemp3.cpp | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Components/FileList.py b/lib/python/Components/FileList.py index e028ec3a..231fde2f 100644 --- a/lib/python/Components/FileList.py +++ b/lib/python/Components/FileList.py @@ -21,6 +21,7 @@ EXTENSIONS = { "bmp": "picture", "ts": "movie", "avi": "movie", + "divx": "movie", "mpg": "movie", "mpeg": "movie", "mkv": "movie", diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index 607294ba..41e6ad18 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -110,7 +110,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB # 'None' is magic to start at the list of mountpoints defaultDir = config.mediaplayer.defaultDir.getValue() - self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|mkv|mp4|dat|flac)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") + self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|mkv|mp4|dat|flac|divx)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self.playlist = MyPlayList() diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 017c58f0..9c1972d7 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -37,6 +37,7 @@ eServiceFactoryMP3::eServiceFactoryMP3() extensions.push_back("wave"); extensions.push_back("mkv"); extensions.push_back("avi"); + extensions.push_back("divx"); extensions.push_back("dat"); extensions.push_back("flac"); extensions.push_back("mp4"); @@ -207,7 +208,7 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp sourceinfo.containertype = ctMPEGTS; else if ( strcasecmp(ext, ".mkv") == 0 ) sourceinfo.containertype = ctMKV; - else if ( strcasecmp(ext, ".avi") == 0 ) + else if ( strcasecmp(ext, ".avi") == 0 || strcasecmp(ext, ".divx") == 0) sourceinfo.containertype = ctAVI; else if ( strcasecmp(ext, ".mp4") == 0 ) sourceinfo.containertype = ctMP4; -- cgit v1.2.3 From a9f7393e1d00eb89b8282aae0ddc4f6da33d9ca1 Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 2 Dec 2008 15:16:49 +0100 Subject: add new after record timer event behavior "auto".. and use it as default --- Navigation.py | 4 ++-- RecordTimer.py | 29 ++++++++++++++++++++++++++--- lib/python/Screens/TimerEntry.py | 16 +++++++++++++--- 3 files changed, 41 insertions(+), 8 deletions(-) (limited to 'lib/python') diff --git a/Navigation.py b/Navigation.py index 42733cb2..715e886b 100644 --- a/Navigation.py +++ b/Navigation.py @@ -11,7 +11,7 @@ import ServiceReference # TODO: remove pNavgation, eNavigation and rewrite this stuff in python. class Navigation: - def __init__(self): + def __init__(self, nextRecordTimerAfterEventActionAuto=False): if NavigationInstance.instance is not None: raise NavigationInstance.instance @@ -33,7 +33,7 @@ class Navigation: clearFPWasTimerWakeup() if getFPWasTimerWakeup(): # sanity check to detect if the FP driver is working correct! print "buggy fp driver detected!!! please update drivers.... ignore timer wakeup!" - elif len(self.getRecordings()) or abs(self.RecordTimer.getNextRecordingTime() - time()) <= 360: + elif nextRecordTimerAfterEventActionAuto and (len(self.getRecordings()) or abs(self.RecordTimer.getNextRecordingTime() - time()) <= 360): if not Screens.Standby.inTryQuitMainloop: # not a shutdown messagebox is open RecordTimer.RecordTimerEntry.TryQuitMainloop(False) # start shutdown handling self.SleepTimer = SleepTimer.SleepTimer() diff --git a/RecordTimer.py b/RecordTimer.py index 28b878a1..cac475d6 100644 --- a/RecordTimer.py +++ b/RecordTimer.py @@ -47,6 +47,7 @@ class AFTEREVENT: NONE = 0 STANDBY = 1 DEEPSTANDBY = 2 + AUTO = 3 # please do not translate log messages class RecordTimerEntry(timer.TimerEntry, object): @@ -91,7 +92,7 @@ class RecordTimerEntry(timer.TimerEntry, object): Notifications.AddNotification(Screens.Standby.TryQuitMainloop, 1, onSessionOpenCallback=RecordTimerEntry.stopTryQuitMainloop, default_yes = default_yes) ################################################################# - def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.NONE, checkOldTimers = False, dirname = None, tags = None): + def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.AUTO, checkOldTimers = False, dirname = None, tags = None): timer.TimerEntry.__init__(self, int(begin), int(end)) if checkOldTimers == True: @@ -361,7 +362,12 @@ def createTimer(xml): disabled = long(xml.getAttribute("disabled") or "0") justplay = long(xml.getAttribute("justplay") or "0") afterevent = str(xml.getAttribute("afterevent") or "nothing") - afterevent = { "nothing": AFTEREVENT.NONE, "standby": AFTEREVENT.STANDBY, "deepstandby": AFTEREVENT.DEEPSTANDBY }[afterevent] + afterevent = { + "nothing": AFTEREVENT.NONE, + "standby": AFTEREVENT.STANDBY, + "deepstandby": AFTEREVENT.DEEPSTANDBY, + "auto": AFTEREVENT.AUTO + }[afterevent] if xml.hasAttribute("eit") and xml.getAttribute("eit") != "None": eit = long(xml.getAttribute("eit")) else: @@ -493,7 +499,12 @@ class RecordTimer(timer.Timer): list.append(' repeated="' + str(int(timer.repeated)) + '"') list.append(' name="' + str(stringToXML(timer.name)) + '"') list.append(' description="' + str(stringToXML(timer.description)) + '"') - list.append(' afterevent="' + str(stringToXML({ AFTEREVENT.NONE: "nothing", AFTEREVENT.STANDBY: "standby", AFTEREVENT.DEEPSTANDBY: "deepstandby" }[timer.afterEvent])) + '"') + list.append(' afterevent="' + str(stringToXML({ + AFTEREVENT.NONE: "nothing", + AFTEREVENT.STANDBY: "standby", + AFTEREVENT.DEEPSTANDBY: "deepstandby", + AFTEREVENT.AUTO: "auto" + }[timer.afterEvent])) + '"') if timer.eit is not None: list.append(' eit="' + str(timer.eit) + '"') if timer.dirname is not None: @@ -538,6 +549,18 @@ class RecordTimer(timer.Timer): return timer.begin return -1 + def isNextRecordAfterEventActionAuto(self): + now = time.time() + t = None + for timer in self.timer_list: + if timer.justplay or timer.begin < now: + continue + if t is None or t.begin == timer.begin: + t = timer + if t.afterEvent == AFTEREVENT.AUTO: + return True + return False + def record(self, entry, ignoreTSC=False, dosave=True): #wird von loadTimer mit dosave=False aufgerufen timersanitycheck = TimerSanityCheck(self.timer_list,entry) if not timersanitycheck.check(): diff --git a/lib/python/Screens/TimerEntry.py b/lib/python/Screens/TimerEntry.py index 1774061d..be8b5240 100644 --- a/lib/python/Screens/TimerEntry.py +++ b/lib/python/Screens/TimerEntry.py @@ -46,7 +46,12 @@ class TimerEntry(Screen, ConfigListScreen): def createConfig(self): justplay = self.timer.justplay - afterevent = { AFTEREVENT.NONE: "nothing", AFTEREVENT.DEEPSTANDBY: "deepstandby", AFTEREVENT.STANDBY: "standby"}[self.timer.afterEvent] + afterevent = { + AFTEREVENT.NONE: "nothing", + AFTEREVENT.DEEPSTANDBY: "deepstandby", + AFTEREVENT.STANDBY: "standby", + AFTEREVENT.AUTO: "auto" + }[self.timer.afterEvent] weekday_table = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"] @@ -84,7 +89,7 @@ class TimerEntry(Screen, ConfigListScreen): day[weekday] = 1 self.timerentry_justplay = ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "zap"}[justplay]) - self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby"))], default = afterevent) + self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby")), ("auto", _("auto"))], default = afterevent) self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type) self.timerentry_name = ConfigText(default = self.timer.name, visible_width = 50, fixed_size = False) self.timerentry_description = ConfigText(default = self.timer.description, visible_width = 50, fixed_size = False) @@ -250,7 +255,12 @@ class TimerEntry(Screen, ConfigListScreen): self.timer.description = self.timerentry_description.value self.timer.justplay = self.timerentry_justplay.value == "zap" self.timer.resetRepeated() - self.timer.afterEvent = {"nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY}[self.timerentry_afterevent.value] + self.timer.afterEvent = { + "nothing": AFTEREVENT.NONE, + "deepstandby": AFTEREVENT.DEEPSTANDBY, + "standby": AFTEREVENT.STANDBY, + "auto": AFTEREVENT.AUTO + }[self.timerentry_afterevent.value] self.timer.service_ref = self.timerentry_service_ref self.timer.tags = self.timerentry_tags -- cgit v1.2.3 From 0a2edb202a5a94dc97d016457b841b1eb7df1f02 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Wed, 3 Dec 2008 12:04:12 +0100 Subject: allow hardware playback of M4A (AAC) and MP3 audio streams. --- .../Plugins/Extensions/MediaPlayer/plugin.py | 2 +- lib/service/servicemp3.cpp | 254 ++++++++++++++++----- 2 files changed, 192 insertions(+), 64 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index 41e6ad18..3d1889b9 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -110,7 +110,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB # 'None' is magic to start at the list of mountpoints defaultDir = config.mediaplayer.defaultDir.getValue() - self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|mkv|mp4|dat|flac|divx)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") + self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|mkv|mp4|m4a|dat|flac)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self.playlist = MyPlayList() diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 9c1972d7..2d217731 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -16,7 +16,6 @@ #include /* for subtitles */ #include -#include // eServiceFactoryMP3 @@ -41,6 +40,7 @@ eServiceFactoryMP3::eServiceFactoryMP3() extensions.push_back("dat"); extensions.push_back("flac"); extensions.push_back("mp4"); + extensions.push_back("m4a"); sc->addServiceFactory(eServiceFactoryMP3::id, this, extensions); } @@ -186,10 +186,8 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp CONNECT(m_seekTimeout->timeout, eServiceMP3::seekTimeoutCB); CONNECT(m_pump.recv_msg, eServiceMP3::gstPoll); GstElement *source = 0; - - GstElement *decoder = 0, *conv = 0, *flt = 0, *sink = 0; /* for audio */ - - GstElement *audio = 0, *switch_audio = 0, *queue_audio = 0, *video = 0, *queue_video = 0, *videodemux = 0; + GstElement *decoder = 0, *conv = 0, *flt = 0, *parser = 0, *sink = 0; /* for audio */ + GstElement *audio = 0, *switch_audio = 0, *queue_audio = 0, *video = 0, *queue_video = 0, *videodemux = 0, *audiodemux = 0; m_state = stIdle; eDebug("SERVICEMP3 construct!"); @@ -202,25 +200,50 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp ext = filename; sourceStream sourceinfo; + sourceinfo.is_video = FALSE; + sourceinfo.audiotype = atUnknown; if ( (strcasecmp(ext, ".mpeg") && strcasecmp(ext, ".mpg") && strcasecmp(ext, ".vob") && strcasecmp(ext, ".bin") && strcasecmp(ext, ".dat") ) == 0 ) + { sourceinfo.containertype = ctMPEGPS; + sourceinfo.is_video = TRUE; + } else if ( strcasecmp(ext, ".ts") == 0 ) + { sourceinfo.containertype = ctMPEGTS; + sourceinfo.is_video = TRUE; + } else if ( strcasecmp(ext, ".mkv") == 0 ) + { sourceinfo.containertype = ctMKV; + sourceinfo.is_video = TRUE; + } else if ( strcasecmp(ext, ".avi") == 0 || strcasecmp(ext, ".divx") == 0) + { sourceinfo.containertype = ctAVI; + sourceinfo.is_video = TRUE; + } else if ( strcasecmp(ext, ".mp4") == 0 ) + { sourceinfo.containertype = ctMP4; + sourceinfo.is_video = TRUE; + } + else if ( strcasecmp(ext, ".m4a") == 0 ) + { + sourceinfo.containertype = ctMP4; + sourceinfo.audiotype = atAAC; + } + else if ( strcasecmp(ext, ".mp3") == 0 ) + sourceinfo.audiotype = atMP3; else if ( (strncmp(filename, "/autofs/", 8) || strncmp(filename+strlen(filename)-13, "/track-", 7) || strcasecmp(ext, ".wav")) == 0 ) sourceinfo.containertype = ctCDA; if ( strcasecmp(ext, ".dat") == 0 ) + { sourceinfo.containertype = ctVCD; + sourceinfo.is_video = TRUE; + } if ( (strncmp(filename, "http://", 7)) == 0 ) sourceinfo.is_streaming = TRUE; - sourceinfo.is_video = ( sourceinfo.containertype && sourceinfo.containertype != ctCDA ); - eDebug("filename=%s, containertype=%d, is_video=%d, is_streaming=%d", filename, sourceinfo.containertype, sourceinfo.is_video, sourceinfo.is_streaming); int all_ok = 0; @@ -252,10 +275,19 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp if (track > 0) g_object_set (G_OBJECT (source), "track", track, NULL); } - else - sourceinfo.containertype = ctNone; } - if ( !sourceinfo.is_streaming && sourceinfo.containertype != ctCDA ) + else if ( sourceinfo.containertype == ctVCD ) + { + int fd = open(filename,O_RDONLY); + char tmp[128*1024]; + int ret = read(fd, tmp, 128*1024); + close(fd); + if ( ret == -1 ) // this is a "REAL" VCD + source = gst_element_factory_make ("vcdsrc", "vcd-source"); + if (source) + g_object_set (G_OBJECT (source), "device", "/dev/cdroms/cdrom0", NULL); + } + if ( !source && !sourceinfo.is_streaming ) { source = gst_element_factory_make ("filesrc", "file-source"); if (source) @@ -271,7 +303,7 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp audio = gst_element_factory_make("dvbaudiosink", "audiosink"); if (!audio) m_error_message += "failed to create Gstreamer element dvbaudiosink\n"; - + video = gst_element_factory_make("dvbvideosink", "videosink"); if (!video) m_error_message += "failed to create Gstreamer element dvbvideosink\n"; @@ -322,35 +354,102 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp } } else /* is audio */ { - - /* filesrc -> decodebin -> audioconvert -> capsfilter -> alsasink */ - decoder = gst_element_factory_make ("decodebin", "decoder"); - if (!decoder) - m_error_message += "failed to create Gstreamer element decodebin\n"; - - conv = gst_element_factory_make ("audioconvert", "converter"); - if (!conv) - m_error_message += "failed to create Gstreamer element audioconvert\n"; - - flt = gst_element_factory_make ("capsfilter", "flt"); - if (!flt) - m_error_message += "failed to create Gstreamer element capsfilter\n"; - - /* for some reasons, we need to set the sample format to depth/width=16, because auto negotiation doesn't work. */ - /* endianness, however, is not required to be set anymore. */ - if (flt) + std::string demux_type; + switch ( sourceinfo.containertype ) { - GstCaps *caps = gst_caps_new_simple("audio/x-raw-int", /* "endianness", G_TYPE_INT, 4321, */ "depth", G_TYPE_INT, 16, "width", G_TYPE_INT, 16, /*"channels", G_TYPE_INT, 2, */NULL); - g_object_set (G_OBJECT (flt), "caps", caps, NULL); - gst_caps_unref(caps); + case ctMP4: + demux_type = "qtdemux"; + break; + default: + break; + } + if ( demux_type.length() ) + { + audiodemux = gst_element_factory_make(demux_type.c_str(), "audiodemux"); + if (!audiodemux) + m_error_message = "GStreamer plugin " + demux_type + " not available!\n"; + } + switch ( sourceinfo.audiotype ) + { + case atMP3: + { + if ( !audiodemux ) + { + parser = gst_element_factory_make("mp3parse", "audioparse"); + if (!parser) + { + m_error_message += "failed to create Gstreamer element mp3parse\n"; + break; + } + } + sink = gst_element_factory_make("dvbaudiosink", "audiosink"); + if ( !sink ) + m_error_message += "failed to create Gstreamer element dvbaudiosink\n"; + else + all_ok = 1; + break; + } + case atAAC: + { + if ( !audiodemux ) + { + m_error_message += "cannot parse raw AAC audio\n"; + break; + } + sink = gst_element_factory_make("dvbaudiosink", "audiosink"); + if (!sink) + m_error_message += "failed to create Gstreamer element dvbaudiosink\n"; + else + all_ok = 1; + break; + } + case atAC3: + { + if ( !audiodemux ) + { + m_error_message += "cannot parse raw AC3 audio\n"; + break; + } + sink = gst_element_factory_make("dvbaudiosink", "audiosink"); + if ( !sink ) + m_error_message += "failed to create Gstreamer element dvbaudiosink\n"; + else + all_ok = 1; + break; + } + default: + { /* filesrc -> decodebin -> audioconvert -> capsfilter -> alsasink */ + decoder = gst_element_factory_make ("decodebin", "decoder"); + if (!decoder) + m_error_message += "failed to create Gstreamer element decodebin\n"; + + conv = gst_element_factory_make ("audioconvert", "converter"); + if (!conv) + m_error_message += "failed to create Gstreamer element audioconvert\n"; + + flt = gst_element_factory_make ("capsfilter", "flt"); + if (!flt) + m_error_message += "failed to create Gstreamer element capsfilter\n"; + + /* for some reasons, we need to set the sample format to depth/width=16, because auto negotiation doesn't work. */ + /* endianness, however, is not required to be set anymore. */ + if (flt) + { + GstCaps *caps = gst_caps_new_simple("audio/x-raw-int", /* "endianness", G_TYPE_INT, 4321, */ "depth", G_TYPE_INT, 16, "width", G_TYPE_INT, 16, /*"channels", G_TYPE_INT, 2, */NULL); + g_object_set (G_OBJECT (flt), "caps", caps, NULL); + gst_caps_unref(caps); + } + + sink = gst_element_factory_make ("alsasink", "alsa-output"); + if (!sink) + m_error_message += "failed to create Gstreamer element alsasink\n"; + + if (source && decoder && conv && sink) + all_ok = 1; + break; + } } - sink = gst_element_factory_make ("alsasink", "alsa-output"); - if (!sink) - m_error_message += "failed to create Gstreamer element alsasink\n"; - - if (source && decoder && conv && sink) - all_ok = 1; } if (m_gst_pipeline && all_ok) { @@ -386,8 +485,9 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp } gst_bin_add_many(GST_BIN(m_gst_pipeline), source, videodemux, audio, queue_audio, video, queue_video, switch_audio, NULL); - if ( sourceinfo.containertype == ctVCD ) + if ( sourceinfo.containertype == ctVCD && gst_bin_get_by_name(GST_BIN(m_gst_pipeline),"file-source") ) { + eDebug("this is a fake video cd... we use filesrc ! cdxaparse !"); GstElement *cdxaparse = gst_element_factory_make("cdxaparse", "cdxaparse"); gst_bin_add(GST_BIN(m_gst_pipeline), cdxaparse); gst_element_link(source, cdxaparse); @@ -403,29 +503,51 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp } else /* is audio*/ { - queue_audio = gst_element_factory_make("queue", "queue_audio"); - - g_signal_connect (decoder, "new-decoded-pad", G_CALLBACK(gstCBnewPad), this); - g_signal_connect (decoder, "unknown-type", G_CALLBACK(gstCBunknownType), this); - - g_object_set (G_OBJECT (sink), "preroll-queue-len", 80, NULL); - - /* gst_bin will take the 'floating references' */ - gst_bin_add_many (GST_BIN (m_gst_pipeline), - source, queue_audio, decoder, NULL); - - /* in decodebin's case we can just connect the source with the decodebin, and decodebin will take care about id3demux (or whatever is required) */ - gst_element_link_many(source, queue_audio, decoder, NULL); - - /* create audio bin with the audioconverter, the capsfilter and the audiosink */ - audio = gst_bin_new ("audiobin"); - - GstPad *audiopad = gst_element_get_static_pad (conv, "sink"); - gst_bin_add_many(GST_BIN(audio), conv, flt, sink, NULL); - gst_element_link_many(conv, flt, sink, NULL); - gst_element_add_pad(audio, gst_ghost_pad_new ("sink", audiopad)); - gst_object_unref(audiopad); - gst_bin_add (GST_BIN(m_gst_pipeline), audio); + if ( decoder ) + { + queue_audio = gst_element_factory_make("queue", "queue_audio"); + + g_signal_connect (decoder, "new-decoded-pad", G_CALLBACK(gstCBnewPad), this); + g_signal_connect (decoder, "unknown-type", G_CALLBACK(gstCBunknownType), this); + + g_object_set (G_OBJECT (sink), "preroll-queue-len", 80, NULL); + + /* gst_bin will take the 'floating references' */ + gst_bin_add_many (GST_BIN (m_gst_pipeline), + source, queue_audio, decoder, NULL); + + /* in decodebin's case we can just connect the source with the decodebin, and decodebin will take care about id3demux (or whatever is required) */ + gst_element_link_many(source, queue_audio, decoder, NULL); + + /* create audio bin with the audioconverter, the capsfilter and the audiosink */ + audio = gst_bin_new ("audiobin"); + + GstPad *audiopad = gst_element_get_static_pad (conv, "sink"); + gst_bin_add_many(GST_BIN(audio), conv, flt, sink, NULL); + gst_element_link_many(conv, flt, sink, NULL); + gst_element_add_pad(audio, gst_ghost_pad_new ("sink", audiopad)); + gst_object_unref(audiopad); + gst_bin_add (GST_BIN(m_gst_pipeline), audio); + } + else + { + gst_bin_add_many (GST_BIN (m_gst_pipeline), source, sink, NULL); + if ( parser ) + { + gst_bin_add (GST_BIN (m_gst_pipeline), parser); + gst_element_link_many(source, parser, sink, NULL); + } + if ( audiodemux ) + { + gst_bin_add (GST_BIN (m_gst_pipeline), audiodemux); + g_signal_connect(audiodemux, "pad-added", G_CALLBACK (gstCBpadAdded), this); + gst_element_link(source, audiodemux); + eDebug("linked source, audiodemux, sink"); + } + audioStream audio; + audio.type = sourceinfo.audiotype; + m_audioStreams.push_back(audio); + } } } else { @@ -1094,8 +1216,14 @@ void eServiceMP3::gstCBpadAdded(GstElement *decodebin, GstPad *pad, gpointer use } else { - gst_pad_link(pad, gst_element_get_static_pad(gst_bin_get_by_name(pipeline,"queue_audio"), "sink")); - _this->m_audioStreams.push_back(audio); + GstElement *queue_audio = gst_bin_get_by_name(pipeline , "queue_audio"); + if ( queue_audio) + { + gst_pad_link(pad, gst_element_get_static_pad(queue_audio, "sink")); + _this->m_audioStreams.push_back(audio); + } + else + gst_pad_link(pad, gst_element_get_static_pad(gst_bin_get_by_name(pipeline , "audiosink"), "sink")); } } if (g_strrstr(type,"video")) -- cgit v1.2.3 From 7e94237a4e4ee40e1dff230d1760dcaaba3d90e8 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 3 Dec 2008 16:08:07 +0100 Subject: use cElementTree instead of minidom for xml parsing (thx to Moritz Venn) --- lib/python/Screens/InfoBarGenerics.py | 6 +-- lib/python/Screens/Menu.py | 71 +++++++++++++++-------------------- lib/python/Screens/Setup.py | 43 +++++++++------------ mytest.py | 26 +++++-------- tests/test_timer.py | 6 +-- 5 files changed, 65 insertions(+), 87 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index b923340c..af29ed4e 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -348,14 +348,14 @@ class InfoBarMenu: def mainMenu(self): print "loading mainmenu XML..." - menu = mdom.childNodes[0] - assert menu.tagName == "menu", "root element in menu must be 'menu'!" + menu = mdom.getroot() + assert menu.tag == "menu", "root element in menu must be 'menu'!" self.session.infobar = self # so we can access the currently active infobar from screens opened from within the mainmenu # at the moment used from the SubserviceSelection - self.session.openWithCallback(self.mainMenuClosed, MainMenu, menu, menu.childNodes) + self.session.openWithCallback(self.mainMenuClosed, MainMenu, menu) def mainMenuClosed(self, *val): self.session.infobar = None diff --git a/lib/python/Screens/Menu.py b/lib/python/Screens/Menu.py index 92039b42..93f23dfb 100644 --- a/lib/python/Screens/Menu.py +++ b/lib/python/Screens/Menu.py @@ -9,12 +9,10 @@ from Components.SystemInfo import SystemInfo from Tools.Directories import resolveFilename, SCOPE_SKIN -import xml.dom.minidom +import xml.etree.cElementTree from Screens.Setup import Setup, getSetupTitle -from Tools import XMLTools - # self.setModeTV() # self.setModeRadio() # self.setModeFile() @@ -22,9 +20,7 @@ from Tools import XMLTools # read the menu -menufile = file(resolveFilename(SCOPE_SKIN, 'menu.xml'), 'r') -mdom = xml.dom.minidom.parseString(menufile.read()) -menufile.close() +mdom = xml.etree.cElementTree.parse(resolveFilename(SCOPE_SKIN, 'menu.xml')) class boundFunction: def __init__(self, fnc, *args): @@ -103,17 +99,17 @@ class Menu(Screen): self.session.openWithCallback(self.menuClosed, Setup, dialog) def addMenu(self, destList, node): - requires = node.getAttribute("requires") + requires = node.get("requires") if requires and not SystemInfo.get(requires, False): return - MenuTitle = _(node.getAttribute("text").encode("UTF-8") or "??") - entryID = node.getAttribute("entryID") or "undefined" - weight = node.getAttribute("weight") or 50 - x = node.getAttribute("flushConfigOnClose") + MenuTitle = _(node.get("text", "??").encode("UTF-8")) + entryID = node.get("entryID", "undefined") + weight = node.get("weight", 50) + x = node.get("flushConfigOnClose") if x: - a = boundFunction(self.session.openWithCallback, self.menuClosedWithConfigFlush, Menu, node, node.childNodes) + a = boundFunction(self.session.openWithCallback, self.menuClosedWithConfigFlush, Menu, node) else: - a = boundFunction(self.session.openWithCallback, self.menuClosed, Menu, node, node.childNodes) + a = boundFunction(self.session.openWithCallback, self.menuClosed, Menu, node) #TODO add check if !empty(node.childNodes) destList.append((MenuTitle, a, entryID, weight)) @@ -126,18 +122,16 @@ class Menu(Screen): self.close(True) def addItem(self, destList, node): - requires = node.getAttribute("requires") + requires = node.get("requires") if requires and not SystemInfo.get(requires, False): return - item_text = node.getAttribute("text").encode("UTF-8") - entryID = node.getAttribute("entryID") or "undefined" - weight = node.getAttribute("weight") or 50 - for x in node.childNodes: - if x.nodeType != xml.dom.minidom.Element.nodeType: - continue - elif x.tagName == 'screen': - module = x.getAttribute("module") or None - screen = x.getAttribute("screen") or None + item_text = node.get("text", "").encode("UTF-8") + entryID = node.get("entryID", "undefined") + weight = node.get("weight", 50) + for x in node: + if x.tag == 'screen': + module = x.get("module") + screen = x.get("screen") if screen is None: screen = module @@ -150,16 +144,16 @@ class Menu(Screen): # check for arguments. they will be appended to the # openDialog call - args = XMLTools.mergeText(x.childNodes) + args = x.text or "" screen += ", " + args destList.append((_(item_text or "??"), boundFunction(self.runScreen, (module, screen)), entryID, weight)) return - elif x.tagName == 'code': - destList.append((_(item_text or "??"), boundFunction(self.execText, XMLTools.mergeText(x.childNodes)), entryID, weight)) + elif x.tag == 'code': + destList.append((_(item_text or "??"), boundFunction(self.execText, x.text), entryID, weight)) return - elif x.tagName == 'setup': - id = x.getAttribute("id") + elif x.tag == 'setup': + id = x.get("id") if item_text == "": item_text = _(getSetupTitle(id)) + "..." else: @@ -169,26 +163,23 @@ class Menu(Screen): destList.append((item_text, self.nothing, entryID, weight)) - def __init__(self, session, parent, childNode): + def __init__(self, session, parent): Screen.__init__(self, session) list = [] menuID = None - for x in childNode: #walk through the actual nodelist - if x.nodeType != xml.dom.minidom.Element.nodeType: - continue - elif x.tagName == 'item': - item_level = int(x.getAttribute("level") or "0") - + for x in parent: #walk through the actual nodelist + if x.tag == 'item': + item_level = int(x.get("level", 0)) if item_level <= config.usage.setup_level.index: self.addItem(list, x) count += 1 - elif x.tagName == 'menu': + elif x.tag == 'menu': self.addMenu(list, x) count += 1 - elif x.tagName == "id": - menuID = x.getAttribute("val") + elif x.tag == "id": + menuID = x.get("val") count = 0 if menuID is not None: @@ -237,10 +228,10 @@ class Menu(Screen): "9": self.keyNumberGlobal }) - a = parent.getAttribute("title").encode("UTF-8") or None + a = parent.get("title", "").encode("UTF-8") or None a = a and _(a) if a is None: - a = _(parent.getAttribute("text").encode("UTF-8")) + a = _(parent.get("text", "").encode("UTF-8")) self["title"] = StaticText(a) self.menu_title = a diff --git a/lib/python/Screens/Setup.py b/lib/python/Screens/Setup.py index 3ff0b76e..35918b5b 100644 --- a/lib/python/Screens/Setup.py +++ b/lib/python/Screens/Setup.py @@ -6,8 +6,7 @@ from Components.ConfigList import ConfigListScreen from Components.Label import Label from Components.Pixmap import Pixmap -import xml.dom.minidom -from Tools import XMLTools +import xml.etree.cElementTree # FIXME: use resolveFile! # read the setupmenu @@ -17,7 +16,7 @@ try: except: # if not found in the current path, we use the global datadir-path setupfile = file('/usr/share/enigma2/setup.xml', 'r') -setupdom = xml.dom.minidom.parseString(setupfile.read()) +setupdom = xml.etree.cElementTree.parse(setupfile) setupfile.close() class SetupSummary(Screen): @@ -63,16 +62,12 @@ class Setup(ConfigListScreen, Screen): self["config"].setList(list) def refill(self, list): - xmldata = setupdom.childNodes[0] - entries = xmldata.childNodes - for x in entries: #walk through the actual nodelist - if x.nodeType != xml.dom.minidom.Element.nodeType: + xmldata = setupdom.getroot() + for x in xmldata.findall("setup"): + if x.get("key") != self.setup: continue - elif x.tagName == 'setup': - if x.getAttribute("key") != self.setup: - continue - self.addItems(list, x.childNodes); - self.setup_title = x.getAttribute("title").encode("UTF-8") + self.addItems(list, x); + self.setup_title = x.get("title", "").encode("UTF-8") def __init__(self, session, setup): Screen.__init__(self, session) @@ -118,12 +113,10 @@ class Setup(ConfigListScreen, Screen): def createSummary(self): return SetupSummary - def addItems(self, list, childNode): - for x in childNode: - if x.nodeType != xml.dom.minidom.Element.nodeType: - continue - elif x.tagName == 'item': - item_level = int(x.getAttribute("level") or "0") + def addItems(self, list, parentNode): + for x in parentNode: + if x.tag == 'item': + item_level = int(x.get("level", 0)) if not self.levelChanged in config.usage.setup_level.notifiers: config.usage.setup_level.notifiers.append(self.levelChanged) @@ -132,12 +125,12 @@ class Setup(ConfigListScreen, Screen): if item_level > config.usage.setup_level.index: continue - requires = x.getAttribute("requires") + requires = x.get("requires") if requires and not SystemInfo.get(requires, False): continue; - item_text = _(x.getAttribute("text").encode("UTF-8") or "??") - b = eval(XMLTools.mergeText(x.childNodes)); + item_text = _(x.get("text", "??").encode("UTF-8")) + b = eval(x.text or ""); if b == "": continue #add to configlist @@ -148,8 +141,8 @@ class Setup(ConfigListScreen, Screen): list.append( (item_text, item) ) def getSetupTitle(id): - xmldata = setupdom.childNodes[0].childNodes - for x in XMLTools.elementsWithTag(xmldata, "setup"): - if x.getAttribute("key") == id: - return x.getAttribute("title").encode("UTF-8") + xmldata = setupdom.getroot() + for x in xmldata.findall("setup"): + if x.get("key") == id: + return x.get("title", "").encode("UTF-8") raise "unknown setup id '%s'!" % repr(id) diff --git a/mytest.py b/mytest.py index 886efab2..014f94c9 100644 --- a/mytest.py +++ b/mytest.py @@ -321,7 +321,6 @@ class Session: profile("Standby,PowerKey") import Screens.Standby from Screens.Menu import MainMenu, mdom -import xml.dom.minidom from GlobalActions import globalActionMap class PowerKey: @@ -350,21 +349,16 @@ class PowerKey: self.shutdown() elif action == "show_menu": print "Show shutdown Menu" - menu = mdom.childNodes[0] - for x in menu.childNodes: - if x.nodeType != xml.dom.minidom.Element.nodeType: - continue - elif x.tagName == 'menu': - for y in x.childNodes: - if y.nodeType != xml.dom.minidom.Element.nodeType: - continue - elif y.tagName == 'id': - id = y.getAttribute("val") - if id and id == "shutdown": - self.session.infobar = self - menu_screen = self.session.openWithCallback(self.MenuClosed, MainMenu, x, x.childNodes) - menu_screen.setTitle(_("Standby / Restart")) - return + root = mdom.getroot() + for x in root.findall("menu"): + y = x.find("id") + if y is not None: + id = y.get("val") + if id and id == "shutdown": + self.session.infobar = self + menu_screen = self.session.openWithCallback(self.MenuClosed, MainMenu, x) + menu_screen.setTitle(_("Standby / Restart")) + return def powerdown(self): self.standbyblocked = 0 diff --git a/tests/test_timer.py b/tests/test_timer.py index 565a838b..ea8b0bdb 100644 --- a/tests/test_timer.py +++ b/tests/test_timer.py @@ -24,10 +24,10 @@ def test_timer(repeat = 0, timer_start = 3600, timer_length = 1000, sim_length = # generate a timer to test - import xml.dom.minidom + import xml.etree.cElementTree import RecordTimer - timer = RecordTimer.createTimer(xml.dom.minidom.parseString( + timer = RecordTimer.createTimer(xml.etree.cElementTree.fromstring( """ """ % (at + timer_start, at + timer_start + timer_length, repeat) - ).childNodes[0]) + )) t.record(timer) -- cgit v1.2.3 From cc53ef67c6cfb594f1d30d1367210c0d3bc41d15 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 3 Dec 2008 17:20:48 +0100 Subject: show timer name in dialog when asking to remove it --- lib/python/Screens/TimerEdit.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Screens/TimerEdit.py b/lib/python/Screens/TimerEdit.py index aae345db..18ab2b79 100644 --- a/lib/python/Screens/TimerEdit.py +++ b/lib/python/Screens/TimerEdit.py @@ -199,9 +199,11 @@ class TimerEditList(Screen): self.updateState() def removeTimerQuestion(self): - if not self["timerlist"].getCurrent(): + cur = self["timerlist"].getCurrent() + if not cur: return - self.session.openWithCallback(self.removeTimer, MessageBox, _("Really delete this timer?")) + + self.session.openWithCallback(self.removeTimer, MessageBox, _("Do you really want to delete %s?") % (cur.name)) def removeTimer(self, result): if not result: -- cgit v1.2.3 From 2e5c13aebb389a6d74e4130658ccee6a863d01f6 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 3 Dec 2008 17:40:25 +0100 Subject: add possibility to change start/end time in timer edit with Vol/Bouquet +/- (thx to Moritz Venn) --- lib/python/Components/config.py | 28 ++++++++++++++++++++++++++++ lib/python/Screens/TimerEntry.py | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 3 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 4d57bbb9..d79337ba 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -604,6 +604,34 @@ class ConfigClock(ConfigSequence): t = time.localtime(default) ConfigSequence.__init__(self, seperator = ":", limits = [(0,23),(0,59)], default = [t.tm_hour, t.tm_min]) + def increment(self): + # Check if Minutes maxed out + if self._value[1] == 59: + # Check if Hours not maxed out + if self._value[0] < 23: + # Increment Hour, reset Minutes to 0 + self._value[0] += 1 + self._value[1] = 0 + else: + # Increment Minutes + self._value[1] += 1 + # Trigger change + self.changed() + + def decrement(self): + # Check if Minutes is minimum + if self._value[1] == 0: + # Check if Hour is greater than 0 + if self._value[0] > 0: + # Decrement Hour, set Minutes to 59 + self._value[0] -= 1 + self._value[1] = 59 + else: + # Decrement Minutes + self._value[1] -= 1 + # Trigger change + self.changed() + class ConfigInteger(ConfigSequence): def __init__(self, default, limits = (0, 9999999999)): ConfigSequence.__init__(self, seperator = ":", limits = [limits], default = default) diff --git a/lib/python/Screens/TimerEntry.py b/lib/python/Screens/TimerEntry.py index be8b5240..0544eff1 100644 --- a/lib/python/Screens/TimerEntry.py +++ b/lib/python/Screens/TimerEntry.py @@ -32,11 +32,15 @@ class TimerEntry(Screen, ConfigListScreen): self.createConfig() - self["actions"] = NumberActionMap(["SetupActions"], + self["actions"] = NumberActionMap(["SetupActions", "GlobalActions", "PiPSetupActions"], { "ok": self.keySelect, "save": self.keyGo, "cancel": self.keyCancel, + "volumeUp": self.incrementStart, + "volumeDown": self.decrementStart, + "size+": self.incrementEnd, + "size-": self.decrementEnd }, -2) self.list = [] @@ -160,9 +164,14 @@ class TimerEntry(Screen, ConfigListScreen): self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date) if self.timerentry_type.value == "once": self.list.append(self.entryDate) - self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime)) + + self.entryStartTime = getConfigListEntry(_("StartTime"), self.timerentry_starttime) + self.list.append(self.entryStartTime) if self.timerentry_justplay.value != "zap": - self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime)) + self.entryEndTime = getConfigListEntry(_("EndTime"), self.timerentry_endtime) + self.list.append(self.entryEndTime) + else: + self.entryEndTime = None self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service) self.list.append(self.channelEntry) @@ -319,6 +328,24 @@ class TimerEntry(Screen, ConfigListScreen): self.saveTimer() self.close((True, self.timer)) + def incrementStart(self): + self.timerentry_starttime.increment() + self["config"].invalidate(self.entryStartTime) + + def decrementStart(self): + self.timerentry_starttime.decrement() + self["config"].invalidate(self.entryStartTime) + + def incrementEnd(self): + if self.entryEndTime is not None: + self.timerentry_endtime.increment() + self["config"].invalidate(self.entryEndTime) + + def decrementEnd(self): + if self.entryEndTime is not None: + self.timerentry_endtime.decrement() + self["config"].invalidate(self.entryEndTime) + def subserviceSelected(self, service): if not service is None: self.timer.service_ref = ServiceReference(service[1]) -- cgit v1.2.3 From 4dda70dcac6996c8b0a2016c49d6cfbab7128fee Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Wed, 3 Dec 2008 17:53:18 +0100 Subject: initialize noCoverFile in case skin doesn't define it. thx to RitzMo --- lib/python/Plugins/Extensions/MediaPlayer/plugin.py | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index 3d1889b9..c25af780 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -44,6 +44,7 @@ class MediaPixmap(Pixmap): def applySkin(self, desktop, screen): from Tools.LoadPixmap import LoadPixmap + noCoverFile = None if self.skinAttributes is not None: for (attrib, value) in self.skinAttributes: if attrib == "pixmap": -- cgit v1.2.3 From 188224c032f898f7ddbb347839baba65550b5903 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 3 Dec 2008 18:05:47 +0100 Subject: GraphMultiEpg: fix zap to services without events --- lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py index 7f422c96..aff1c91d 100644 --- a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py +++ b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py @@ -93,13 +93,13 @@ class EPGList(HTMLComponent, GUIComponent): return event def getCurrent(self): - if self.cur_service is None or self.cur_event is None: + if self.cur_service is None: return ( None, None ) old_service = self.cur_service #(service, service_name, events) events = self.cur_service[2] refstr = self.cur_service[0] - if not events or not len(events): - return ( None, None ) + if self.cur_event is None or not events or not len(events): + return ( None, ServiceReference(refstr) ) event = events[self.cur_event] #(event_id, event_title, begin_time, duration) eventid = event[0] service = ServiceReference(refstr) -- cgit v1.2.3 From 1e1b651652e0f46bebc1c803e289fb84de222690 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 3 Dec 2008 19:05:33 +0100 Subject: GraphMultiEpg.py: better readable code (no functional change) --- .../Extensions/GraphMultiEPG/GraphMultiEpg.py | 26 ++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py index aff1c91d..441cb5d8 100644 --- a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py +++ b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py @@ -204,7 +204,13 @@ class EPGList(HTMLComponent, GUIComponent): def buildEntry(self, service, service_name, events): r1=self.service_rect r2=self.event_rect - res = [ None, MultiContentEntryText(pos = (r1.left(),r1.top()), size = (r1.width(), r1.height()), font = 0, flags = RT_HALIGN_LEFT | RT_VALIGN_CENTER, text = service_name, color = self.foreColorService, backcolor = self.backColorService) ] + res = [ None, MultiContentEntryText( + pos = (r1.left(),r1.top()), + size = (r1.width(), r1.height()), + font = 0, flags = RT_HALIGN_LEFT | RT_VALIGN_CENTER, + text = service_name, + color = self.foreColorService, + backcolor = self.backColorService) ] if events: start = self.time_base+self.offs*self.time_epoch*60 @@ -222,9 +228,16 @@ class EPGList(HTMLComponent, GUIComponent): for ev in events: #(event_id, event_title, begin_time, duration) rec=ev[2] and self.timer.isInTimer(ev[0], ev[2], ev[3], service) > ((ev[3]/10)*8) xpos, ewidth = self.calcEntryPosAndWidthHelper(ev[2], ev[3], start, end, width) - res.append(MultiContentEntryText(pos = (left+xpos, top), size = (ewidth, height), font = 1, flags = RT_HALIGN_CENTER | RT_VALIGN_CENTER | RT_WRAP, text = ev[1], color = foreColor, color_sel = foreColorSelected, backcolor = backColor, backcolor_sel = backColorSelected, border_width = 1, border_color = borderColor)) + res.append(MultiContentEntryText( + pos = (left+xpos, top), size = (ewidth, height), + font = 1, flags = RT_HALIGN_CENTER | RT_VALIGN_CENTER | RT_WRAP, + text = ev[1], color = foreColor, color_sel = foreColorSelected, + backcolor = backColor, backcolor_sel = backColorSelected, border_width = 1, border_color = borderColor)) if rec and ewidth > 23: - res.append(MultiContentEntryPixmapAlphaTest(pos = (left+xpos+ewidth-22, top+height-22), size = (21, 21), png = self.clock_pixmap, backcolor = backColor, backcolor_sel = backColorSelected)) + res.append(MultiContentEntryPixmapAlphaTest( + pos = (left+xpos+ewidth-22, top+height-22), size = (21, 21), + png = self.clock_pixmap, backcolor = backColor, + backcolor_sel = backColorSelected)) return res def selEntry(self, dir, visible=True): @@ -278,8 +291,13 @@ class EPGList(HTMLComponent, GUIComponent): self.time_base = int(stime) test = [ (service.ref.toString(), 0, self.time_base, self.time_epoch) for service in services ] test.insert(0, 'XRnITBD') + print "BEFORE:" + for x in test: + print x epg_data = self.queryEPG(test) - + print "EPG:" + for x in epg_data: + print x self.list = [ ] tmp_list = None service = "" -- cgit v1.2.3 From 282d9e86ee6942a5c557d25cce0899857fab78dd Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 3 Dec 2008 19:06:21 +0100 Subject: GraphMultiEpg/plugin.py: fix not working zap function when the bouquet is changed with bouquet +/- --- lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py b/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py index 0ebcafca..adb7015d 100644 --- a/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py +++ b/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py @@ -69,6 +69,7 @@ def changeBouquetCB(direction, epg): bouquet = bouquetSel.getCurrent() services = getBouquetServices(bouquet) if len(services): + global epg_bouquet epg_bouquet = bouquet epg.setServices(services) -- cgit v1.2.3 From bf85c027880227646227e9f4ffc658e81eae5c69 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Thu, 4 Dec 2008 11:18:09 +0100 Subject: allow callback-less ePopen --- lib/python/Components/Console.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'lib/python') diff --git a/lib/python/Components/Console.py b/lib/python/Components/Console.py index c5fa5f98..136d10d0 100644 --- a/lib/python/Components/Console.py +++ b/lib/python/Components/Console.py @@ -8,7 +8,7 @@ class Console(object): self.callbacks = {} self.extra_args = {} - def ePopen(self, cmd, callback, extra_args=[]): + def ePopen(self, cmd, callback=None, extra_args=[]): name = cmd i = 0 while self.appContainers.has_key(name): @@ -50,5 +50,6 @@ class Console(object): extra_args = self.extra_args[name] del self.appContainers[name] del self.extra_args[name] - self.callbacks[name](data,retval,extra_args) + if self.callbacks[name]: + self.callbacks[name](data,retval,extra_args) del self.callbacks[name] -- cgit v1.2.3 From e61975a7c2d349bcc5c372c3ca472ce8da28f6fc Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Thu, 4 Dec 2008 11:18:35 +0100 Subject: allow grabbing still frames from movies using seddis AiO Screengrabber V0.8 (needs package aio-grab) for graphical dvd menus --- lib/python/Plugins/Extensions/CutListEditor/plugin.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/CutListEditor/plugin.py b/lib/python/Plugins/Extensions/CutListEditor/plugin.py index 0d2454e4..c80bff18 100644 --- a/lib/python/Plugins/Extensions/CutListEditor/plugin.py +++ b/lib/python/Plugins/Extensions/CutListEditor/plugin.py @@ -12,6 +12,7 @@ from Components.GUIComponent import GUIComponent from enigma import eListboxPythonMultiContent, eListbox, gFont, iPlayableService, RT_HALIGN_RIGHT from Screens.FixedMenu import FixedMenu from Screens.HelpMenu import HelpableScreen +from ServiceReference import ServiceReference import bisect def CutListEntry(where, what): @@ -42,6 +43,7 @@ class CutListContextMenu(FixedMenu): RET_DELETEMARK = 4 RET_REMOVEBEFORE = 5 RET_REMOVEAFTER = 6 + RET_GRABFRAME = 7 SHOW_STARTCUT = 0 SHOW_ENDCUT = 1 @@ -75,6 +77,7 @@ class CutListContextMenu(FixedMenu): else: menu.append((_("remove this mark"), self.removeMark)) + menu.append((("grab this frame as bitmap"), self.grabFrame)) FixedMenu.__init__(self, session, _("Cut"), menu) self.skinName = "Menu" @@ -99,6 +102,8 @@ class CutListContextMenu(FixedMenu): def removeAfter(self): self.close(self.RET_REMOVEAFTER) + def grabFrame(self): + self.close(self.RET_GRABFRAME) class CutList(GUIComponent): def __init__(self, list): @@ -390,6 +395,8 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He # add 'out' point bisect.insort(self.cut_list, (self.context_position, 1)) self.uploadCuesheet() + elif result == CutListContextMenu.RET_GRABFRAME: + self.grabFrame() # we modify the "play" behavior a bit: # if we press pause while being in slowmotion, we will pause (and not play) @@ -399,6 +406,14 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He else: self.pauseService() + def grabFrame(self): + path = self.session.nav.getCurrentlyPlayingServiceReference().getPath() + from Components.Console import Console + grabConsole = Console() + cmd = 'grab -vblpr%d "%s"' % (180, path.rsplit('.',1)[0] + ".png") + grabConsole.ePopen(cmd) + self.playpauseService() + def main(session, service, **kwargs): session.open(CutListEditor, service) -- cgit v1.2.3 From c69c3febf1582fb1bd170bc4b04132354f574cfc Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Thu, 4 Dec 2008 11:20:12 +0100 Subject: allow fully customizable dvd menu layout, including automatic thumbnail graphic creation (requires package aio-grab) --- .../Plugins/Extensions/DVDBurn/DVDProject.py | 100 ++++++--- lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py | 10 +- .../Extensions/DVDBurn/DreamboxDVD.ddvdp.xml | 14 ++ .../DVDBurn/DreamboxDVDtemplate.ddvdp.xml | 23 -- lib/python/Plugins/Extensions/DVDBurn/Process.py | 249 +++++++++++++-------- .../Plugins/Extensions/DVDBurn/ProjectSettings.py | 34 ++- .../Extensions/DVDBurn/Text menu boat.ddvdm.xml | 35 +++ .../DVDBurn/Thumbs menu clouds.ddvdm.xml | 35 +++ .../Plugins/Extensions/DVDBurn/TitleCutter.py | 7 + lib/python/Plugins/Extensions/DVDBurn/TitleList.py | 4 +- .../Plugins/Extensions/DVDBurn/TitleProperties.py | 45 ++-- .../Plugins/Extensions/DVDBurn/dreamdvd_clouds.jpg | Bin 0 -> 62697 bytes lib/python/Plugins/Extensions/DVDBurn/dvdburn.png | Bin 13 files changed, 381 insertions(+), 175 deletions(-) create mode 100644 lib/python/Plugins/Extensions/DVDBurn/DreamboxDVD.ddvdp.xml delete mode 100644 lib/python/Plugins/Extensions/DVDBurn/DreamboxDVDtemplate.ddvdp.xml create mode 100644 lib/python/Plugins/Extensions/DVDBurn/Text menu boat.ddvdm.xml create mode 100644 lib/python/Plugins/Extensions/DVDBurn/Thumbs menu clouds.ddvdm.xml create mode 100644 lib/python/Plugins/Extensions/DVDBurn/dreamdvd_clouds.jpg mode change 100755 => 100644 lib/python/Plugins/Extensions/DVDBurn/dvdburn.png (limited to 'lib/python') diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py index 112a221e..b0b8197a 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py @@ -1,18 +1,10 @@ from Tools.Directories import fileExists -from Components.config import config, ConfigSubsection, ConfigInteger, ConfigText, ConfigSelection, getConfigListEntry, ConfigSequence +from Components.config import config, ConfigSubsection, ConfigInteger, ConfigText, ConfigSelection, getConfigListEntry, ConfigSequence, ConfigSubList class ConfigColor(ConfigSequence): def __init__(self): ConfigSequence.__init__(self, seperator = "#", limits = [(0,255),(0,255),(0,255)]) -class ConfigPixelvals(ConfigSequence): - def __init__(self): - ConfigSequence.__init__(self, seperator = ",", limits = [(0,200),(0,200),(0,200)]) - -class ConfigPixelvals(ConfigSequence): - def __init__(self): - ConfigSequence.__init__(self, seperator = ",", limits = [(0,200),(0,200),(0,200)]) - class ConfigFilename(ConfigText): def __init__(self): ConfigText.__init__(self, default = "", fixed_size = True, visible_width = False) @@ -35,19 +27,11 @@ class DVDProject: self.settings.titlesetmode = ConfigSelection(choices = [("single", _("Simple titleset (compatibility for legacy players)")), ("multi", _("Complex (allows mixing audio tracks and aspects)"))], default="multi") self.settings.output = ConfigSelection(choices = [("iso", _("Create DVD-ISO")), ("dvd", _("Burn DVD"))]) self.settings.isopath = ConfigText(fixed_size = False, visible_width = 40) - self.settings.dataformat = ConfigSelection(choices = [("iso9660_1", ("ISO9660 Level 1")), ("iso9660_4", ("ISO9660 version 2")), ("udf", ("UDF"))]) - self.settings.menubg = ConfigFilename() - self.settings.menuaudio = ConfigFilename() - self.settings.titleformat = ConfigText(fixed_size = False, visible_width = 40) - self.settings.subtitleformat = ConfigText(fixed_size = False, visible_width = 40) - self.settings.color_headline = ConfigColor() - self.settings.color_highlight = ConfigColor() - self.settings.color_button = ConfigColor() - self.settings.font_face = ConfigFilename() - self.settings.font_size = ConfigPixelvals() - self.settings.space = ConfigPixelvals() + self.settings.dataformat = ConfigSelection(choices = [("iso9660_1", ("ISO9660 Level 1")), ("iso9660_4", ("ISO9660 version 2")), ("udf", ("UDF"))]) + self.settings.menutemplate = ConfigFilename() self.settings.vmgm = ConfigFilename() - self.filekeys = ["vmgm", "menubg", "menuaudio", "font_face", "isopath"] + self.filekeys = ["vmgm", "isopath", "menutemplate"] + self.menutemplate = MenuTemplate() def addService(self, service): import DVDTitle @@ -65,12 +49,30 @@ class DVDProject: list.append('\t\n') + list.append('/>\n') list.append('\t\n') for title in self.titles: - list.append('\t\t') + list.append('\t\t\n') + list.append('\t\t\t<path>') list.append(stringToXML(title.source.getPath())) list.append('</path>\n') + list.append('\t\t\t<properties ') + audiotracks = [] + for key, val in title.properties.dict().iteritems(): + if type(val) is ConfigSubList: + audiotracks.append('\t\t\t<audiotracks>\n') + for audiotrack in val: + audiotracks.append('\t\t\t\t<audiotrack ') + for subkey, subval in audiotrack.dict().iteritems(): + audiotracks.append( subkey + '="' + str(subval.getValue()) + '" ' ) + audiotracks.append(' />\n') + audiotracks.append('\t\t\t</audiotracks>\n') + else: + list.append( key + '="' + str(val.getValue()) + '" ' ) + list.append('/>\n') + for line in audiotracks: + list.append(line) + list.append('\t\t\n') list.append('\t\n') list.append('\n') @@ -89,6 +91,13 @@ class DVDProject: return False return filename + def load(self, filename): + ret = self.loadProject(filename) + if ret: + ret = self.menutemplate.loadTemplate(self.settings.menutemplate.getValue()) + self.error += self.menutemplate.error + return ret + def loadProject(self, filename): import xml.dom.minidom try: @@ -105,9 +114,9 @@ class DVDProject: if project.nodeType == xml.dom.minidom.Element.nodeType: if project.tagName == 'settings': i = 0 - if project.attributes.length < 11: + if project.attributes.length < len(self.settings.dict()): self.error = "project attributes missing" - raise AttributeError + raise AttributeError while i < project.attributes.length: item = project.attributes.item(i) key = item.name.encode("utf-8") @@ -131,3 +140,44 @@ class DVDProject: self.error += (" in project '%s'") % (filename) return False return True + +class MenuTemplate(DVDProject): + def __init__(self): + self.settings = ConfigSubsection() + self.settings.titleformat = ConfigText(fixed_size = False, visible_width = 40) + self.settings.subtitleformat = ConfigText(fixed_size = False, visible_width = 40) + self.settings.menubg = ConfigFilename() + self.settings.menuaudio = ConfigFilename() + self.settings.dimensions = ConfigSequence(seperator = ',', default = [576,720], limits = [(352,720),(480,576)]) + self.settings.rows = ConfigInteger(default = 4, limits = (1, 10)) + self.settings.cols = ConfigInteger(default = 1, limits = (1, 4)) + self.settings.color_headline = ConfigColor() + self.settings.color_headline = ConfigColor() + self.settings.color_highlight = ConfigColor() + self.settings.color_button = ConfigColor() + self.settings.fontface_headline = ConfigFilename() + self.settings.fontface_title = ConfigFilename() + self.settings.fontface_subtitle = ConfigFilename() + self.settings.fontsize_headline = ConfigInteger(default = 46, limits = (0, 199)) + self.settings.fontsize_title = ConfigInteger(default = 24, limits = (0, 199)) + self.settings.fontsize_subtitle = ConfigInteger(default = 14, limits = (0, 199)) + self.settings.margin_top = ConfigInteger(default = 120, limits = (0, 500)) + self.settings.margin_bottom = ConfigInteger(default = 40, limits = (0, 500)) + self.settings.margin_left = ConfigInteger(default = 56, limits = (0, 500)) + self.settings.margin_right = ConfigInteger(default = 56, limits = (0, 500)) + self.settings.space_rows = ConfigInteger(default = 32, limits = (0, 500)) + self.settings.space_cols = ConfigInteger(default = 24, limits = (0, 500)) + self.settings.prev_page_text = ConfigText(default = "<<<", fixed_size = False) + self.settings.next_page_text = ConfigText(default = ">>>", fixed_size = False) + self.settings.offset_headline = ConfigSequence(seperator = ',', default = [0,0], limits = [(-1,500),(-1,500)]) + self.settings.offset_title = ConfigSequence(seperator = ',', default = [0,0], limits = [(-1,500),(-1,500)]) + self.settings.offset_subtitle = ConfigSequence(seperator = ',', default = [20,0], limits = [(-1,500),(-1,500)]) + self.settings.offset_thumb = ConfigSequence(seperator = ',', default = [40,0], limits = [(-1,500),(-1,500)]) + self.settings.thumb_size = ConfigSequence(seperator = ',', default = [200,158], limits = [(0,576),(-1,720)]) + self.settings.thumb_border = ConfigInteger(default = 2, limits = (0, 20)) + self.filekeys = ["menubg", "menuaudio", "fontface_headline", "fontface_title", "fontface_subtitle"] + + def loadTemplate(self, filename): + ret = DVDProject.loadProject(self, filename) + DVDProject.error = self.error + return ret diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py b/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py index b1c627aa..660005e6 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py @@ -51,11 +51,11 @@ class DVDTitle: self.length = info.getLength(service) def initDVDmenuText(self, project, track): - self.properties.menutitle.setValue(self.formatDVDmenuText(project.settings.titleformat.getValue(), track)) - self.properties.menusubtitle.setValue(self.formatDVDmenuText(project.settings.subtitleformat.getValue(), track)) + s = project.menutemplate.settings + self.properties.menutitle.setValue(self.formatDVDmenuText(s.titleformat.getValue(), track)) + self.properties.menusubtitle.setValue(self.formatDVDmenuText(s.subtitleformat.getValue(), track)) def formatDVDmenuText(self, template, track): - properties = self.properties template = template.replace("$i", str(track)) template = template.replace("$t", self.DVBname) template = template.replace("$d", self.DVBdescr) @@ -76,7 +76,7 @@ class DVDTitle: audiolist.append(trackstring) audiostring = ', '.join(audiolist) template = template.replace("$A", audiostring) - + if template.find("$l") >= 0: l = self.length lengthstring = "%d:%02d:%02d" % (l/3600, l%3600/60, l%60) @@ -90,7 +90,7 @@ class DVDTitle: else: template = template.replace("$Y", "").replace("$M", "").replace("$D", "").replace("$T", "") return template - + def produceFinalCuesheet(self): CUT_TYPE_IN = 0 CUT_TYPE_OUT = 1 diff --git a/lib/python/Plugins/Extensions/DVDBurn/DreamboxDVD.ddvdp.xml b/lib/python/Plugins/Extensions/DVDBurn/DreamboxDVD.ddvdp.xml new file mode 100644 index 00000000..2c35e531 --- /dev/null +++ b/lib/python/Plugins/Extensions/DVDBurn/DreamboxDVD.ddvdp.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/lib/python/Plugins/Extensions/DVDBurn/DreamboxDVDtemplate.ddvdp.xml b/lib/python/Plugins/Extensions/DVDBurn/DreamboxDVDtemplate.ddvdp.xml deleted file mode 100644 index 7d8de8ce..00000000 --- a/lib/python/Plugins/Extensions/DVDBurn/DreamboxDVDtemplate.ddvdp.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/lib/python/Plugins/Extensions/DVDBurn/Process.py b/lib/python/Plugins/Extensions/DVDBurn/Process.py index 750e9d9b..d0c9d3c6 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/Process.py +++ b/lib/python/Plugins/Extensions/DVDBurn/Process.py @@ -455,13 +455,13 @@ class ImagePrepareTask(Task): try: from ImageFont import truetype from Image import open as Image_open - s = self.job.project.settings + s = self.job.project.menutemplate.settings + (width, height) = s.dimensions.getValue() self.Menus.im_bg_orig = Image_open(s.menubg.getValue()) - if self.Menus.im_bg_orig.size != (self.Menus.imgwidth, self.Menus.imgheight): - self.Menus.im_bg_orig = self.Menus.im_bg_orig.resize((720, 576)) - self.Menus.fontsizes = s.font_size.getValue() - fontface = s.font_face.getValue() - self.Menus.fonts = [truetype(fontface, self.Menus.fontsizes[0]), truetype(fontface, self.Menus.fontsizes[1]), truetype(fontface, self.Menus.fontsizes[2])] + if self.Menus.im_bg_orig.size != (width, height): + self.Menus.im_bg_orig = self.Menus.im_bg_orig.resize((width, height)) + self.Menus.fontsizes = [s.fontsize_headline.getValue(), s.fontsize_title.getValue(), s.fontsize_subtitle.getValue()] + self.Menus.fonts = [(truetype(s.fontface_headline.getValue(), self.Menus.fontsizes[0])), (truetype(s.fontface_title.getValue(), self.Menus.fontsizes[1])),(truetype(s.fontface_subtitle.getValue(), self.Menus.fontsizes[2]))] Task.processFinished(self, 0) except: Task.processFinished(self, 1) @@ -480,98 +480,158 @@ class MenuImageTask(Task): def run(self, callback): self.callback = callback - try: - import ImageDraw, Image, os - s = self.job.project.settings - fonts = self.Menus.fonts - im_bg = self.Menus.im_bg_orig.copy() - im_high = Image.new("P", (self.Menus.imgwidth, self.Menus.imgheight), 0) - im_high.putpalette(self.Menus.spu_palette) - draw_bg = ImageDraw.Draw(im_bg) - draw_high = ImageDraw.Draw(im_high) - if self.menu_count == 1: - headline = s.name.getValue().decode("utf-8") - textsize = draw_bg.textsize(headline, font=fonts[0]) - if textsize[0] > self.Menus.imgwidth: - offset = (0 , 20) - else: - offset = (((self.Menus.imgwidth-textsize[0]) / 2) , 20) - draw_bg.text(offset, headline, fill=self.Menus.color_headline, font=fonts[0]) - spuxml = """ - - - """ % (self.highlightpngfilename, self.Menus.spu_palette[0], self.Menus.spu_palette[1], self.Menus.spu_palette[2]) - s_top, s_rows, s_left = s.space.getValue() - rowheight = (self.Menus.fontsizes[1]+self.Menus.fontsizes[2]+s_rows) - menu_start_title = (self.menu_count-1)*self.job.titles_per_menu + 1 - menu_end_title = (self.menu_count)*self.job.titles_per_menu + 1 - nr_titles = len(self.job.project.titles) - if menu_end_title > nr_titles: - menu_end_title = nr_titles+1 - menu_i = 0 - for title_no in range( menu_start_title , menu_end_title ): - menu_i += 1 - title = self.job.project.titles[title_no-1] - top = s_top + ( menu_i * rowheight ) - titleText = title.formatDVDmenuText(s.titleformat.getValue(), title_no).decode("utf-8") - draw_bg.text((s_left,top), titleText, fill=self.Menus.color_button, font=fonts[1]) - draw_high.text((s_left,top), titleText, fill=1, font=self.Menus.fonts[1]) - subtitleText = title.formatDVDmenuText(s.subtitleformat.getValue(), title_no).decode("utf-8") - draw_bg.text((s_left,top+36), subtitleText, fill=self.Menus.color_button, font=fonts[2]) - bottom = top+rowheight - if bottom > self.Menus.imgheight: - bottom = self.Menus.imgheight - spuxml += """ -