Fixed torrent support for Synology downloader to work properly with torrent files passed directly by CouchPotato.
This commit is contained in:
1 parent
580d43aeaf
commit
09b4ad6937
1 file changed
+62
-36
@@ -1,10 +1,8 @@
|
|||||||
from couchpotato.core.downloaders.base import Downloader
|
from couchpotato.core.downloaders.base import Downloader
|
||||||
from couchpotato.core.helpers.encoding import isInt
|
from couchpotato.core.helpers.encoding import isInt
|
||||||
from couchpotato.core.logger import CPLog
|
from couchpotato.core.logger import CPLog
|
||||||
import httplib
|
|
||||||
import json
|
import json
|
||||||
import urllib
|
import requests
|
||||||
import urllib2
|
|
||||||
|
|
||||||
|
|
||||||
log = CPLog(__name__)
|
log = CPLog(__name__)
|
||||||
@@ -16,7 +14,8 @@ class Synology(Downloader):
|
|||||||
|
|
||||||
def download(self, data, movie, filedata = None):
|
def download(self, data, movie, filedata = None):
|
||||||
|
|
||||||
log.error('Sending "%s" (%s) to Synology.', (data.get('name'), data.get('type')))
|
response = False
|
||||||
|
log.error('Sending "%s" (%s) to Synology.', (data['name'], data['type']))
|
||||||
|
|
||||||
# Load host from config and split out port.
|
# Load host from config and split out port.
|
||||||
host = self.conf('host').split(':')
|
host = self.conf('host').split(':')
|
||||||
@@ -25,14 +24,22 @@ class Synology(Downloader):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Send request to Transmission
|
# Send request to Synology
|
||||||
srpc = SynologyRPC(host[0], host[1], self.conf('username'), self.conf('password'))
|
srpc = SynologyRPC(host[0], host[1], self.conf('username'), self.conf('password'))
|
||||||
remote_torrent = srpc.add_torrent_uri(data.get('url'))
|
if data['type'] == 'torrent_magnet':
|
||||||
log.info('Response: %s', remote_torrent)
|
log.info('Adding torrent URL %s', data['url'])
|
||||||
return remote_torrent['success']
|
response = srpc.create_task(url=data['url'])
|
||||||
|
elif data['type'] == 'torrent':
|
||||||
|
log.info('Adding torrent')
|
||||||
|
if not filedata:
|
||||||
|
log.error('No torrent data found')
|
||||||
|
else:
|
||||||
|
filename = data['name'] + '.' + data['type']
|
||||||
|
response = srpc.create_task(filename=filename, filedata=filedata)
|
||||||
except Exception, err:
|
except Exception, err:
|
||||||
log.error('Exception while adding torrent: %s', err)
|
log.error('Exception while adding torrent: %s', err)
|
||||||
return False
|
finally:
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
class SynologyRPC(object):
|
class SynologyRPC(object):
|
||||||
@@ -54,11 +61,13 @@ class SynologyRPC(object):
|
|||||||
args = {'api': 'SYNO.API.Auth', 'account': self.username, 'passwd': self.password, 'version': 2,
|
args = {'api': 'SYNO.API.Auth', 'account': self.username, 'passwd': self.password, 'version': 2,
|
||||||
'method': 'login', 'session': self.session_name, 'format': 'sid'}
|
'method': 'login', 'session': self.session_name, 'format': 'sid'}
|
||||||
response = self._req(self.auth_url, args)
|
response = self._req(self.auth_url, args)
|
||||||
if response['success'] == True:
|
if response['success']:
|
||||||
self.sid = response['data']['sid']
|
self.sid = response['data']['sid']
|
||||||
log.debug('Sid=%s', self.sid)
|
log.debug('sid=%s', self.sid)
|
||||||
return response
|
else:
|
||||||
elif self.username or self.password:
|
log.error('Couldn\'t login to Synology, %s', response)
|
||||||
|
return response['success']
|
||||||
|
else:
|
||||||
log.error('User or password missing, not using authentication.')
|
log.error('User or password missing, not using authentication.')
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -66,34 +75,51 @@ class SynologyRPC(object):
|
|||||||
args = {'api':'SYNO.API.Auth', 'version':1, 'method':'logout', 'session':self.session_name, '_sid':self.sid}
|
args = {'api':'SYNO.API.Auth', 'version':1, 'method':'logout', 'session':self.session_name, '_sid':self.sid}
|
||||||
return self._req(self.auth_url, args)
|
return self._req(self.auth_url, args)
|
||||||
|
|
||||||
def _req(self, url, args):
|
def _req(self, url, args, files=None):
|
||||||
req = urllib2.Request(url, urllib.urlencode(args))
|
response = {'success': False}
|
||||||
try:
|
try:
|
||||||
req_open = urllib2.urlopen(req)
|
req = requests.post(url, data=args, files=files)
|
||||||
response = json.loads(req_open.read())
|
req.raise_for_status()
|
||||||
|
response = json.loads(req.text)
|
||||||
if response['success'] == True:
|
if response['success'] == True:
|
||||||
log.info('Synology action successfull')
|
log.info('Synology action successfull')
|
||||||
return response
|
return response
|
||||||
except httplib.InvalidURL, err:
|
except requests.ConnectionError, err:
|
||||||
log.error('Invalid Synology host, check your config %s', err)
|
log.error('Synology connection error, check your config %s', err)
|
||||||
return False
|
except requests.HTTPError, err:
|
||||||
except urllib2.HTTPError, err:
|
|
||||||
log.error('SynologyRPC HTTPError: %s', err)
|
log.error('SynologyRPC HTTPError: %s', err)
|
||||||
return False
|
except Exception, err:
|
||||||
except urllib2.URLError, err:
|
log.error('Exception: %s', err)
|
||||||
log.error('Unable to connect to Synology %s', err)
|
finally:
|
||||||
return False
|
return response
|
||||||
|
|
||||||
def add_torrent_uri(self, torrent):
|
def create_task(self, url=None, filename=None, filedata=None):
|
||||||
log.info('Adding torrent URL %s', torrent)
|
''' Creates new download task in Synology DownloadStation. Either specify
|
||||||
response = {}
|
url or pair (filename, filedata).
|
||||||
|
|
||||||
|
Returns True if task was created, False otherwise
|
||||||
|
'''
|
||||||
|
result = False
|
||||||
# login
|
# login
|
||||||
login = self._login()
|
if self._login():
|
||||||
if login and login['success'] == True:
|
args = {'api': 'SYNO.DownloadStation.Task',
|
||||||
log.info('Login success, adding torrent')
|
'version': '1',
|
||||||
args = {'api':'SYNO.DownloadStation.Task', 'version':1, 'method':'create', 'uri':torrent, '_sid':self.sid}
|
'method': 'create',
|
||||||
response = self._req(self.download_url, args)
|
'_sid': self.sid}
|
||||||
|
if url:
|
||||||
|
log.info('Login success, adding torrent URI')
|
||||||
|
args['uri'] = url
|
||||||
|
response = self._req(self.download_url, args=args)
|
||||||
|
log.info('Response: %s', response)
|
||||||
|
result = response['success']
|
||||||
|
elif filename and filedata:
|
||||||
|
log.info('Login success, adding torrent')
|
||||||
|
files = {'file': (filename, filedata)}
|
||||||
|
response = self._req(self.download_url, args=args, files=files)
|
||||||
|
log.info('Response: %s', response)
|
||||||
|
result = response['success']
|
||||||
|
else:
|
||||||
|
log.error('Invalid use of SynologyRPC.create_task: either url or filename+filedata must be specified')
|
||||||
self._logout()
|
self._logout()
|
||||||
else:
|
|
||||||
log.error('Couldn\'t login to Synology, %s', login)
|
return result
|
||||||
return response
|
|
||||||
Reference in new issue
Block a user