From e3ee00dc65b77bdf546e59a59910a5adbe008f0c Mon Sep 17 00:00:00 2001 From: Twol Date: Thu, 16 Jun 2022 19:56:40 +0200 Subject: [PATCH 01/26] About fix import, cleanup IPTV text, remove boot device as not always in BoxInfo --- lib/python/Screens/About.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/python/Screens/About.py b/lib/python/Screens/About.py index d5094b5ff9..176e6aecfb 100644 --- a/lib/python/Screens/About.py +++ b/lib/python/Screens/About.py @@ -17,8 +17,8 @@ from Screens.Screen import Screen, ScreenSummary from Screens.GitCommitInfo import CommitInfo from Screens.SoftwareUpdate import UpdatePlugin -from Tools.Directories import fileExists, fileCheck, pathExists -from Tools.Multiboot import GetCurrentImage, GetCurrentImageMode, isPluginInstalled +from Tools.Directories import fileExists, fileCheck, pathExists, isPluginInstalled +from Tools.Multiboot import GetCurrentImage, GetCurrentImageMode from Tools.StbHardware import getFPVersion @@ -56,7 +56,6 @@ def populate(self): if SystemInfo["BoxInfo"]: BoxInfo = SystemInfo["BoxInfo"] - AboutText += _("Boot Device:\t%s\n") % BoxInfo.getItem("mtdbootfs") AboutText += _("Chipset:\t%s\n") % BoxInfo.getItem("socfamily") elif about.getChipSetString() != _("unavailable"): @@ -113,9 +112,9 @@ def populate(self): AboutText += _("Kernel:\t%s\n") % about.getKernelVersionString() AboutText += _("GStreamer:\t%s\n") % about.getGStreamerVersionString().replace("GStreamer ", "") if isPluginInstalled("ServiceApp") and config.plugins.serviceapp.servicemp3.replace.value == True: - AboutText += _("IPTV 4097 player:\t%s\n") % config.plugins.serviceapp.servicemp3.player.value + AboutText += _("iptv 4097 player:\t%s\n") % config.plugins.serviceapp.servicemp3.player.value else: - AboutText += _("IPTV 4097 player:\tDefault player\n") + AboutText += _("iptv 4097 player:\tDefault player\n") AboutText += _("Python:\t%s\n") % about.getPythonVersionString() AboutText += _("Installed:\t%s\n") % about.getFlashDateString() AboutText += _("Last update:\t%s\n") % getEnigmaVersionString() From 12c2833f5a3e6ac56021c5cc75fac20bdd6ebbc2 Mon Sep 17 00:00:00 2001 From: Rowland Creed Date: Fri, 17 Jun 2022 11:56:57 +0200 Subject: [PATCH 02/26] [config] tweak "os" imports --- lib/python/Components/config.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 3831a04f35..6004c059db 100644 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -7,7 +7,7 @@ from Components.Harddisk import harddiskmanager from Tools.LoadPixmap import LoadPixmap from copy import copy as copy_copy -from os import path as os_path +from os import fsync, path as os_path, rename, sep from time import localtime, strftime, mktime ACTIONKEY_LEFT = 0 @@ -1908,7 +1908,7 @@ def removedMount(self, mp): x[2] = False def refreshMountpoints(self): - self.mountpoints = [p.mountpoint for p in harddiskmanager.getMountedPartitions() if p.mountpoint != "/"] + self.mountpoints = [p.mountpoint for p in harddiskmanager.getMountedPartitions() if p.mountpoint != sep] self.mountpoints.sort(key=lambda x: -len(x)) def checkChangedMountpoints(self): @@ -1925,7 +1925,7 @@ def checkChangedMountpoints(self): self.addedMount(x) def getMountpoint(self, file): - file = os_path.realpath(file) + "/" + file = os_path.realpath(file) + sep for m in self.mountpoints: if file.startswith(m): return m @@ -2231,13 +2231,12 @@ def unpickle(self, lines, base_file=True): def saveToFile(self, filename): text = self.pickle() try: - import os f = open(filename + ".writing", "w") f.write(text) f.flush() - os.fsync(f.fileno()) + fsync(f.fileno()) f.close() - os.rename(filename + ".writing", filename) + rename(filename + ".writing", filename) except IOError: print("[Config] Couldn't write %s" % filename) From 1d4903ea51800ff2a5f6a233c2f4ac79ec587f61 Mon Sep 17 00:00:00 2001 From: Rowland Creed Date: Fri, 17 Jun 2022 12:32:35 +0200 Subject: [PATCH 03/26] [config] use "with" when opening settings file --- lib/python/Components/config.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 6004c059db..2ec7a3c2c8 100644 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -2231,17 +2231,17 @@ def unpickle(self, lines, base_file=True): def saveToFile(self, filename): text = self.pickle() try: - f = open(filename + ".writing", "w") - f.write(text) - f.flush() - fsync(f.fileno()) - f.close() + with open(filename + ".writing", "w") as f: + f.write(text) + f.flush() + fsync(f.fileno()) rename(filename + ".writing", filename) except IOError: print("[Config] Couldn't write %s" % filename) def loadFromFile(self, filename, base_file=True): - self.unpickle(open(filename, "r"), base_file) + with open(filename, "r") as f: + self.unpickle(f, base_file) config = Config() From 7574f457345055f47e0345dd71f07982ab666d61 Mon Sep 17 00:00:00 2001 From: Rowland Creed Date: Fri, 17 Jun 2022 12:46:18 +0200 Subject: [PATCH 04/26] [config] force encoding UTF-8 when handling settings file Manual says: encoding is the name of the encoding used to decode or encode the file. This should only be used in text mode. The default encoding is platform dependent (whatever locale.getpreferredencoding() returns), but any text encoding supported by Python can be used. https://docs.python.org/3/library/functions.html#open But research by @jbleyel suggest that in the case of enigma this is not true and the default encoding is ASCII: open("%s.writing" % filename, "w") -> Crash open("%s.writing" % filename, "w", encoding="UTF-8") -> No Crash 11:23:46.7334 File "/usr/lib/enigma2/python/Components/config.py", line 2233, in save 11:23:46.7368 config.saveToFile(self.CONFIG_FILE) 11:23:46.7372 File "/usr/lib/enigma2/python/Components/config.py", line 2214, in saveToFile 11:23:46.7386 fd.write(self.pickle()) 11:23:46.7393 UnicodeEncodeError: 'ascii' codec can't encode character '\xf6' in position 891: ordinal not in range(128) More info here: https://github.com/openatv/enigma2/pull/2375 --- lib/python/Components/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 2ec7a3c2c8..4a082d6a53 100644 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -2231,7 +2231,7 @@ def unpickle(self, lines, base_file=True): def saveToFile(self, filename): text = self.pickle() try: - with open(filename + ".writing", "w") as f: + with open(filename + ".writing", "w", encoding="UTF-8") as f: f.write(text) f.flush() fsync(f.fileno()) @@ -2240,7 +2240,7 @@ def saveToFile(self, filename): print("[Config] Couldn't write %s" % filename) def loadFromFile(self, filename, base_file=True): - with open(filename, "r") as f: + with open(filename, "r", encoding="UTF-8") as f: self.unpickle(f, base_file) From d5f6653c77f42ab5e7889ebfda04beb0abdfd5ab Mon Sep 17 00:00:00 2001 From: Athanasios Oikonomou Date: Tue, 18 Jan 2022 23:16:54 +0200 Subject: [PATCH 05/26] enigma2.sh: change LC_CTYPE to LC_ALL For mor info see: https://github.com/OpenPLi/enigma2/commit/198d8e53ce2cd158a6a52adca514266c6e06d11f --- tools/enigma2.sh.in | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/enigma2.sh.in b/tools/enigma2.sh.in index bd99ccc73b..30cc0fb7dc 100755 --- a/tools/enigma2.sh.in +++ b/tools/enigma2.sh.in @@ -66,7 +66,10 @@ sync (sleep 2; echo "enigma2 is the main pvr application... adjust oom score!"; PID=$(pidof enigma2); \ [ -e /proc/$PID/oom_score_adj ] && echo "-999" > /proc/$PID/oom_score_adj || echo "-17" > /proc/$PID/oom_adj;) & -export LC_CTYPE="en_US.UTF-8" +# LC_ALL available? +if [ -z $LC_ALL ]; then + export LC_ALL="en_US.UTF-8" +fi # set time format used to prefix each line in the debug logs # From 4da578a38a4efd6dae44ba89683e96d6cafcdb60 Mon Sep 17 00:00:00 2001 From: Twol Date: Fri, 17 Jun 2022 16:03:14 +0200 Subject: [PATCH 06/26] About(Screens) - fix boot device applicability, split information into CPU & Image Information --- lib/python/Screens/About.py | 98 ++++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 46 deletions(-) diff --git a/lib/python/Screens/About.py b/lib/python/Screens/About.py index 176e6aecfb..71807c04eb 100644 --- a/lib/python/Screens/About.py +++ b/lib/python/Screens/About.py @@ -14,14 +14,13 @@ from Components.ScrollLabel import ScrollLabel from Components.Sources.StaticText import StaticText from Components.SystemInfo import SystemInfo -from Screens.Screen import Screen, ScreenSummary from Screens.GitCommitInfo import CommitInfo +from Screens.Screen import Screen, ScreenSummary from Screens.SoftwareUpdate import UpdatePlugin from Tools.Directories import fileExists, fileCheck, pathExists, isPluginInstalled -from Tools.Multiboot import GetCurrentImage, GetCurrentImageMode +from Tools.Multiboot import GetCurrentImageMode from Tools.StbHardware import getFPVersion - class About(Screen): def __init__(self, session): Screen.__init__(self, session) @@ -54,11 +53,7 @@ def populate(self): AboutText += _("Model:\t%s %s\n") % (getMachineBrand(), getMachineName()) - if SystemInfo["BoxInfo"]: - BoxInfo = SystemInfo["BoxInfo"] - AboutText += _("Chipset:\t%s\n") % BoxInfo.getItem("socfamily") - - elif about.getChipSetString() != _("unavailable"): + if about.getChipSetString() != _("unavailable"): if SystemInfo["HasHiSi"]: AboutText += _("Chipset:\tHiSilicon %s\n") % about.getChipSetString().upper() elif about.getIsBroadcom(): @@ -67,11 +62,52 @@ def populate(self): AboutText += _("Chipset:\t%s\n") % about.getChipSetString().upper() AboutText += _("CPU:\t%s %s %s\n") % (about.getCPUArch(), about.getCPUSpeedString(), about.getCpuCoresString()) + + if SystemInfo["BoxInfo"]: + BoxInfo = SystemInfo["BoxInfo"] + AboutText += _("SoC:\t%s\n") % BoxInfo.getItem("socfamily").upper() + + tempinfo = "" + if path.exists("/proc/stb/sensors/temp0/value"): + with open("/proc/stb/sensors/temp0/value", "r") as f: + tempinfo = f.read() + elif path.exists("/proc/stb/fp/temp_sensor"): + with open("/proc/stb/fp/temp_sensor", "r") as f: + tempinfo = f.read() + elif path.exists("/proc/stb/sensors/temp/value"): + with open("/proc/stb/sensors/temp/value", "r") as f: + tempinfo = f.read() + if tempinfo and int(tempinfo.replace("\n", "")) > 0: + AboutText += _("System temp:\t%s") % tempinfo.replace("\n", "").replace(" ", "") + "\xb0" + "C\n" + + tempinfo = "" + if path.exists("/proc/stb/fp/temp_sensor_avs"): + with open("/proc/stb/fp/temp_sensor_avs", "r") as f: + tempinfo = f.read() + elif path.exists("/sys/devices/virtual/thermal/thermal_zone0/temp"): + try: + with open("/sys/devices/virtual/thermal/thermal_zone0/temp", "r") as f: + tempinfo = f.read() + tempinfo = tempinfo[:-4] + except: + tempinfo = "" + elif path.exists("/proc/hisi/msp/pm_cpu"): + try: + tempinfo = search("temperature = (\d+) degree", open("/proc/hisi/msp/pm_cpu").read()).group(1) + except: + tempinfo = "" + if tempinfo and int(tempinfo) > 0: + AboutText += _("Processor temp:\t%s") % tempinfo.replace("\n", "").replace(" ", "") + "\xb0" + "C\n" + imageSubBuild = "" if getImageType() != "release": imageSubBuild = ".%s" % getImageDevBuild() AboutText += _("Image:\t%s.%s%s (%s)\n") % (getImageVersion(), getImageBuild(), imageSubBuild, getImageType().title()) + if SystemInfo["BoxInfo"]: + BoxInfo = SystemInfo["BoxInfo"] + if BoxInfo.getItem("mtdbootfs") != "" and " " not in BoxInfo.getItem("mtdbootfs"): + AboutText += _("Boot Device:\t%s\n") % BoxInfo.getItem("mtdbootfs") if SystemInfo["HasH9SD"]: if "rootfstype=ext4" in open("/sys/firmware/devicetree/base/chosen/bootargs", "r").read(): part = " - SD card in use for Image root \n" @@ -92,7 +128,7 @@ def populate(self): else: image -= 1 part = "SDcard slot %s (%s) " % (image, SystemInfo["canMultiBoot"][slot]["root"]) - AboutText += _("Image Slot:\t%s") % "STARTUP_" + str(slot) + " " + part + " " + bootmode + "\n" + AboutText += _("Image Slot:\t%s") % "Startup " + str(slot) + " - " + part + " " + bootmode + "\n" if getMachineName() in ("ET8500") and path.exists("/proc/mtd"): self.dualboot = self.dualBoot() @@ -106,18 +142,20 @@ def populate(self): year = string[0:4] month = string[4:6] day = string[6:8] - driversdate = "-".join((year, month, day)) + driversdate = "-".join((day, month, year)) AboutText += _("Drivers:\t%s\n") % driversdate AboutText += _("Kernel:\t%s\n") % about.getKernelVersionString() AboutText += _("GStreamer:\t%s\n") % about.getGStreamerVersionString().replace("GStreamer ", "") if isPluginInstalled("ServiceApp") and config.plugins.serviceapp.servicemp3.replace.value == True: - AboutText += _("iptv 4097 player:\t%s\n") % config.plugins.serviceapp.servicemp3.player.value + AboutText += _("4097 iptv player:\t%s\n") % config.plugins.serviceapp.servicemp3.player.value else: - AboutText += _("iptv 4097 player:\tDefault player\n") + AboutText += _("4097 iptv player:\tDefault player\n") AboutText += _("Python:\t%s\n") % about.getPythonVersionString() - AboutText += _("Installed:\t%s\n") % about.getFlashDateString() - AboutText += _("Last update:\t%s\n") % getEnigmaVersionString() + flashDate = about.getFlashDateString()[8:] + about.getFlashDateString()[4:8] + about.getFlashDateString()[0:4] + AboutText += _("Installed:\t%s\n") % flashDate + lastUpdate = getEnigmaVersionString()[8:] + getEnigmaVersionString()[4:8] + getEnigmaVersionString()[0:4] + AboutText += _("Last update:\t%s\n") % lastUpdate AboutText += _("E2 (re)starts:\t%s\n") % config.misc.startCounter.value uptime = about.getBoxUptime() if uptime: @@ -127,38 +165,6 @@ def populate(self): AboutText += _("Enigma2 uptime:\t%s\n") % e2uptime AboutText += _("Skin:\t%s") % config.skin.primary_skin.value[0:-9] + _(" (%s x %s)") % (skinWidth, skinHeight) + "\n" - tempinfo = "" - if path.exists("/proc/stb/sensors/temp0/value"): - with open("/proc/stb/sensors/temp0/value", "r") as f: - tempinfo = f.read() - elif path.exists("/proc/stb/fp/temp_sensor"): - with open("/proc/stb/fp/temp_sensor", "r") as f: - tempinfo = f.read() - elif path.exists("/proc/stb/sensors/temp/value"): - with open("/proc/stb/sensors/temp/value", "r") as f: - tempinfo = f.read() - if tempinfo and int(tempinfo.replace("\n", "")) > 0: - AboutText += _("System temp:\t%s") % tempinfo.replace("\n", "").replace(" ", "") + "\xb0" + "C\n" - - tempinfo = "" - if path.exists("/proc/stb/fp/temp_sensor_avs"): - with open("/proc/stb/fp/temp_sensor_avs", "r") as f: - tempinfo = f.read() - elif path.exists("/sys/devices/virtual/thermal/thermal_zone0/temp"): - try: - with open("/sys/devices/virtual/thermal/thermal_zone0/temp", "r") as f: - tempinfo = f.read() - tempinfo = tempinfo[:-4] - except: - tempinfo = "" - elif path.exists("/proc/hisi/msp/pm_cpu"): - try: - tempinfo = search("temperature = (\d+) degree", open("/proc/hisi/msp/pm_cpu").read()).group(1) - except: - tempinfo = "" - if tempinfo and int(tempinfo) > 0: - AboutText += _("Processor temp:\t%s") % tempinfo.replace("\n", "").replace(" ", "") + "\xb0" + "C\n" - fp_version = getFPVersion() if fp_version is None: fp_version = "" From 33f2846554341dbd50d9632bea1a3a08519ef0cd Mon Sep 17 00:00:00 2001 From: Orlandoxx <95180049+Orlandoxx@users.noreply.github.com> Date: Sat, 18 Jun 2022 18:55:20 +0300 Subject: [PATCH 07/26] One localization fix of About.py Fixing localisation. --- lib/python/Screens/About.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/python/Screens/About.py b/lib/python/Screens/About.py index 71807c04eb..5069bd8107 100644 --- a/lib/python/Screens/About.py +++ b/lib/python/Screens/About.py @@ -332,7 +332,7 @@ def Stage1Complete(self, result, retval, extra_args=None): if pathExists("/media/autofs"): for entry in sorted(listdir("/media/autofs")): mountEntry = path.join("/media/autofs", entry) - self.mountinfo += _("\n %s is also enabled for autofs network mount" % (mountEntry)) + self.mountinfo += _("\n %s is also enabled for autofs network mount") % (mountEntry) if self.mountinfo: self["mounts"].setText(self.mountinfo) else: From fa54207b8cb7f55fb1da51599d06038d1655e202 Mon Sep 17 00:00:00 2001 From: Orlandoxx <95180049+Orlandoxx@users.noreply.github.com> Date: Sat, 18 Jun 2022 19:58:13 +0300 Subject: [PATCH 08/26] Updated finnish translation --- po/fi.po | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/po/fi.po b/po/fi.po index 2b5b18bb61..a8bd2cc756 100755 --- a/po/fi.po +++ b/po/fi.po @@ -5,7 +5,7 @@ msgstr "" "Project-Id-Version: enigma2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-19 22:18+0000\n" -"PO-Revision-Date: 2022-05-28 14:22+0300\n" +"PO-Revision-Date: 2022-06-18 17:57+0300\n" "Last-Translator: Orlandox\n" "Language-Team: timoj/Kojo/Samzam/Orlandox\n" "Language: fi\n" @@ -21,7 +21,7 @@ msgid "" " %s is also enabled for autofs network mount" msgstr "" "\n" -"%s on myös käytössä autofs verkkoliitokselle" +" %s on myös käytössä autofs verkkoliitokselle" msgid "" "\n" @@ -5725,7 +5725,7 @@ msgid "Feeds status: Updating" msgstr "Syötteiden tila: Päivityksessä" msgid "Feeds status: Official developer feeds" -msgstr "Syötteiden tila: Viralliset kehitys-syötteet" +msgstr "Syötteiden tila: Viralliset kehittäjä-syötteet" msgid "Fiji" msgstr "Fiji" @@ -16460,3 +16460,9 @@ msgstr "Http/https streamin käynnistysviive" msgid "Define additional delay in milliseconds before start of http(s) streams, e.g. to connect a remote tuner, you use a complex system of DiSEqC." msgstr "Määrittele lisäviive millisekunneissa ennen http/https streamien alkua, esimerkiksi etävirittimen yhteyteen käytetään mutkikasta DiSEqC-järjestelmää." + +msgid "4097 iptv player:\t%s\n" +msgstr "4097 iptv soitin:\t%s\n" + +msgid "4097 iptv player:\tDefault player\n" +msgstr "4097 iptv soitin:\tOletus soitin\n" From 1f889158e2a1473b98ec88969b88235bbf7679d3 Mon Sep 17 00:00:00 2001 From: Rowland Creed Date: Sat, 18 Jun 2022 23:53:14 +0200 Subject: [PATCH 09/26] [Ci.py] text tweak --- lib/python/Screens/Ci.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/python/Screens/Ci.py b/lib/python/Screens/Ci.py index 79d48d3e90..129712d711 100644 --- a/lib/python/Screens/Ci.py +++ b/lib/python/Screens/Ci.py @@ -443,7 +443,7 @@ def appendEntries(self, slot, state): elif self.state[slot] == 2: #module ready appname = eDVBCI_UI.getInstance().getAppName(slot) self.list.append((appname, ConfigNothing(), 2, slot)) - self.list.append(getConfigListEntry(_("Set pin code persistent"), config.ci[slot].use_static_pin, 3, slot)) + self.list.append(getConfigListEntry(_("Set persistent PIN code"), config.ci[slot].use_static_pin, 3, slot)) self.list.append((_("Enter persistent PIN code"), ConfigNothing(), 5, slot)) self.list.append((_("Reset persistent PIN code"), ConfigNothing(), 6, slot)) self.list.append(getConfigListEntry(_("Show CI messages"), config.ci[slot].show_ci_messages, 3, slot)) From 08dcb277e7cdafb6c02ec65bc2fed7c86213ceec Mon Sep 17 00:00:00 2001 From: catalinii Date: Sat, 18 Jun 2022 08:37:48 -0700 Subject: [PATCH 10/26] Add support for enabling and disabling CI devices (#2283) (#3432) *By default every device is enabled *Allows the user to disable the CI device from the menu (to be used by other software) *At startup a disabled device will not initialize but will appear in the menu as disabled and the user can choose to enable it (cherry picked from commit 7ee03a08b085076482a62fc6b7da5a40bd1d015a) --- lib/dvb_ci/dvbci.cpp | 57 ++++++++++++++++++++++++++++++++++++---- lib/dvb_ci/dvbci.h | 7 ++++- lib/dvb_ci/dvbci_ui.cpp | 5 ++++ lib/dvb_ci/dvbci_ui.h | 1 + lib/python/Screens/Ci.py | 18 +++++++++++-- 5 files changed, 80 insertions(+), 8 deletions(-) diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index 9451d67abd..45c1db5579 100644 --- a/lib/dvb_ci/dvbci.cpp +++ b/lib/dvb_ci/dvbci.cpp @@ -1027,6 +1027,14 @@ PyObject *eDVBCIInterfaces::readCICaIds(int slotid) return 0; } +int eDVBCIInterfaces::setCIEnabled(int slotid, bool enabled) +{ + eDVBCISlot *slot = getSlot(slotid); + if (slot) + return slot->setEnabled(enabled); + return -1; +} + int eDVBCIInterfaces::setCIClockRate(int slotid, int rate) { singleLock s(m_slot_lock); @@ -1231,6 +1239,20 @@ void eDVBCISlot::data(int what) DEFINE_REF(eDVBCISlot); eDVBCISlot::eDVBCISlot(eMainloop *context, int nr) +{ + char configStr[255]; + slotid = nr; + m_context = context; + state = stateDisabled; + snprintf(configStr, 255, "config.ci.%d.enabled", slotid); + bool enabled = eConfigManager::getConfigBoolValue(configStr, true); + if (enabled) + openDevice(); + else + /* emit */ eDVBCI_UI::getInstance()->m_messagepump.send(eDVBCIInterfaces::Message(eDVBCIInterfaces::Message::slotStateChanged, getSlotID(), 3)); // state disabled +} + +void eDVBCISlot::openDevice() { char filename[128]; @@ -1244,9 +1266,7 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr) plugged = true; m_ci_version = versionUnknown; - slotid = nr; - - sprintf(filename, "/dev/ci%d", nr); + sprintf(filename, "/dev/ci%d", slotid); // possible_caids.insert(0x1702); // possible_providers.insert(providerPair("PREMIERE", 0xC00000)); @@ -1259,7 +1279,7 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr) if (fd >= 0) { - notifier = eSocketNotifier::create(context, fd, eSocketNotifier::Read | eSocketNotifier::Priority | eSocketNotifier::Write); + notifier = eSocketNotifier::create(m_context, fd, eSocketNotifier::Read | eSocketNotifier::Priority | eSocketNotifier::Write); CONNECT(notifier->activated, eDVBCISlot::data); } else { @@ -1273,7 +1293,16 @@ eDVBCISlot::~eDVBCISlot() close(fd); } -void eDVBCISlot::setAppManager( eDVBCIApplicationManagerSession *session ) +void eDVBCISlot::closeDevice() +{ + close(fd); + fd = -1; + notifier->stop(); + data(eSocketNotifier::Priority); + state = stateDisabled; +} + +void eDVBCISlot::setAppManager(eDVBCIApplicationManagerSession *session) { singleLock s(eDVBCIInterfaces::m_slot_lock); application_manager=session; @@ -1607,4 +1636,22 @@ int eDVBCISlot::setClockRate(int rate) return 0; } +int eDVBCISlot::setEnabled(bool enabled) +{ + eDebug("[CI] Slot: %d Enabled: %d, state %d", getSlotID(), enabled, state); + if (enabled && state != stateDisabled) + return 0; + + if (!enabled && state == stateDisabled) + return 0; + + if(enabled) + openDevice(); + else { + closeDevice(); + /* emit */ eDVBCI_UI::getInstance()->m_messagepump.send(eDVBCIInterfaces::Message(eDVBCIInterfaces::Message::slotStateChanged, getSlotID(), 3)); // state disabled + } + return 0; +} + eAutoInitP0 init_eDVBCIInterfaces(eAutoInitNumbers::dvb, "CI Slots"); diff --git a/lib/dvb_ci/dvbci.h b/lib/dvb_ci/dvbci.h index 48dc019b56..def59a6008 100644 --- a/lib/dvb_ci/dvbci.h +++ b/lib/dvb_ci/dvbci.h @@ -66,6 +66,7 @@ class eDVBCISlot: public iObject, public sigc::trackable bool user_mapped; void data(int); bool plugged; + eMainloop *m_context; eDVBCIApplicationManagerSession *getAppManager() { return application_manager; } eDVBCIMMISession *getMMIManager() { return mmi_session; } @@ -85,12 +86,15 @@ class eDVBCISlot: public iObject, public sigc::trackable int setSource(const std::string &source); int setClockRate(int); void determineCIVersion(); + int setEnabled(bool); static std::string getTunerLetter(int tuner_no) { return std::string(1, char(65 + tuner_no)); } public: - enum {stateRemoved, stateInserted, stateInvalid, stateResetted}; + enum {stateRemoved, stateInserted, stateInvalid, stateResetted, stateDisabled}; enum {versionUnknown = -1, versionCI = 0, versionCIPlus1 = 1, versionCIPlus2 = 2}; eDVBCISlot(eMainloop *context, int nr); ~eDVBCISlot(); + void closeDevice(); + void openDevice(); int send(const unsigned char *data, size_t len); @@ -183,6 +187,7 @@ class eDVBCIInterfaces: public eMainloop, private eThread void ciRemoved(eDVBCISlot *slot); int getSlotState(int slot); + int setCIEnabled(int slot, bool enabled); int reset(int slot); int initialize(int slot); int startMMI(int slot); diff --git a/lib/dvb_ci/dvbci_ui.cpp b/lib/dvb_ci/dvbci_ui.cpp index a7adc037b4..d6bb5e787a 100644 --- a/lib/dvb_ci/dvbci_ui.cpp +++ b/lib/dvb_ci/dvbci_ui.cpp @@ -96,5 +96,10 @@ int eDVBCI_UI::setClockRate(int slot, int rate) return eDVBCIInterfaces::getInstance()->setCIClockRate(slot, rate); } +int eDVBCI_UI::setEnabled(int slot, bool enabled) +{ + return eDVBCIInterfaces::getInstance()->setCIEnabled(slot, enabled); +} + //FIXME: correct "run/startlevel" eAutoInitP0 init_dvbciui(eAutoInitNumbers::rc, "DVB-CI UI"); diff --git a/lib/dvb_ci/dvbci_ui.h b/lib/dvb_ci/dvbci_ui.h index d08f257337..fea0964826 100644 --- a/lib/dvb_ci/dvbci_ui.h +++ b/lib/dvb_ci/dvbci_ui.h @@ -34,6 +34,7 @@ class eDVBCI_UI: public eMMI_UI int answerEnq(int slot, char *val); int cancelEnq(int slot); int setClockRate(int slot, int rate); + int setEnabled(int slot, bool enabled); }; #endif diff --git a/lib/python/Screens/Ci.py b/lib/python/Screens/Ci.py index 129712d711..cadced46f0 100644 --- a/lib/python/Screens/Ci.py +++ b/lib/python/Screens/Ci.py @@ -13,10 +13,11 @@ forceNotShowCiMessages = False - def setCIBitrate(configElement): eDVBCI_UI.getInstance().setClockRate(configElement.slotid, eDVBCI_UI.rateNormal if configElement.value == "no" else eDVBCI_UI.rateHigh) +def setCIEnabled(configElement): + eDVBCI_UI.getInstance().setEnabled(configElement.slotid, configElement.value) def setdvbCiDelay(configElement): open(SystemInfo["CommonInterfaceCIDelay"], "w").write(configElement.value) @@ -33,6 +34,9 @@ def InitCiConfig(): if SystemInfo["CommonInterface"]: for slot in range(SystemInfo["CommonInterface"]): config.ci.append(ConfigSubsection()) + config.ci[slot].enabled = ConfigYesNo(default=True) + config.ci[slot].enabled.slotid = slot + config.ci[slot].enabled.addNotifier(setCIEnabled) config.ci[slot].canDescrambleMultipleServices = ConfigSelection(choices=[("auto", _("auto")), ("no", _("no")), ("yes", _("yes"))], default="auto") config.ci[slot].use_static_pin = ConfigYesNo(default=True) config.ci[slot].static_pin = ConfigPIN(default=0) @@ -433,6 +437,7 @@ def appendEntries(self, slot, state): self.state[slot] = state if self.slot > 1: self.list.append(("**************************", ConfigNothing(), 3, slot)) + self.list.append((_("CI %s enabled" % (slot)), config.ci[slot].enabled, -1, slot)) self.list.append((_("Reset"), ConfigNothing(), 0, slot)) self.list.append((_("Init"), ConfigNothing(), 1, slot)) @@ -443,6 +448,10 @@ def appendEntries(self, slot, state): elif self.state[slot] == 2: #module ready appname = eDVBCI_UI.getInstance().getAppName(slot) self.list.append((appname, ConfigNothing(), 2, slot)) + elif self.state[slot] == 3: # module disabled by the user + self.list.append((_("module disabled"), ConfigNothing(), 2, slot)) + return + self.list.append(getConfigListEntry(_("Set persistent PIN code"), config.ci[slot].use_static_pin, 3, slot)) self.list.append((_("Enter persistent PIN code"), ConfigNothing(), 5, slot)) self.list.append((_("Reset persistent PIN code"), ConfigNothing(), 6, slot)) @@ -465,6 +474,7 @@ def updateState(self, slot): if slot > 0: slotidx += 1 #do not change separator + slotidx += 1 #do not change CI Enabled slotidx += 1 #do not change Reset slotidx += 1 #do not change Init @@ -475,7 +485,11 @@ def updateState(self, slot): elif state == 2: #module ready appname = eDVBCI_UI.getInstance().getAppName(slot) self.list[slotidx] = (appname, ConfigNothing(), 2, slot) - + if len(self.list) <= slotidx + 1: + self.list = [] + self.appendEntries(slot, state) + elif state == 3: + self.list = self.list[0:slotidx+1] lst = self["entries"] lst.list = self.list lst.l.setList(self.list) From 566163b0d17df2ed12b8ed85a5c5c24e31201874 Mon Sep 17 00:00:00 2001 From: Twol Date: Fri, 24 Jun 2022 11:02:51 +0200 Subject: [PATCH 11/26] RecordTimer - resequence imports --- lib/python/RecordTimer.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/python/RecordTimer.py b/lib/python/RecordTimer.py index 300d3683bb..13dc76d41f 100644 --- a/lib/python/RecordTimer.py +++ b/lib/python/RecordTimer.py @@ -1,26 +1,26 @@ -from boxbranding import getMachineBrand, getMachineName import os -from enigma import eEPGCache, getBestPlayableServiceReference, eStreamServer, eServiceReference, iRecordableService, quitMainloop, eActionMap, setPreferredTuner, eServiceCenter +from timer import Timer, TimerEntry +import xml.etree.cElementTree +from bisect import insort +from sys import maxsize +from time import localtime, strftime, ctime, time +from enigma import eEPGCache, getBestPlayableServiceReference, eStreamServer, eServiceReference, iRecordableService, quitMainloop, eActionMap, setPreferredTuner, eServiceCenter +from boxbranding import getMachineBrand, getMachineName from Components.config import config +import Components.ParentalControl from Components.UsageConfig import defaultMoviePath from Components.SystemInfo import SystemInfo from Components.TimerSanityCheck import TimerSanityCheck import Screens.InfoBar -import Components.ParentalControl from Screens.MessageBox import MessageBox from Screens.PictureInPicture import PictureInPicture import Screens.Standby from Tools import Directories, Notifications, ASCIItranslit, Trashcan from Tools.XMLTools import stringToXML -from timer import Timer, TimerEntry -import xml.etree.cElementTree import NavigationInstance -from time import localtime, strftime, ctime, time -from bisect import insort -from sys import maxsize # ok, for descriptions etc we have: # service reference (to get the service name) From 2156ed3a9db2dee98b7960e8353a3876927c7769 Mon Sep 17 00:00:00 2001 From: Twol Date: Fri, 24 Jun 2022 11:06:31 +0200 Subject: [PATCH 12/26] RecordTimer - only import used options from os --- lib/python/RecordTimer.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/python/RecordTimer.py b/lib/python/RecordTimer.py index 13dc76d41f..a476eb4633 100644 --- a/lib/python/RecordTimer.py +++ b/lib/python/RecordTimer.py @@ -1,4 +1,4 @@ -import os +from os import access, fsync, makedirs, remove, rename, path as ospath, statvfs, W_OK from timer import Timer, TimerEntry import xml.etree.cElementTree from bisect import insort @@ -85,14 +85,14 @@ def findSafeRecordPath(dirname): if not dirname: return None from Components import Harddisk - dirname = os.path.realpath(dirname) + dirname = ospath.realpath(dirname) mountpoint = Harddisk.findMountPoint(dirname) - if not os.path.ismount(mountpoint): + if not ospath.ismount(mountpoint): print("[RecordTimer] media is not mounted:", dirname) return None - if not os.path.isdir(dirname): + if not ospath.isdir(dirname): try: - os.makedirs(dirname) + makedirs(dirname) except Exception as ex: print("[RecordTimer] Failed to create dir '%s':" % dirname, ex) return None @@ -292,12 +292,12 @@ def freespace(self): return False self.MountPath = dirname - mountwriteable = os.access(dirname, os.W_OK) + mountwriteable = access(dirname, W_OK) if not mountwriteable: self.log(0, ("Mount '%s' is not writeable." % dirname)) return False - s = os.statvfs(dirname) + s = statvfs(dirname) if (s.f_bavail * s.f_bsize) // 1000000 < 1024: self.log(0, "Not enough free space to record") return False @@ -576,9 +576,9 @@ def activate(self): # Both see the file as existing, but only one can delete it... # with wasrec_lock: - if os.path.exists("/tmp/was_rectimer_wakeup") and not wasRecTimerWakeup: + if ospath.exists("/tmp/was_rectimer_wakeup") and not wasRecTimerWakeup: wasRecTimerWakeup = int(open("/tmp/was_rectimer_wakeup", "r").read()) and True or False - os.remove("/tmp/was_rectimer_wakeup") + remove("/tmp/was_rectimer_wakeup") self.autostate = Screens.Standby.inStandby @@ -1061,7 +1061,7 @@ def loadTimer(self, justLoad=False): print("[RecordTimer] timers.xml failed to load!") try: - os.rename(self.Filename, self.Filename + "_old") + rename(self.Filename, self.Filename + "_old") except (IOError, OSError): print("[RecordTimer] renaming broken timer failed") return @@ -1174,9 +1174,9 @@ def saveTimer(self): file.writelines(list) file.flush() - os.fsync(file.fileno()) + fsync(file.fileno()) file.close() - os.rename(self.Filename + ".writing", self.Filename) + rename(self.Filename + ".writing", self.Filename) def getNextZapTime(self): now = time() From f23a6a27b265df32e935dca94d683fa8260845d4 Mon Sep 17 00:00:00 2001 From: Twol Date: Fri, 24 Jun 2022 11:09:46 +0200 Subject: [PATCH 13/26] RecordTimer - lets use double quotes and tidy up comments --- lib/python/RecordTimer.py | 52 ++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/lib/python/RecordTimer.py b/lib/python/RecordTimer.py index a476eb4633..72c9b8269c 100644 --- a/lib/python/RecordTimer.py +++ b/lib/python/RecordTimer.py @@ -124,8 +124,8 @@ def SetIconDisplay(nrec): return (wdev, max_states) = SID_code_states if nrec == 0: # An absolute setting - clear it... - f = open(wdev, 'w') - f.write('0') + f = open(wdev, "w") + f.write("0") f.close() return # @@ -134,7 +134,7 @@ def SetIconDisplay(nrec): sym = max_states if sym < 0: # Sanity check - just in case... sym = 0 - f = open(wdev, 'w') + f = open(wdev, "w") f.write(str(sym)) f.close() return @@ -177,14 +177,14 @@ def RecordingsState(alter): # type 2 = digital radio sound service # type 10 = advanced codec digital radio sound service -service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 22) || (type == 25) || (type == 134) || (type == 195)' +service_types_tv = "1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 22) || (type == 25) || (type == 134) || (type == 195)" wasRecTimerWakeup = False # please do not translate log messages class RecordTimerEntry(TimerEntry): - def __init__(self, serviceref, begin, end, name, description, eit, disabled=False, justplay=False, afterEvent=AFTEREVENT.AUTO, checkOldTimers=False, dirname=None, tags=None, descramble='notset', record_ecm='notset', isAutoTimer=False, always_zap=False, rename_repeat=True, conflict_detection=True, pipzap=False, autoTimerId=None): + def __init__(self, serviceref, begin, end, name, description, eit, disabled=False, justplay=False, afterEvent=AFTEREVENT.AUTO, checkOldTimers=False, dirname=None, tags=None, descramble="notset", record_ecm="notset", isAutoTimer=False, always_zap=False, rename_repeat=True, conflict_detection=True, pipzap=False, autoTimerId=None): TimerEntry.__init__(self, int(begin), int(end)) if checkOldTimers: if self.begin < time() - 1209600: @@ -218,14 +218,14 @@ def __init__(self, serviceref, begin, end, name, description, eit, disabled=Fals self.tags = tags or [] self.conflict_detection = conflict_detection - if descramble == 'notset' and record_ecm == 'notset': - if config.recording.ecm_data.value == 'descrambled+ecm': + if descramble == "notset" and record_ecm == "notset": + if config.recording.ecm_data.value == "descrambled+ecm": self.descramble = True self.record_ecm = True - elif config.recording.ecm_data.value == 'scrambled+ecm': + elif config.recording.ecm_data.value == "scrambled+ecm": self.descramble = False self.record_ecm = True - elif config.recording.ecm_data.value == 'normal': + elif config.recording.ecm_data.value == "normal": self.descramble = True self.record_ecm = False else: @@ -237,7 +237,7 @@ def __init__(self, serviceref, begin, end, name, description, eit, disabled=Fals if SystemInfo["DVB-T_priority_tuner_available"] or SystemInfo["DVB-C_priority_tuner_available"] or SystemInfo["DVB-S_priority_tuner_available"] or SystemInfo["ATSC_priority_tuner_available"]: rec_ref = self.service_ref and self.service_ref.ref str_service = rec_ref and rec_ref.toString() - if str_service and '%3a//' not in str_service and not str_service.rsplit(":", 1)[1].startswith("/"): + if str_service and "%3a//" not in str_service and not str_service.rsplit(":", 1)[1].startswith("/"): type_service = rec_ref.getUnsignedData(4) >> 16 if type_service == 0xEEEE: if SystemInfo["DVB-T_priority_tuner_available"] and config.usage.recording_frontend_priority_dvbt.value != "-2": @@ -321,7 +321,7 @@ def calculateFilename(self, name=None): filename = begin_date + " - " + service_name if name: if config.recording.filename_composition.value == "event": - filename = name + ' - ' + begin_date + "_" + service_name + filename = name + " - " + begin_date + "_" + service_name elif config.recording.filename_composition.value == "short": filename = strftime("%Y%m%d", localtime(self.begin)) + " - " + name elif config.recording.filename_composition.value == "long": @@ -470,16 +470,14 @@ def _bouquet_search(self): ChannelSelectionInstance.addToHistory(self.service_ref.ref) NavigationInstance.instance.playService(self.service_ref.ref) -# Report the tuner that the current recording is using - def log_tuner(self, level, state): -# If we have a Zap timer then the tuner is for the current service - if self.justplay: + def log_tuner(self, level, state): # Report the tuner that the current recording is using + if self.justplay: # If we have a Zap timer then the tuner is for the current service timer_rs = NavigationInstance.instance.getCurrentService() else: timer_rs = self.record_service feinfo = timer_rs and hasattr(timer_rs, "frontendInfo") and timer_rs.frontendInfo() fedata = feinfo and hasattr(feinfo, "getFrontendData") and feinfo.getFrontendData() - tuner_info = fedata and "tuner_number" in fedata and chr(ord('A') + fedata.get("tuner_number")) or "(fallback) stream" + tuner_info = fedata and "tuner_number" in fedata and chr(ord("A") + fedata.get("tuner_number")) or "(fallback) stream" self.log(level, "%s recording on tuner: %s" % (state, tuner_info)) def activate(self): @@ -609,7 +607,7 @@ def activate(self): if cur_ref_group and cur_ref_group != self.service_ref.ref and self.InfoBarInstance and hasattr(self.InfoBarInstance.session, 'pipshown') and not Components.ParentalControl.parentalControl.isProtected(self.service_ref.ref): if self.InfoBarInstance.session.pipshown: hasattr(self.InfoBarInstance, "showPiP") and self.InfoBarInstance.showPiP() - if hasattr(self.InfoBarInstance.session, 'pip'): + if hasattr(self.InfoBarInstance.session, "pip"): del self.InfoBarInstance.session.pip self.InfoBarInstance.session.pipshown = False self.InfoBarInstance.session.pip = self.InfoBarInstance.session.instantiateDialog(PictureInPicture) @@ -696,8 +694,8 @@ def activate(self): return True from Components.Converter.ClientsStreaming import ClientsStreaming if (not Screens.Standby.inStandby and NavigationInstance.instance.getCurrentlyPlayingServiceReference() and - ('0:0:0:0:0:0:0:0:0' in NavigationInstance.instance.getCurrentlyPlayingServiceReference().toString() or - '4097:' in NavigationInstance.instance.getCurrentlyPlayingServiceReference().toString()) + ("0:0:0:0:0:0:0:0:0" in NavigationInstance.instance.getCurrentlyPlayingServiceReference().toString() or + "4097:" in NavigationInstance.instance.getCurrentlyPlayingServiceReference().toString()) ): return True @@ -734,7 +732,7 @@ def activate(self): def keypress(self, key=None, flag=1): if flag and self.wasInStandby: self.wasInStandby = False - eActionMap.getInstance().unbindAction('', self.keypress) + eActionMap.getInstance().unbindAction("", self.keypress) def setAutoincreaseEnd(self, entry=None): if not self.autoincrease: @@ -858,9 +856,9 @@ def failureCB(self, answer): self.log(13, "ok, zapped away") #NavigationInstance.instance.stopUserServices() self._bouquet_search() - if not self.first_try_prepare and self.InfoBarInstance and hasattr(self.InfoBarInstance.session, 'pipshown') and self.InfoBarInstance.session.pipshown: + if not self.first_try_prepare and self.InfoBarInstance and hasattr(self.InfoBarInstance.session, "pipshown") and self.InfoBarInstance.session.pipshown: hasattr(self.InfoBarInstance, "showPiP") and self.InfoBarInstance.showPiP() - if hasattr(self.InfoBarInstance.session, 'pip'): + if hasattr(self.InfoBarInstance.session, "pip"): del self.InfoBarInstance.session.pip self.InfoBarInstance.session.pipshown = False else: @@ -907,13 +905,13 @@ def gotRecordEvent(self, record, event): # we have record_service as property to automatically subscribe to record service events def setRecordService(self, service): if self.__record_service is not None: -# print("[RecordTimer][remove callback]") + # print("[RecordTimer][remove callback]") NavigationInstance.instance.record_event.remove(self.gotRecordEvent) self.__record_service = service if self.__record_service is not None: -# print("[RecordTimer][add callback]") + # print("[RecordTimer][add callback]") NavigationInstance.instance.record_event.append(self.gotRecordEvent) record_service = property(lambda self: self.__record_service, setRecordService) @@ -1046,9 +1044,7 @@ def isRecording(self): return True return False - # justLoad is passed on to record() - # - def loadTimer(self, justLoad=False): + def loadTimer(self, justLoad=False): # justLoad is passed on to record() try: file = open(self.Filename, 'r') doc = xml.etree.cElementTree.parse(file) @@ -1390,7 +1386,7 @@ def isInTimerOnService(serviceTimerList, begin, duration): return returnValue or (None, None) def removeEntry(self, entry): - # print("[RecordTimer] Remove " + str(entry)) + # print("[RecordTimer] Remove " + str(entry)) # avoid re-enqueuing entry.repeated = False From 75aaede0c815c2185c7f2c718750e91363b5a4b6 Mon Sep 17 00:00:00 2001 From: Twol Date: Fri, 24 Jun 2022 11:17:36 +0200 Subject: [PATCH 14/26] force 4097 streams to record as servicetype 1 --- lib/python/Components/EpgListGrid.py | 4 +++- lib/python/RecordTimer.py | 17 +++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/python/Components/EpgListGrid.py b/lib/python/Components/EpgListGrid.py index 23c5b1c6b5..39ad3cf1ea 100644 --- a/lib/python/Components/EpgListGrid.py +++ b/lib/python/Components/EpgListGrid.py @@ -527,7 +527,8 @@ def buildEntry(self, service, serviceName, events, picon, channel): duration = ev[3] xpos, ewidth = self.calcEventPosAndWidthHelper(stime, duration, start, end, width) - serviceTimers = self.filteredTimerList.get(':'.join(service.split(':')[:11])) + serviceref = service.replace("4097", "1", 1) if "4097" in service else service + serviceTimers = self.filteredTimerList.get(':'.join(serviceref.split(':')[:11])) if serviceTimers is not None: timer, matchType = RecordTimer.isInTimerOnService(serviceTimers, stime, duration) timerIcon, autoTimerIcon = self.getPixmapsForTimer(timer, matchType, selected) @@ -821,6 +822,7 @@ def snapshotTimers(self, startTime, endTime): # repeat timers represent all their future repetitions, so always include them if (startTime <= timer.end or timer.repeated) and timer.begin < endTime: serviceref = timer.service_ref.ref.toCompareString() + serviceref = serviceref.replace("4097", "1", 1) if "4097" in serviceref else serviceref l = self.filteredTimerList.get(serviceref) if l is None: self.filteredTimerList[serviceref] = l = [timer] diff --git a/lib/python/RecordTimer.py b/lib/python/RecordTimer.py index 72c9b8269c..6fd6e5535d 100644 --- a/lib/python/RecordTimer.py +++ b/lib/python/RecordTimer.py @@ -199,6 +199,10 @@ def __init__(self, serviceref, begin, end, name, description, eit, disabled=Fals self.service_ref = serviceref else: self.service_ref = eServiceReference() + if "4097" in self.service_ref.toString(): + pre_serviceref = self.service_ref.toString().replace("4097", "1") + self.service_ref = eServiceReference(pre_serviceref) + print("[RecordTimer][RecordTimerEntry] serviceref", serviceref) self.eit = eit self.dontSave = False self.name = name @@ -538,12 +542,14 @@ def activate(self): return True self.log(7, "prepare failed") if eStreamServer.getInstance().getConnectedClients(): + self.log(71, "eStreamerServer client - stop") eStreamServer.getInstance().stopStream() return False if self.first_try_prepare or (self.ts_dialog is not None and not self.checkingTimeshiftRunning()): self.first_try_prepare = False cur_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference() - if cur_ref and not cur_ref.getPath(): + rec_ref = self.service_ref and self.service_ref.ref + if (cur_ref and not cur_ref.getPath()) or "4097" in rec_ref.toString(): if self.always_zap: return False if Screens.Standby.inStandby: @@ -920,7 +926,8 @@ def setRecordService(self, service): def createTimer(xml): begin = int(xml.get("begin")) end = int(xml.get("end")) - serviceref = eServiceReference(str(xml.get("serviceref"))) + pre_serviceref = xml.get("serviceref") + serviceref = pre_serviceref.replace("4097", "1", 1) if "4097" in pre_serviceref else eServiceReference(pre_serviceref) description = str(xml.get("description")) repeated = str(xml.get("repeated")) rename_repeat = int(xml.get("rename_repeat") or "1") @@ -999,9 +1006,7 @@ def doActivate(self, w, dosave=True): self.timer_list.remove(w) except: print("[RecordTimer] Remove list failed") - - # did this timer reached the last state? - if w.state < RecordTimerEntry.StateEnded: + if w.state < RecordTimerEntry.StateEnded: # did this timer reached the last state? # no, sort it into active list insort(self.timer_list, w) else: @@ -1362,7 +1367,7 @@ def isInTimer(self, service, begin, duration): for timer in self.timer_list: # repeat timers represent all their future repetitions, so always include them if (startAt <= timer.end or timer.repeated) and timer.begin < endAt: - check = timer.service_ref.toCompareString() == refstr + check = timer.service_ref.toCompareString().split(":", 2)[2] == refstr.split(":", 2)[2] if check: matchType = RecordTimer.__checkTimer(timer, check_offset_time, begin, end, duration) if matchType is not None: From f7705056c009591e9084f371d74ecc81afcf432d Mon Sep 17 00:00:00 2001 From: Rob van der Does Date: Fri, 24 Jun 2022 11:55:46 +0200 Subject: [PATCH 15/26] [Translations] Update Dutch (NL) translation. --- po/nl.po | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/po/nl.po b/po/nl.po index bc8be25635..74543c02a4 100644 --- a/po/nl.po +++ b/po/nl.po @@ -3,8 +3,8 @@ msgid "" msgstr "" "Project-Id-Version: ViX\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-01 00:16+0000\n" -"PO-Revision-Date: 2022-05-06 16:02+0200\n" +"POT-Creation-Date: 2022-06-13 14:02+0000\n" +"PO-Revision-Date: 2022-06-24 11:48+0200\n" "Last-Translator: Rob van der Does \n" "Language-Team: Andy Blackburn, Rob van der Does\n" "Language: nl\n" @@ -13,7 +13,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: iso-8859-15\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.1\n" #, python-format msgid "" @@ -2545,6 +2545,9 @@ msgstr "Alvorens het commande om de TV in stand-by te zetten wordt verstuurd, te msgid "Begin time" msgstr "Starttijd" +msgid "Behave like stop-button" +msgstr "Gedrag als stop-toets." + msgid "Behavior of 'pause' when paused" msgstr "Functie van pauzetoets gedurende pauze" From db818059880bb56efcb822e26c180bf336dac67f Mon Sep 17 00:00:00 2001 From: Twol Date: Fri, 24 Jun 2022 14:50:05 +0200 Subject: [PATCH 16/26] Streams 4097 - add setup in Recordings to reset default recording from 1 to 4097 for 4097 streams --- data/setup.xml | 1 + lib/python/Components/EpgListGrid.py | 4 ++-- lib/python/Components/RecordingConfig.py | 1 + lib/python/RecordTimer.py | 8 ++++---- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/data/setup.xml b/data/setup.xml index e0cc7cf0fa..86f975db02 100755 --- a/data/setup.xml +++ b/data/setup.xml @@ -191,6 +191,7 @@ config.usage.default_path config.usage.timer_path config.usage.instantrec_path + config.recording.setstreamto1 config.recording.asktozap config.recording.margin_before diff --git a/lib/python/Components/EpgListGrid.py b/lib/python/Components/EpgListGrid.py index 39ad3cf1ea..f71aa177f7 100644 --- a/lib/python/Components/EpgListGrid.py +++ b/lib/python/Components/EpgListGrid.py @@ -527,7 +527,7 @@ def buildEntry(self, service, serviceName, events, picon, channel): duration = ev[3] xpos, ewidth = self.calcEventPosAndWidthHelper(stime, duration, start, end, width) - serviceref = service.replace("4097", "1", 1) if "4097" in service else service + serviceref = service.replace("4097", "1", 1) if config.recording.setstreamto1.value else service serviceTimers = self.filteredTimerList.get(':'.join(serviceref.split(':')[:11])) if serviceTimers is not None: timer, matchType = RecordTimer.isInTimerOnService(serviceTimers, stime, duration) @@ -822,7 +822,7 @@ def snapshotTimers(self, startTime, endTime): # repeat timers represent all their future repetitions, so always include them if (startTime <= timer.end or timer.repeated) and timer.begin < endTime: serviceref = timer.service_ref.ref.toCompareString() - serviceref = serviceref.replace("4097", "1", 1) if "4097" in serviceref else serviceref + serviceref = serviceref.replace("4097", "1", 1) if config.recording.setstreamto1.value else servicere l = self.filteredTimerList.get(serviceref) if l is None: self.filteredTimerList[serviceref] = l = [timer] diff --git a/lib/python/Components/RecordingConfig.py b/lib/python/Components/RecordingConfig.py index a660ece264..6a2ae1c643 100644 --- a/lib/python/Components/RecordingConfig.py +++ b/lib/python/Components/RecordingConfig.py @@ -5,6 +5,7 @@ def InitRecordingConfig(): config.recording = ConfigSubsection() # actually this is "recordings always have priority". "Yes" does mean: don't ask. The RecordTimer will ask when value is 0. config.recording.asktozap = ConfigYesNo(default=True) + config.recording.setstreamto1 = ConfigYesNo(default=True) config.recording.margin_before = ConfigSelectionNumber(min=0, max=120, stepwidth=1, default=3, wraparound=True) config.recording.margin_after = ConfigSelectionNumber(min=0, max=120, stepwidth=1, default=5, wraparound=True) config.recording.split_programme_minutes = ConfigSelectionNumber(min=0, max=30, stepwidth=1, default=15, wraparound=True) diff --git a/lib/python/RecordTimer.py b/lib/python/RecordTimer.py index 6fd6e5535d..6cb1f85a87 100644 --- a/lib/python/RecordTimer.py +++ b/lib/python/RecordTimer.py @@ -199,10 +199,10 @@ def __init__(self, serviceref, begin, end, name, description, eit, disabled=Fals self.service_ref = serviceref else: self.service_ref = eServiceReference() - if "4097" in self.service_ref.toString(): - pre_serviceref = self.service_ref.toString().replace("4097", "1") + if config.recording.setstreamto1.value: + pre_serviceref = self.service_ref.toString().replace("4097", "1", 1) self.service_ref = eServiceReference(pre_serviceref) - print("[RecordTimer][RecordTimerEntry] serviceref", serviceref) + # print("[RecordTimer][RecordTimerEntry2] serviceref", self.service_ref) self.eit = eit self.dontSave = False self.name = name @@ -927,7 +927,7 @@ def createTimer(xml): begin = int(xml.get("begin")) end = int(xml.get("end")) pre_serviceref = xml.get("serviceref") - serviceref = pre_serviceref.replace("4097", "1", 1) if "4097" in pre_serviceref else eServiceReference(pre_serviceref) + serviceref = pre_serviceref.replace("4097", "1", 1) if config.recording.setstreamto1.value else eServiceReference(pre_serviceref) description = str(xml.get("description")) repeated = str(xml.get("repeated")) rename_repeat = int(xml.get("rename_repeat") or "1") From 5cbefcafcb760c8e82c40b3de48f59c353a86dd7 Mon Sep 17 00:00:00 2001 From: Huevos Date: Fri, 24 Jun 2022 17:45:54 +0200 Subject: [PATCH 17/26] [EpgListGrid] typo --- lib/python/Components/EpgListGrid.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/python/Components/EpgListGrid.py b/lib/python/Components/EpgListGrid.py index f71aa177f7..797da5e033 100644 --- a/lib/python/Components/EpgListGrid.py +++ b/lib/python/Components/EpgListGrid.py @@ -822,7 +822,7 @@ def snapshotTimers(self, startTime, endTime): # repeat timers represent all their future repetitions, so always include them if (startTime <= timer.end or timer.repeated) and timer.begin < endTime: serviceref = timer.service_ref.ref.toCompareString() - serviceref = serviceref.replace("4097", "1", 1) if config.recording.setstreamto1.value else servicere + serviceref = serviceref.replace("4097", "1", 1) if config.recording.setstreamto1.value else serviceref l = self.filteredTimerList.get(serviceref) if l is None: self.filteredTimerList[serviceref] = l = [timer] From 8f66eda40b5c978063d0fdcbb4cbd6b19c08d5e4 Mon Sep 17 00:00:00 2001 From: Rowland Creed Date: Fri, 24 Jun 2022 18:57:42 +0200 Subject: [PATCH 18/26] "4097" commits: 1) Use "startswith" not "in" to test service ref starts with "4097" 2) Add missing "eServiceReference" wrapper in RecordTimer, line 930. --- lib/python/Components/EpgListGrid.py | 4 ++-- lib/python/RecordTimer.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/python/Components/EpgListGrid.py b/lib/python/Components/EpgListGrid.py index 797da5e033..1f7d6ea503 100644 --- a/lib/python/Components/EpgListGrid.py +++ b/lib/python/Components/EpgListGrid.py @@ -527,7 +527,7 @@ def buildEntry(self, service, serviceName, events, picon, channel): duration = ev[3] xpos, ewidth = self.calcEventPosAndWidthHelper(stime, duration, start, end, width) - serviceref = service.replace("4097", "1", 1) if config.recording.setstreamto1.value else service + serviceref = "1" + service[4:] if config.recording.setstreamto1.value and service.startswith("4097:") else service serviceTimers = self.filteredTimerList.get(':'.join(serviceref.split(':')[:11])) if serviceTimers is not None: timer, matchType = RecordTimer.isInTimerOnService(serviceTimers, stime, duration) @@ -822,7 +822,7 @@ def snapshotTimers(self, startTime, endTime): # repeat timers represent all their future repetitions, so always include them if (startTime <= timer.end or timer.repeated) and timer.begin < endTime: serviceref = timer.service_ref.ref.toCompareString() - serviceref = serviceref.replace("4097", "1", 1) if config.recording.setstreamto1.value else serviceref + serviceref = "1" + serviceref[4:] if config.recording.setstreamto1.value and serviceref.startswith("4097:") else serviceref l = self.filteredTimerList.get(serviceref) if l is None: self.filteredTimerList[serviceref] = l = [timer] diff --git a/lib/python/RecordTimer.py b/lib/python/RecordTimer.py index 6cb1f85a87..4b5d095ede 100644 --- a/lib/python/RecordTimer.py +++ b/lib/python/RecordTimer.py @@ -199,8 +199,8 @@ def __init__(self, serviceref, begin, end, name, description, eit, disabled=Fals self.service_ref = serviceref else: self.service_ref = eServiceReference() - if config.recording.setstreamto1.value: - pre_serviceref = self.service_ref.toString().replace("4097", "1", 1) + if config.recording.setstreamto1.value and self.service_ref.toString().startswith("4097:"): + pre_serviceref = "1" + self.service_ref.toString()[4:] self.service_ref = eServiceReference(pre_serviceref) # print("[RecordTimer][RecordTimerEntry2] serviceref", self.service_ref) self.eit = eit @@ -549,7 +549,7 @@ def activate(self): self.first_try_prepare = False cur_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference() rec_ref = self.service_ref and self.service_ref.ref - if (cur_ref and not cur_ref.getPath()) or "4097" in rec_ref.toString(): + if cur_ref and not cur_ref.getPath() or rec_ref.toString().startswith("4097:"): if self.always_zap: return False if Screens.Standby.inStandby: @@ -927,7 +927,7 @@ def createTimer(xml): begin = int(xml.get("begin")) end = int(xml.get("end")) pre_serviceref = xml.get("serviceref") - serviceref = pre_serviceref.replace("4097", "1", 1) if config.recording.setstreamto1.value else eServiceReference(pre_serviceref) + serviceref = eServiceReference("1" + pre_serviceref[4:]) if config.recording.setstreamto1.value and pre_serviceref.startswith("4097:") else eServiceReference(pre_serviceref) description = str(xml.get("description")) repeated = str(xml.get("repeated")) rename_repeat = int(xml.get("rename_repeat") or "1") From 293bc82a49ab4b10390c7bf971a9b57971ce3068 Mon Sep 17 00:00:00 2001 From: openvix-build Date: Fri, 24 Jun 2022 18:36:56 +0000 Subject: [PATCH 19/26] openvix: developer 6.2.006.001 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 15d83a4acd..cf59cfc85d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1018,3 +1018,4 @@ openvix: developer 6.2.004.002 openvix: developer 6.2.004.003 openvix: developer 6.2.005.001 openvix: developer 6.2.005.002 +openvix: developer 6.2.006.001 From fe16f119eae8fb1490d65999fa5b77e3b1cb9474 Mon Sep 17 00:00:00 2001 From: Rowland Creed Date: Sat, 25 Jun 2022 15:52:21 +0200 Subject: [PATCH 20/26] IPTV recordings: Allow users to convert 4097, 5001 and 5002 to type 1 --- data/setup.xml | 2 +- lib/python/Components/EpgListGrid.py | 4 ++-- lib/python/Components/RecordingConfig.py | 10 +++++++++- lib/python/RecordTimer.py | 11 ++++++----- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/data/setup.xml b/data/setup.xml index 86f975db02..b4e7916bff 100755 --- a/data/setup.xml +++ b/data/setup.xml @@ -191,7 +191,7 @@ config.usage.default_path config.usage.timer_path config.usage.instantrec_path - config.recording.setstreamto1 + config.recording.setstreamto1 config.recording.asktozap config.recording.margin_before diff --git a/lib/python/Components/EpgListGrid.py b/lib/python/Components/EpgListGrid.py index 1f7d6ea503..3193da3cab 100644 --- a/lib/python/Components/EpgListGrid.py +++ b/lib/python/Components/EpgListGrid.py @@ -527,7 +527,7 @@ def buildEntry(self, service, serviceName, events, picon, channel): duration = ev[3] xpos, ewidth = self.calcEventPosAndWidthHelper(stime, duration, start, end, width) - serviceref = "1" + service[4:] if config.recording.setstreamto1.value and service.startswith("4097:") else service + serviceref = "1" + service[4:] if service[:4] in config.recording.setstreamto1.value else service # converts 4097, 5001, 5002 to 1 serviceTimers = self.filteredTimerList.get(':'.join(serviceref.split(':')[:11])) if serviceTimers is not None: timer, matchType = RecordTimer.isInTimerOnService(serviceTimers, stime, duration) @@ -822,7 +822,7 @@ def snapshotTimers(self, startTime, endTime): # repeat timers represent all their future repetitions, so always include them if (startTime <= timer.end or timer.repeated) and timer.begin < endTime: serviceref = timer.service_ref.ref.toCompareString() - serviceref = "1" + serviceref[4:] if config.recording.setstreamto1.value and serviceref.startswith("4097:") else serviceref + serviceref = "1" + serviceref[4:] if serviceref[:4] in config.recording.setstreamto1.value else serviceref # converts 4097, 5001, 5002 to 1 l = self.filteredTimerList.get(serviceref) if l is None: self.filteredTimerList[serviceref] = l = [timer] diff --git a/lib/python/Components/RecordingConfig.py b/lib/python/Components/RecordingConfig.py index 6a2ae1c643..a0cf76f8c3 100644 --- a/lib/python/Components/RecordingConfig.py +++ b/lib/python/Components/RecordingConfig.py @@ -5,7 +5,15 @@ def InitRecordingConfig(): config.recording = ConfigSubsection() # actually this is "recordings always have priority". "Yes" does mean: don't ask. The RecordTimer will ask when value is 0. config.recording.asktozap = ConfigYesNo(default=True) - config.recording.setstreamto1 = ConfigYesNo(default=True) + config.recording.setstreamto1 = ConfigSelection(default=(), choices=[ + ((), _("don't convert")), + (("4097",), _("4097 only")), + (("4097", "5001"), _("4097 + 5001")), + (("4097", "5001", "5002"), _("4097 + 5001 + 5002")), + (("4097", "5002"), _("4097 + 5002")), + (("5001",), _("5001 only")), + (("5001", "5002"), _("5001 + 5002")), + (("5002",), _("5002 only"))]) config.recording.margin_before = ConfigSelectionNumber(min=0, max=120, stepwidth=1, default=3, wraparound=True) config.recording.margin_after = ConfigSelectionNumber(min=0, max=120, stepwidth=1, default=5, wraparound=True) config.recording.split_programme_minutes = ConfigSelectionNumber(min=0, max=30, stepwidth=1, default=15, wraparound=True) diff --git a/lib/python/RecordTimer.py b/lib/python/RecordTimer.py index 4b5d095ede..03ab4f03ab 100644 --- a/lib/python/RecordTimer.py +++ b/lib/python/RecordTimer.py @@ -199,7 +199,7 @@ def __init__(self, serviceref, begin, end, name, description, eit, disabled=Fals self.service_ref = serviceref else: self.service_ref = eServiceReference() - if config.recording.setstreamto1.value and self.service_ref.toString().startswith("4097:"): + if self.service_ref.toString()[:4] in config.recording.setstreamto1.value: # check if to convert IPTV services (4097, etc) to "1" pre_serviceref = "1" + self.service_ref.toString()[4:] self.service_ref = eServiceReference(pre_serviceref) # print("[RecordTimer][RecordTimerEntry2] serviceref", self.service_ref) @@ -549,7 +549,7 @@ def activate(self): self.first_try_prepare = False cur_ref = NavigationInstance.instance.getCurrentlyPlayingServiceReference() rec_ref = self.service_ref and self.service_ref.ref - if cur_ref and not cur_ref.getPath() or rec_ref.toString().startswith("4097:"): + if cur_ref and not cur_ref.getPath() or rec_ref.toString()[:4] in config.recording.setstreamto1.value: # "or" check if IPTV services (4097, etc) if self.always_zap: return False if Screens.Standby.inStandby: @@ -927,7 +927,7 @@ def createTimer(xml): begin = int(xml.get("begin")) end = int(xml.get("end")) pre_serviceref = xml.get("serviceref") - serviceref = eServiceReference("1" + pre_serviceref[4:]) if config.recording.setstreamto1.value and pre_serviceref.startswith("4097:") else eServiceReference(pre_serviceref) + serviceref = eServiceReference("1" + pre_serviceref[4:]) if pre_serviceref[:4] in config.recording.setstreamto1.value else eServiceReference(pre_serviceref) # check if to convert IPTV services (4097, etc) to "1" description = str(xml.get("description")) repeated = str(xml.get("repeated")) rename_repeat = int(xml.get("rename_repeat") or "1") @@ -985,12 +985,13 @@ def __init__(self): def doActivate(self, w, dosave=True): # when activating a timer for servicetype 4097, # and SystemApp has player enabled, then skip recording. - if "4097:" in w.service_ref.toString() and Directories.isPluginInstalled("ServiceApp") and config.plugins.serviceapp.servicemp3.replace.value == True: + # Or always skip if in ("5001", "5002") as these cannot be recorded. + if w.service_ref.toString().startswith("4097:") and Directories.isPluginInstalled("ServiceApp") and config.plugins.serviceapp.servicemp3.replace.value == True or w.service_ref.toString()[:4] in ("5001", "5002"): print("[RecordTimer][doActivate] found Serviceapp & player enabled - disable this timer recording") w.state = RecordTimerEntry.StateEnded from Tools.Notifications import AddPopup from Screens.MessageBox import MessageBox - AddPopup(_("Recording IPTV 4097 with systemapp enabled, timer ended!\nPlease recheck it!"), type=MessageBox.TYPE_ERROR, timeout=0, id="TimerRecordingFailed") + AddPopup(_("Recording IPTV with systemapp enabled, timer ended!\nPlease recheck it!"), type=MessageBox.TYPE_ERROR, timeout=0, id="TimerRecordingFailed") # when activating a timer which has already passed, # simply abort the timer. don't run trough all the stages. elif w.shouldSkip(): From 760a76157cbd8353d8846c4c758feb7f8d87e5fd Mon Sep 17 00:00:00 2001 From: openvix-build Date: Sat, 25 Jun 2022 13:58:12 +0000 Subject: [PATCH 21/26] openvix: developer 6.2.006.002 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index cf59cfc85d..d91e630c57 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1019,3 +1019,4 @@ openvix: developer 6.2.004.003 openvix: developer 6.2.005.001 openvix: developer 6.2.005.002 openvix: developer 6.2.006.001 +openvix: developer 6.2.006.002 From f38a9ac48f11ce10c32f6b14c82334af024c19c7 Mon Sep 17 00:00:00 2001 From: Rowland Creed Date: Sun, 26 Jun 2022 19:23:45 +0200 Subject: [PATCH 22/26] [RecordTimer] move "setstreamto1" conversion code above "serviceref.isRecordable()" test --- lib/python/RecordTimer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/python/RecordTimer.py b/lib/python/RecordTimer.py index 03ab4f03ab..cf0bf0cfc5 100644 --- a/lib/python/RecordTimer.py +++ b/lib/python/RecordTimer.py @@ -195,13 +195,13 @@ def __init__(self, serviceref, begin, end, name, description, eit, disabled=Fals assert isinstance(serviceref, eServiceReference) + if serviceref and serviceref.toString()[:4] in config.recording.setstreamto1.value: # check if to convert IPTV services (4097, etc) to "1" + serviceref = eServiceReference("1" + serviceref.toString()[4:]) + if serviceref and serviceref.isRecordable(): self.service_ref = serviceref else: self.service_ref = eServiceReference() - if self.service_ref.toString()[:4] in config.recording.setstreamto1.value: # check if to convert IPTV services (4097, etc) to "1" - pre_serviceref = "1" + self.service_ref.toString()[4:] - self.service_ref = eServiceReference(pre_serviceref) # print("[RecordTimer][RecordTimerEntry2] serviceref", self.service_ref) self.eit = eit self.dontSave = False From 4fc12d4f8e33e4989bb09d0f15984d267abbc855 Mon Sep 17 00:00:00 2001 From: openvix-build Date: Sun, 26 Jun 2022 18:38:05 +0000 Subject: [PATCH 23/26] openvix: developer 6.2.006.003 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index d91e630c57..c64a864129 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1020,3 +1020,4 @@ openvix: developer 6.2.005.001 openvix: developer 6.2.005.002 openvix: developer 6.2.006.001 openvix: developer 6.2.006.002 +openvix: developer 6.2.006.003 From e8b9372d33a2c6077397f95711a92f9842fdbbc0 Mon Sep 17 00:00:00 2001 From: Rowland Creed Date: Sun, 26 Jun 2022 23:18:02 +0200 Subject: [PATCH 24/26] Revert "enigma2.sh: change LC_CTYPE to LC_ALL" This reverts commit d5f6653c77f42ab5e7889ebfda04beb0abdfd5ab. --- tools/enigma2.sh.in | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tools/enigma2.sh.in b/tools/enigma2.sh.in index 30cc0fb7dc..bd99ccc73b 100755 --- a/tools/enigma2.sh.in +++ b/tools/enigma2.sh.in @@ -66,10 +66,7 @@ sync (sleep 2; echo "enigma2 is the main pvr application... adjust oom score!"; PID=$(pidof enigma2); \ [ -e /proc/$PID/oom_score_adj ] && echo "-999" > /proc/$PID/oom_score_adj || echo "-17" > /proc/$PID/oom_adj;) & -# LC_ALL available? -if [ -z $LC_ALL ]; then - export LC_ALL="en_US.UTF-8" -fi +export LC_CTYPE="en_US.UTF-8" # set time format used to prefix each line in the debug logs # From 55a11e9f64773107d90b4e997304ec69f0b4038c Mon Sep 17 00:00:00 2001 From: openvix-build Date: Sun, 26 Jun 2022 21:22:39 +0000 Subject: [PATCH 25/26] openvix: developer 6.2.006.004 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index c64a864129..4b52e38f8b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1021,3 +1021,4 @@ openvix: developer 6.2.005.002 openvix: developer 6.2.006.001 openvix: developer 6.2.006.002 openvix: developer 6.2.006.003 +openvix: developer 6.2.006.004 From 33550c27ef9c8ada43ee30383c58b18131a0e1fe Mon Sep 17 00:00:00 2001 From: openvix-build Date: Mon, 27 Jun 2022 09:35:02 +0000 Subject: [PATCH 26/26] openvix: developer 6.2.006.005 --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 4b52e38f8b..cb4ee861df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1022,3 +1022,4 @@ openvix: developer 6.2.006.001 openvix: developer 6.2.006.002 openvix: developer 6.2.006.003 openvix: developer 6.2.006.004 +openvix: developer 6.2.006.005