@@ -3,21 +3,15 @@
import cherrypy
import htpc
import urllib2
import gzip
import socket
from json import loads , dumps
import requests
from json import dumps
import logging
import cookielib
from StringIO import StringIO
from cherrypy .lib .auth2 import require
from htpc .helpers import fix_basepath , striphttp
class Deluge (object ):
cookieJar = cookielib .CookieJar ()
opener = urllib2 .build_opener (urllib2 .HTTPCookieProcessor (cookieJar ))
session = requests .Session ()
def __init__ (self ):
self .logger = logging .getLogger ('modules.deluge' )
@@ -111,7 +105,6 @@ def remove(self, torrentId, removeData):
removeDataBool = bool (int (removeData ))
return self .fetch ('core.remove_torrent' , [torrentId , removeDataBool ])
#Used for torrent search
@cherrypy .expose ()
@require ()
@cherrypy .tools .json_out ()
@@ -133,49 +126,32 @@ def to_client(self, link, torrentname, **kwargs):
except Exception as e :
self .logger .debug ('Failed adding %s to deluge %s %s' % (torrentname , link , e ))
# Wrapper to access the Deluge Api
# If the first call fails, there probably is no valid Session ID so we try it again
def fetch (self , method , arguments = None ):
""" Do request to Deluge api """
if arguments is None :
arguments = []
self .logger .debug ("Request deluge method: %s arguments %s" % (method , arguments ))
# format post data
data = {'id' : 1 , 'method' : method , 'params' : arguments }
response = self .read_data (data )
self .logger .debug ("response is %s" % response )
if response and response ['error' ]:
self .auth ()
response = self .read_data (data )
self .logger .debug ("response is %s" % response )
return response
host = striphttp (htpc .settings .get ('deluge_host' , '' ))
port = htpc .settings .get ('deluge_port' , '' )
deluge_basepath = fix_basepath (htpc .settings .get ('deluge_basepath' , '/' ))
ssl = 's' if htpc .settings .get ('deluge_ssl' ) else ''
def auth (self ):
self .read_data ({"method" : "auth.login" , "params" : [htpc .settings .get ('deluge_password' , '' )], "id" : 1 })
url = 'http%s://%s:%s%sjson' % (ssl , host , port , deluge_basepath )
def read_data ( self , data ):
self . logger . debug ( "Request deluge method: %s arguments %s" % ( method , arguments ))
try :
self .logger .debug ("Read data from server" )
host = striphttp (htpc .settings .get ('deluge_host' , '' ))
port = htpc .settings .get ('deluge_port' , '' )
deluge_basepath = fix_basepath (htpc .settings .get ('deluge_basepath' , '/' ))
ssl = 's' if htpc .settings .get ('deluge_ssl' ) else ''
url = 'http%s://%s:%s%sjson' % (ssl , host , port , deluge_basepath )
self .logger .debug ('read data url is %s' % url )
post_data = dumps (data )
buf = StringIO (self .opener .open (url , post_data , 1 ).read ())
f = gzip .GzipFile (fileobj = buf )
response = loads (f .read ())
self .logger .debug ("response for %s is %s" % (data , response ))
return response
except urllib2 .URLError :
self .logger .error ("can't connect with %s" % data )
return {'result' : {}, 'error' : "can't connect with %s" % data }
except socket .timeout :
self .logger .error ("timeout when connect with %s" % data )
return {'result' : {}, 'error' : "can't connect with %s" % data }
# format post data
data = {'id' : 1 , 'method' : method , 'params' : arguments }
response = self .session .post (url , data = dumps (data ), verify = False )
result = response .json ()
self .logger .debug ("response is %s" % response .content )
if result and result ['error' ]:
self .logger .debug ('Authenticating' )
self .session .post (url , data = dumps ({"method" : "auth.login" , "params" : [htpc .settings .get ('deluge_password' , '' )], "id" : 1 }), verify = False )
response = self .session .post (url , data = dumps (data ), verify = False )
self .logger .debug ("response is %s" % response .text )
return result
except Exception as e :
self .logger .error ('Failed to fetch method %s arguments %s %s' % (method , arguments , e ))