diff --git a/packages/addons/service/downloadmanager/SABnzbd-Suite/config/settings.xml b/packages/addons/service/downloadmanager/SABnzbd-Suite/config/settings.xml
index 20c2a69b4e..6bdd7c4637 100644
--- a/packages/addons/service/downloadmanager/SABnzbd-Suite/config/settings.xml
+++ b/packages/addons/service/downloadmanager/SABnzbd-Suite/config/settings.xml
@@ -2,4 +2,5 @@
+
diff --git a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/bin/SABnzbd-Suite.py b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/bin/SABnzbd-Suite.py
new file mode 100755
index 0000000000..8b1ff65847
--- /dev/null
+++ b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/bin/SABnzbd-Suite.py
@@ -0,0 +1,401 @@
+################################################################################
+# This file is part of OpenELEC - http://www.openelec.tv
+# Copyright (C) 2012 Lukas Heiniger
+#
+# 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
+################################################################################
+
+
+# Initializes and launches SABnzbd, Couchpotato, Sickbeard and Headphones
+
+import os
+import shutil
+import xbmc
+import signal
+import subprocess
+import urllib2
+from configobj import ConfigObj
+from xml.dom.minidom import parseString
+import logging
+
+logging.basicConfig(filename='/var/log/sabnzbd-suite.log',
+ filemode='w',
+ format='%(asctime)s SABnzbd-Suite: %(message)s',
+ level=logging.WARNING)
+
+
+
+
+# helper functions
+# ----------------
+
+def createDir(dir):
+ if not os.path.isdir(dir):
+ os.makedirs(dir)
+
+def getAddonSetting(doc,id):
+ for element in doc.getElementsByTagName('setting'):
+ if element.getAttribute('id')==id:
+ return element.getAttribute('value')
+
+def loadWebInterface(url,user,pwd):
+ passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
+ passman.add_password(None, url, user, pwd)
+ authhandler = urllib2.HTTPBasicAuthHandler(passman)
+ opener = urllib2.build_opener(authhandler)
+ urllib2.install_opener(opener)
+ pagehandle = urllib2.urlopen(url)
+ return pagehandle.read()
+
+
+
+
+# define some things that we're gonna need, mainly paths
+# ------------------------------------------------------
+
+# addon
+pAddon = os.path.expanduser('~/.xbmc/addons/service.downloadmanager.SABnzbd-Suite')
+pAddonHome = os.path.expanduser('~/.xbmc/userdata/addon_data/service.downloadmanager.SABnzbd-Suite')
+
+# settings
+pDefaultSuiteSettings = os.path.join(pAddon, 'settings-default.xml')
+pSuiteSettings = os.path.join(pAddonHome, 'settings.xml')
+pXbmcSettings = '/storage/.xbmc/userdata/guisettings.xml'
+pSabNzbdSettings = os.path.join(pAddonHome, 'sabnzbd.ini')
+pSickBeardSettings = os.path.join(pAddonHome, 'config.ini')
+pCouchPotatoSettings = os.path.join(pAddonHome, 'couchpotato.ini')
+pHeadphonesSettings = os.path.join(pAddonHome, 'headphones.ini')
+
+# directories
+pSabNzbdComplete = '/storage/downloads'
+pSabNzbdCompleteMov = '/storage/downloads/movies'
+pSabNzbdCompleteMusic = '/storage/downloads/music'
+pSabNzbdIncomplete = '/storage/downloads/incomplete'
+pSickBeardTvScripts = os.path.join(pAddon, 'SickBeard/autoProcessTV')
+pSabNzbdScripts = os.path.join(pAddonHome, 'scripts')
+
+
+# pylib
+pPylib = os.path.join(pAddon, 'pylib')
+
+# service commands
+sabnzbd = ['python', os.path.join(pAddon, 'SABnzbd/SABnzbd.py'),
+ '-d', '-f', pSabNzbdSettings, '-l 0']
+sickBeard = ['python', os.path.join(pAddon, 'SickBeard/SickBeard.py'),
+ '--daemon', '--datadir', pAddonHome]
+couchPotato = ['python', os.path.join(pAddon, 'CouchPotato/CouchPotato.py'),
+ '-d', '--datadir', pAddonHome, '--config', pCouchPotatoSettings]
+headphones = ['python', os.path.join(pAddon, 'Headphones/Headphones.py'),
+ '-d', '--datadir', pAddonHome, '--config', pHeadphonesSettings]
+
+# Other stuff
+sabNzbdHost = '127.0.0.1:8081'
+addonId = 'service.downloadmanager.SABnzbd-Suite'
+
+
+
+
+# create directories and settings on first launch
+# -----------------------------------------------
+
+firstLaunch = not os.path.exists(pSabNzbdSettings)
+if firstLaunch:
+ logging.debug('First launch, creating directories')
+ createDir(pAddonHome)
+ createDir(pSabNzbdComplete)
+ createDir(pSabNzbdCompleteMov)
+ createDir(pSabNzbdCompleteMusic)
+ createDir(pSabNzbdIncomplete)
+ createDir(pSabNzbdScripts)
+ shutil.copy(os.path.join(pSickBeardTvScripts,'sabToSickBeard.py'), pSabNzbdScripts)
+ shutil.copy(os.path.join(pSickBeardTvScripts,'autoProcessTV.py'), pSabNzbdScripts)
+ os.chmod(os.path.join(pSabNzbdScripts,'sabToSickBeard.py'), 0755)
+ # the settings file already exists if the user set settings before the first launch
+ if not os.path.exists(pSuiteSettings):
+ shutil.copy(pDefaultSuiteSettings, pSuiteSettings)
+ # make utilities executable
+ for utility in {'par2','unrar','unzip'}:
+ os.chmod(os.path.join(pAddon, 'bin', utility), 0755)
+
+
+
+
+# read addon and xbmc settings
+# ----------------------------
+
+# SABnzbd-Suite
+fSuiteSettings = open(pSuiteSettings, 'r')
+data = fSuiteSettings.read()
+fSuiteSettings.close
+suiteSettings = parseString(data)
+user = getAddonSetting(suiteSettings, 'SABNZBD_USER')
+pwd = getAddonSetting(suiteSettings, 'SABNZBD_PWD')
+host = getAddonSetting(suiteSettings, 'SABNZBD_IP')
+sabNzbdKeepAwake = getAddonSetting(suiteSettings, 'SABNZBD_KEEP_AWAKE')
+
+# XBMC
+fXbmcSettings = open(pXbmcSettings, 'r')
+data = fXbmcSettings.read()
+fXbmcSettings.close
+xbmcSettings = parseString(data)
+xbmcServices = xbmcSettings.getElementsByTagName('services')[0]
+xbmcPort = xbmcServices.getElementsByTagName('webserverport')[0].firstChild.data
+try:
+ xbmcUser = xbmcServices.getElementsByTagName('webserverusername')[0].firstChild.data
+except:
+ xbmcUser = ''
+try:
+ xbmcPwd = xbmcServices.getElementsByTagName('webserverpassword')[0].firstChild.data
+except:
+ xbmcPwd = ''
+
+
+
+# prepare execution environment
+# -----------------------------
+
+signal.signal(signal.SIGCHLD, signal.SIG_DFL)
+os.environ['PYTHONPATH'] = str(os.environ.get('PYTHONPATH')) + ':' + pPylib
+
+
+
+
+# write SABnzbd settings
+# ----------------------
+
+sabNzbdConfig = ConfigObj(pSabNzbdSettings,create_empty=True)
+defaultConfig = ConfigObj()
+defaultConfig['misc'] = {}
+defaultConfig['misc']['disable_api_key'] = '0'
+defaultConfig['misc']['check_new_rel'] = '0'
+defaultConfig['misc']['auto_browser'] = '0'
+defaultConfig['misc']['username'] = user
+defaultConfig['misc']['password'] = pwd
+defaultConfig['misc']['port'] = '8081'
+defaultConfig['misc']['https_port'] = '9081'
+defaultConfig['misc']['https_cert'] = 'server.cert'
+defaultConfig['misc']['https_key'] = 'server.key'
+defaultConfig['misc']['host'] = host
+defaultConfig['misc']['web_dir'] = 'Plush'
+defaultConfig['misc']['web_dir2'] = 'Plush'
+defaultConfig['misc']['web_color'] = 'gold'
+defaultConfig['misc']['web_color2'] = 'gold'
+defaultConfig['misc']['log_dir'] = 'logs'
+defaultConfig['misc']['admin_dir'] = 'admin'
+defaultConfig['misc']['nzb_backup_dir'] = 'backup'
+defaultConfig['misc']['script_dir'] = 'scripts'
+
+if firstLaunch:
+ defaultConfig['misc']['download_dir'] = pSabNzbdIncomplete
+ defaultConfig['misc']['complete_dir'] = pSabNzbdComplete
+ servers = {}
+ servers['localhost'] = {}
+ servers['localhost']['host'] = 'localhost'
+ servers['localhost']['port'] = '119'
+ servers['localhost']['enable'] = '0'
+ categories = {}
+ categories['tv'] = {}
+ categories['tv']['name'] = 'tv'
+ categories['tv']['script'] = 'sabToSickBeard.py'
+ categories['tv']['priority'] = '-100'
+ categories['movies'] = {}
+ categories['movies']['name'] = 'movies'
+ categories['movies']['dir'] = 'movies'
+ categories['movies']['priority'] = '-100'
+ categories['music'] = {}
+ categories['music']['name'] = 'music'
+ categories['music']['dir'] = 'music'
+ categories['music']['priority'] = '-100'
+ defaultConfig['servers'] = servers
+ defaultConfig['categories'] = categories
+
+sabNzbdConfig.merge(defaultConfig)
+sabNzbdConfig.write()
+
+# also keep the autoProcessTV config up to date
+autoProcessConfig = ConfigObj(os.path.join(pSabNzbdScripts, 'autoProcessTV.cfg'), create_empty=True)
+defaultConfig = ConfigObj()
+defaultConfig['SickBeard'] = {}
+defaultConfig['SickBeard']['host'] = 'localhost'
+defaultConfig['SickBeard']['port'] = '8082'
+defaultConfig['SickBeard']['username'] = user
+defaultConfig['SickBeard']['password'] = pwd
+autoProcessConfig.merge(defaultConfig)
+autoProcessConfig.write()
+
+
+
+
+# launch SABnzbd and get the API key
+# ----------------------------------
+
+logging.debug('Launching SABnzbd...')
+subprocess.call(sabnzbd)
+logging.debug('...done')
+
+# SABnzbd will only complete the .ini file when we first access the web interface
+if firstLaunch:
+ loadWebInterface('http://' + sabNzbdHost,user,pwd)
+sabNzbdConfig.reload()
+sabNzbdApiKey = sabNzbdConfig['misc']['api_key']
+logging.debug('SABnzbd api key: ' + sabNzbdApiKey)
+
+
+
+
+# write SickBeard settings
+# ------------------------
+
+sickBeardConfig = ConfigObj(pSickBeardSettings,create_empty=True)
+defaultConfig = ConfigObj()
+defaultConfig['General'] = {}
+defaultConfig['General']['launch_browser'] = '0'
+defaultConfig['General']['version_notify'] = '0'
+defaultConfig['General']['log_dir'] = 'logs'
+defaultConfig['General']['web_port'] = '8082'
+defaultConfig['General']['web_host'] = host
+defaultConfig['General']['web_username'] = user
+defaultConfig['General']['web_password'] = pwd
+defaultConfig['SABnzbd'] = {}
+defaultConfig['SABnzbd']['sab_username'] = user
+defaultConfig['SABnzbd']['sab_password'] = pwd
+defaultConfig['SABnzbd']['sab_apikey'] = sabNzbdApiKey
+defaultConfig['SABnzbd']['sab_host'] = 'http://' + sabNzbdHost + '/'
+defaultConfig['XBMC'] = {}
+defaultConfig['XBMC']['use_xbmc'] = '1'
+defaultConfig['XBMC']['xbmc_host'] = '127.0.0.1:' + xbmcPort
+defaultConfig['XBMC']['xbmc_username'] = xbmcUser
+defaultConfig['XBMC']['xbmc_password'] = xbmcPwd
+
+if firstLaunch:
+ defaultConfig['General']['metadata_xbmc'] = '1|1|1|1|1|1'
+ defaultConfig['General']['nzb_method'] = 'sabnzbd'
+ defaultConfig['General']['keep_processed_dir'] = '0'
+ defaultConfig['General']['use_banner'] = '1'
+ defaultConfig['General']['rename_episodes'] = '1'
+ defaultConfig['General']['naming_ep_name'] = '0'
+ defaultConfig['General']['naming_use_periods'] = '1'
+ defaultConfig['General']['naming_sep_type'] = '1'
+ defaultConfig['General']['naming_ep_type'] = '1'
+ defaultConfig['General']['root_dirs'] = '0|/storage/tvshows'
+ defaultConfig['SABnzbd']['sab_category'] = 'tv'
+ # workaround: on first launch, sick beard will always add
+ # 'http://' and trailing '/' on its own
+ defaultConfig['SABnzbd']['sab_host'] = sabNzbdHost
+ defaultConfig['XBMC']['xbmc_notify_ondownload'] = '1'
+ defaultConfig['XBMC']['xbmc_update_library'] = '1'
+
+sickBeardConfig.merge(defaultConfig)
+sickBeardConfig.write()
+
+
+
+
+# launch SickBeard
+# ----------------
+logging.debug('Launching SickBeard...')
+subprocess.call(sickBeard)
+logging.debug('...done')
+
+
+
+
+# write CouchPotato settings
+# --------------------------
+
+couchPotatoConfig = ConfigObj(pCouchPotatoSettings,create_empty=True)
+defaultConfig = ConfigObj()
+defaultConfig['global'] = {}
+defaultConfig['global']['launchbrowser'] = 'False'
+defaultConfig['global']['updater'] = 'False'
+defaultConfig['global']['password'] = pwd
+defaultConfig['global']['username'] = user
+defaultConfig['global']['port'] = '8083'
+defaultConfig['global']['host'] = host
+defaultConfig['Sabnzbd'] = {}
+defaultConfig['Sabnzbd']['username'] = user
+defaultConfig['Sabnzbd']['password'] = pwd
+defaultConfig['Sabnzbd']['apikey'] = sabNzbdApiKey
+defaultConfig['Sabnzbd']['host'] = sabNzbdHost
+defaultConfig['XBMC'] = {}
+defaultConfig['XBMC']['enabled'] = 'True'
+defaultConfig['XBMC']['host'] = '127.0.0.1:' + xbmcPort
+defaultConfig['XBMC']['username'] = xbmcUser
+defaultConfig['XBMC']['password'] = xbmcPwd
+
+if firstLaunch:
+ defaultConfig['Sabnzbd']['category'] = 'movies'
+ defaultConfig['Sabnzbd']['ppdir'] = pSabNzbdCompleteMov
+ defaultConfig['Renamer'] = {}
+ defaultConfig['Renamer']['enabled'] = 'True'
+ defaultConfig['Renamer']['download'] = pSabNzbdCompleteMov
+ defaultConfig['Renamer']['destination'] = '/storage/videos'
+ defaultConfig['Renamer']['separator'] = '.'
+ defaultConfig['Renamer']['cleanup'] = 'True'
+
+couchPotatoConfig.merge(defaultConfig)
+couchPotatoConfig.write()
+
+
+
+
+# launch CouchPotato
+# ------------------
+
+logging.debug('Launching CouchPotato...')
+subprocess.call(couchPotato)
+logging.debug('...done')
+
+
+
+
+# write Headphones settings
+# -------------------------
+
+headphonesConfig = ConfigObj(pHeadphonesSettings,create_empty=True)
+defaultConfig = ConfigObj()
+defaultConfig['General'] = {}
+defaultConfig['General']['launch_browser'] = '0'
+defaultConfig['General']['http_port'] = '8084'
+defaultConfig['General']['http_host'] = host
+defaultConfig['General']['http_username'] = user
+defaultConfig['General']['http_password'] = pwd
+defaultConfig['SABnzbd'] = {}
+defaultConfig['SABnzbd']['sab_apikey'] = sabNzbdApiKey
+defaultConfig['SABnzbd']['sab_host'] = sabNzbdHost
+defaultConfig['SABnzbd']['sab_username'] = user
+defaultConfig['SABnzbd']['sab_password'] = pwd
+
+if firstLaunch:
+ defaultConfig['SABnzbd']['sab_category'] = 'music'
+ defaultConfig['General']['music_dir'] = '/storage/music'
+ defaultConfig['General']['destination_dir'] = '/storage/music'
+ defaultConfig['General']['download_dir'] = '/storage/downloads/music'
+ defaultConfig['General']['move_files'] = '1'
+ defaultConfig['General']['rename_files'] = '1'
+
+headphonesConfig.merge(defaultConfig)
+headphonesConfig.write()
+
+
+
+
+# launch Headphones
+# -----------------
+
+logging.debug('Launching Headphones...')
+subprocess.call(headphones)
+logging.debug('...done')
diff --git a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/bin/SABnzbd-Suite.service b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/bin/SABnzbd-Suite.service
deleted file mode 100755
index 8115710b7f..0000000000
--- a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/bin/SABnzbd-Suite.service
+++ /dev/null
@@ -1,359 +0,0 @@
-#!/bin/sh
-
-################################################################################
-# This file is part of OpenELEC - http://www.openelec.tv
-# Copyright (C) 2009-2012 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
-################################################################################
-
-. /etc/profile
-
-# Addon settings
- ADDON_DIR="$HOME/.xbmc/addons/service.downloadmanager.SABnzbd-Suite"
- ADDON_HOME="$HOME/.xbmc/userdata/addon_data/service.downloadmanager.SABnzbd-Suite"
-
- SABNZBDSUITE_SETTINGS="$ADDON_HOME/settings.xml"
- SABNZBD_SETTINGS="$ADDON_HOME/sabnzbd.ini"
- SICKBEARD_SETTINGS="$ADDON_HOME/config.ini"
- COUCHPOTATO_SETTINGS="$ADDON_HOME/couchpotato.ini"
- HEADPHONES_SETTINGS="$ADDON_HOME/headphones.ini"
- XBMC_SETTINGS="$HOME/.xbmc/userdata/guisettings.xml"
-
- export PYTHONPATH="$PYTHONPATH:$ADDON_DIR/pylib"
-
-################################################################################
-# default sabnzbd values
-################################################################################
- SABNZBD_HOST="127.0.0.1"
- SABNZBD_PORT="8081"
- SABNZBD_DISABLEAPIKEY="0"
- SABNZBD_CHECKRELEASE="0"
- SABNZBD_LAUNCHBROWSER="0"
-
- SABNZBD_HTTPPORT="8081"
- SABNZBD_HTTPSPORT="9081"
- SABNZBD_HTTPSCERT="server.cert"
- SABNZBD_HTTPSKEY="server.key"
-
- SABNZBD_SKIN="Plush"
- SABNZBD_SKIN2="Plush"
- SABNZBD_WEBCOLOR="gold"
- SABNZBD_WEBCOLOR2="gold"
-
- SABNZBD_LOGDIR="logs"
- SABNZBD_ADMINDIR="admin"
- SABNZBD_BACKUPDIR="backup"
- SABNZBD_SCRIPTDIR="scripts"
-
- SABNZBD_INCOMPLETEDIR="/storage/downloads/incomplete"
- SABNZBD_COMPLETEDIR="/storage/downloads"
- SABNZBD_WATCHDIR="/storage/downloads/watch"
-
-################################################################################
-# default sickbeard values
-################################################################################
- SICKBEARD_LOGDIR="log"
- SICKBEARD_CACHEDIR="cache"
- SICKBEARD_PORT="8082"
- SICKBEARD_LAUNCHBROWSER="0"
- SICKBEARD_VERSIONCHECK="0"
- SICKBEARD_USEIPV6="0"
- SICKBEARD_WEBLOG="0"
-
- SICKBEARD_USEXBMC="1"
- SICKBEARD_METADATAXBMC="1|1|1|1|1|1"
-
-################################################################################
-# default couchpotato values
-################################################################################
- COUCHPOTATO_LAUNCHBROWSER="False"
- COUCHPOTATO_VERSIONCHECK="False"
- COUCHPOTATO_PORT="8083"
- COUCHPOTATO_USEXBMC="True"
- COUCHPOTATO_UPDATEXBMC="True"
-
-################################################################################
-# default headphones values
-################################################################################
-
- HEADPHONES_PORT="8084"
- HEADPHONES_LAUNCHBROWSER="0"
- HEADPHONES_MUSICDIR="/storage/music"
- HEADPHONES_DESTDIR="/storage/music"
- HEADPHONES_DOWNLOADDIR="/storage/music"
- HEADPHONES_SABHOST="$SABNZBD_HOST:$SABNZBD_PORT"
- HEADPHONES_SABCATEGORY="music"
-
-################################################################################
-# setup functions
-################################################################################
-
-write_sabnzbd_ini() {
-python $ADDON_DIR/bin/ini_tool --action=write \
- --file=$SABNZBD_SETTINGS \
- --option="$1:$2" \
- --value="$3"
-}
-
-write_sickbeard_ini() {
-python $ADDON_DIR/bin/ini_tool --action=write \
- --file=$SICKBEARD_SETTINGS \
- --option="$1:$2" \
- --value="$3"
-}
-
-write_couchpotato_ini() {
-python $ADDON_DIR/bin/ini_tool --action=write \
- --file=$COUCHPOTATO_SETTINGS \
- --option="$1:$2" \
- --value="$3"
-}
-
-write_headphones_ini() {
-python $ADDON_DIR/bin/ini_tool --action=write \
- --file=$HEADPHONES_SETTINGS \
- --option="$1:$2" \
- --value="$3"
-}
-
-read_sabconfig() {
-python $ADDON_DIR/bin/ini_tool --action=read \
- --file=$SABNZBD_SETTINGS \
- --option="$1:$2"
-}
-
-
-read_xbmcconfig() {
-grep "<$1>" $XBMC_SETTINGS | sed -e "s,[[:space:]]*<$1>,," -e "s,$1>,,"
-}
-
-write_ini_postprocess() {
-python $ADDON_DIR/bin/ini_tool --action=write \
- --file=$ADDON_HOME/$SABNZBD_SCRIPTDIR/autoProcessTV.cfg \
- --option="$1:$2" \
- --value="$3"
-}
-
-################################################################################
-# read xbmc settings
-################################################################################
- XBMC_HOST="127.0.0.1"
- XBMC_PORT=`read_xbmcconfig webserverport`
- XBMC_USER=`read_xbmcconfig webserverusername`
- XBMC_PWD=`read_xbmcconfig webserverpassword`
-
-################################################################################
-# create default config
-################################################################################
-
- mkdir -p $ADDON_HOME
-
- if [ ! -f "$SABNZBDSUITE_SETTINGS" ]; then
- cp $ADDON_DIR/settings-default.xml $SABNZBDSUITE_SETTINGS
- fi
-
-################################################################################
-# read settings from xbmc setup dialog
-################################################################################
- mkdir -p /var/config
- cat "$ADDON_DIR/settings-default.xml" | awk -F\" '{print $2"=\""$4"\""}' | sed '/^=/d' > /var/config/sabnzbd.conf.default
- cat "$SABNZBDSUITE_SETTINGS" | awk -F\" '{print $2"=\""$4"\""}' | sed '/^=/d' > /var/config/sabnzbd.conf
-
- . /var/config/sabnzbd.conf.default
- . /var/config/sabnzbd.conf
-
- # TODO: add SABNZBD_HOST, SABNZBD_PORT etc to setup ui
-
- SICKBEARD_IP="$SABNZBD_IP"
- COUCHPOTATO_IP="$SABNZBD_IP"
- HEADPHONES_IP="$SABNZBD_IP"
-
-################################################################################
-# setup sabnzbd ini file
-################################################################################
- if [ -z "$SABNZBD_IP" ]; then
- SABNZBD_IP="0.0.0.0"
- fi
-
- if [ ! -f "$SABNZBD_SETTINGS" ]; then
- SABNZBD_FIRSTRUN="yes"
- fi
-
- write_sabnzbd_ini misc disable_api_key $SABNZBD_DISABLEAPIKEY
- write_sabnzbd_ini misc check_new_rel $SABNZBD_CHECKRELEASE
- write_sabnzbd_ini misc auto_browser $SABNZBD_LAUNCHBROWSER
- write_sabnzbd_ini misc username $SABNZBD_USER
- write_sabnzbd_ini misc password $SABNZBD_PWD
- write_sabnzbd_ini misc port $SABNZBD_HTTPPORT
- write_sabnzbd_ini misc https_port $SABNZBD_HTTPSPORT
- write_sabnzbd_ini misc https_cert $SABNZBD_HTTPSCERT
- write_sabnzbd_ini misc https_key $SABNZBD_HTTPSKEY
- write_sabnzbd_ini misc host $SABNZBD_IP
- write_sabnzbd_ini misc web_dir $SABNZBD_SKIN
- write_sabnzbd_ini misc web_dir2 $SABNZBD_SKIN2
- write_sabnzbd_ini misc web_color $SABNZBD_WEBCOLOR
- write_sabnzbd_ini misc web_color2 $SABNZBD_WEBCOLOR2
- write_sabnzbd_ini misc log_dir $SABNZBD_LOGDIR
- write_sabnzbd_ini misc admin_dir $SABNZBD_ADMINDIR
- write_sabnzbd_ini misc nzb_backup_dir $SABNZBD_BACKUPDIR
- write_sabnzbd_ini misc script_dir $SABNZBD_SCRIPTDIR
-
-
- if [ "$SABNZBD_FIRSTRUN" = "yes" ]; then
- mkdir -p "$SABNZBD_INCOMPLETEDIR"
- mkdir -p "$SABNZBD_COMPLETEDIR"
- mkdir -p "$SABNZBD_WATCHDIR"
- write_sabnzbd_ini misc download_dir $SABNZBD_INCOMPLETEDIR
- write_sabnzbd_ini misc complete_dir $SABNZBD_COMPLETEDIR
- write_sabnzbd_ini misc dirscan_dir $SABNZBD_WATCHDIR
-
- write_sabnzbd_ini servers:localhost name "localhost"
- write_sabnzbd_ini servers:localhost host "localhost"
- write_sabnzbd_ini servers:localhost port "119"
- write_sabnzbd_ini servers:localhost enable "0"
- fi
-
-################################################################################
-# setup postprocessing scripts file
-################################################################################
- mkdir -p $ADDON_HOME/$SABNZBD_SCRIPTDIR
- cp -P $ADDON_DIR/SickBeard/autoProcessTV/*.py $ADDON_HOME/$SABNZBD_SCRIPTDIR
- chmod +x $ADDON_HOME/$SABNZBD_SCRIPTDIR/*.py
-
- write_ini_postprocess SickBeard host localhost
- write_ini_postprocess SickBeard port $SICKBEARD_PORT
- write_ini_postprocess SickBeard username $SABNZBD_USER
- write_ini_postprocess SickBeard password $SABNZBD_PWD
-
-################################################################################
-# start sabnzbd
-################################################################################
- python $ADDON_DIR/SABnzbd/SABnzbd.py -d -f $SABNZBD_SETTINGS -l 0
-
-################################################################################
-# read sabnzbd settings
-################################################################################
- SABNZBD_APIKEY=`read_sabconfig misc api_key`
-
-################################################################################
-# setup sickbeard ini file
-################################################################################
- if [ -z "$SICKBEARD_IP" ]; then
- SICKBEARD_IP="0.0.0.0"
- fi
-
- if [ ! -f "$SICKBEARD_SETTINGS" ]; then
- SICKBEARD_FIRSTRUN="yes"
- fi
-
- write_sickbeard_ini General launch_browser $SICKBEARD_LAUNCHBROWSER
- write_sickbeard_ini General version_notify $SICKBEARD_VERSIONCHECK
- write_sickbeard_ini General log_dir $SICKBEARD_LOGDIR
- write_sickbeard_ini General cache_dir $SICKBEARD_CACHEDIR
- write_sickbeard_ini General web_port $SICKBEARD_PORT
- write_sickbeard_ini General web_host $SICKBEARD_IP
- write_sickbeard_ini General web_ipv6 $SICKBEARD_USEIPV6
- write_sickbeard_ini General web_log $SICKBEARD_WEBLOG
- write_sickbeard_ini General web_username $SABNZBD_USER
- write_sickbeard_ini General web_password $SABNZBD_PWD
-
- write_sickbeard_ini SABnzbd sab_username $SABNZBD_USER
- write_sickbeard_ini SABnzbd sab_password $SABNZBD_PWD
- write_sickbeard_ini SABnzbd sab_apikey $SABNZBD_APIKEY
- write_sickbeard_ini SABnzbd sab_host "http://$SABNZBD_HOST:$SABNZBD_PORT/"
-
- write_sickbeard_ini XBMC use_xbmc $SICKBEARD_USEXBMC
- write_sickbeard_ini XBMC xbmc_host "$XBMC_HOST:$XBMC_PORT"
- write_sickbeard_ini XBMC xbmc_username $XBMC_USER
- write_sickbeard_ini XBMC xbmc_password $XBMC_PWD
-
- if [ "$SICKBEARD_FIRSTRUN" = "yes" ]; then
- write_sickbeard_ini General metadata_xbmc $SICKBEARD_METADATAXBMC
- fi
-
-################################################################################
-# start sickbeard
-################################################################################
- python $ADDON_DIR/SickBeard/SickBeard.py --daemon --datadir $ADDON_HOME
-
-################################################################################
-# setup couchpotato ini file
-################################################################################
- if [ -z "$COUCHPOTATO_IP" ]; then
- COUCHPOTATO_IP="0.0.0.0"
- fi
-
- if [ ! -f "$COUCHPOTATO_SETTINGS" ]; then
- COUCHPOTATO_FIRSTRUN="yes"
- fi
-
- write_couchpotato_ini global host $COUCHPOTATO_IP
- write_couchpotato_ini global port $COUCHPOTATO_PORT
- write_couchpotato_ini global username $SABNZBD_USER
- write_couchpotato_ini global password $SABNZBD_PWD
- write_couchpotato_ini global launchbrowser $COUCHPOTATO_LAUNCHBROWSER
- write_couchpotato_ini global updater $COUCHPOTATO_VERSIONCHECK
-
- write_couchpotato_ini Sabnzbd username $SABNZBD_USER
- write_couchpotato_ini Sabnzbd password $SABNZBD_PWD
- write_couchpotato_ini Sabnzbd apikey $SABNZBD_APIKEY
- write_couchpotato_ini Sabnzbd host "$SABNZBD_HOST:$SABNZBD_PORT"
-
- write_couchpotato_ini XBMC enabled $COUCHPOTATO_USEXBMC
- write_couchpotato_ini XBMC host "$XBMC_HOST:$XBMC_PORT"
- write_couchpotato_ini XBMC username $XBMC_USER
- write_couchpotato_ini XBMC password $XBMC_PWD
-
- if [ "$COUCHPOTATO_FIRSTRUN" = "yes" ]; then
- write_couchpotato_ini XBMC updateoneonly $COUCHPOTATO_UPDATEXBMC
- fi
-
-################################################################################
-# start couchpotato
-################################################################################
- python $ADDON_DIR/CouchPotato/CouchPotato.py -d --datadir $ADDON_HOME --config $COUCHPOTATO_SETTINGS
-
-################################################################################
-# setup headphones ini file
-################################################################################
-
- if [ -z "$HEADPHONES_IP" ]; then
- HEADPHONES_IP="0.0.0.0"
- fi
-
- if [ ! -f "$HEADPHONES_SETTINGS" ]; then
- HEADPHONES_FIRSTRUN="yes"
- fi
-
- if [ "$HEADPHONES_FIRSTRUN" = "yes" ]; then
- write_headphones_ini General http_port $HEADPHONES_PORT
- write_headphones_ini General http_host $HEADPHONES_IP
- write_headphones_ini General launch_browser $HEADPHONES_LAUNCHBROWSER
- write_headphones_ini General music_dir $HEADPHONES_MUSICDIR
- write_headphones_ini General destination_dir $HEADPHONES_DESTDIR
- write_headphones_ini General download_dir $HEADPHONES_DOWNLOADDIR
-
- write_headphones_ini SABnzbd sab_host $HEADPHONES_SABHOST
- write_headphones_ini SABnzbd sab_apikey $SABNZBD_APIKEY
- write_headphones_ini SABnzbd sab_category $HEADPHONES_SABCATEGORY
- fi
-
-
-################################################################################
-# start headphones
-################################################################################
- python $ADDON_DIR/Headphones/Headphones.py -d --datadir $ADDON_HOME --config $HEADPHONES_SETTINGS
diff --git a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/bin/ini_tool b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/bin/ini_tool
deleted file mode 100755
index 297c13cddf..0000000000
--- a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/bin/ini_tool
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/usr/bin/env python
-
-################################################################################
-# This file is part of OpenELEC - http://www.openelec.tv
-# Copyright (C) 2011 Travis Glenn Hansen (travisghansen@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
-################################################################################
-
-from configobj import ConfigObj
-import sys
-import os
-import string
-
-python_major = sys.version_info[0]
-python_minor = sys.version_info[1]
-
-prog="ini_tool"
-description="""Read/Write config files.
-
-Examples:
- %(prog)s --file config.ini --action read --option [section:]username
- %(prog)s --file config.ini --action write --option [section:]username --value foo""" % {'prog':prog}
-
-def option_required_error(option):
- parser.print_usage()
- print prog + ": error: " + option + " is required"
- exit(2)
-
-if python_major > 2 or (python_major == 2 and python_minor >= 7):
- import argparse
-
- parser = argparse.ArgumentParser(
- prog=prog,
- description=description,
- formatter_class=argparse.RawDescriptionHelpFormatter,
- )
-
- parser.add_argument('--file', help='file to read/write to/from', required=True)
- parser.add_argument('--action', help='read|write', required=True)
- parser.add_argument('--option', help='the option key', required=True)
- parser.add_argument('--value', help='value to store in the given option (only for write action)')
-
- options = parser.parse_args()
-
-else:
- import optparse
-
- parser = optparse.OptionParser(
- prog=prog,
- description=description,
- )
-
- parser.add_option('--file', help='file to read/write to/from')
- parser.add_option('--action', help='read|write')
- parser.add_option('--option', help='the option key')
- parser.add_option('--value', help='value to store in the given option (only for write action)')
-
- (options, args) = parser.parse_args()
-
- if not options.file:
- option_required_error("--file")
- if not options.action:
- option_required_error("--action")
- if not options.option:
- option_required_error("--option")
-
-
-if options.action != "read" and options.action != "write":
- print "'" + options.action + "' is not a valid action"
- parser.print_help()
- exit(2)
-
-if options.action == "read" and not os.path.isfile(options.file):
- print "'" + options.file + "' is not a file"
- exit(2)
-
-config = ConfigObj(options.file)
-keys = string.split(options.option, ":")
-key_len = len(keys)
-current_section = config
-
-if options.action == 'read':
- i = 1
- for key in keys:
- if i == key_len:
- print current_section[key]
- exit(0)
- else:
- current_section = current_section[key]
- i += 1
-elif options.action == 'write':
- i = 1
- for key in keys:
- if i == key_len:
- current_section[key] = options.value
- elif key not in current_section:
- current_section[key] = {}
- current_section = current_section[key]
- i += 1
-
- config.write()
-else:
- exit(1)
\ No newline at end of file
diff --git a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/default.py b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/default.py
index eba995f350..d56e31083f 100644
--- a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/default.py
+++ b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/default.py
@@ -24,15 +24,66 @@ import xbmcaddon
import time
import subprocess
import xbmc
+import urllib2
+import socket
+from configobj import ConfigObj
__scriptname__ = "SABnzbd Suite"
-__author__ = "OpenELEC"
-__url__ = "http://www.openelec.tv"
+__author__ = "OpenELEC"
+__url__ = "http://www.openelec.tv"
__settings__ = xbmcaddon.Addon(id='service.downloadmanager.SABnzbd-Suite')
__cwd__ = __settings__.getAddonInfo('path')
-__path__ = xbmc.translatePath( os.path.join( __cwd__, 'bin', "SABnzbd-Suite.service") )
+__path__ = xbmc.translatePath( os.path.join( __cwd__, 'bin', "SABnzbd-Suite.py") )
-#make binary files executable in adson bin folder
-subprocess.Popen("chmod -R +x " + __cwd__ + "/bin/*" , shell=True, close_fds=True)
+checkInterval = 120
+timeout = 20
-subprocess.Popen(__path__, shell=True, close_fds=True)
+
+# Launch Suite
+subprocess.call(['python',__path__])
+
+
+# SABnzbd addresses and api key
+sabNzbdAddress = '127.0.0.1:8081'
+sabNzbdConfigFile = '/storage/.xbmc/userdata/addon_data/service.downloadmanager.SABnzbd-Suite/sabnzbd.ini'
+sabConfiguration = ConfigObj(sabNzbdConfigFile)
+sabNzbdApiKey = sabConfiguration['misc']['api_key']
+sabNzbdUser = sabConfiguration['misc']['username']
+sabNzbdPass = sabConfiguration['misc']['password']
+sabNzbdQueue = 'http://' + sabNzbdAddress + '/sabnzbd/api?mode=queue&output=xml&apikey=' + sabNzbdApiKey + '&ma_username=' + sabNzbdUser + '&ma_password=' + sabNzbdUser
+
+# start checking SABnzbd for activity and prevent sleeping if necessary
+socket.setdefaulttimeout(timeout)
+
+shouldKeepAwake = __settings__.getSetting('SABNZBD_KEEP_AWAKE')
+if shouldKeepAwake:
+ xbmc.log('SABnzbd-Suite: will prevent idle sleep/shutdown while downloading')
+
+while (not xbmc.abortRequested):
+
+ # reread setting in case it has changed
+ shouldKeepAwake = __settings__.getSetting('SABNZBD_KEEP_AWAKE')
+
+ # check if SABnzbd is downloading
+ sabIsActive = False
+ req = urllib2.Request(sabNzbdQueue)
+ try: handle = urllib2.urlopen(req)
+ except IOError, e:
+ xbmc.log('SABnzbd-Suite: could not determine SABnzbds status', level=xbmc.LOGERROR)
+ else:
+ queue = handle.read()
+ handle.close()
+ sabIsActive = (queue.find('Downloading') >= 0)
+
+ # reset idle timer when we're close to idle sleep/shutdown
+ if (shouldKeepAwake and sabIsActive):
+ response = xbmc.executehttpapi("GetGUISetting(0;powermanagement.shutdowntime)").replace('
','')
+ shutdownTime = int(response) * 60
+ idleTime = xbmc.getGlobalIdleTime()
+ timeToShutdown = shutdownTime - idleTime
+
+ if (sabIsActive and timeToShutdown <= checkInterval - timeout):
+ xbmc.log('SABnzbd-Suite: still downloading. Resetting XBMC idle timer.')
+ xbmc.executehttpapi("SendKey(0xF000)")
+
+ xbmc.sleep(checkInterval * 1000)
\ No newline at end of file
diff --git a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/language/English/strings.xml b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/language/English/strings.xml
index 1977d9e605..3fae37f4a3 100644
--- a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/language/English/strings.xml
+++ b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/language/English/strings.xml
@@ -8,5 +8,7 @@
Password
Network Settings
Allowed IP addresses
+ Sleep
+ Keep awake while downloading
diff --git a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/language/German/strings.xml b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/language/German/strings.xml
index 264b514b8a..fb2a450293 100644
--- a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/language/German/strings.xml
+++ b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/language/German/strings.xml
@@ -8,5 +8,7 @@
Passwort
Netzwerk Einstellungen
Erlaubte IP Adressen
+ Ruhezustand
+ Verhindere Ruhezustand wenn aktiv
diff --git a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/settings.xml b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/settings.xml
old mode 100644
new mode 100755
index 403df8c7cc..6ac0150f85
--- a/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/settings.xml
+++ b/packages/addons/service/downloadmanager/SABnzbd-Suite/source/resources/settings.xml
@@ -11,5 +11,9 @@
+
+
+
+