117 lines
4.1 KiB
Python
117 lines
4.1 KiB
Python
import os
|
|
import server
|
|
from aiohttp import web
|
|
|
|
# Get the absolute path to the 'data' directory
|
|
# __file__ is the path to the current script (api.py)
|
|
# os.path.dirname(__file__) is the directory of the current script (modules)
|
|
# os.path.join(..., '..', 'data') goes up one level and then into 'data'
|
|
DATA_DIR = os.path.join(os.path.dirname(__file__), '..', 'data')
|
|
|
|
BASE_URL = '/autocomplete-plus/csv'
|
|
|
|
TAGS_BASE_FILE = 'danbooru_tags.csv'
|
|
COOCCURRENCE_BASE_FILE = 'danbooru_tags_cooccurrence.csv'
|
|
|
|
def get_extra_csv_files():
|
|
"""
|
|
Returns a dictionary with extra CSV files for tags and cooccurrence.
|
|
"""
|
|
tags_extra_files = []
|
|
cooccurrence_extra_files = []
|
|
|
|
all_csv_files = [f for f in os.listdir(DATA_DIR) if f.endswith('.csv')]
|
|
if len(all_csv_files) == 0:
|
|
print("[Autocomplete-Plus] No CSV files found in the data directory.")
|
|
|
|
# Create extra CSV files list
|
|
for filename in all_csv_files:
|
|
if filename in [TAGS_BASE_FILE, COOCCURRENCE_BASE_FILE]:
|
|
continue # Skip base files
|
|
|
|
if 'cooccurrence' in filename.lower():
|
|
cooccurrence_extra_files.append(filename)
|
|
elif 'tag' in filename.lower():
|
|
tags_extra_files.append(filename)
|
|
return {
|
|
'tags': tags_extra_files,
|
|
'cooccurrence': cooccurrence_extra_files,
|
|
}
|
|
|
|
# --- API Endpoints ---
|
|
|
|
@server.PromptServer.instance.routes.get('/autocomplete-plus/csv')
|
|
async def get_csv_list(_request):
|
|
"""
|
|
Returns number of extra CSV files available.
|
|
"""
|
|
extra_csv_files = get_extra_csv_files()
|
|
|
|
response = {
|
|
'tags': len(extra_csv_files['tags']),
|
|
'cooccurrence': len(extra_csv_files['cooccurrence']),
|
|
}
|
|
return web.json_response(response)
|
|
|
|
@server.PromptServer.instance.routes.get('/autocomplete-plus/csv/tags/base')
|
|
async def get_base_tags_file(_request):
|
|
"""
|
|
Returns the base tags CSV file.
|
|
"""
|
|
file_path = os.path.join(DATA_DIR, TAGS_BASE_FILE)
|
|
if not os.path.exists(file_path):
|
|
return web.json_response({"error": "Base tags file not found"}, status=404)
|
|
return web.FileResponse(file_path)
|
|
|
|
@server.PromptServer.instance.routes.get('/autocomplete-plus/csv/tags/extra/{index}')
|
|
async def get_extra_tags_file(request):
|
|
"""
|
|
Returns the extra tags CSV file at the specified index.
|
|
"""
|
|
try:
|
|
extra_csv_files = get_extra_csv_files()
|
|
|
|
index = int(request.match_info['index'])
|
|
if index < 0 or index >= len(extra_csv_files['tags']):
|
|
return web.json_response({"error": "Invalid index"}, status=404)
|
|
|
|
file_path = os.path.join(DATA_DIR, extra_csv_files['tags'][index])
|
|
if not os.path.exists(file_path):
|
|
return web.json_response({"error": "Extra tags file not found"}, status=404)
|
|
|
|
return web.FileResponse(file_path)
|
|
|
|
except ValueError:
|
|
return web.json_response({"error": "Invalid index format"}, status=400)
|
|
|
|
@server.PromptServer.instance.routes.get('/autocomplete-plus/csv/cooccurrence/base')
|
|
async def get_base_cooccurrence_file(_request):
|
|
"""
|
|
Returns the base cooccurrence CSV file.
|
|
"""
|
|
file_path = os.path.join(DATA_DIR, COOCCURRENCE_BASE_FILE)
|
|
if not os.path.exists(file_path):
|
|
return web.json_response({"error": "Base cooccurrence file not found"}, status=404)
|
|
return web.FileResponse(file_path)
|
|
|
|
@server.PromptServer.instance.routes.get('/autocomplete-plus/csv/cooccurrence/extra/{index}')
|
|
async def get_extra_cooccurrence_file(request):
|
|
"""
|
|
Returns the extra cooccurrence CSV file at the specified index.
|
|
"""
|
|
try:
|
|
extra_csv_files = get_extra_csv_files()
|
|
|
|
index = int(request.match_info['index'])
|
|
if index < 0 or index >= len(extra_csv_files['cooccurrence']):
|
|
return web.json_response({"error": "Invalid index"}, status=404)
|
|
|
|
file_path = os.path.join(DATA_DIR, extra_csv_files['cooccurrence'][index])
|
|
if not os.path.exists(file_path):
|
|
return web.json_response({"error": "Extra cooccurrence file not found"}, status=404)
|
|
|
|
return web.FileResponse(file_path)
|
|
|
|
except ValueError:
|
|
return web.json_response({"error": "Invalid index format"}, status=400)
|