From 70b1574aa60a0cb729575e60aa4147e38f11478d Mon Sep 17 00:00:00 2001 From: rembo10 Date: Wed, 6 May 2015 00:02:11 -0700 Subject: [PATCH] Updated sab.py to use the requests library. Should fix #2208 --- headphones/sab.py | 133 ++++++++++++++++------------------------------ 1 file changed, 46 insertions(+), 87 deletions(-) diff --git a/headphones/sab.py b/headphones/sab.py index 45565f77..c7ff286c 100644 --- a/headphones/sab.py +++ b/headphones/sab.py @@ -20,19 +20,21 @@ import MultipartPostHandler import headphones import cookielib -import urllib2 import httplib -import urllib -import ast from headphones.common import USER_AGENT -from headphones import logger -from headphones import helpers +from headphones import logger, helpers, request -def sendNZB(nzb): +def sab_api_call(request_type=None, params={}, **kwargs): - params = {} + if not headphones.CONFIG.SAB_HOST.startswith('http'): + headphones.CONFIG.SAB_HOST = 'http://' + headphones.CONFIG.SAB_HOST + + if headphones.CONFIG.SAB_HOST.endswith('/'): + headphones.CONFIG.SAB_HOST = headphones.CONFIG.SAB_HOST[0:len(headphones.CONFIG.SAB_HOST) - 1] + + url = headphones.CONFIG.SAB_HOST + "/" + "api?" if headphones.CONFIG.SAB_USERNAME: params['ma_username'] = headphones.CONFIG.SAB_USERNAME @@ -40,9 +42,28 @@ def sendNZB(nzb): params['ma_password'] = headphones.CONFIG.SAB_PASSWORD if headphones.CONFIG.SAB_APIKEY: params['apikey'] = headphones.CONFIG.SAB_APIKEY - if headphones.CONFIG.SAB_CATEGORY: + + if request_type=='send_nzb' and headphones.CONFIG.SAB_CATEGORY: params['cat'] = headphones.CONFIG.SAB_CATEGORY + params['output']='json' + + logger.info("Trying to send nzb to SABnzbd") + response = request.request_json(url, params=params, **kwargs) + + if not response: + logger.error("Error connecting to SABnzbd on url: %s" % url) + return False + if response['status'] == False and response['error']: + logger.error("Error connecting to SABnzbd: %s" % response['error']) + return False + else: + logger.info("Successfully connected to SABnzbd") + return response + +def sendNZB(nzb): + + params = {} # if it's a normal result we just pass SAB the URL if nzb.resultType == "nzb": # for newzbin results send the ID to sab specifically @@ -62,102 +83,40 @@ def sendNZB(nzb): # Sanitize the file a bit, since we can only use ascii chars with MultiPartPostHandler nzbdata = helpers.latinToAscii(nzb.extraInfo[0]) params['mode'] = 'addfile' - multiPartParams = {"nzbfile": (helpers.latinToAscii(nzb.name) + ".nzb", nzbdata)} + files = {"nzbfile": (helpers.latinToAscii(nzb.name) + ".nzb", nzbdata)} + headers = {'User-Agent': USER_AGENT} - if not headphones.CONFIG.SAB_HOST.startswith('http'): - headphones.CONFIG.SAB_HOST = 'http://' + headphones.CONFIG.SAB_HOST + if nzb.resultType == "nzb": + response = sab_api_call('send_nzb', params=params) + elif nzb.resultType == "nzbdata": + cookies = cookielib.CookieJar() + response = sab_api_call('send_nzb', params=params, method="post", files=files, cookies=cookies, headers=headers) - if headphones.CONFIG.SAB_HOST.endswith('/'): - headphones.CONFIG.SAB_HOST = headphones.CONFIG.SAB_HOST[0:len(headphones.CONFIG.SAB_HOST) - 1] - - url = headphones.CONFIG.SAB_HOST + "/" + "api?" + urllib.urlencode(params) - - try: - - if nzb.resultType == "nzb": - f = urllib.urlopen(url) - elif nzb.resultType == "nzbdata": - cookies = cookielib.CookieJar() - opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies), - MultipartPostHandler.MultipartPostHandler) - - req = urllib2.Request(url, - multiPartParams, - headers={'User-Agent': USER_AGENT}) - - f = opener.open(req) - - except (EOFError, IOError) as e: - logger.error(u"Unable to connect to SAB with URL: %s" % url) - return False - - except httplib.InvalidURL as e: - logger.error(u"Invalid SAB host, check your config. Current host: %s" % headphones.CONFIG.SAB_HOST) - return False - - except Exception as e: - logger.error(u"Error: " + str(e)) - return False - - if f is None: + if not response: logger.info(u"No data returned from SABnzbd, NZB not sent") return False - try: - result = f.readlines() - except Exception as e: - logger.info(u"Error trying to get result from SAB, NZB not sent: ") - return False - - if len(result) == 0: - logger.info(u"No data returned from SABnzbd, NZB not sent") - return False - - sabText = result[0].strip() - - logger.info(u"Result text from SAB: " + sabText) - - if sabText == "ok": - logger.info(u"NZB sent to SAB successfully") + if response['status']: + logger.info(u"NZB sent to SABnzbd successfully") return True - elif sabText == "Missing authentication": - logger.info(u"Incorrect username/password sent to SAB, NZB not sent") - return False else: - logger.info(u"Unknown failure sending NZB to sab. Return text is: " + sabText) + logger.error(u"Error sending NZB to SABnzbd: %s" % response['error']) return False def checkConfig(): params = {'mode': 'get_config', - 'section': 'misc' + 'section': 'misc', } - if headphones.CONFIG.SAB_USERNAME: - params['ma_username'] = headphones.CONFIG.SAB_USERNAME - if headphones.CONFIG.SAB_PASSWORD: - params['ma_password'] = headphones.CONFIG.SAB_PASSWORD - if headphones.CONFIG.SAB_APIKEY: - params['apikey'] = headphones.CONFIG.SAB_APIKEY - - if not headphones.CONFIG.SAB_HOST.startswith('http'): - headphones.CONFIG.SAB_HOST = 'http://' + headphones.CONFIG.SAB_HOST - - if headphones.CONFIG.SAB_HOST.endswith('/'): - headphones.CONFIG.SAB_HOST = headphones.CONFIG.SAB_HOST[0:len(headphones.CONFIG.SAB_HOST) - 1] - - url = headphones.CONFIG.SAB_HOST + "/" + "api?" + urllib.urlencode(params) - - try: - f = urllib.urlopen(url).read() - except Exception: + config_options = sab_api_call(params=params) + + if not config_options: logger.warn("Unable to read SABnzbd config file - cannot determine renaming options (might affect auto & forced post processing)") return (0, 0) - config_options = ast.literal_eval(f) - - replace_spaces = config_options['misc']['replace_spaces'] - replace_dots = config_options['misc']['replace_dots'] + replace_spaces = config_options['config']['misc']['replace_spaces'] + replace_dots = config_options['config']['misc']['replace_dots'] return (replace_spaces, replace_dots)