from couchpotato.core.downloaders.base import Downloader from couchpotato.core.helpers.encoding import isInt from couchpotato.core.logger import CPLog import httplib import json import urllib import urllib2 log = CPLog(__name__) class Synology(Downloader): type = ['torrent', 'torrent_magnet'] log = CPLog(__name__) def download(self, data, movie, filedata = None): log.error('Sending "%s" (%s) to Synology.', (data.get('name'), data.get('type'))) # Load host from config and split out port. host = self.conf('host').split(':') if not isInt(host[1]): log.error('Config properties are not filled in correctly, port is missing.') return False try: # Send request to Transmission srpc = SynologyRPC(host[0], host[1], self.conf('username'), self.conf('password')) remote_torrent = srpc.add_torrent_uri(data.get('url')) log.info('Response: %s', remote_torrent) return remote_torrent['success'] except Exception, err: log.error('Exception while adding torrent: %s', err) return False class SynologyRPC(object): '''SynologyRPC lite library''' def __init__(self, host = 'localhost', port = 5000, username = None, password = None): super(SynologyRPC, self).__init__() self.download_url = 'http://%s:%s/webapi/DownloadStation/task.cgi' % (host, port) self.auth_url = 'http://%s:%s/webapi/auth.cgi' % (host, port) self.username = username self.password = password self.session_name = 'DownloadStation' def _login(self): if self.username and self.password: args = {'api': 'SYNO.API.Auth', 'account': self.username, 'passwd': self.password, 'version': 2, 'method': 'login', 'session': self.session_name, 'format': 'sid'} response = self._req(self.auth_url, args) if response['success'] == True: self.sid = response['data']['sid'] log.debug('Sid=%s', self.sid) return response elif self.username or self.password: log.error('User or password missing, not using authentication.') return False def _logout(self): args = {'api':'SYNO.API.Auth', 'version':1, 'method':'logout', 'session':self.session_name, '_sid':self.sid} return self._req(self.auth_url, args) def _req(self, url, args): req = urllib2.Request(url, urllib.urlencode(args)) try: req_open = urllib2.urlopen(req) response = json.loads(req_open.read()) if response['success'] == True: log.info('Synology action successfull') return response except httplib.InvalidURL, err: log.error('Invalid Synology host, check your config %s', err) return False except urllib2.HTTPError, err: log.error('SynologyRPC HTTPError: %s', err) return False except urllib2.URLError, err: log.error('Unable to connect to Synology %s', err) return False def add_torrent_uri(self, torrent): log.info('Adding torrent URL %s', torrent) response = {} # login login = self._login() if login and login['success'] == True: log.info('Login success, adding torrent') args = {'api':'SYNO.DownloadStation.Task', 'version':1, 'method':'create', 'uri':torrent, '_sid':self.sid} response = self._req(self.download_url, args) self._logout() else: log.error('Couldn\'t login to Synology, %s', login) return response