125 lines
4.1 KiB
Python
125 lines
4.1 KiB
Python
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
|