from os import name from typing import Dict, Optional, TypedDict, Union, List import requests class FolderInfo(TypedDict): id: str name: str class EagleAPI: def __init__(self, base_url="http://localhost:41595"): self.base_url = base_url self.folder_list: Optional[List[FolderInfo]] = None # ######################################### # 画像をEagleに送信 def add_item_from_path(self, data, folder_id=None): if folder_id: data["folderId"] = folder_id return self._send_request("/api/item/addFromPath", method="POST", data=data) # ######################################### # フォルダ名 or ID で該当フォルダを探してIDを返す # 存在しなければ作成してIDを返す def find_or_create_folder(self, name_or_id:str) -> str: folder = self._find_folder(name_or_id) if folder: return folder.get("id", "") return self._create_folder(name_or_id) # ######################################### # フォルダ名 or ID で該当フォルダを取得 # 存在しないなら None を返す def _find_folder(self, name_or_id:str) -> Optional[FolderInfo]: self._ensure_folder_list() if(self.folder_list is not None): # 名前とIDの両方で検索 for folder in self.folder_list: if folder["name"] == name_or_id or folder["id"] == name_or_id: return folder return None # ######################################### # フォルダを作成 # 作成できない or 名前指定がなければ "" を返す def _create_folder(self, name:str) -> str: if(not name): return "" try: data = {"folderName": name} response = self._send_request("/api/folder/create", method="POST", data=data) new_folder_id = response.get("data", {}).get("id", "") # フォルダリストを更新 if new_folder_id and self.folder_list is not None: self.folder_list.append({"id": new_folder_id, "name": name}) return new_folder_id except requests.RequestException: return "" # ######################################### # Eagle のフォルダID、名前の一覧を取得 def _ensure_folder_list(self): if self.folder_list is None: self._get_all_folder_list() def _get_all_folder_list(self): try: json = self._send_request("/api/folder/list") self.folder_list = self._extract_id_name_pairs(json["data"]) except requests.RequestException: self.folder_list = [] # ######################################### # Private method for sending requests def _send_request(self, endpoint, method="GET", data=None): url = self.base_url + endpoint headers = {"Content-Type": "application/json"} try: if method == "GET": response = requests.get(url, headers=headers) elif method == "POST": response = requests.post(url, headers=headers, json=data) else: raise ValueError(f"Unsupported HTTP method: {method}") response.raise_for_status() return response.json() except requests.RequestException as e: print(f"Eagle request failed: {e}") raise # ######################################### # フォルダリストを作成 def _extract_id_name_pairs(self, data): result = [] def recursive_extract(item): if isinstance(item, dict): if 'id' in item and 'name' in item: result.append({'id': item['id'], 'name': item['name']}) if 'children' in item and isinstance(item['children'], list): for child in item['children']: recursive_extract(child) elif isinstance(item, list): for element in item: recursive_extract(element) recursive_extract(data) return result