Fixed torrent support for Synology downloader to work properly with torrent files passed directly by CouchPotato.

This commit is contained in:
sax authored and Ruud committed 2013-06-14 23:31:56 +02:00
1 parent 580d43aeaf
commit 09b4ad6937
1 file changed
+62 -36
+62 -36
View File
@@ -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