def _request(self, method, arguments=None, ids=None, require_ids=False, timeout=None): """ Send json-rpc request to Transmission using http POST :type arguments: object :type method: str """ if not isinstance(method, str): raise ValueError('request takes method as string') if arguments is None: arguments = {} if not isinstance(arguments, dict): raise ValueError('request takes arguments as dict') arguments = { key.replace('_', '-'): value for key, value in arguments.items() } ids = parse_torrent_ids(ids) if len(ids) > 0: arguments['ids'] = ids elif require_ids: raise ValueError('request require ids') query = json.dumps({ 'tag': self._sequence, 'method': method, 'arguments': arguments }) self._sequence += 1 start = time.time() http_data = self._http_query(query, timeout) elapsed = time.time() - start self.logger.info('http request took %.3f s' % elapsed) try: data = json.loads(http_data) except ValueError as error: self.logger.error('Error: ' + str(error)) self.logger.error('Request: \"%s\"' % query) self.logger.error('HTTP data: \"%s\"' % http_data) raise ValueError from error self.logger.debug(json.dumps(data, indent=2)) if 'result' in data: if data['result'] != 'success': raise TransmissionError('Query failed with result \"%s\".' % (data['result'])) else: raise TransmissionError('Query failed without result.') results = {} if method == 'torrent-get': for item in data['arguments']['torrents']: results[item['id']] = Torrent(self, item) if self.protocol_version == 2 and 'peers' not in item: self.protocol_version = 1 elif method == 'torrent-add': item = None if 'torrent-added' in data['arguments']: item = data['arguments']['torrent-added'] elif 'torrent-duplicate' in data['arguments']: item = data['arguments']['torrent-duplicate'] if item: results[item['id']] = Torrent(self, item) else: raise TransmissionError('Invalid torrent-add response.') elif method == 'session-get': self._update_session(data['arguments']) elif method == 'session-stats': # older versions of T has the return data in "session-stats" if 'session-stats' in data['arguments']: self._update_session(data['arguments']['session-stats']) else: self._update_session(data['arguments']) elif method in ('port-test', 'blocklist-update', 'free-space', 'torrent-rename-path'): results = data['arguments'] else: return None return results
def _request( self, method: str, arguments: Dict[str, Any] = None, ids: _TorrentIDs = None, require_ids: bool = False, timeout: _Timeout = None, ) -> dict: """ Send json-rpc request to Transmission using http POST """ if not isinstance(method, str): raise ValueError("request takes method as string") if arguments is None: arguments = {} if not isinstance(arguments, dict): raise ValueError("request takes arguments as dict") arguments = { key.replace("_", "-"): value for key, value in arguments.items() } ids = _parse_torrent_ids(ids) if len(ids) > 0: arguments["ids"] = ids elif require_ids: raise ValueError("request require ids") query = json.dumps({ "tag": self._sequence, "method": method, "arguments": arguments }) self._sequence += 1 start = time.time() http_data = self._http_query(query, timeout) elapsed = time.time() - start self.logger.info("http request took %.3f s" % elapsed) try: data: dict = json.loads(http_data) except ValueError as error: self.logger.error("Error: " + str(error)) self.logger.error('Request: "%s"' % query) self.logger.error('HTTP data: "%s"' % http_data) raise ValueError from error self.logger.debug(json.dumps(data, indent=2)) if "result" in data: if data["result"] != "success": raise TransmissionError('Query failed with result "%s".' % (data["result"])) else: raise TransmissionError("Query failed without result.") results = {} if method == "torrent-get": for item in data["arguments"]["torrents"]: results[item["id"]] = Torrent(self, item) if self.protocol_version == 2 and "peers" not in item: self.protocol_version = 1 elif method == "torrent-add": item = None if "torrent-added" in data["arguments"]: item = data["arguments"]["torrent-added"] elif "torrent-duplicate" in data["arguments"]: item = data["arguments"]["torrent-duplicate"] if item: results[item["id"]] = Torrent(self, item) else: raise TransmissionError("Invalid torrent-add response.") elif method == "session-get": self._update_session(data["arguments"]) elif method == "session-stats": # older versions of T has the return data in "session-stats" if "session-stats" in data["arguments"]: self._update_session(data["arguments"]["session-stats"]) else: self._update_session(data["arguments"]) elif method in ( "port-test", "blocklist-update", "free-space", "torrent-rename-path", ): results = data["arguments"] else: return data return results