"""Bot-side client for the musician's share-list / share-link endpoints. This module used to hardcode the musician's LAN address and send no auth header, which broke the file-share feature in two ways: * the musician's ``/get_share_list`` and ``/get_share_links`` both call ``_authorize_request()``, so every request 401'd on any deployment that set ``CONJURER_API_KEY`` — which the deployment guides tell you to do; and * the hardcoded IP ignored ``CONJURER_FILE_SERVICE``, so a musician running on another host (the Proxmox/docker split) was unreachable. It now follows the same convention as the other service clients (``music_functions``): address from ``constants``, shared auth headers, and an explicit timeout so a wedged musician can't hang the bot. """ import requests from constants import ( FILE_SERVICE_ADDRESS, GET_SHARE_LINKS, GET_SHARE_LIST, service_headers, ) SERVICE_HEADERS = service_headers() REQUEST_TIMEOUT = 60 def find_matches(entries, keywords): """ Call the get_share_list endpoint. entries: int (1-10) keywords: list of strings Returns: list of file paths """ payload = {'entries': entries, 'keywords': keywords} response = requests.post( f"{FILE_SERVICE_ADDRESS}{GET_SHARE_LIST}", json=payload, headers=SERVICE_HEADERS, timeout=REQUEST_TIMEOUT, ) response.raise_for_status() data = response.json() return data.get('files', []) def publish(file_paths): """ Call the get_share_links endpoint. file_paths: list of file path strings Returns: list of published URLs """ payload = {'file_paths': file_paths} response = requests.post( f"{FILE_SERVICE_ADDRESS}{GET_SHARE_LINKS}", json=payload, headers=SERVICE_HEADERS, timeout=REQUEST_TIMEOUT, ) response.raise_for_status() data = response.json() return data.get('links', [])