import requests from bemani.client.common import random_hex_string from bemani.protocol import EAmuseProtocol, Node class ClientProtocol: def __init__( self, address: str, port: int, encryption: bool, compression: bool, verbose: bool, ) -> None: self.__address = address self.__port = port self.__encryption = encryption self.__compression = compression self.__verbose = verbose def exchange( self, uri: str, tree: Node, text_encoding: str = "shift-jis", packet_encoding: str = "binary", ) -> Node: headers = {} if self.__verbose: print("Outgoing request:") print(tree) # Handle encoding if packet_encoding == "xml": _packet_encoding = EAmuseProtocol.XML elif packet_encoding == "binary": _packet_encoding = EAmuseProtocol.BINARY else: raise Exception(f"Unknown packet encoding {packet_encoding}") # Handle encryption if self.__encryption: encryption = f"1-{random_hex_string(8)}-{random_hex_string(4)}" headers["X-Eamuse-Info"] = encryption else: encryption = None # Handle compression if self.__compression: compression = "lz77" else: compression = None headers["X-Compress"] = compression # Convert it proto = EAmuseProtocol() req = proto.encode( compression, encryption, tree, text_encoding=text_encoding, packet_encoding=_packet_encoding, ) # Send the request, get the response r = requests.post( f"http://{self.__address}:{self.__port}/{uri}", headers=headers, data=req, ) # Get the compression and encryption encryption = headers.get("X-Eamuse-Info") compression = headers.get("X-Compress") # Decode it packet = proto.decode( compression, encryption, r.content, ) if self.__verbose: print("Incoming response:") print(packet) return packet