diff --git a/packages/addons/driver/hdhomerun/addon b/packages/addons/driver/hdhomerun/addon index f006e3260b..64dad25a52 100755 --- a/packages/addons/driver/hdhomerun/addon +++ b/packages/addons/driver/hdhomerun/addon @@ -24,3 +24,4 @@ mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/config/ cp -P $PKG_DIR/config/* $ADDON_BUILD/$PKG_ADDON_ID/config/ + cp -P $PKG_DIR/settings-default.xml $ADDON_BUILD/$PKG_ADDON_ID/ diff --git a/packages/addons/driver/hdhomerun/changelog.txt b/packages/addons/driver/hdhomerun/changelog.txt index fb1539bfea..98ab8de3d3 100644 --- a/packages/addons/driver/hdhomerun/changelog.txt +++ b/packages/addons/driver/hdhomerun/changelog.txt @@ -1,23 +1,20 @@ +3.0.3 + improved python script for modifying tuners 3.0.2 -- added addon settings for + added addon settings for modifying tuner type (DVB-C, DVB-T, ATSC) setting delays 3.0.1 -- bump addon version -- binary files are stored with OpenELEC image -- addon is used to start userspace program - + bump addon version + binary files are stored with OpenELEC image + addon is used to start userspace program 2.1.3 -- bump addon version for new kernel - + bump addon version for new kernel 2.1.2 -- dvbhdhomerun upgraded to 0.0.10 - + dvbhdhomerun upgraded to 0.0.10 2.1.1 -- rebuild for addon version 2.1 - + rebuild for addon version 2.1 2.0.1 -- starting userspace DVB drivers from Tvheadend/VDR - + starting userspace DVB drivers from Tvheadend/VDR 2.0.0 -- initial version of HDHomeRun driver + initial version of HDHomeRun driver diff --git a/packages/addons/driver/hdhomerun/meta b/packages/addons/driver/hdhomerun/meta index 34b6e460a4..3f06fb63c5 100644 --- a/packages/addons/driver/hdhomerun/meta +++ b/packages/addons/driver/hdhomerun/meta @@ -20,7 +20,7 @@ PKG_NAME="hdhomerun" PKG_VERSION="3.0" -PKG_REV="2" +PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.silicondust.com/products/hdhomerun/dvbt/" diff --git a/packages/addons/driver/hdhomerun/source/bin/refresh-tuners.py b/packages/addons/driver/hdhomerun/source/bin/refresh-tuners.py deleted file mode 100644 index bc382eeb01..0000000000 --- a/packages/addons/driver/hdhomerun/source/bin/refresh-tuners.py +++ /dev/null @@ -1,125 +0,0 @@ -""" -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) -# Copyright (C) 2013 ultraman/vpeter -# -# This Program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This Program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ -""" - -import os -import sys -import shutil -import xmlpp -import xbmcaddon - -from xml.dom import minidom -from array import array - -__settings__ = xbmcaddon.Addon(id='driver.dvb.hdhomerun') -__cwd__ = __settings__.getAddonInfo('path') -__settings_xml__ = xbmc.translatePath(os.path.join(__cwd__, 'resources', 'settings.xml')) - -__hdhomerun_log__ = '/var/log/dvbhdhomerun.log' - -# make backup settings only once -try: - with open(__settings_xml__ + '_orig') as f: pass -except IOError as e: - shutil.copyfile(__settings_xml__, __settings_xml__ + '_orig') - -###################################################################################################### - -# get supported devices on a system (name) -tuners = [] -try: - for line in open(__hdhomerun_log__, 'r'): - line = line.strip() - if line.startswith('Registered tuner'): - name = line.split(':'); - name = name[2].strip() - tuners.append(name) -except IOError: - print 'Error reading log file ', __hdhomerun_log__ - -""" -root ~ # grep "Registered tuner" /var/log/dvbhdhomerun.log -Registered tuner, id from kernel: 0 name: 101ADD2B-0 -Registered tuner, id from kernel: 1 name: 101ADD2B-1 -Registered tuner, id from kernel: 2 name: 1031D75A-0 -Registered tuner, id from kernel: 3 name: 1031D75A-1 -""" - -###################################################################################################### - -xmldoc = minidom.parse(__settings_xml__) -category = xmldoc.getElementsByTagName('category') - -# remove all nodes with id started with ATTACHED_TUNER_ -for node_cat in category: - setting = node_cat.getElementsByTagName('setting') - for node_set in setting : - if 'id' in node_set.attributes.keys() and not node_set.getAttribute('id').find('ATTACHED_TUNER_'): - node_set.parentNode.removeChild(node_set) - -# add new ATTACHED_TUNER_ nodes for available tuners -for node_cat in category: - setting = node_cat.getElementsByTagName('setting') - for node_set in setting : - if 'label' in node_set.attributes.keys() and '9010' in node_set.getAttribute('label'): - for ix, tuner_name in enumerate(tuners): - tuner_name_var = tuner_name.replace('-', '_') - - node1 = xmldoc.createElement("setting") - node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_name_var + '_DVBMODE') - node1.setAttribute("label", tuner_name) - node1.setAttribute("type", 'labelenum') - node1.setAttribute("default", 'auto') - node1.setAttribute("values", 'auto|ATSC|DVB-C|DVB-T') - node_cat.appendChild(node1) - - node2 = xmldoc.createElement("setting") - node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_name_var + '_FULLNAME') - node2.setAttribute("label", '9020') - node2.setAttribute("type", 'bool') - node2.setAttribute("default", 'false') - node_cat.appendChild(node2) - - node3 = xmldoc.createElement("setting") - node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_name_var + '_DISABLE') - node3.setAttribute("label", '9030') - node3.setAttribute("type", 'bool') - node3.setAttribute("default", 'false') - node_cat.appendChild(node3) - - # for tuner - break - -###################################################################################################### - -# save file back -try: - outputfile=open(__settings_xml__, 'w') - xmlpp.pprint(xmldoc.toxml(), output=outputfile, indent=2) - outputfile.close() -except IOError: - print 'Error writing file ', __settings_xml__ - -###################################################################################################### - -# dialog is closed already so just open settings again -xbmcaddon.Addon(id='driver.dvb.hdhomerun').openSettings() diff --git a/packages/addons/driver/hdhomerun/source/bin/userspace-driver.sh b/packages/addons/driver/hdhomerun/source/bin/userspace-driver.sh index 393cc2a5c9..56dda1b7f3 100644 --- a/packages/addons/driver/hdhomerun/source/bin/userspace-driver.sh +++ b/packages/addons/driver/hdhomerun/source/bin/userspace-driver.sh @@ -2,7 +2,7 @@ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -67,7 +67,7 @@ if [ -z "$(pidof userhdhomerun)" ]; then mv ${DVBHDHOMERUN_CONF_TMP}-types $DVBHDHOMERUN_CONF_TMP echo "" >>$DVBHDHOMERUN_CONF_TMP # remove empty lines at the end of file - sed -i '${/^$/d;}' $DVBHDHOMERUN_CONF_TMP + sed -i -e ':a' -e '/^\n*$/{$d;N;};/\n$/ba' $DVBHDHOMERUN_CONF_TMP ADDNEW=true if [ -n "$DVBMODE" ]; then @@ -86,6 +86,23 @@ if [ -z "$(pidof userhdhomerun)" ]; then echo "" >>$DVBHDHOMERUN_CONF_TMP done + # remove logging from libhdhomerun library + awk -v val="[libhdhomerun]" '$0 == val {flag=1; next} /^enable=|^logfile=|^#|^$/{if (flag==1) next} /.*/{flag=0; print}' $DVBHDHOMERUN_CONF_TMP >${DVBHDHOMERUN_CONF_TMP}-log + mv ${DVBHDHOMERUN_CONF_TMP}-log $DVBHDHOMERUN_CONF_TMP + echo "" >>$DVBHDHOMERUN_CONF_TMP + # remove empty lines at the end of file + sed -i -e ':a' -e '/^\n*$/{$d;N;};/\n$/ba' $DVBHDHOMERUN_CONF_TMP + + if [ "$LIBHDHOMERUN_LOG" = "true" ]; then + cat >>$DVBHDHOMERUN_CONF_TMP << EOF + +[libhdhomerun] +enable=true +logfile=/var/log/dvbhdhomerun_libhdhomerun.log + +EOF + fi + md5_1=$(md5sum -b $DVBHDHOMERUN_CONF_TMP | awk '{print $1}') md5_2=$(md5sum -b $ADDON_HOME/dvbhdhomerun.conf | awk '{print $1}') if [ "$md5_1" != "$md5_2" ]; then diff --git a/packages/addons/driver/hdhomerun/source/default.py b/packages/addons/driver/hdhomerun/source/default.py index 8d4c5e9e96..89a8e99f56 100644 --- a/packages/addons/driver/hdhomerun/source/default.py +++ b/packages/addons/driver/hdhomerun/source/default.py @@ -1,6 +1,6 @@ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -21,3 +21,16 @@ import os import sys import xbmcaddon + +__settings__ = xbmcaddon.Addon(id = 'driver.dvb.hdhomerun') +__cwd__ = __settings__.getAddonInfo('path') +__resources_lib__ = xbmc.translatePath(os.path.join(__cwd__, 'resources', 'lib')) +__settings_xml__ = xbmc.translatePath(os.path.join(__cwd__, 'resources', 'settings.xml')) + +__hdhomerun_log__ = '/var/log/dvbhdhomerun.log' + +if __name__ == "__main__" and len(sys.argv) == 2 and sys.argv[1] == 'refresh_tuners': + sys.path.append(__resources_lib__) + from functions import refresh_hdhomerun_tuners + refresh_hdhomerun_tuners(__settings_xml__, __hdhomerun_log__) + __settings__.openSettings() diff --git a/packages/addons/driver/hdhomerun/source/resources/language/English/strings.xml b/packages/addons/driver/hdhomerun/source/resources/language/English/strings.xml index 143e077530..9e9886759e 100644 --- a/packages/addons/driver/hdhomerun/source/resources/language/English/strings.xml +++ b/packages/addons/driver/hdhomerun/source/resources/language/English/strings.xml @@ -3,10 +3,11 @@ General Pre wait time [sec] Post wait time [sec] + Enable libhdhomerun logging Tuner settings Enable modifying settings - Refresh... + Refresh tuners... (press me) use full name disabled diff --git a/packages/addons/driver/hdhomerun/source/resources/lib/functions.py b/packages/addons/driver/hdhomerun/source/resources/lib/functions.py new file mode 100644 index 0000000000..421a3d108d --- /dev/null +++ b/packages/addons/driver/hdhomerun/source/resources/lib/functions.py @@ -0,0 +1,272 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) +# +# This Program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This Program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +import os +import sys +import shutil +import xmlpp +from xml.dom import minidom + +__sundtek_userspace__ = '/storage/.xbmc/userdata/addon_data/driver.dvb.sundtek-mediatv/' + +###################################################################################################### +# backup setting.xml file only if backup doesn't exist +def settings_backup(settings_xml): + try: + with open(settings_xml + '_orig') as f: pass + except IOError as e: + shutil.copyfile(settings_xml, settings_xml + '_orig') + +###################################################################################################### +# restore setting.xml file from backup +def settings_restore(settings_xml): + try: + shutil.copyfile(settings_xml + '_orig', settings_xml) + except IOError as e: + print 'Error restoring file:', settings_xml + +###################################################################################################### +# get hdhomerun supported devices on a system (only name like 101ADD2B-0) +def get_devices_hdhomerun(hdhomerun_log): + tuners = [] + try: + for line in open(hdhomerun_log, 'r'): + line = line.strip() + if line.startswith('Registered tuner'): + name = line.split(':'); + name = name[2].strip() + tuners.append(name) + except IOError: + print 'Error reading hdhomerun log file', hdhomerun_log + return tuners + + """ +root ~ # grep "Registered tuner" /var/log/dvbhdhomerun.log +Registered tuner, id from kernel: 0 name: 101ADD2B-0 +Registered tuner, id from kernel: 1 name: 101ADD2B-1 +Registered tuner, id from kernel: 2 name: 1031D75A-0 +Registered tuner, id from kernel: 3 name: 1031D75A-1 + """ + +###################################################################################################### +# get sundtek supported devices on a system (name, serial number, type) +def get_devices_sundtek(mediaclient_e): + tuners = [] + try: + p = os.popen(mediaclient_e, "r") + while 1: + line = p.readline() + if not line: + break + else: + str = line.strip() + if str.startswith('device '): + name = str[str.find("[")+1:str.find("]")] + tuners.append([name, 0, 's']) + + if str.startswith('[SERIAL]:'): + line = p.readline() + str = line.strip() + if str.startswith('ID:'): + id = str.split(':'); + id = id[1].strip() + tuners[len(tuners)-1] = [name, id, 's'] + + if str.startswith('[DVB-C]:'): + tuners[len(tuners)-1] = [name, id, 'c'] + elif str.startswith('[DVB-T]:'): + tuners[len(tuners)-1] = [name, id, 'c'] + elif str.startswith('[DVB-T2]:'): + tuners[len(tuners)-1] = [name, id, 'c'] + except IOError: + print 'Error getting sundtek tuners info' + return tuners + + """ +root ~ # mediaclient -e +**** List of Media Hardware Devices **** +device 0: [Sundtek MediaTV Pro (USB 2.0)] DVB-C, DVB-T, ANALOG-TV, FM-RADIO, REMOTE-CONTROL, OSS-AUDIO, RDS + [BUS]: + ID: 1-7 + [SERIAL]: + ID: U110763295205 + [DVB-C]: + FRONTEND: /dev/dvb/adapter0/frontend0 + DVR: /dev/dvb/adapter0/dvr0 + DMX: /dev/dvb/adapter0/demux0 + [DVB-T]: + FRONTEND: /dev/dvb/adapter0/frontend0 + DVR: /dev/dvb/adapter0/dvr0 + DMX: /dev/dvb/adapter0/demux0 + [ANALOG-TV]: + VIDEO0: /dev/video0 + VBI0: /dev/vbi0 + [FM-RADIO]: + RADIO0: /dev/radio0 + RDS: /dev/rds0 + [REMOTECONTROL]: + INPUT0: /dev/mediainput0 + [OSS]: + OSS0: /dev/dsp0 + """ + +###################################################################################################### +# parse settings.xml file +def parse_settings(settings_xml): + try: + xmldoc = minidom.parse(settings_xml) + category = xmldoc.getElementsByTagName('category') + return xmldoc + except Exception as inst: + print 'Error parse settings file', settings_xml + return None + +###################################################################################################### +# remove all nodes with id started with ATTACHED_TUNER_ +def remove_old_tuners(xmldoc): + category = xmldoc.getElementsByTagName('category') + for node_cat in category: + setting = node_cat.getElementsByTagName('setting') + for node_set in setting : + if 'id' in node_set.attributes.keys() and not node_set.getAttribute('id').find('ATTACHED_TUNER_'): + node_set.parentNode.removeChild(node_set) + +###################################################################################################### +# add new hdhomerun tuners +def add_hdhomerun(xmldoc, node_cat, tuners): + for ix, tuner in enumerate(tuners): + tuner_var = tuner.replace('-', '_') + + node1 = xmldoc.createElement("setting") + node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_DVBMODE') + node1.setAttribute("label", tuner) + node1.setAttribute("type", 'labelenum') + node1.setAttribute("default", 'auto') + node1.setAttribute("values", 'auto|ATSC|DVB-C|DVB-T') + node_cat.appendChild(node1) + + node2 = xmldoc.createElement("setting") + node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_FULLNAME') + node2.setAttribute("label", '9020') + node2.setAttribute("type", 'bool') + node2.setAttribute("default", 'false') + node_cat.appendChild(node2) + + node3 = xmldoc.createElement("setting") + node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_DISABLE') + node3.setAttribute("label", '9030') + node3.setAttribute("type", 'bool') + node3.setAttribute("default", 'false') + node_cat.appendChild(node3) + + # for tuner + +###################################################################################################### +# add new sundtek tuners +def add_sundtek(xmldoc, node_cat, tuners): + for ix, tuner in enumerate(tuners): + tuner_name = tuner[0] + tuner_serial = tuner[1] + tuner_type = tuner[2] + + node1 = xmldoc.createElement("setting") + node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_DVBMODE') + node1.setAttribute("label", tuner_name + ", " + tuner_serial) + node1.setAttribute("type", 'labelenum') + + if (tuner_type == 's'): + node1.setAttribute("default", 'DVB-S') + node1.setAttribute("values", 'DVB-S') + else: + node1.setAttribute("default", 'DVB-C') + node1.setAttribute("values", 'DVB-C|DVB-T') + + node_cat.appendChild(node1) + + node2 = xmldoc.createElement("setting") + node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_IRPROT') + node2.setAttribute("label", '9020') + node2.setAttribute("type", 'labelenum') + node2.setAttribute("default", 'auto') + node2.setAttribute("values", 'auto|RC5|NEC|RC6') + node_cat.appendChild(node2) + + node3 = xmldoc.createElement("setting") + node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_KEYMAP') + node3.setAttribute("label", '9030') + node3.setAttribute("type", 'file') + node3.setAttribute("mask", '*.map') + node3.setAttribute("default", __sundtek_userspace__) + node_cat.appendChild(node3) + + # for tuner + +###################################################################################################### +# add new ATTACHED_TUNER_ nodes for available tuners +def add_new_tuners(xmldoc, tuners, which): + category = xmldoc.getElementsByTagName('category') + for node_cat in category: + setting = node_cat.getElementsByTagName('setting') + for node_set in setting : + if 'label' in node_set.attributes.keys() and '9010' in node_set.getAttribute('label'): + if which == 'hdhomerun': + add_hdhomerun(xmldoc, node_cat, tuners) + break + elif which == 'sundtek': + add_sundtek(xmldoc, node_cat, tuners) + break + + +###################################################################################################### +# save settings.xml file back +def save_settings(settings_xml, xmldoc): + try: + outputfile = open(settings_xml, 'w') + xmlpp.pprint(xmldoc.toxml(), output = outputfile, indent=2) + outputfile.close() + except IOError: + print 'Error saving file:', settings_xml + settings_restore(settings_xml) + +###################################################################################################### +# refresh hdhomerun tuners in settings.xml file +def refresh_hdhomerun_tuners(settings_xml, hdhomerun_log): + settings_backup(settings_xml) + tuners = get_devices_hdhomerun(hdhomerun_log) + xmldoc = parse_settings(settings_xml) + if xmldoc == None: + print 'No hdhomerun tuners found' + else: + remove_old_tuners(xmldoc) + add_new_tuners(xmldoc, tuners, 'hdhomerun') + save_settings(settings_xml, xmldoc) + +###################################################################################################### +# refresh sundtek tuners in settings.xml file +def refresh_sundtek_tuners(settings_xml, mediaclient_e): + settings_backup(settings_xml) + tuners = get_devices_sundtek(mediaclient_e) + xmldoc = parse_settings(settings_xml) + if xmldoc == None: + print 'No sundtek tuners found' + else: + remove_old_tuners(xmldoc) + add_new_tuners(xmldoc, tuners, 'sundtek') + save_settings(settings_xml, xmldoc) diff --git a/packages/addons/driver/hdhomerun/source/bin/xmlpp.py b/packages/addons/driver/hdhomerun/source/resources/lib/xmlpp.py similarity index 100% rename from packages/addons/driver/hdhomerun/source/bin/xmlpp.py rename to packages/addons/driver/hdhomerun/source/resources/lib/xmlpp.py diff --git a/packages/addons/driver/hdhomerun/source/resources/settings.xml b/packages/addons/driver/hdhomerun/source/resources/settings.xml index afaf8065f9..873b1ef411 100644 --- a/packages/addons/driver/hdhomerun/source/resources/settings.xml +++ b/packages/addons/driver/hdhomerun/source/resources/settings.xml @@ -4,10 +4,11 @@ + - + diff --git a/packages/addons/driver/sundtek-mediatv/changelog.txt b/packages/addons/driver/sundtek-mediatv/changelog.txt index 7161defcaf..f2c5eac910 100644 --- a/packages/addons/driver/sundtek-mediatv/changelog.txt +++ b/packages/addons/driver/sundtek-mediatv/changelog.txt @@ -1,3 +1,5 @@ +3.0.4 + improved python script for modifying tuners 3.0.3 added addon settings for modifying tuner type (DVB-C, DVB-T) 3.0.2 diff --git a/packages/addons/driver/sundtek-mediatv/config/rc_key_enter b/packages/addons/driver/sundtek-mediatv/config/rc_key_enter.map similarity index 100% rename from packages/addons/driver/sundtek-mediatv/config/rc_key_enter rename to packages/addons/driver/sundtek-mediatv/config/rc_key_enter.map diff --git a/packages/addons/driver/sundtek-mediatv/config/rc_key_ok b/packages/addons/driver/sundtek-mediatv/config/rc_key_ok.map similarity index 100% rename from packages/addons/driver/sundtek-mediatv/config/rc_key_ok rename to packages/addons/driver/sundtek-mediatv/config/rc_key_ok.map diff --git a/packages/addons/driver/sundtek-mediatv/meta b/packages/addons/driver/sundtek-mediatv/meta index cb1b74034b..0d94b33e1c 100644 --- a/packages/addons/driver/sundtek-mediatv/meta +++ b/packages/addons/driver/sundtek-mediatv/meta @@ -20,7 +20,7 @@ PKG_NAME="sundtek-mediatv" PKG_VERSION="3.0" -PKG_REV="3" +PKG_REV="4" PKG_ARCH="any" PKG_LICENSE="nonfree" PKG_SITE="http://support.sundtek.com/" diff --git a/packages/addons/driver/sundtek-mediatv/source/bin/refresh-tuners.py b/packages/addons/driver/sundtek-mediatv/source/bin/refresh-tuners.py deleted file mode 100644 index ba9771d103..0000000000 --- a/packages/addons/driver/sundtek-mediatv/source/bin/refresh-tuners.py +++ /dev/null @@ -1,172 +0,0 @@ -""" -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) -# Copyright (C) 2013 ultraman/vpeter -# -# This Program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This Program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ -""" - -import os -import sys -import shutil -import xmlpp -import xbmcaddon - -from xml.dom import minidom -from array import array - -__settings__ = xbmcaddon.Addon(id='driver.dvb.sundtek-mediatv') -__cwd__ = __settings__.getAddonInfo('path') -__mediaclient__ = xbmc.translatePath(os.path.join(__cwd__, 'bin', 'mediaclient')) -__ld_preload__ = xbmc.translatePath(os.path.join(__cwd__, 'lib', 'libmediaclient.so')) -__settings_xml__ = xbmc.translatePath(os.path.join(__cwd__, 'resources', 'settings.xml')) - -__mediaclient_e__ = 'LD_PRELOAD=' + __ld_preload__ + ' ' + __mediaclient__ + ' -e' - -# make backup settings only once -try: - with open(__settings_xml__ + '_orig') as f: pass -except IOError as e: - shutil.copyfile(__settings_xml__, __settings_xml__ + '_orig') - -###################################################################################################### - -# get supported devices on a system (name, serial number, type) -tuners = [] -p = os.popen(__mediaclient_e__, "r") -while 1: - line = p.readline() - if not line: - break - else: - str = line.strip() - if str.startswith('device '): - name = str[str.find("[")+1:str.find("]")] - tuners.append([name, 0, 's']) - - if str.startswith('[SERIAL]:'): - line = p.readline() - str = line.strip() - if str.startswith('ID:'): - id = str.split(':'); - id = id[1].strip() - tuners[len(tuners)-1] = [name, id, 's'] - - if str.startswith('[DVB-C]:'): - tuners[len(tuners)-1] = [name, id, 'c'] - elif str.startswith('[DVB-T]:'): - tuners[len(tuners)-1] = [name, id, 'c'] - elif str.startswith('[DVB-T2]:'): - tuners[len(tuners)-1] = [name, id, 'c'] - -""" -root ~ # mediaclient -e -**** List of Media Hardware Devices **** -device 0: [Sundtek MediaTV Pro (USB 2.0)] DVB-C, DVB-T, ANALOG-TV, FM-RADIO, REMOTE-CONTROL, OSS-AUDIO, RDS - [BUS]: - ID: 1-7 - [SERIAL]: - ID: U110714145205 - [DVB-C]: - FRONTEND: /dev/dvb/adapter0/frontend0 - DVR: /dev/dvb/adapter0/dvr0 - DMX: /dev/dvb/adapter0/demux0 - [DVB-T]: - FRONTEND: /dev/dvb/adapter0/frontend0 - DVR: /dev/dvb/adapter0/dvr0 - DMX: /dev/dvb/adapter0/demux0 - [ANALOG-TV]: - VIDEO0: /dev/video0 - VBI0: /dev/vbi0 - [FM-RADIO]: - RADIO0: /dev/radio0 - RDS: /dev/rds0 - [REMOTECONTROL]: - INPUT0: /dev/mediainput0 - [OSS]: - OSS0: /dev/dsp0 -""" - -###################################################################################################### - -xmldoc = minidom.parse(__settings_xml__) -category = xmldoc.getElementsByTagName('category') - -# remove all nodes with id started with ATTACHED_TUNER_ -for node_cat in category: - setting = node_cat.getElementsByTagName('setting') - for node_set in setting : - if 'id' in node_set.attributes.keys() and not node_set.getAttribute('id').find('ATTACHED_TUNER_'): - node_set.parentNode.removeChild(node_set) - -# add new ATTACHED_TUNER_ nodes for available tuners -for node_cat in category: - setting = node_cat.getElementsByTagName('setting') - for node_set in setting : - if 'label' in node_set.attributes.keys() and '9010' in node_set.getAttribute('label'): - for ix, tuner in enumerate(tuners): - tuner_name = tuner[0] - tuner_serial = tuner[1] - tuner_type = tuner[2] - - node1 = xmldoc.createElement("setting") - node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_DVBMODE') - node1.setAttribute("label", tuner_name + ", " + tuner_serial) - node1.setAttribute("type", 'labelenum') - - if (tuner_type == 's'): - node1.setAttribute("default", 'DVB-S') - node1.setAttribute("values", 'DVB-S') - else: - node1.setAttribute("default", 'DVB-C') - node1.setAttribute("values", 'DVB-C|DVB-T') - - node_cat.appendChild(node1) - - node2 = xmldoc.createElement("setting") - node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_IRPROT') - node2.setAttribute("label", '9020') - node2.setAttribute("type", 'labelenum') - node2.setAttribute("default", 'auto') - node2.setAttribute("values", 'auto|RC5|NEC|RC6') - node_cat.appendChild(node2) - - node3 = xmldoc.createElement("setting") - node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_KEYMAP') - node3.setAttribute("label", '9030') - node3.setAttribute("type", 'text') - node3.setAttribute("default", 'rc_key_ok') - node_cat.appendChild(node3) - - # for tuner - break - -###################################################################################################### - -# save file back -try: - outputfile=open(__settings_xml__, 'w') - xmlpp.pprint(xmldoc.toxml(), output=outputfile, indent=2) - outputfile.close() -except IOError: - print 'Error writing file ', __settings_xml__ - -###################################################################################################### - -# dialog is closed already so just open settings again -xbmcaddon.Addon(id='driver.dvb.sundtek-mediatv').openSettings() diff --git a/packages/addons/driver/sundtek-mediatv/source/bin/userspace-driver.sh b/packages/addons/driver/sundtek-mediatv/source/bin/userspace-driver.sh index b720d77cd5..3f86375417 100644 --- a/packages/addons/driver/sundtek-mediatv/source/bin/userspace-driver.sh +++ b/packages/addons/driver/sundtek-mediatv/source/bin/userspace-driver.sh @@ -2,7 +2,7 @@ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -56,6 +56,9 @@ if [ ! -f "$ADDON_SETTINGS" ]; then cp $ADDON_DIR/settings-default.xml $ADDON_SETTINGS fi +[ ! -f $ADDON_HOME/rc_key_enter.map ] && mv $ADDON_HOME/rc_key_enter $ADDON_HOME/rc_key_enter.map +[ ! -f $ADDON_HOME/rc_key_ok.map ] && mv $ADDON_HOME/rc_key_ok $ADDON_HOME/rc_key_ok.map + mkdir -p /var/config cat "$ADDON_SETTINGS" | awk -F\" '{print $2"=\""$4"\""}' | sed '/^=/d' > /var/config/sundtek-addon.conf . /var/config/sundtek-addon.conf @@ -131,7 +134,7 @@ if [ ! -f $ADDON_HOME/driver-version.txt ]; then fi # enable to install same addon package version again -rm -f /storage/.xbmc/addons/packages/driver.dvb.sundtek* +#rm -f /storage/.xbmc/addons/packages/driver.dvb.sundtek* # add alias for /opt/bin/mediaclient alias_set="$(grep libmediaclient.so /storage/.profile 2>/dev/null)" @@ -213,7 +216,7 @@ if [ -z "$(pidof mediasrv)" ]; then mv ${SUNDTEK_CONF_TMP}-net $SUNDTEK_CONF_TMP echo "" >>$SUNDTEK_CONF_TMP # remove empty lines at the end of file - sed -i '${/^$/d;}' $SUNDTEK_CONF_TMP + sed -i -e ':a' -e '/^\n*$/{$d;N;};/\n$/ba' $SUNDTEK_CONF_TMP # add entries echo -e "\n[NETWORK]" >>$SUNDTEK_CONF_TMP for dev in $(seq 0 $DEVICE1_NUM); do @@ -245,7 +248,7 @@ if [ -z "$(pidof mediasrv)" ]; then mv ${SUNDTEK_CONF_TMP}-net $SUNDTEK_CONF_TMP echo "" >>$SUNDTEK_CONF_TMP # remove empty lines at the end of file - sed -i '${/^$/d;}' $SUNDTEK_CONF_TMP + sed -i -e ':a' -e '/^\n*$/{$d;N;};/\n$/ba' $SUNDTEK_CONF_TMP fi if [ "$ENABLE_TUNER_TYPES" = "true" ]; then @@ -267,15 +270,14 @@ if [ -z "$(pidof mediasrv)" ]; then [ "$IRPROT" = "NEC" -o "$IRPROT" = "auto" ] && IRPROT="" - KEYMAP_FILE="$ADDON_HOME/$KEYMAP" - [ ! -f $KEYMAP_FILE ] && KEYMAP_FILE="" + [ ! -f $KEYMAP ] && KEYMAP="" # remove setttings for this tuner awk -v val="[$SERIAL]" '$0 == val {flag=1; next} /^ir_protocol=|^rcmap=|^initial_dvb_mode=|^#|^$/{if (flag==1) next} /.*/{flag=0; print}' $SUNDTEK_CONF_TMP >${SUNDTEK_CONF_TMP}-types mv ${SUNDTEK_CONF_TMP}-types $SUNDTEK_CONF_TMP echo "" >>$SUNDTEK_CONF_TMP # remove empty lines at the end of file - sed -i '${/^$/d;}' $SUNDTEK_CONF_TMP + sed -i -e ':a' -e '/^\n*$/{$d;N;};/\n$/ba' $SUNDTEK_CONF_TMP ADDNEW=true if [ -n "$DVBMODE" ]; then @@ -286,9 +288,9 @@ if [ -z "$(pidof mediasrv)" ]; then [ $ADDNEW = true ] && ADDNEW=false && echo -e "\n[$SERIAL]" >>$SUNDTEK_CONF_TMP echo "ir_protocol=$IRPROT" >>$SUNDTEK_CONF_TMP fi - if [ -n "$KEYMAP_FILE" ]; then + if [ -n "$KEYMAP" ]; then [ $ADDNEW = true ] && ADDNEW=false && echo -e "\n[$SERIAL]" >>$SUNDTEK_CONF_TMP - echo "rcmap=$KEYMAP_FILE" >>$SUNDTEK_CONF_TMP + echo "rcmap=$KEYMAP" >>$SUNDTEK_CONF_TMP fi echo "" >>$SUNDTEK_CONF_TMP diff --git a/packages/addons/driver/sundtek-mediatv/source/default.py b/packages/addons/driver/sundtek-mediatv/source/default.py index 8d4c5e9e96..d02f59584a 100644 --- a/packages/addons/driver/sundtek-mediatv/source/default.py +++ b/packages/addons/driver/sundtek-mediatv/source/default.py @@ -1,6 +1,6 @@ ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) # # This Program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -21,3 +21,18 @@ import os import sys import xbmcaddon + +__settings__ = xbmcaddon.Addon(id = 'driver.dvb.sundtek-mediatv') +__cwd__ = __settings__.getAddonInfo('path') +__resources_lib__ = xbmc.translatePath(os.path.join(__cwd__, 'resources', 'lib')) +__settings_xml__ = xbmc.translatePath(os.path.join(__cwd__, 'resources', 'settings.xml')) + +__mediaclient__ = xbmc.translatePath(os.path.join(__cwd__, 'bin', 'mediaclient')) +__ld_preload__ = xbmc.translatePath(os.path.join(__cwd__, 'lib', 'libmediaclient.so')) +__mediaclient_e__ = 'LD_PRELOAD=' + __ld_preload__ + ' ' + __mediaclient__ + ' -e' + +if __name__ == "__main__" and len(sys.argv) == 2 and sys.argv[1] == 'refresh_tuners': + sys.path.append(__resources_lib__) + from functions import refresh_sundtek_tuners + refresh_sundtek_tuners(__settings_xml__, __mediaclient_e__) + __settings__.openSettings() diff --git a/packages/addons/driver/sundtek-mediatv/source/resources/language/English/strings.xml b/packages/addons/driver/sundtek-mediatv/source/resources/language/English/strings.xml index 97d55aa426..b39dad0c87 100644 --- a/packages/addons/driver/sundtek-mediatv/source/resources/language/English/strings.xml +++ b/packages/addons/driver/sundtek-mediatv/source/resources/language/English/strings.xml @@ -25,7 +25,7 @@ Tuner settings Enable modifying settings - Refresh... + Refresh tuners... (press me) IR protocol keymap filename diff --git a/packages/addons/driver/sundtek-mediatv/source/resources/lib/functions.py b/packages/addons/driver/sundtek-mediatv/source/resources/lib/functions.py new file mode 100644 index 0000000000..421a3d108d --- /dev/null +++ b/packages/addons/driver/sundtek-mediatv/source/resources/lib/functions.py @@ -0,0 +1,272 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) +# +# This Program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This Program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +import os +import sys +import shutil +import xmlpp +from xml.dom import minidom + +__sundtek_userspace__ = '/storage/.xbmc/userdata/addon_data/driver.dvb.sundtek-mediatv/' + +###################################################################################################### +# backup setting.xml file only if backup doesn't exist +def settings_backup(settings_xml): + try: + with open(settings_xml + '_orig') as f: pass + except IOError as e: + shutil.copyfile(settings_xml, settings_xml + '_orig') + +###################################################################################################### +# restore setting.xml file from backup +def settings_restore(settings_xml): + try: + shutil.copyfile(settings_xml + '_orig', settings_xml) + except IOError as e: + print 'Error restoring file:', settings_xml + +###################################################################################################### +# get hdhomerun supported devices on a system (only name like 101ADD2B-0) +def get_devices_hdhomerun(hdhomerun_log): + tuners = [] + try: + for line in open(hdhomerun_log, 'r'): + line = line.strip() + if line.startswith('Registered tuner'): + name = line.split(':'); + name = name[2].strip() + tuners.append(name) + except IOError: + print 'Error reading hdhomerun log file', hdhomerun_log + return tuners + + """ +root ~ # grep "Registered tuner" /var/log/dvbhdhomerun.log +Registered tuner, id from kernel: 0 name: 101ADD2B-0 +Registered tuner, id from kernel: 1 name: 101ADD2B-1 +Registered tuner, id from kernel: 2 name: 1031D75A-0 +Registered tuner, id from kernel: 3 name: 1031D75A-1 + """ + +###################################################################################################### +# get sundtek supported devices on a system (name, serial number, type) +def get_devices_sundtek(mediaclient_e): + tuners = [] + try: + p = os.popen(mediaclient_e, "r") + while 1: + line = p.readline() + if not line: + break + else: + str = line.strip() + if str.startswith('device '): + name = str[str.find("[")+1:str.find("]")] + tuners.append([name, 0, 's']) + + if str.startswith('[SERIAL]:'): + line = p.readline() + str = line.strip() + if str.startswith('ID:'): + id = str.split(':'); + id = id[1].strip() + tuners[len(tuners)-1] = [name, id, 's'] + + if str.startswith('[DVB-C]:'): + tuners[len(tuners)-1] = [name, id, 'c'] + elif str.startswith('[DVB-T]:'): + tuners[len(tuners)-1] = [name, id, 'c'] + elif str.startswith('[DVB-T2]:'): + tuners[len(tuners)-1] = [name, id, 'c'] + except IOError: + print 'Error getting sundtek tuners info' + return tuners + + """ +root ~ # mediaclient -e +**** List of Media Hardware Devices **** +device 0: [Sundtek MediaTV Pro (USB 2.0)] DVB-C, DVB-T, ANALOG-TV, FM-RADIO, REMOTE-CONTROL, OSS-AUDIO, RDS + [BUS]: + ID: 1-7 + [SERIAL]: + ID: U110763295205 + [DVB-C]: + FRONTEND: /dev/dvb/adapter0/frontend0 + DVR: /dev/dvb/adapter0/dvr0 + DMX: /dev/dvb/adapter0/demux0 + [DVB-T]: + FRONTEND: /dev/dvb/adapter0/frontend0 + DVR: /dev/dvb/adapter0/dvr0 + DMX: /dev/dvb/adapter0/demux0 + [ANALOG-TV]: + VIDEO0: /dev/video0 + VBI0: /dev/vbi0 + [FM-RADIO]: + RADIO0: /dev/radio0 + RDS: /dev/rds0 + [REMOTECONTROL]: + INPUT0: /dev/mediainput0 + [OSS]: + OSS0: /dev/dsp0 + """ + +###################################################################################################### +# parse settings.xml file +def parse_settings(settings_xml): + try: + xmldoc = minidom.parse(settings_xml) + category = xmldoc.getElementsByTagName('category') + return xmldoc + except Exception as inst: + print 'Error parse settings file', settings_xml + return None + +###################################################################################################### +# remove all nodes with id started with ATTACHED_TUNER_ +def remove_old_tuners(xmldoc): + category = xmldoc.getElementsByTagName('category') + for node_cat in category: + setting = node_cat.getElementsByTagName('setting') + for node_set in setting : + if 'id' in node_set.attributes.keys() and not node_set.getAttribute('id').find('ATTACHED_TUNER_'): + node_set.parentNode.removeChild(node_set) + +###################################################################################################### +# add new hdhomerun tuners +def add_hdhomerun(xmldoc, node_cat, tuners): + for ix, tuner in enumerate(tuners): + tuner_var = tuner.replace('-', '_') + + node1 = xmldoc.createElement("setting") + node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_DVBMODE') + node1.setAttribute("label", tuner) + node1.setAttribute("type", 'labelenum') + node1.setAttribute("default", 'auto') + node1.setAttribute("values", 'auto|ATSC|DVB-C|DVB-T') + node_cat.appendChild(node1) + + node2 = xmldoc.createElement("setting") + node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_FULLNAME') + node2.setAttribute("label", '9020') + node2.setAttribute("type", 'bool') + node2.setAttribute("default", 'false') + node_cat.appendChild(node2) + + node3 = xmldoc.createElement("setting") + node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_var + '_DISABLE') + node3.setAttribute("label", '9030') + node3.setAttribute("type", 'bool') + node3.setAttribute("default", 'false') + node_cat.appendChild(node3) + + # for tuner + +###################################################################################################### +# add new sundtek tuners +def add_sundtek(xmldoc, node_cat, tuners): + for ix, tuner in enumerate(tuners): + tuner_name = tuner[0] + tuner_serial = tuner[1] + tuner_type = tuner[2] + + node1 = xmldoc.createElement("setting") + node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_DVBMODE') + node1.setAttribute("label", tuner_name + ", " + tuner_serial) + node1.setAttribute("type", 'labelenum') + + if (tuner_type == 's'): + node1.setAttribute("default", 'DVB-S') + node1.setAttribute("values", 'DVB-S') + else: + node1.setAttribute("default", 'DVB-C') + node1.setAttribute("values", 'DVB-C|DVB-T') + + node_cat.appendChild(node1) + + node2 = xmldoc.createElement("setting") + node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_IRPROT') + node2.setAttribute("label", '9020') + node2.setAttribute("type", 'labelenum') + node2.setAttribute("default", 'auto') + node2.setAttribute("values", 'auto|RC5|NEC|RC6') + node_cat.appendChild(node2) + + node3 = xmldoc.createElement("setting") + node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_KEYMAP') + node3.setAttribute("label", '9030') + node3.setAttribute("type", 'file') + node3.setAttribute("mask", '*.map') + node3.setAttribute("default", __sundtek_userspace__) + node_cat.appendChild(node3) + + # for tuner + +###################################################################################################### +# add new ATTACHED_TUNER_ nodes for available tuners +def add_new_tuners(xmldoc, tuners, which): + category = xmldoc.getElementsByTagName('category') + for node_cat in category: + setting = node_cat.getElementsByTagName('setting') + for node_set in setting : + if 'label' in node_set.attributes.keys() and '9010' in node_set.getAttribute('label'): + if which == 'hdhomerun': + add_hdhomerun(xmldoc, node_cat, tuners) + break + elif which == 'sundtek': + add_sundtek(xmldoc, node_cat, tuners) + break + + +###################################################################################################### +# save settings.xml file back +def save_settings(settings_xml, xmldoc): + try: + outputfile = open(settings_xml, 'w') + xmlpp.pprint(xmldoc.toxml(), output = outputfile, indent=2) + outputfile.close() + except IOError: + print 'Error saving file:', settings_xml + settings_restore(settings_xml) + +###################################################################################################### +# refresh hdhomerun tuners in settings.xml file +def refresh_hdhomerun_tuners(settings_xml, hdhomerun_log): + settings_backup(settings_xml) + tuners = get_devices_hdhomerun(hdhomerun_log) + xmldoc = parse_settings(settings_xml) + if xmldoc == None: + print 'No hdhomerun tuners found' + else: + remove_old_tuners(xmldoc) + add_new_tuners(xmldoc, tuners, 'hdhomerun') + save_settings(settings_xml, xmldoc) + +###################################################################################################### +# refresh sundtek tuners in settings.xml file +def refresh_sundtek_tuners(settings_xml, mediaclient_e): + settings_backup(settings_xml) + tuners = get_devices_sundtek(mediaclient_e) + xmldoc = parse_settings(settings_xml) + if xmldoc == None: + print 'No sundtek tuners found' + else: + remove_old_tuners(xmldoc) + add_new_tuners(xmldoc, tuners, 'sundtek') + save_settings(settings_xml, xmldoc) diff --git a/packages/addons/driver/sundtek-mediatv/source/bin/xmlpp.py b/packages/addons/driver/sundtek-mediatv/source/resources/lib/xmlpp.py similarity index 100% rename from packages/addons/driver/sundtek-mediatv/source/bin/xmlpp.py rename to packages/addons/driver/sundtek-mediatv/source/resources/lib/xmlpp.py diff --git a/packages/addons/driver/sundtek-mediatv/source/resources/settings.xml b/packages/addons/driver/sundtek-mediatv/source/resources/settings.xml index 24ffab9056..f69589c854 100644 --- a/packages/addons/driver/sundtek-mediatv/source/resources/settings.xml +++ b/packages/addons/driver/sundtek-mediatv/source/resources/settings.xml @@ -28,6 +28,6 @@ - +