) xbmc.sleep(1000) torr_info = jsonrq.get_torrent_info(info_hash) if __name__ == '__main__': if sys.argv[1] == 'pause': jsonrq.pause_torrent(sys.argv[2]) elif sys.argv[1] == 'resume': jsonrq.resume_torrent(sys.argv[2]) elif sys.argv[1] == 'delete' and xbmcgui.Dialog().yesno( _('Confirm delete'), _('Do you really want to delete the torrent?')): jsonrq.remove_torrent(sys.argv[2], False) elif sys.argv[1] == 'delete_with_files'and xbmcgui.Dialog().yesno( _('Confirm delete'), _('Do you really want to delete the torrent with files?'), _('Warning: The files will be deleted permanently!')): jsonrq.remove_torrent(sys.argv[2], True) elif sys.argv[1] == 'pause_all': jsonrq.pause_all() elif sys.argv[1] == 'resume_all': jsonrq.resume_all() elif sys.argv[1] == 'show_info': show_torrent_info(sys.argv[2]) elif sys.argv[1] == 'restore_finished': jsonrq.restore_finished(sys.argv[2]) else: addon.log_debug('Command cancelled or invalid command: {0}'.format(sys.argv[1])) xbmc.executebuiltin('Container.Refresh')
class WebClient(requests.Session): _secret_data = ['password'] def __init__(self, headers=None, cookie_file=None): super(WebClient, self).__init__() if cookie_file is not None: self.cookies = cookielib.LWPCookieJar(cookie_file) if os.path.exists(cookie_file): self.cookies.load(ignore_discard=True, ignore_expires=True) if headers is not None: self.headers.update(headers) self._addon = Addon() def __save_cookies(self): if isinstance(self.cookies, cookielib.LWPCookieJar) \ and self.cookies.filename: self.cookies.save(ignore_expires=True, ignore_discard=True) def post(self, url, **kwargs): func = super(WebClient, self).post return self._run(func, url, **kwargs) def get(self, url, **kwargs): func = super(WebClient, self).get return self._run(func, url, **kwargs) def put(self, url, **kwargs): func = super(WebClient, self).put return self._run(func, url, **kwargs) def delete(self, url, **kwargs): func = super(WebClient, self).delete return self._run(func, url, **kwargs) def _run(self, func, url, **kwargs): try: r = func(url, **kwargs) r.raise_for_status() except (requests.HTTPError, requests.ConnectionError) as e: self._log_error(e) raise WebClientError(e) else: self._log_debug(r) if r.headers.get('set-cookie') is not None: self.__save_cookies() return r def _log_debug(self, response): debug_info = [] request = getattr(response, 'request', None) if request is not None: request_info = self._get_request_info(request) if request: debug_info.append(request_info) if response is not None: response_info = self._get_response_info(response) if response_info: debug_info.append(response_info) self._addon.log_debug('\n'.join(debug_info)) def _log_error(self, error): error_info = [str(error)] response = getattr(error, 'response', None) request = getattr(error, 'request', None) if request is not None: request_info = self._get_request_info(request) if request: error_info.append(request_info) if response is not None: response_info = self._get_response_info(response) if response_info: error_info.append(response_info) self._addon.log_error('\n'.join(error_info)) @staticmethod def _get_response_info(response): response_info = ['Response info', 'Status code: {0}'.format(response.status_code), 'Reason: {0}'.format(response.reason)] if not PY26: response_info.append('Elapsed: {0:.4f} sec'.format(response.elapsed.total_seconds())) if response.url: response_info.append('URL: {0}'.format(response.url)) if response.headers: response_info.append('Headers: {0}'.format(response.headers)) if response.text \ and response.encoding: response_info.append('Content: {0}'.format(response.text)) return '\n'.join(response_info) @classmethod def _get_request_info(cls, request): request_info = ['Request info', 'Method: {0}'.format(request.method)] if request.url: request_info.append('URL: {0}'.format(request.url)) if request.headers: request_info.append('Headers: {0}'.format(request.headers)) if request.body: try: j = json.loads(request.body) for field in cls._secret_data: if j.get(field) is not None: j[field] = '<SECRET>' data = json.dumps(j) except ValueError: data = request.body for param in data.split('&'): if '=' in param: field, value = param.split('=') if field in cls._secret_data: data = data.replace(param, '{0}=<SECRET>'.format(field)) request_info.append('Data: {0}'.format(data)) return '\n'.join(request_info)
librorrent_addon.set_setting('custom_version', orig_custom_version) librorrent_addon.set_setting('set_version', orig_set_version) # ====== if addon.enable_limits: wsgi_app.limits_timer.start() if addon.persistent: wsgi_app.save_resume_timer.start() httpd = create_server(wsgi_app.app, port=addon.server_port) httpd.timeout = 0.1 start_trigger = True while not kodi_monitor.abortRequested(): httpd.handle_request() if start_trigger: addon.log_notice('Torrent Server started') xbmcgui.Dialog().notification('YATP', _('Torrent server started.'), addon.icon, 3000, False) start_trigger = False addon.log_debug('Stopping Torrent Server...') addon.log_debug('Close server socket') httpd.socket.close() addon.log_debug('Abort buffering') wsgi_app.torrent_client.abort_buffering() addon.log_debug('Stop timers') if addon.enable_limits: wsgi_app.limits_timer.abort() if addon.persistent: wsgi_app.save_resume_timer.abort() addon.log_notice('Torrent Server stopped')
xbmc.sleep(1000) torr_info = jsonrq.get_torrent_info(info_hash) if __name__ == '__main__': if sys.argv[1] == 'pause': jsonrq.pause_torrent(sys.argv[2]) elif sys.argv[1] == 'resume': jsonrq.resume_torrent(sys.argv[2]) elif sys.argv[1] == 'delete' and xbmcgui.Dialog().yesno( _('Confirm delete'), _('Do you really want to delete the torrent?')): jsonrq.remove_torrent(sys.argv[2], False) elif sys.argv[1] == 'delete_with_files' and xbmcgui.Dialog().yesno( _('Confirm delete'), _('Do you really want to delete the torrent with files?'), _('Warning: The files will be deleted permanently!')): jsonrq.remove_torrent(sys.argv[2], True) elif sys.argv[1] == 'pause_all': jsonrq.pause_all() elif sys.argv[1] == 'resume_all': jsonrq.resume_all() elif sys.argv[1] == 'show_info': show_torrent_info(sys.argv[2]) elif sys.argv[1] == 'restore_finished': jsonrq.restore_finished(sys.argv[2]) else: addon.log_debug('Command cancelled or invalid command: {0}'.format( sys.argv[1])) xbmc.executebuiltin('Container.Refresh')