diff --git a/data/interfaces/default/config.html b/data/interfaces/default/config.html index 9ba9f2aa..b6e41303 100644 --- a/data/interfaces/default/config.html +++ b/data/interfaces/default/config.html @@ -392,6 +392,12 @@ Usually http://localhost:8112 (requires WebUI plugin) +
+ + + Path to the certificate file. Make sure to use a valid certificate ("Issued To" field must match + hostname) which is not the case with the default certificate. Path is usually %appdata%\deluge\ssl on Windows, ~/.config/deluge/ssl/ on Linux. Leave this blank if you are using a self-signed certificate. +
diff --git a/headphones/__init__.py b/headphones/__init__.py index 4b36acf7..daf067a5 100644 --- a/headphones/__init__.py +++ b/headphones/__init__.py @@ -143,7 +143,7 @@ def initialize(config_file): SOFT_CHROOT = SoftChroot(str(CONFIG.SOFT_CHROOT)) if SOFT_CHROOT.isEnabled(): logger.info("Soft-chroot enabled for dir: %s", str(CONFIG.SOFT_CHROOT)) - except exceptions.SoftChrootError as e: + except headphones.exceptions.SoftChrootError as e: logger.error("SoftChroot error: %s", e) raise e diff --git a/headphones/config.py b/headphones/config.py index dd1ae9b6..a4dc5d27 100644 --- a/headphones/config.py +++ b/headphones/config.py @@ -68,6 +68,7 @@ _CONFIG_DEFINITIONS = { 'CUSTOMUSER': (str, 'General', ''), 'DELETE_LOSSLESS_FILES': (int, 'General', 1), 'DELUGE_HOST': (str, 'Deluge', ''), + 'DELUGE_CERT': (str, 'Deluge', ''), 'DELUGE_PASSWORD': (str, 'Deluge', ''), 'DELUGE_LABEL': (str, 'Deluge', ''), 'DELUGE_DONE_DIRECTORY': (str, 'Deluge', ''), diff --git a/headphones/deluge.py b/headphones/deluge.py index 5f79d29e..e07cc7c1 100644 --- a/headphones/deluge.py +++ b/headphones/deluge.py @@ -48,22 +48,63 @@ import traceback delugeweb_auth = {} delugeweb_url = '' +deluge_verify_cert = False +scrub_logs = True -def addTorrent(link, data=None): +def _scrubber(text): + if scrub_logs: + try: + # URL parameter values + text = re.sub('=[0-9a-zA-Z]*', '=REMOVED', text) + # Local host with port + # text = re.sub('\:\/\/.*\:', '://REMOVED:', text) # just host + text = re.sub('\:\/\/.*\:[0-9]*', '://REMOVED:', text) + # Session cookie + text = re.sub("_session_id'\: '.*'", "_session_id': 'REMOVED'", text) + # Local Windows user path + if text.lower().startswith('c:\\users\\'): + k = text.split('\\') + text = '\\'.join([k[0], k[1], '.....', k[-1]]) + #partial_link = re.sub('(auth.*?)=.*&','\g<1>=SECRETZ&', link) + #partial_link = re.sub('(\w)=[0-9a-zA-Z]*&*','\g<1>=REMOVED&', link) + except Exception as e: + logger.debug('Deluge: Scrubber failed: %s' % str(e)) + return text + + +def addTorrent(link, data=None, name=None): try: + # Authenticate anyway + logger.debug('Deluge: addTorrent Authentication') + _get_auth() + result = {} retid = False + url_what = ['https://what.cd/', 'http://what.cd/'] + url_waffles = ['https://waffles.fm/', 'http://waffles.fm/'] - if link.startswith('magnet:'): - logger.debug('Deluge: Got a magnet link: %s' % link) + if link.lower().startswith('magnet:'): + logger.debug('Deluge: Got a magnet link: %s' % _scrubber(link)) result = {'type': 'magnet', 'url': link} retid = _add_torrent_magnet(result) - elif link.startswith('http://') or link.startswith('https://'): - logger.debug('Deluge: Got a URL: %s' % link) - user_agent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2243.2 Safari/537.36' + elif link.lower().startswith('http://') or link.lower().startswith('https://'): + logger.debug('Deluge: Got a URL: %s' % _scrubber(link)) + if link.lower().startswith(tuple(url_waffles)): + if 'rss=' not in link: + link = link + '&rss=1' + if link.lower().startswith(tuple(url_what)): + logger.debug('Deluge: Using different User-Agent for this site') + user_agent = 'Headphones' + # This method will make Deluge download the file + #logger.debug('Deluge: Letting Deluge download this') + #local_torrent_path = _add_torrent_url({'url': link}) + #logger.debug('Deluge: Returned this local path: %s' % _scrubber(local_torrent_path)) + #return addTorrent(local_torrent_path) + else: + user_agent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2243.2 Safari/537.36' headers = {'User-Agent': user_agent} torrentfile = '' logger.debug('Deluge: Trying to download (GET)') @@ -71,39 +112,38 @@ def addTorrent(link, data=None): r = requests.get(link, headers=headers) if r.status_code == 200: logger.debug('Deluge: 200 OK') - torrentfile = r.text - #for chunk in r.iter_content(chunk_size=1024): - # if chunk: # filter out keep-alive new chunks - # torrentfile = torrentfile + chunk + # .text will ruin the encoding for some torrents + torrentfile = r.content else: - logger.debug('Deluge: Trying to GET %s returned status %d' % (link, r.status_code)) + logger.debug('Deluge: Trying to GET %s returned status %d' % (_scrubber(link), r.status_code)) return False except Exception as e: logger.debug('Deluge: Download failed: %s' % str(e)) - if 'announce' not in torrentfile[:40]: - logger.debug('Deluge: Contents of %s doesn\'t look like a torrent file' % link) + if 'announce' not in str(torrentfile)[:40]: + logger.debug('Deluge: Contents of %s doesn\'t look like a torrent file' % _scrubber(link)) return False - # Extract torrent name from .torrent - try: - logger.debug('Deluge: Getting torrent name length') - name_length = int(re.findall('name([0-9]*)\:.*?\:', torrentfile)[0]) - logger.debug('Deluge: Getting torrent name') - name = re.findall('name[0-9]*\:(.*?)\:', torrentfile)[0][:name_length] - except Exception as e: - logger.debug('Deluge: Could not get torrent name, getting file name') - # get last part of link/path (name only) - name = link.split('\\')[-1].split('/')[-1] - # remove '.torrent' suffix - if name[-len('.torrent'):] == '.torrent': - name = name[:-len('.torrent')] - logger.debug('Deluge: Sending Deluge torrent with name %s and content [%s...]' % (name, torrentfile[:40])) + if not name: + # Extract torrent name from .torrent + try: + logger.debug('Deluge: Getting torrent name length') + name_length = int(re.findall('name([0-9]*)\:.*?\:', str(torrentfile))[0]) + logger.debug('Deluge: Getting torrent name') + name = re.findall('name[0-9]*\:(.*?)\:', str(torrentfile))[0][:name_length] + except Exception as e: + logger.debug('Deluge: Could not get torrent name, getting file name') + # get last part of link/path (name only) + name = link.split('\\')[-1].split('/')[-1] + # remove '.torrent' suffix + if name[-len('.torrent'):] == '.torrent': + name = name[:-len('.torrent')] + logger.debug('Deluge: Sending Deluge torrent with name %s and content [%s...]' % (name, str(torrentfile)[:40])) result = {'type': 'torrent', 'name': name, 'content': torrentfile} retid = _add_torrent_file(result) # elif link.endswith('.torrent') or data: - elif not (link.startswith('http://') or link.startswith('https://')): + elif not (link.lower().startswith('http://') or link.lower().startswith('https://')): if data: logger.debug('Deluge: Getting .torrent data') torrentfile = data @@ -111,20 +151,21 @@ def addTorrent(link, data=None): logger.debug('Deluge: Getting .torrent file') with open(link, 'rb') as f: torrentfile = f.read() - # Extract torrent name from .torrent - try: - logger.debug('Deluge: Getting torrent name length') - name_length = int(re.findall('name([0-9]*)\:.*?\:', torrentfile)[0]) - logger.debug('Deluge: Getting torrent name') - name = re.findall('name[0-9]*\:(.*?)\:', torrentfile)[0][:name_length] - except Exception as e: - logger.debug('Deluge: Could not get torrent name, getting file name') - # get last part of link/path (name only) - name = link.split('\\')[-1].split('/')[-1] - # remove '.torrent' suffix - if name[-len('.torrent'):] == '.torrent': - name = name[:-len('.torrent')] - logger.debug('Deluge: Sending Deluge torrent with name %s and content [%s...]' % (name, torrentfile[:40])) + if not name: + # Extract torrent name from .torrent + try: + logger.debug('Deluge: Getting torrent name length') + name_length = int(re.findall('name([0-9]*)\:.*?\:', str(torrentfile))[0]) + logger.debug('Deluge: Getting torrent name') + name = re.findall('name[0-9]*\:(.*?)\:', str(torrentfile))[0][:name_length] + except Exception as e: + logger.debug('Deluge: Could not get torrent name, getting file name') + # get last part of link/path (name only) + name = link.split('\\')[-1].split('/')[-1] + # remove '.torrent' suffix + if name[-len('.torrent'):] == '.torrent': + name = name[:-len('.torrent')] + logger.debug('Deluge: Sending Deluge torrent with name %s and content [%s...]' % (name, str(torrentfile)[:40])) result = {'type': 'torrent', 'name': name, 'content': torrentfile} @@ -137,7 +178,7 @@ def addTorrent(link, data=None): logger.info('Deluge: Torrent sent to Deluge successfully (%s)' % retid) return retid else: - logger.info('Deluge returned status %s' % retid) + logger.info('Deluge: Returned status %s' % retid) return False except Exception as e: @@ -157,15 +198,17 @@ def getTorrentFolder(result): result['hash'], ["total_done"] ], - "id": 22}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + "id": 21}) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) result['total_done'] = json.loads(response.text)['result']['total_done'] tries = 0 while result['total_done'] == 0 and tries < 10: tries += 1 time.sleep(5) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) result['total_done'] = json.loads(response.text)['result']['total_done'] post_data = json.dumps({"method": "web.get_torrent_status", @@ -183,7 +226,8 @@ def getTorrentFolder(result): ], "id": 23}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) result['save_path'] = json.loads(response.text)['result']['save_path'] result['name'] = json.loads(response.text)['result']['name'] @@ -194,34 +238,51 @@ def getTorrentFolder(result): def removeTorrent(torrentid, remove_data=False): - + logger.debug('Deluge: Remove torrent %s' % torrentid) if not any(delugeweb_auth): _get_auth() - result = False - post_data = json.dumps({"method": "core.remove_torrent", - "params": [ - torrentid, - remove_data - ], - "id": 25}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) - result = json.loads(response.text)['result'] + try: + result = False + post_data = json.dumps({"method": "core.remove_torrent", + "params": [ + torrentid, + remove_data + ], + "id": 25}) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) + result = json.loads(response.text)['result'] - return result + return result + except Exception as e: + logger.error('Deluge: Removing torrent failed: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) + return None def _get_auth(): logger.debug('Deluge: Authenticating...') - global delugeweb_auth, delugeweb_url + global delugeweb_auth, delugeweb_url, deluge_verify_cert delugeweb_auth = {} delugeweb_host = headphones.CONFIG.DELUGE_HOST + delugeweb_cert = headphones.CONFIG.DELUGE_CERT delugeweb_password = headphones.CONFIG.DELUGE_PASSWORD + logger.debug('Deluge: Using password %s******%s' % (delugeweb_password[0], delugeweb_password[-1])) if not delugeweb_host.startswith('http'): delugeweb_host = 'http://%s' % delugeweb_host + if delugeweb_cert is None or delugeweb_cert.strip() == '': + deluge_verify_cert = False + logger.debug('Deluge: FYI no SSL certificate configured') + else: + deluge_verify_cert = delugeweb_cert + delugeweb_host = delugeweb_host.replace('http:', 'https:') + logger.debug('Deluge: Using certificate %s, host is now %s' % (_scrubber(deluge_verify_cert), _scrubber(delugeweb_host))) + if delugeweb_host.endswith('/'): delugeweb_host = delugeweb_host[:-1] @@ -231,33 +292,59 @@ def _get_auth(): "params": [delugeweb_password], "id": 1}) try: - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) - # , verify=TORRENT_VERIFY_CERT) - except Exception: + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) + except requests.ConnectionError: + try: + logger.debug('Deluge: Connection failed, let\'s try HTTPS just in case') + response = requests.post(delugeweb_url.replace('http:', 'https:'), data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) + # If the previous line didn't fail, change delugeweb_url for the rest of this session + logger.error('Deluge: Switching to HTTPS, but certificate won\'t be verified because NO CERTIFICATE WAS CONFIGURED!') + delugeweb_url = delugeweb_url.replace('http:', 'https:') + except Exception as e: + logger.error('Deluge: Authentication failed: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) + return None + except Exception as e: + logger.error('Deluge: Authentication failed: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) return None auth = json.loads(response.text)["result"] + auth_error = json.loads(response.text)["error"] + logger.debug('Deluge: Authentication result: %s, Error: %s' % (auth, auth_error)) delugeweb_auth = response.cookies - + logger.debug('Deluge: Authentication cookies: %s' % _scrubber(str(delugeweb_auth.get_dict()))) post_data = json.dumps({"method": "web.connected", "params": [], "id": 10}) try: - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) - # , verify=TORRENT_VERIFY_CERT) - except Exception: + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) + except Exception as e: + logger.error('Deluge: Authentication failed: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) return None connected = json.loads(response.text)['result'] + connected_error = json.loads(response.text)['error'] + logger.debug('Deluge: Connection result: %s, Error: %s' % (connected, connected_error)) if not connected: post_data = json.dumps({"method": "web.get_hosts", "params": [], "id": 11}) try: - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) - # , verify=TORRENT_VERIFY_CERT) - except Exception: + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) + except Exception as e: + logger.error('Deluge: Authentication failed: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) return None delugeweb_hosts = json.loads(response.text)['result'] @@ -270,9 +357,12 @@ def _get_auth(): "id": 11}) try: - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) - # , verify=TORRENT_VERIFY_CERT) - except Exception: + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) + except Exception as e: + logger.error('Deluge: Authentication failed: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) return None post_data = json.dumps({"method": "web.connected", @@ -280,9 +370,12 @@ def _get_auth(): "id": 10}) try: - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) - # , verify=TORRENT_VERIFY_CERT) - except Exception: + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) + except Exception as e: + logger.error('Deluge: Authentication failed: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) return None connected = json.loads(response.text)['result'] @@ -302,14 +395,18 @@ def _add_torrent_magnet(result): post_data = json.dumps({"method": "core.add_torrent_magnet", "params": [result['url'], {}], "id": 2}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) result['hash'] = json.loads(response.text)['result'] - logger.debug('Deluge: Response was %s' % str(json.loads(response.text)['result'])) + logger.debug('Deluge: Response was %s' % str(json.loads(response.text))) return json.loads(response.text)['result'] except Exception as e: logger.error('Deluge: Adding torrent magnet failed: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) + return False + -''' def _add_torrent_url(result): logger.debug('Deluge: Adding URL') if not any(delugeweb_auth): @@ -317,14 +414,17 @@ def _add_torrent_url(result): try: post_data = json.dumps({"method": "web.download_torrent_from_url", "params": [result['url'], {}], - "id": 2}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) - result['hash'] = json.loads(response.text)['result'] - logger.debug('Deluge: Response was %s' % str(json.loads(response.text)['result'])) + "id": 32}) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) + result['location'] = json.loads(response.text)['result'] + logger.debug('Deluge: Response was %s' % str(json.loads(response.text))) return json.loads(response.text)['result'] except Exception as e: logger.error('Deluge: Adding torrent URL failed: %s' % str(e)) -''' + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) + return False def _add_torrent_file(result): @@ -336,14 +436,33 @@ def _add_torrent_file(result): post_data = json.dumps({"method": "core.add_torrent_file", "params": [result['name'] + '.torrent', b64encode(result['content'].encode('utf8')), {}], "id": 2}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) result['hash'] = json.loads(response.text)['result'] - logger.debug('Deluge: Response was %s' % str(json.loads(response.text)['result'])) + logger.debug('Deluge: Response was %s' % str(json.loads(response.text))) return json.loads(response.text)['result'] + except UnicodeDecodeError: + try: + # content is torrent file contents that needs to be encoded to base64 + # this time let's try leaving the encoding as is + post_data = json.dumps({"method": "core.add_torrent_file", + "params": [result['name'] + '.torrent', b64encode(result['content']), {}], + "id": 22}) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) + result['hash'] = json.loads(response.text)['result'] + logger.debug('Deluge: Response was %s' % str(json.loads(response.text))) + return json.loads(response.text)['result'] + except Exception as e: + logger.error('Deluge: Adding torrent file failed after decode: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) + return False except Exception as e: logger.error('Deluge: Adding torrent file failed: %s' % str(e)) formatted_lines = traceback.format_exc().splitlines() logger.error('; '.join(formatted_lines)) + return False def setTorrentLabel(result): @@ -361,7 +480,8 @@ def setTorrentLabel(result): post_data = json.dumps({"method": 'label.get_labels', "params": [], "id": 3}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) labels = json.loads(response.text)['result'] if labels is not None: @@ -371,7 +491,8 @@ def setTorrentLabel(result): post_data = json.dumps({"method": 'label.add', "params": [label], "id": 4}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) logger.debug('Deluge: %s label added to Deluge' % label) except Exception as e: logger.error('Deluge: Setting label failed: %s' % str(e)) @@ -382,7 +503,8 @@ def setTorrentLabel(result): post_data = json.dumps({"method": 'label.set_torrent', "params": [result['hash'], label], "id": 5}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) logger.debug('Deluge: %s label added to torrent' % label) else: logger.debug('Deluge: Label plugin not detected') @@ -400,19 +522,27 @@ def setSeedRatio(result): if result['ratio']: ratio = result['ratio'] - if ratio: - post_data = json.dumps({"method": "core.set_torrent_stop_at_ratio", - "params": [result['hash'], True], - "id": 5}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) - post_data = json.dumps({"method": "core.set_torrent_stop_ratio", - "params": [result['hash'], float(ratio)], - "id": 6}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + try: + if ratio: + post_data = json.dumps({"method": "core.set_torrent_stop_at_ratio", + "params": [result['hash'], True], + "id": 5}) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) + post_data = json.dumps({"method": "core.set_torrent_stop_ratio", + "params": [result['hash'], float(ratio)], + "id": 6}) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) - return not json.loads(response.text)['error'] + return not json.loads(response.text)['error'] - return True + return True + except Exception as e: + logger.error('Deluge: Setting seed ratio failed: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) + return None def setTorrentPath(result): @@ -420,28 +550,36 @@ def setTorrentPath(result): if not any(delugeweb_auth): _get_auth() - if headphones.CONFIG.DELUGE_DONE_DIRECTORY or headphones.CONFIG.DOWNLOAD_TORRENT_DIR: - post_data = json.dumps({"method": "core.set_torrent_move_completed", - "params": [result['hash'], True], - "id": 7}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + try: + if headphones.CONFIG.DELUGE_DONE_DIRECTORY or headphones.CONFIG.DOWNLOAD_TORRENT_DIR: + post_data = json.dumps({"method": "core.set_torrent_move_completed", + "params": [result['hash'], True], + "id": 7}) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) - if headphones.CONFIG.DELUGE_DONE_DIRECTORY: - move_to = headphones.CONFIG.DELUGE_DONE_DIRECTORY - else: - move_to = headphones.CONFIG.DOWNLOAD_TORRENT_DIR + if headphones.CONFIG.DELUGE_DONE_DIRECTORY: + move_to = headphones.CONFIG.DELUGE_DONE_DIRECTORY + else: + move_to = headphones.CONFIG.DOWNLOAD_TORRENT_DIR - if not os.path.exists(move_to): - logger.debug('Deluge: %s directory doesn\'t exist, let\'s create it' % move_to) - os.makedirs(move_to) - post_data = json.dumps({"method": "core.set_torrent_move_completed_path", - "params": [result['hash'], move_to], - "id": 8}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + if not os.path.exists(move_to): + logger.debug('Deluge: %s directory doesn\'t exist, let\'s create it' % move_to) + os.makedirs(move_to) + post_data = json.dumps({"method": "core.set_torrent_move_completed_path", + "params": [result['hash'], move_to], + "id": 8}) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) - return not json.loads(response.text)['error'] + return not json.loads(response.text)['error'] - return True + return True + except Exception as e: + logger.error('Deluge: Setting torrent move-to directory failed: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) + return None def setTorrentPause(result): @@ -449,12 +587,19 @@ def setTorrentPause(result): if not any(delugeweb_auth): _get_auth() - if headphones.CONFIG.DELUGE_PAUSED: - post_data = json.dumps({"method": "core.pause_torrent", - "params": [[result['hash']]], - "id": 9}) - response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth) + try: + if headphones.CONFIG.DELUGE_PAUSED: + post_data = json.dumps({"method": "core.pause_torrent", + "params": [[result['hash']]], + "id": 9}) + response = requests.post(delugeweb_url, data=post_data.encode('utf-8'), cookies=delugeweb_auth, + verify=deluge_verify_cert) - return not json.loads(response.text)['error'] + return not json.loads(response.text)['error'] - return True + return True + except Exception as e: + logger.error('Deluge: Setting torrent paused failed: %s' % str(e)) + formatted_lines = traceback.format_exc().splitlines() + logger.error('; '.join(formatted_lines)) + return None diff --git a/headphones/postprocessor.py b/headphones/postprocessor.py index 507a5571..ef87624f 100755 --- a/headphones/postprocessor.py +++ b/headphones/postprocessor.py @@ -46,7 +46,7 @@ def checkFolder(): if album['Kind'] == 'nzb': download_dir = headphones.CONFIG.DOWNLOAD_DIR else: - if headphones.CONFIG.DELUGE_DONE_DIRECTORY: + if headphones.CONFIG.DELUGE_DONE_DIRECTORY and headphones.CONFIG.TORRENT_DOWNLOADER == 3: download_dir = headphones.CONFIG.DELUGE_DONE_DIRECTORY else: download_dir = headphones.CONFIG.DOWNLOAD_TORRENT_DIR diff --git a/headphones/searcher.py b/headphones/searcher.py index 5c8b4144..c3e5d72d 100644 --- a/headphones/searcher.py +++ b/headphones/searcher.py @@ -917,10 +917,10 @@ def send_to_downloader(data, bestqual, album): deluge.setSeedRatio({'hash': torrentid, 'ratio': seed_ratio}) # Set move-to directory - if headphones.CONFIG.DELUGE_DONE_DIRECTORY: + if headphones.CONFIG.DELUGE_DONE_DIRECTORY or headphones.CONFIG.DOWNLOAD_TORRENT_DIR: deluge.setTorrentPath({'hash': torrentid}) - # I only just realized this function is useless... + # Get folder name from Deluge, it's usually the torrent name folder_name = deluge.getTorrentFolder({'hash': torrentid}) if folder_name: logger.info('Torrent folder name: %s' % folder_name) diff --git a/headphones/webserve.py b/headphones/webserve.py index 741a37f4..d22f0185 100644 --- a/headphones/webserve.py +++ b/headphones/webserve.py @@ -1157,6 +1157,7 @@ class WebInterface(object): "transmission_username": headphones.CONFIG.TRANSMISSION_USERNAME, "transmission_password": headphones.CONFIG.TRANSMISSION_PASSWORD, "deluge_host": headphones.CONFIG.DELUGE_HOST, + "deluge_cert": headphones.CONFIG.DELUGE_CERT, "deluge_password": headphones.CONFIG.DELUGE_PASSWORD, "deluge_label": headphones.CONFIG.DELUGE_LABEL, "deluge_done_directory": headphones.CONFIG.DELUGE_DONE_DIRECTORY,