572 lines
9.0 KiB
Markdown
572 lines
9.0 KiB
Markdown
# IIB API Reference
|
|
|
|
Complete API endpoint reference documentation.
|
|
|
|
Base path: `/infinite_image_browsing`
|
|
|
|
---
|
|
|
|
## 1. File System Operations
|
|
|
|
### GET /files
|
|
List directory files.
|
|
|
|
**Parameters:**
|
|
- `folder_path` (string): Directory path
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"files": [{
|
|
"type": "file|dir",
|
|
"date": 1234567890.0,
|
|
"created_time": 1234567890.0,
|
|
"size": "1.2 MB",
|
|
"bytes": 1258291,
|
|
"name": "image.png",
|
|
"fullpath": "/path/to/image.png",
|
|
"is_under_scanned_path": true
|
|
}]
|
|
}
|
|
```
|
|
|
|
### POST /batch_get_files_info
|
|
Batch get file information.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "paths": ["/path/to/file1", "/path/to/file2"] }
|
|
```
|
|
|
|
### POST /delete_files
|
|
Delete files or empty folders.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "file_paths": ["/path/to/file1", "/path/to/file2"] }
|
|
```
|
|
|
|
### POST /mkdirs
|
|
Create directory.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "dest_folder": "/path/to/new/folder" }
|
|
```
|
|
|
|
### POST /copy_files
|
|
Copy files.
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"file_paths": ["/path/to/file1"],
|
|
"dest": "/destination/folder",
|
|
"create_dest_folder": false,
|
|
"continue_on_error": false
|
|
}
|
|
```
|
|
|
|
### POST /move_files
|
|
Move files.
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"file_paths": ["/path/to/file1"],
|
|
"dest": "/destination/folder",
|
|
"create_dest_folder": false,
|
|
"continue_on_error": false
|
|
}
|
|
```
|
|
|
|
### POST /db/rename
|
|
Rename file.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "path": "/path/to/file", "name": "new_name.png" }
|
|
```
|
|
|
|
### POST /flatten_folder
|
|
Flatten folder (move files from subdirectories to root).
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"folder_path": "/path/to/folder",
|
|
"dry_run": true
|
|
}
|
|
```
|
|
|
|
### POST /zip
|
|
Create ZIP archive.
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"paths": ["/path/to/file1", "/path/to/file2"],
|
|
"compress": true,
|
|
"pack_only": false
|
|
}
|
|
```
|
|
|
|
### POST /check_path_exists
|
|
Check if paths exist.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "paths": ["/path1", "/path2"] }
|
|
```
|
|
|
|
---
|
|
|
|
## 2. Media File Access
|
|
|
|
### GET /image-thumbnail
|
|
Get image thumbnail.
|
|
|
|
**Parameters:**
|
|
- `path` (string): Image path
|
|
- `t` (string): Timestamp (for caching)
|
|
- `size` (string, default "256x256"): Thumbnail size
|
|
|
|
**Response:** WebP image
|
|
|
|
### GET /file
|
|
Get original file.
|
|
|
|
**Parameters:**
|
|
- `path` (string): File path
|
|
- `t` (string): Timestamp
|
|
- `disposition` (string, optional): Download filename
|
|
|
|
### GET /stream_video
|
|
Stream video with HTTP Range support.
|
|
|
|
**Parameters:**
|
|
- `path` (string): Video path
|
|
|
|
### GET /video_cover
|
|
Get video cover thumbnail.
|
|
|
|
**Parameters:**
|
|
- `path` (string): Video path
|
|
- `mt` (string): Modified time
|
|
|
|
---
|
|
|
|
## 3. Image Metadata
|
|
|
|
### GET /image_geninfo
|
|
Get image generation info (SD prompt, etc.).
|
|
|
|
**Parameters:**
|
|
- `path` (string): Image path
|
|
|
|
**Response:** Generation parameter text
|
|
|
|
### POST /image_geninfo_batch
|
|
Batch get generation info.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "paths": ["/path/to/img1.png", "/path/to/img2.png"] }
|
|
```
|
|
|
|
### GET /image_exif
|
|
Get image EXIF data.
|
|
|
|
**Parameters:**
|
|
- `path` (string): Image path
|
|
|
|
---
|
|
|
|
## 4. Database & Search
|
|
|
|
### GET /db/basic_info
|
|
Get database basic info.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"img_count": 10000,
|
|
"tags": [{"id": 1, "name": "tag1", "type": "custom", "color": "#ff0000"}],
|
|
"expired": false,
|
|
"expired_dirs": []
|
|
}
|
|
```
|
|
|
|
### GET /db/random_images
|
|
Get random images (128 images).
|
|
|
|
### POST /db/update_image_data
|
|
Refresh image index (incremental update).
|
|
|
|
### POST /db/rebuild_index
|
|
Full rebuild of image index.
|
|
|
|
### POST /db/search_by_substr
|
|
Substring search.
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"surstr": "search term",
|
|
"cursor": "",
|
|
"regexp": "",
|
|
"folder_paths": [],
|
|
"size": 200,
|
|
"path_only": false,
|
|
"media_type": "all"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"files": [{...FileInfo...}],
|
|
"cursor": { "has_next": true, "next": "cursor_string" }
|
|
}
|
|
```
|
|
|
|
### POST /db/match_images_by_tags
|
|
Tag-based search.
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"and_tags": [1, 2],
|
|
"or_tags": [3],
|
|
"not_tags": [4],
|
|
"cursor": "",
|
|
"folder_paths": [],
|
|
"size": 200,
|
|
"random_sort": false
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 5. Tag Management
|
|
|
|
### GET /db/img_selected_custom_tag
|
|
Get image's custom tags.
|
|
|
|
**Parameters:**
|
|
- `path` (string): Image path
|
|
|
|
### POST /db/get_image_tags
|
|
Batch get image tags.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "paths": ["/path/to/img1.png"] }
|
|
```
|
|
|
|
### POST /db/add_custom_tag
|
|
Add custom tag.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "tag_name": "my_tag" }
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{ "id": 1, "name": "my_tag", "type": "custom", "color": "" }
|
|
```
|
|
|
|
### POST /db/toggle_custom_tag_to_img
|
|
Toggle image tag (add if missing, remove if present).
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "img_path": "/path/to/image.png", "tag_id": 1 }
|
|
```
|
|
|
|
### POST /db/batch_update_image_tag
|
|
Batch update tags.
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"img_paths": ["/path/to/img1.png", "/path/to/img2.png"],
|
|
"action": "add",
|
|
"tag_id": 1
|
|
}
|
|
```
|
|
|
|
### POST /db/remove_custom_tag
|
|
Delete custom tag.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "tag_id": 1 }
|
|
```
|
|
|
|
### POST /db/update_tag
|
|
Update tag properties.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "id": 1, "color": "#ff0000" }
|
|
```
|
|
|
|
---
|
|
|
|
## 6. AI Features
|
|
|
|
### POST /ai-chat
|
|
General AI chat interface (OpenAI compatible).
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"messages": [
|
|
{ "role": "system", "content": "You are a helpful assistant." },
|
|
{ "role": "user", "content": "Hello!" }
|
|
],
|
|
"temperature": 0.7,
|
|
"max_tokens": null,
|
|
"stream": false
|
|
}
|
|
```
|
|
|
|
### POST /db/build_iib_output_embeddings
|
|
Build image embeddings.
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"folder": "/path/to/folder",
|
|
"model": "text-embedding-3-small",
|
|
"force": false,
|
|
"batch_size": 100,
|
|
"max_chars": 2000,
|
|
"recursive": false
|
|
}
|
|
```
|
|
|
|
### POST /db/cluster_iib_output_job_start
|
|
Start clustering background job.
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"folder": "/path/to/folder",
|
|
"folder_paths": [],
|
|
"model": "text-embedding-3-small",
|
|
"threshold": 0.85,
|
|
"min_cluster_size": 3,
|
|
"title_model": "gpt-4o-mini",
|
|
"lang": "en",
|
|
"recursive": false
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{ "job_id": "uuid-string" }
|
|
```
|
|
|
|
### GET /db/cluster_iib_output_job_status
|
|
Query clustering job status.
|
|
|
|
**Parameters:**
|
|
- `job_id` (string): Job ID
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"job_id": "uuid",
|
|
"status": "running|completed|failed",
|
|
"progress": 0.5,
|
|
"result": {
|
|
"clusters": [{
|
|
"id": "c1",
|
|
"title": "Landscape Photos",
|
|
"size": 50,
|
|
"keywords": ["landscape", "nature"],
|
|
"paths": ["/path/to/img1.png", ...]
|
|
}]
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 7. Smart File Organization
|
|
|
|
### POST /db/organize_files_start
|
|
Start file organization job.
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"folder_paths": ["/path/to/source"],
|
|
"dest_folder": "/path/to/destination",
|
|
"threshold": 0.90,
|
|
"min_cluster_size": 2,
|
|
"lang": "en",
|
|
"recursive": false,
|
|
"folder_naming": "title",
|
|
"action": "move",
|
|
"handle_noise": "unsorted",
|
|
"noise_folder_name": "Unsorted"
|
|
}
|
|
```
|
|
|
|
**Parameter details:**
|
|
- `folder_naming`: "title" | "keywords" | "id"
|
|
- `action`: "move" | "copy"
|
|
- `handle_noise`: "skip" | "unsorted" | "leave"
|
|
|
|
### GET /db/organize_files_status
|
|
Query organization job status.
|
|
|
|
**Parameters:**
|
|
- `job_id` (string): Job ID
|
|
|
|
### POST /db/organize_files_confirm
|
|
Confirm and execute organization.
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"job_id": "uuid",
|
|
"folder_edits": [
|
|
{ "cluster_id": "c1", "new_folder_name": "Custom Name" }
|
|
],
|
|
"skip_cluster_ids": ["c2", "c3"]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 8. Tag Graph
|
|
|
|
### POST /db/cluster_tag_graph
|
|
Build tag relationship graph.
|
|
|
|
**Request body:**
|
|
```json
|
|
{
|
|
"folder_paths": ["/path/to/folder"],
|
|
"lang": "en"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 9. Extra Paths Management
|
|
|
|
### GET /db/extra_paths
|
|
Get extra paths list.
|
|
|
|
### POST /db/extra_paths
|
|
Add extra path.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "path": "/new/scan/path", "types": ["scan"] }
|
|
```
|
|
|
|
### DELETE /db/extra_paths
|
|
Remove extra path.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "path": "/path/to/remove", "types": ["scan"] }
|
|
```
|
|
|
|
### POST /db/alias_extra_path
|
|
Set path alias.
|
|
|
|
**Request body:**
|
|
```json
|
|
{ "path": "/path", "alias": "My Alias" }
|
|
```
|
|
|
|
---
|
|
|
|
## 10. System APIs
|
|
|
|
### GET /hello
|
|
Health check. Returns `"hello"`
|
|
|
|
### GET /version
|
|
Get version info.
|
|
|
|
### GET /global_setting
|
|
Get global settings.
|
|
|
|
### POST /app_fe_setting
|
|
Save frontend setting.
|
|
|
|
### DELETE /app_fe_setting
|
|
Delete frontend setting.
|
|
|
|
### POST /open_folder
|
|
Open file browser.
|
|
|
|
### POST /open_with_default_app
|
|
Open file with default application.
|
|
|
|
### POST /shutdown
|
|
Shutdown application (requires `--enable_shutdown`).
|
|
|
|
---
|
|
|
|
## Data Models
|
|
|
|
### FileInfoDict
|
|
```typescript
|
|
{
|
|
type: "file" | "dir"
|
|
date: number // Modified timestamp
|
|
created_time: number // Created timestamp
|
|
size: string // Human readable size "1.2 MB"
|
|
bytes: number // Raw byte count
|
|
name: string // Filename
|
|
fullpath: string // Full path
|
|
is_under_scanned_path: boolean
|
|
}
|
|
```
|
|
|
|
### Cursor
|
|
```typescript
|
|
{
|
|
has_next: boolean
|
|
next: string // Next page cursor
|
|
}
|
|
```
|
|
|
|
### Tag
|
|
```typescript
|
|
{
|
|
id: number
|
|
name: string
|
|
type: "custom" | "auto"
|
|
color: string
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Error Handling
|
|
|
|
| Status Code | Meaning |
|
|
|-------------|---------|
|
|
| 200 | Success |
|
|
| 400 | Bad request / Invalid parameters |
|
|
| 401 | Authentication failed |
|
|
| 403 | Permission denied |
|
|
| 404 | Resource not found |
|
|
| 500 | Server error |
|
|
|
|
Error response format:
|
|
```json
|
|
{ "detail": "error message" }
|
|
```
|