nix: set up project-wide formatter
Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I4806c58aa0a17f504c9312723ad770166a6a6964
This commit is contained in:
parent
aa9c55277c
commit
9e5eb41d39
78 changed files with 7406 additions and 2504 deletions
4628
crates/pinakes-ui/assets/css/main.css
vendored
4628
crates/pinakes-ui/assets/css/main.css
vendored
File diff suppressed because one or more lines are too long
19
docs/api/analytics.md
vendored
19
docs/api/analytics.md
vendored
|
|
@ -17,7 +17,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Event recorded |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -31,14 +31,14 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ------------------------- |
|
||||
| `limit` | query | No | Maximum number of results |
|
||||
| `offset` | query | No | Pagination offset |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Most viewed media |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -52,14 +52,14 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ------------------------- |
|
||||
| `limit` | query | No | Maximum number of results |
|
||||
| `offset` | query | No | Pagination offset |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Recently viewed media |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -73,13 +73,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Watch progress |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -94,7 +94,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -106,7 +106,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Progress updated |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -114,4 +114,3 @@ See `docs/api/openapi.json` for the full schema.
|
|||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
5
docs/api/audit.md
vendored
5
docs/api/audit.md
vendored
|
|
@ -11,17 +11,16 @@ Audit log entries
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ----------------- |
|
||||
| `offset` | query | No | Pagination offset |
|
||||
| `limit` | query | No | Page size |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Audit log entries |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
16
docs/api/auth.md
vendored
16
docs/api/auth.md
vendored
|
|
@ -17,7 +17,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Login successful |
|
||||
| 400 | Bad request |
|
||||
| 401 | Invalid credentials |
|
||||
|
|
@ -32,7 +32,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Logged out |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -46,7 +46,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Current user info |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -55,15 +55,14 @@ See `docs/api/openapi.json` for the full schema.
|
|||
|
||||
### POST /api/v1/auth/refresh
|
||||
|
||||
Refresh the current session, extending its expiry by the configured
|
||||
duration.
|
||||
Refresh the current session, extending its expiry by the configured duration.
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Session refreshed |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -79,7 +78,7 @@ Revoke all sessions for the current user
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | All sessions revoked |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -93,11 +92,10 @@ Revoke all sessions for the current user
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Active sessions |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
11
docs/api/backup.md
vendored
11
docs/api/backup.md
vendored
|
|
@ -6,22 +6,21 @@ Database backup
|
|||
|
||||
### POST /api/v1/admin/backup
|
||||
|
||||
Create a database backup and return it as a downloadable file.
|
||||
POST /api/v1/admin/backup
|
||||
Create a database backup and return it as a downloadable file. POST
|
||||
/api/v1/admin/backup
|
||||
|
||||
For `SQLite`: creates a backup via VACUUM INTO and returns the file.
|
||||
For `PostgreSQL`: returns unsupported error (use `pg_dump` instead).
|
||||
For `SQLite`: creates a backup via VACUUM INTO and returns the file. For
|
||||
`PostgreSQL`: returns unsupported error (use `pg_dump` instead).
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Backup file download |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
35
docs/api/books.md
vendored
35
docs/api/books.md
vendored
|
|
@ -13,7 +13,7 @@ List all books with optional search filters
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ----------- | ----- | -------- | ------------------- |
|
||||
| `isbn` | query | No | Filter by ISBN |
|
||||
| `author` | query | No | Filter by author |
|
||||
| `series` | query | No | Filter by series |
|
||||
|
|
@ -25,7 +25,7 @@ List all books with optional search filters
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | List of books |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -41,14 +41,14 @@ List all authors with book counts
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ----------------- |
|
||||
| `offset` | query | No | Pagination offset |
|
||||
| `limit` | query | No | Pagination limit |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------------ |
|
||||
| 200 | Authors with book counts |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -63,7 +63,7 @@ Get books by a specific author
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ----------------- |
|
||||
| `name` | path | Yes | Author name |
|
||||
| `offset` | query | No | Pagination offset |
|
||||
| `limit` | query | No | Pagination limit |
|
||||
|
|
@ -71,7 +71,7 @@ Get books by a specific author
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------- |
|
||||
| 200 | Books by author |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -86,13 +86,13 @@ Get user's reading list
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ------------------------ |
|
||||
| `status` | query | No | Filter by reading status |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | Reading list |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -107,7 +107,7 @@ List all series with book counts
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------------------- |
|
||||
| 200 | List of series with counts |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -122,13 +122,13 @@ Get books in a specific series
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ------ | ---- | -------- | ----------- |
|
||||
| `name` | path | Yes | Series name |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------- |
|
||||
| 200 | Books in series |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -143,13 +143,13 @@ Get book metadata by media ID
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------- |
|
||||
| 200 | Book metadata |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -165,13 +165,13 @@ Get reading progress for a book
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------- |
|
||||
| 200 | Reading progress |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -187,7 +187,7 @@ Update reading progress for a book
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -199,10 +199,9 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------- |
|
||||
| 204 | Progress updated |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
25
docs/api/collections.md
vendored
25
docs/api/collections.md
vendored
|
|
@ -11,7 +11,7 @@ Media collections
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | List of collections |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -31,7 +31,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Collection created |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -47,13 +47,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Collection ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Collection |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -68,13 +68,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Collection ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Collection deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -90,13 +90,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Collection ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Collection members |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -111,7 +111,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Collection ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -123,7 +123,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Member added |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -139,14 +139,14 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---------- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Collection ID |
|
||||
| `media_id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Member removed |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -154,4 +154,3 @@ See `docs/api/openapi.json` for the full schema.
|
|||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
13
docs/api/config.md
vendored
13
docs/api/config.md
vendored
|
|
@ -11,7 +11,7 @@ Server configuration
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------------------- |
|
||||
| 200 | Current server configuration |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -32,7 +32,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Updated configuration |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -54,7 +54,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Updated configuration |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -75,7 +75,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Updated configuration |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -90,7 +90,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | UI configuration |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -110,11 +110,10 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------------ |
|
||||
| 200 | Updated UI configuration |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
7
docs/api/database.md
vendored
7
docs/api/database.md
vendored
|
|
@ -11,7 +11,7 @@ Database administration
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Database cleared |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -26,7 +26,7 @@ Database administration
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Database statistics |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -41,11 +41,10 @@ Database administration
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Database vacuumed |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
3
docs/api/duplicates.md
vendored
3
docs/api/duplicates.md
vendored
|
|
@ -11,10 +11,9 @@ Duplicate media detection
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Duplicate groups |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
11
docs/api/enrichment.md
vendored
11
docs/api/enrichment.md
vendored
|
|
@ -17,7 +17,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------------ |
|
||||
| 200 | Enrichment job submitted |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -33,13 +33,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------------ |
|
||||
| 200 | Enrichment job submitted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -55,17 +55,16 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | External metadata |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
5
docs/api/export.md
vendored
5
docs/api/export.md
vendored
|
|
@ -11,7 +11,7 @@ Media library export
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Export job submitted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -32,11 +32,10 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Export job submitted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
17
docs/api/health.md
vendored
17
docs/api/health.md
vendored
|
|
@ -13,7 +13,7 @@ Comprehensive health check - includes database, filesystem, and cache status
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------- |
|
||||
| 200 | Health status |
|
||||
|
||||
---
|
||||
|
|
@ -25,39 +25,38 @@ Comprehensive health check - includes database, filesystem, and cache status
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------------- |
|
||||
| 200 | Detailed health status |
|
||||
|
||||
---
|
||||
|
||||
### GET /api/v1/health/live
|
||||
|
||||
Liveness probe - just checks if the server is running
|
||||
Returns 200 OK if the server process is alive
|
||||
Liveness probe - just checks if the server is running Returns 200 OK if the
|
||||
server process is alive
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------- |
|
||||
| 200 | Server is alive |
|
||||
|
||||
---
|
||||
|
||||
### GET /api/v1/health/ready
|
||||
|
||||
Readiness probe - checks if the server can serve requests
|
||||
Returns 200 OK if database is accessible
|
||||
Readiness probe - checks if the server can serve requests Returns 200 OK if
|
||||
database is accessible
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------- |
|
||||
| 200 | Server is ready |
|
||||
| 503 | Server not ready |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
11
docs/api/integrity.md
vendored
11
docs/api/integrity.md
vendored
|
|
@ -11,7 +11,7 @@ Library integrity checks and repairs
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------------------ |
|
||||
| 200 | Orphan detection job submitted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -32,7 +32,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Orphans resolved |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -47,7 +47,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------------------- |
|
||||
| 200 | Thumbnail cleanup job submitted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -68,7 +68,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------------------------- |
|
||||
| 200 | Thumbnail generation job submitted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -89,11 +89,10 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------------------------ |
|
||||
| 200 | Integrity verification job submitted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
11
docs/api/jobs.md
vendored
11
docs/api/jobs.md
vendored
|
|
@ -11,7 +11,7 @@ Background job management
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | List of jobs |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -25,13 +25,13 @@ Background job management
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Job ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | Job details |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -46,17 +46,16 @@ Background job management
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Job ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------- |
|
||||
| 200 | Job cancelled |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
| 404 | Not found |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
89
docs/api/media.md
vendored
89
docs/api/media.md
vendored
|
|
@ -11,7 +11,7 @@ Media item management
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ----------------- |
|
||||
| `offset` | query | No | Pagination offset |
|
||||
| `limit` | query | No | Page size |
|
||||
| `sort` | query | No | Sort field |
|
||||
|
|
@ -19,7 +19,7 @@ Media item management
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | List of media items |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -33,7 +33,7 @@ Media item management
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | All media deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -54,7 +54,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ----------------------- |
|
||||
| 200 | Batch collection result |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -76,7 +76,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Batch delete result |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -98,7 +98,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Batch move result |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -120,7 +120,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Batch tag result |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -142,7 +142,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Batch update result |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -158,7 +158,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media count |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -178,7 +178,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media imported |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -200,7 +200,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Batch import results |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -222,7 +222,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------------ |
|
||||
| 200 | Directory import results |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -244,7 +244,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media imported |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -266,7 +266,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Directory preview |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -282,14 +282,14 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ----------------- |
|
||||
| `offset` | query | No | Pagination offset |
|
||||
| `limit` | query | No | Page size |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Trashed media items |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -303,7 +303,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Trash emptied |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -318,7 +318,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Trash info |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -332,13 +332,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media item |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -353,7 +353,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -365,7 +365,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Updated media item |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -382,13 +382,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -404,7 +404,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -416,7 +416,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Custom field set |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -433,14 +433,14 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ------ | ---- | -------- | ----------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
| `name` | path | Yes | Custom field name |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Custom field deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -456,7 +456,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -468,7 +468,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Moved media item |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -485,13 +485,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media opened |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -506,14 +506,14 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ----------- | ----- | -------- | ------------------------------------ |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
| `permanent` | query | No | Set to 'true' for permanent deletion |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -529,7 +529,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -541,7 +541,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Renamed media item |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -558,13 +558,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media restored |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -580,13 +580,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media stream |
|
||||
| 206 | Partial content |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -602,13 +602,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Thumbnail image |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -623,13 +623,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media moved to trash |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -637,4 +637,3 @@ See `docs/api/openapi.json` for the full schema.
|
|||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
21
docs/api/notes.md
vendored
21
docs/api/notes.md
vendored
|
|
@ -15,13 +15,13 @@ GET /api/v1/media/{id}/backlinks
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Backlinks |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -40,13 +40,13 @@ GET /api/v1/media/{id}/outgoing-links
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Outgoing links |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -65,13 +65,13 @@ POST /api/v1/media/{id}/reindex-links
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Links reindexed |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -90,14 +90,14 @@ GET /api/v1/notes/graph?center={uuid}&depth={n}
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ---------------------------------- |
|
||||
| `center` | query | No | Center node ID |
|
||||
| `depth` | query | No | Traversal depth (max 5, default 2) |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Graph data |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -115,7 +115,7 @@ POST /api/v1/notes/resolve-links
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Links resolved |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -133,10 +133,9 @@ GET /api/v1/notes/unresolved-count
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Unresolved link count |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
9
docs/api/photos.md
vendored
9
docs/api/photos.md
vendored
|
|
@ -13,7 +13,7 @@ Get photos in a bounding box for map view
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ------ | ----- | -------- | ------------------------ |
|
||||
| `lat1` | query | Yes | Bounding box latitude 1 |
|
||||
| `lon1` | query | Yes | Bounding box longitude 1 |
|
||||
| `lat2` | query | Yes | Bounding box latitude 2 |
|
||||
|
|
@ -22,7 +22,7 @@ Get photos in a bounding box for map view
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Map markers |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -39,7 +39,7 @@ Get timeline of photos grouped by date
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---------- | ----- | -------- | -------------------------- |
|
||||
| `group_by` | query | No | Grouping: day, month, year |
|
||||
| `year` | query | No | Filter by year |
|
||||
| `month` | query | No | Filter by month |
|
||||
|
|
@ -48,10 +48,9 @@ Get timeline of photos grouped by date
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Photo timeline groups |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
37
docs/api/playlists.md
vendored
37
docs/api/playlists.md
vendored
|
|
@ -11,7 +11,7 @@ Media playlists
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | List of playlists |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -31,7 +31,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Playlist created |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -46,13 +46,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Playlist ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------- |
|
||||
| 200 | Playlist details |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -67,7 +67,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Playlist ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -79,7 +79,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------- |
|
||||
| 200 | Playlist updated |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -95,13 +95,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Playlist ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------- |
|
||||
| 200 | Playlist deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -116,13 +116,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Playlist ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Playlist items |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -137,7 +137,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Playlist ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -149,7 +149,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | Item added |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -164,7 +164,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Playlist ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -176,7 +176,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Item reordered |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -191,14 +191,14 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---------- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Playlist ID |
|
||||
| `media_id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | Item removed |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -213,17 +213,16 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Playlist ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ----------------------- |
|
||||
| 200 | Shuffled playlist items |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
| 404 | Not found |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
29
docs/api/plugins.md
vendored
29
docs/api/plugins.md
vendored
|
|
@ -13,7 +13,7 @@ List all installed plugins
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | List of plugins |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -35,7 +35,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------- |
|
||||
| 200 | Plugin installed |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -59,7 +59,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Event received |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -74,7 +74,7 @@ List all UI pages provided by loaded plugins
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------- |
|
||||
| 200 | Plugin UI pages |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -89,7 +89,7 @@ List merged CSS custom property overrides from all enabled plugins
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------------------- |
|
||||
| 200 | Plugin UI theme extensions |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -104,7 +104,7 @@ List all UI widgets provided by loaded plugins
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ----------------- |
|
||||
| 200 | Plugin UI widgets |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -119,13 +119,13 @@ Get a specific plugin by ID
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Plugin ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Plugin details |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -141,13 +141,13 @@ Uninstall a plugin
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Plugin ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------ |
|
||||
| 200 | Plugin uninstalled |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -164,13 +164,13 @@ Reload a plugin (for development)
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Plugin ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------- |
|
||||
| 200 | Plugin reloaded |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -187,7 +187,7 @@ Enable or disable a plugin
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Plugin ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -199,11 +199,10 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Plugin toggled |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
| 404 | Not found |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
9
docs/api/saved_searches.md
vendored
9
docs/api/saved_searches.md
vendored
|
|
@ -11,7 +11,7 @@ Saved search queries
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------------- |
|
||||
| 200 | List of saved searches |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -31,7 +31,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Search saved |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -46,17 +46,16 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | --------------- |
|
||||
| `id` | path | Yes | Saved search ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Saved search deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
5
docs/api/scan.md
vendored
5
docs/api/scan.md
vendored
|
|
@ -19,7 +19,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Scan job submitted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -34,9 +34,8 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | Scan status |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
11
docs/api/scheduled_tasks.md
vendored
11
docs/api/scheduled_tasks.md
vendored
|
|
@ -11,7 +11,7 @@ Scheduled background tasks
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ----------------------- |
|
||||
| 200 | List of scheduled tasks |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -25,13 +25,13 @@ Scheduled background tasks
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Task ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Task triggered |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -46,17 +46,16 @@ Scheduled background tasks
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Task ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | Task toggled |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
| 404 | Not found |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
7
docs/api/search.md
vendored
7
docs/api/search.md
vendored
|
|
@ -11,7 +11,7 @@ Full-text media search
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ----------------- |
|
||||
| `q` | query | Yes | Search query |
|
||||
| `sort` | query | No | Sort order |
|
||||
| `offset` | query | No | Pagination offset |
|
||||
|
|
@ -20,7 +20,7 @@ Full-text media search
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Search results |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -41,11 +41,10 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Search results |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
77
docs/api/shares.md
vendored
77
docs/api/shares.md
vendored
|
|
@ -6,15 +6,14 @@ Media sharing and notifications
|
|||
|
||||
### GET /api/v1/notifications/shares
|
||||
|
||||
Get unread share notifications
|
||||
GET /api/notifications/shares
|
||||
Get unread share notifications GET /api/notifications/shares
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------------- |
|
||||
| 200 | Unread notifications |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -22,15 +21,14 @@ GET /api/notifications/shares
|
|||
|
||||
### POST /api/v1/notifications/shares/read-all
|
||||
|
||||
Mark all notifications as read
|
||||
POST /api/notifications/shares/read-all
|
||||
Mark all notifications as read POST /api/notifications/shares/read-all
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------------------------- |
|
||||
| 200 | All notifications marked as read |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -38,21 +36,20 @@ POST /api/notifications/shares/read-all
|
|||
|
||||
### POST /api/v1/notifications/shares/{id}/read
|
||||
|
||||
Mark a notification as read
|
||||
POST /api/notifications/shares/{id}/read
|
||||
Mark a notification as read POST /api/notifications/shares/{id}/read
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | --------------- |
|
||||
| `id` | path | Yes | Notification ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------------- |
|
||||
| 200 | Notification marked as read |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -60,22 +57,21 @@ POST /api/notifications/shares/{id}/read
|
|||
|
||||
### GET /api/v1/shared/{token}
|
||||
|
||||
Access a public shared resource
|
||||
GET /api/shared/{token}
|
||||
Access a public shared resource GET /api/shared/{token}
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---------- | ----- | -------- | -------------------------- |
|
||||
| `token` | path | Yes | Share token |
|
||||
| `password` | query | No | Share password if required |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Shared content |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -84,8 +80,7 @@ GET /api/shared/{token}
|
|||
|
||||
### POST /api/v1/shares
|
||||
|
||||
Create a new share
|
||||
POST /api/shares
|
||||
Create a new share POST /api/shares
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
|
|
@ -98,7 +93,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Share created |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -108,8 +103,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
|
||||
### POST /api/v1/shares/batch/delete
|
||||
|
||||
Batch delete shares
|
||||
POST /api/shares/batch/delete
|
||||
Batch delete shares POST /api/shares/batch/delete
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
|
|
@ -122,7 +116,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Shares deleted |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -132,22 +126,21 @@ See `docs/api/openapi.json` for the full schema.
|
|||
|
||||
### GET /api/v1/shares/incoming
|
||||
|
||||
List incoming shares (shares shared with me)
|
||||
GET /api/shares/incoming
|
||||
List incoming shares (shares shared with me) GET /api/shares/incoming
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ----------------- |
|
||||
| `offset` | query | No | Pagination offset |
|
||||
| `limit` | query | No | Pagination limit |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------- |
|
||||
| 200 | Incoming shares |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -155,22 +148,21 @@ GET /api/shares/incoming
|
|||
|
||||
### GET /api/v1/shares/outgoing
|
||||
|
||||
List outgoing shares (shares I created)
|
||||
GET /api/shares/outgoing
|
||||
List outgoing shares (shares I created) GET /api/shares/outgoing
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ----------------- |
|
||||
| `offset` | query | No | Pagination offset |
|
||||
| `limit` | query | No | Pagination limit |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------- |
|
||||
| 200 | Outgoing shares |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -178,21 +170,20 @@ GET /api/shares/outgoing
|
|||
|
||||
### GET /api/v1/shares/{id}
|
||||
|
||||
Get share details
|
||||
GET /api/shares/{id}
|
||||
Get share details GET /api/shares/{id}
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Share ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------- |
|
||||
| 200 | Share details |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -202,15 +193,14 @@ GET /api/shares/{id}
|
|||
|
||||
### PATCH /api/v1/shares/{id}
|
||||
|
||||
Update a share
|
||||
PATCH /api/shares/{id}
|
||||
Update a share PATCH /api/shares/{id}
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Share ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -222,7 +212,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------- |
|
||||
| 200 | Share updated |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -232,21 +222,20 @@ See `docs/api/openapi.json` for the full schema.
|
|||
|
||||
### DELETE /api/v1/shares/{id}
|
||||
|
||||
Delete (revoke) a share
|
||||
DELETE /api/shares/{id}
|
||||
Delete (revoke) a share DELETE /api/shares/{id}
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Share ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------- |
|
||||
| 204 | Share deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -256,15 +245,14 @@ DELETE /api/shares/{id}
|
|||
|
||||
### GET /api/v1/shares/{id}/activity
|
||||
|
||||
Get share activity log
|
||||
GET /api/shares/{id}/activity
|
||||
Get share activity log GET /api/shares/{id}/activity
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ----------------- |
|
||||
| `id` | path | Yes | Share ID |
|
||||
| `offset` | query | No | Pagination offset |
|
||||
| `limit` | query | No | Pagination limit |
|
||||
|
|
@ -272,11 +260,10 @@ GET /api/shares/{id}/activity
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Share activity |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
| 404 | Not found |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
31
docs/api/social.md
vendored
31
docs/api/social.md
vendored
|
|
@ -11,7 +11,7 @@ Ratings, comments, favorites, and share links
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | User favorites |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -31,7 +31,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Added to favorites |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -45,13 +45,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---------- | ---- | -------- | ------------- |
|
||||
| `media_id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------------- |
|
||||
| 200 | Removed from favorites |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -71,7 +71,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Share link created |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -86,13 +86,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media comments |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -106,7 +106,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -118,7 +118,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Comment added |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -133,7 +133,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -145,7 +145,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Rating saved |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -160,13 +160,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media ratings |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -180,17 +180,16 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---------- | ----- | -------- | -------------- |
|
||||
| `token` | path | Yes | Share token |
|
||||
| `password` | query | No | Share password |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | Shared media |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
3
docs/api/statistics.md
vendored
3
docs/api/statistics.md
vendored
|
|
@ -11,10 +11,9 @@ Library statistics
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Library statistics |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
21
docs/api/streaming.md
vendored
21
docs/api/streaming.md
vendored
|
|
@ -11,13 +11,13 @@ HLS and DASH adaptive streaming
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------- |
|
||||
| 200 | DASH manifest |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -32,7 +32,7 @@ HLS and DASH adaptive streaming
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| --------- | ---- | -------- | ---------------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
| `profile` | path | Yes | Transcode profile name |
|
||||
| `segment` | path | Yes | Segment filename |
|
||||
|
|
@ -40,7 +40,7 @@ HLS and DASH adaptive streaming
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------------- |
|
||||
| 200 | DASH segment data |
|
||||
| 202 | Segment not yet available |
|
||||
| 400 | Bad request |
|
||||
|
|
@ -55,13 +55,13 @@ HLS and DASH adaptive streaming
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------- |
|
||||
| 200 | HLS master playlist |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -75,14 +75,14 @@ HLS and DASH adaptive streaming
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| --------- | ---- | -------- | ---------------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
| `profile` | path | Yes | Transcode profile name |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------------- |
|
||||
| 200 | HLS variant playlist |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -97,7 +97,7 @@ HLS and DASH adaptive streaming
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| --------- | ---- | -------- | ---------------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
| `profile` | path | Yes | Transcode profile name |
|
||||
| `segment` | path | Yes | Segment filename |
|
||||
|
|
@ -105,11 +105,10 @@ HLS and DASH adaptive streaming
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------------- |
|
||||
| 200 | HLS segment data |
|
||||
| 202 | Segment not yet available |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
21
docs/api/subtitles.md
vendored
21
docs/api/subtitles.md
vendored
|
|
@ -11,13 +11,13 @@ Media subtitle management
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | Subtitles |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -31,7 +31,7 @@ Media subtitle management
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -43,7 +43,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Subtitle added |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -58,14 +58,14 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ------------- | ---- | -------- | ------------- |
|
||||
| `media_id` | path | Yes | Media item ID |
|
||||
| `subtitle_id` | path | Yes | Subtitle ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------- |
|
||||
| 200 | Subtitle content |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -79,13 +79,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Subtitle ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------- |
|
||||
| 200 | Subtitle deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -99,7 +99,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Subtitle ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -111,10 +111,9 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Offset updated |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
111
docs/api/sync.md
vendored
111
docs/api/sync.md
vendored
|
|
@ -6,8 +6,7 @@ Multi-device library synchronization
|
|||
|
||||
### POST /api/v1/sync/ack
|
||||
|
||||
Acknowledge processed changes
|
||||
POST /api/sync/ack
|
||||
Acknowledge processed changes POST /api/sync/ack
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
|
|
@ -20,7 +19,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------------- |
|
||||
| 200 | Changes acknowledged |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -29,22 +28,21 @@ See `docs/api/openapi.json` for the full schema.
|
|||
|
||||
### GET /api/v1/sync/changes
|
||||
|
||||
Get changes since cursor
|
||||
GET /api/sync/changes
|
||||
Get changes since cursor GET /api/sync/changes
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| -------- | ----- | -------- | ---------------------- |
|
||||
| `cursor` | query | No | Sync cursor |
|
||||
| `limit` | query | No | Max changes (max 1000) |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------------- |
|
||||
| 200 | Changes since cursor |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -53,15 +51,14 @@ GET /api/sync/changes
|
|||
|
||||
### GET /api/v1/sync/conflicts
|
||||
|
||||
List unresolved conflicts
|
||||
GET /api/sync/conflicts
|
||||
List unresolved conflicts GET /api/sync/conflicts
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------------- |
|
||||
| 200 | Unresolved conflicts |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -69,15 +66,14 @@ GET /api/sync/conflicts
|
|||
|
||||
### POST /api/v1/sync/conflicts/{id}/resolve
|
||||
|
||||
Resolve a sync conflict
|
||||
POST /api/sync/conflicts/{id}/resolve
|
||||
Resolve a sync conflict POST /api/sync/conflicts/{id}/resolve
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Conflict ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -89,7 +85,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ----------------- |
|
||||
| 200 | Conflict resolved |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -98,15 +94,14 @@ See `docs/api/openapi.json` for the full schema.
|
|||
|
||||
### GET /api/v1/sync/devices
|
||||
|
||||
List user's sync devices
|
||||
GET /api/sync/devices
|
||||
List user's sync devices GET /api/sync/devices
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------- |
|
||||
| 200 | List of devices |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -114,8 +109,7 @@ GET /api/sync/devices
|
|||
|
||||
### POST /api/v1/sync/devices
|
||||
|
||||
Register a new sync device
|
||||
POST /api/sync/devices
|
||||
Register a new sync device POST /api/sync/devices
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
|
|
@ -128,7 +122,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Device registered |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -138,21 +132,20 @@ See `docs/api/openapi.json` for the full schema.
|
|||
|
||||
### GET /api/v1/sync/devices/{id}
|
||||
|
||||
Get device details
|
||||
GET /api/sync/devices/{id}
|
||||
Get device details GET /api/sync/devices/{id}
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Device ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Device details |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -162,15 +155,14 @@ GET /api/sync/devices/{id}
|
|||
|
||||
### PUT /api/v1/sync/devices/{id}
|
||||
|
||||
Update a device
|
||||
PUT /api/sync/devices/{id}
|
||||
Update a device PUT /api/sync/devices/{id}
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Device ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -182,7 +174,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Device updated |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -192,21 +184,20 @@ See `docs/api/openapi.json` for the full schema.
|
|||
|
||||
### DELETE /api/v1/sync/devices/{id}
|
||||
|
||||
Delete a device
|
||||
DELETE /api/sync/devices/{id}
|
||||
Delete a device DELETE /api/sync/devices/{id}
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Device ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 204 | Device deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -216,21 +207,20 @@ DELETE /api/sync/devices/{id}
|
|||
|
||||
### POST /api/v1/sync/devices/{id}/token
|
||||
|
||||
Regenerate device token
|
||||
POST /api/sync/devices/{id}/token
|
||||
Regenerate device token POST /api/sync/devices/{id}/token
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Device ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ----------------- |
|
||||
| 200 | Token regenerated |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -240,21 +230,20 @@ POST /api/sync/devices/{id}/token
|
|||
|
||||
### GET /api/v1/sync/download/{path}
|
||||
|
||||
Download a file for sync (supports Range header)
|
||||
GET /api/sync/download/{*path}
|
||||
Download a file for sync (supports Range header) GET /api/sync/download/{*path}
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ------ | ---- | -------- | ----------- |
|
||||
| `path` | path | Yes | File path |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------- |
|
||||
| 200 | File content |
|
||||
| 206 | Partial content |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -264,8 +253,7 @@ GET /api/sync/download/{*path}
|
|||
|
||||
### POST /api/v1/sync/report
|
||||
|
||||
Report local changes from client
|
||||
POST /api/sync/report
|
||||
Report local changes from client POST /api/sync/report
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
|
|
@ -278,7 +266,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ----------------- |
|
||||
| 200 | Changes processed |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -287,8 +275,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
|
||||
### POST /api/v1/sync/upload
|
||||
|
||||
Create an upload session for chunked upload
|
||||
POST /api/sync/upload
|
||||
Create an upload session for chunked upload POST /api/sync/upload
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
|
|
@ -301,7 +288,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------------- |
|
||||
| 200 | Upload session created |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -310,21 +297,20 @@ See `docs/api/openapi.json` for the full schema.
|
|||
|
||||
### GET /api/v1/sync/upload/{id}
|
||||
|
||||
Get upload session status
|
||||
GET /api/sync/upload/{id}
|
||||
Get upload session status GET /api/sync/upload/{id}
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------------- |
|
||||
| `id` | path | Yes | Upload session ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Upload session status |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -333,21 +319,20 @@ GET /api/sync/upload/{id}
|
|||
|
||||
### DELETE /api/v1/sync/upload/{id}
|
||||
|
||||
Cancel an upload session
|
||||
DELETE /api/sync/upload/{id}
|
||||
Cancel an upload session DELETE /api/sync/upload/{id}
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------------- |
|
||||
| `id` | path | Yes | Upload session ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------- |
|
||||
| 204 | Upload cancelled |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -356,29 +341,27 @@ DELETE /api/sync/upload/{id}
|
|||
|
||||
### PUT /api/v1/sync/upload/{id}/chunks/{index}
|
||||
|
||||
Upload a chunk
|
||||
PUT /api/sync/upload/{id}/chunks/{index}
|
||||
Upload a chunk PUT /api/sync/upload/{id}/chunks/{index}
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ------- | ---- | -------- | ----------------- |
|
||||
| `id` | path | Yes | Upload session ID |
|
||||
| `index` | path | Yes | Chunk index |
|
||||
|
||||
#### Request Body
|
||||
|
||||
Chunk binary data
|
||||
`Content-Type: application/octet-stream`
|
||||
Chunk binary data `Content-Type: application/octet-stream`
|
||||
|
||||
See `docs/api/openapi.json` for the full schema.
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Chunk received |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -388,25 +371,23 @@ See `docs/api/openapi.json` for the full schema.
|
|||
|
||||
### POST /api/v1/sync/upload/{id}/complete
|
||||
|
||||
Complete an upload session
|
||||
POST /api/sync/upload/{id}/complete
|
||||
Complete an upload session POST /api/sync/upload/{id}/complete
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------------- |
|
||||
| `id` | path | Yes | Upload session ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ---------------- |
|
||||
| 200 | Upload completed |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
25
docs/api/tags.md
vendored
25
docs/api/tags.md
vendored
|
|
@ -11,13 +11,13 @@ Media tag management
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---------- | ---- | -------- | ------------- |
|
||||
| `media_id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Media tags |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -32,7 +32,7 @@ Media tag management
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---------- | ---- | -------- | ------------- |
|
||||
| `media_id` | path | Yes | Media item ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -44,7 +44,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Tag applied |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -60,14 +60,14 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---------- | ---- | -------- | ------------- |
|
||||
| `media_id` | path | Yes | Media item ID |
|
||||
| `tag_id` | path | Yes | Tag ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Tag removed |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -83,7 +83,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | List of tags |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -103,7 +103,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Tag created |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -119,13 +119,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Tag ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Tag |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -140,13 +140,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | Tag ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | Tag deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -154,4 +154,3 @@ See `docs/api/openapi.json` for the full schema.
|
|||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
15
docs/api/transcode.md
vendored
15
docs/api/transcode.md
vendored
|
|
@ -11,7 +11,7 @@ Video transcoding sessions
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -23,7 +23,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ----------------------- |
|
||||
| 200 | Transcode job submitted |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -38,7 +38,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------------------- |
|
||||
| 200 | List of transcode sessions |
|
||||
| 401 | Unauthorized |
|
||||
|
||||
|
|
@ -51,13 +51,13 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | -------------------- |
|
||||
| `id` | path | Yes | Transcode session ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------------------- |
|
||||
| 200 | Transcode session details |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
|
@ -71,16 +71,15 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | -------------------- |
|
||||
| `id` | path | Yes | Transcode session ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------------- |
|
||||
| 200 | Transcode session cancelled |
|
||||
| 401 | Unauthorized |
|
||||
| 404 | Not found |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
25
docs/api/upload.md
vendored
25
docs/api/upload.md
vendored
|
|
@ -6,15 +6,14 @@ File upload and managed storage
|
|||
|
||||
### GET /api/v1/managed/stats
|
||||
|
||||
Get managed storage statistics
|
||||
GET /api/managed/stats
|
||||
Get managed storage statistics GET /api/managed/stats
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------------------- |
|
||||
| 200 | Managed storage statistics |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
|
@ -23,21 +22,20 @@ GET /api/managed/stats
|
|||
|
||||
### GET /api/v1/media/{id}/download
|
||||
|
||||
Download a managed file
|
||||
GET /api/media/{id}/download
|
||||
Download a managed file GET /api/media/{id}/download
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | File content |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -47,21 +45,20 @@ GET /api/media/{id}/download
|
|||
|
||||
### POST /api/v1/media/{id}/move-to-managed
|
||||
|
||||
Migrate an external file to managed storage
|
||||
POST /api/media/{id}/move-to-managed
|
||||
Migrate an external file to managed storage POST /api/media/{id}/move-to-managed
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ------------- |
|
||||
| `id` | path | Yes | Media item ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 204 | File migrated |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -71,19 +68,17 @@ POST /api/media/{id}/move-to-managed
|
|||
|
||||
### POST /api/v1/upload
|
||||
|
||||
Upload a file to managed storage
|
||||
POST /api/upload
|
||||
Upload a file to managed storage POST /api/upload
|
||||
|
||||
**Authentication:** Required (Bearer JWT)
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | File uploaded |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
| 500 | Internal server error |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
29
docs/api/users.md
vendored
29
docs/api/users.md
vendored
|
|
@ -13,7 +13,7 @@ List all users (admin only)
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------- |
|
||||
| 200 | List of users |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -36,7 +36,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------- |
|
||||
| 200 | User created |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -54,13 +54,13 @@ Get a specific user by ID
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | User ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | User details |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -77,7 +77,7 @@ Update a user
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | User ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -90,7 +90,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | User updated |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -108,13 +108,13 @@ Delete a user (admin only)
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | User ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ------------ |
|
||||
| 200 | User deleted |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -131,13 +131,13 @@ Get user's accessible libraries
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | User ID |
|
||||
|
||||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | User libraries |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -153,7 +153,7 @@ Grant library access to a user (admin only)
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | User ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -165,7 +165,7 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Access granted |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
|
|
@ -185,7 +185,7 @@ slashes that conflict with URL routing.
|
|||
#### Parameters
|
||||
|
||||
| Name | In | Required | Description |
|
||||
|------|----|----------|-------------|
|
||||
| ---- | ---- | -------- | ----------- |
|
||||
| `id` | path | Yes | User ID |
|
||||
|
||||
#### Request Body
|
||||
|
|
@ -197,11 +197,10 @@ See `docs/api/openapi.json` for the full schema.
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | -------------- |
|
||||
| 200 | Access revoked |
|
||||
| 400 | Bad request |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
5
docs/api/webhooks.md
vendored
5
docs/api/webhooks.md
vendored
|
|
@ -11,7 +11,7 @@ Webhook configuration
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | --------------------------- |
|
||||
| 200 | List of configured webhooks |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
|
@ -25,10 +25,9 @@ Webhook configuration
|
|||
#### Responses
|
||||
|
||||
| Status | Description |
|
||||
|--------|-------------|
|
||||
| ------ | ----------------- |
|
||||
| 200 | Test webhook sent |
|
||||
| 401 | Unauthorized |
|
||||
| 403 | Forbidden |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -1,18 +1,23 @@
|
|||
# HEIF/HEIC Support Plugin
|
||||
|
||||
This example plugin adds support for HEIF (High Efficiency Image Format) and HEIC (HEIF Container) to Pinakes.
|
||||
This example plugin adds support for HEIF (High Efficiency Image Format) and
|
||||
HEIC (HEIF Container) to Pinakes.
|
||||
|
||||
## Overview
|
||||
|
||||
HEIF is a modern image format that provides better compression than JPEG while maintaining higher quality. This plugin enables Pinakes to:
|
||||
HEIF is a modern image format that provides better compression than JPEG while
|
||||
maintaining higher quality. This plugin enables Pinakes to:
|
||||
|
||||
- Recognize HEIF/HEIC files as a media type
|
||||
- Extract metadata from HEIF images
|
||||
- Generate thumbnails from HEIF images
|
||||
|
||||
## Features
|
||||
|
||||
- **Media Type Registration**: Registers `.heif`, `.heic`, `.hif` extensions as image media types
|
||||
- **EXIF Extraction**: Extracts EXIF metadata including camera info, GPS coordinates, timestamps
|
||||
- **Media Type Registration**: Registers `.heif`, `.heic`, `.hif` extensions as
|
||||
image media types
|
||||
- **EXIF Extraction**: Extracts EXIF metadata including camera info, GPS
|
||||
coordinates, timestamps
|
||||
- **Thumbnail Generation**: Generates thumbnails in JPEG, PNG, or WebP format
|
||||
- **Resource Limits**: Configurable memory and CPU limits for safe processing
|
||||
- **Large Image Support**: Handles images up to 8192x8192 pixels
|
||||
|
|
@ -95,6 +100,7 @@ impl ThumbnailGenerator for HeifPlugin {
|
|||
## Dependencies
|
||||
|
||||
The plugin uses the following Rust crates (compiled to WASM):
|
||||
|
||||
- `libheif-rs`: HEIF decoding and encoding
|
||||
- `image`: Image processing and thumbnail generation
|
||||
- `kamadak-exif`: EXIF metadata parsing
|
||||
|
|
@ -159,15 +165,19 @@ pinakes plugin install /path/to/heif-support
|
|||
The plugin can be configured through the `config` section in `plugin.toml`:
|
||||
|
||||
### EXIF Extraction
|
||||
|
||||
- `extract_exif`: Enable EXIF metadata extraction (default: true)
|
||||
|
||||
### Thumbnail Generation
|
||||
|
||||
- `generate_thumbnails`: Enable thumbnail generation (default: true)
|
||||
- `thumbnail_quality`: JPEG quality for thumbnails, 1-100 (default: 85)
|
||||
- `thumbnail_format`: Output format - "jpeg", "png", or "webp" (default: "jpeg")
|
||||
|
||||
### Resource Limits
|
||||
- `max_memory_mb`: Maximum memory the plugin can use in megabytes (default: 256, set in `[capabilities]`)
|
||||
|
||||
- `max_memory_mb`: Maximum memory the plugin can use in megabytes (default: 256,
|
||||
set in `[capabilities]`)
|
||||
- `max_width`: Maximum image width to process (default: 8192)
|
||||
- `max_height`: Maximum image height to process (default: 8192)
|
||||
|
||||
|
|
@ -188,6 +198,7 @@ The plugin can be configured through the `config` section in `plugin.toml`:
|
|||
### Sandboxing
|
||||
|
||||
The plugin runs in a WASM sandbox with:
|
||||
|
||||
- No access to host filesystem beyond granted paths
|
||||
- No network access
|
||||
- No arbitrary code execution
|
||||
|
|
@ -210,6 +221,7 @@ The plugin runs in a WASM sandbox with:
|
|||
## Error Handling
|
||||
|
||||
The plugin handles:
|
||||
|
||||
- **Corrupted Files**: Returns descriptive error
|
||||
- **Unsupported Variants**: Gracefully skips unsupported HEIF features
|
||||
- **Memory Limits**: Fails safely if image too large
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
# Markdown Metadata Extractor Plugin
|
||||
|
||||
This example plugin demonstrates how to create a metadata extractor plugin for Pinakes.
|
||||
This example plugin demonstrates how to create a metadata extractor plugin for
|
||||
Pinakes.
|
||||
|
||||
## Overview
|
||||
|
||||
The Markdown Metadata Extractor enhances Pinakes' built-in markdown support by:
|
||||
|
||||
- Parsing YAML and TOML frontmatter
|
||||
- Extracting metadata from frontmatter fields
|
||||
- Converting frontmatter tags to Pinakes media tags
|
||||
|
|
@ -12,8 +14,10 @@ The Markdown Metadata Extractor enhances Pinakes' built-in markdown support by:
|
|||
|
||||
## Features
|
||||
|
||||
- **Frontmatter Parsing**: Supports both YAML (`---`) and TOML (`+++`) frontmatter formats
|
||||
- **Tag Extraction**: Automatically extracts tags from frontmatter and applies them to media items
|
||||
- **Frontmatter Parsing**: Supports both YAML (`---`) and TOML (`+++`)
|
||||
frontmatter formats
|
||||
- **Tag Extraction**: Automatically extracts tags from frontmatter and applies
|
||||
them to media items
|
||||
- **Custom Fields**: Preserves all frontmatter fields as custom metadata
|
||||
- **Configuration**: Configurable via `plugin.toml` config section
|
||||
|
||||
|
|
@ -88,6 +92,7 @@ The plugin can be configured through the `config` section in `plugin.toml`:
|
|||
## Security
|
||||
|
||||
This plugin has minimal capabilities:
|
||||
|
||||
- **Filesystem**: No write access, read access only to files being processed
|
||||
- **Network**: Disabled
|
||||
- **Environment**: No access
|
||||
|
|
|
|||
BIN
flake.lock
generated
BIN
flake.lock
generated
Binary file not shown.
33
flake.nix
33
flake.nix
|
|
@ -21,5 +21,38 @@
|
|||
in {
|
||||
default = pkgs.callPackage ./nix/shell.nix {};
|
||||
});
|
||||
|
||||
formatter = forEachSystem (system: let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
in
|
||||
pkgs.writeShellApplication {
|
||||
name = "nix3-fmt-wrapper";
|
||||
|
||||
runtimeInputs = [
|
||||
pkgs.alejandra
|
||||
pkgs.fd
|
||||
pkgs.prettier
|
||||
pkgs.deno
|
||||
pkgs.taplo
|
||||
pkgs.sql-formatter
|
||||
];
|
||||
|
||||
text = ''
|
||||
# Format Nix with Alejandra
|
||||
fd "$@" -t f -e nix -x alejandra -q '{}'
|
||||
|
||||
# Format TOML with Taplo
|
||||
fd "$@" -t f -e toml -x taplo fmt '{}'
|
||||
|
||||
# Format CSS with Prettier
|
||||
fd "$@" -t f -e css -x prettier --write '{}'
|
||||
|
||||
# Format SQL with sql-format
|
||||
fd "$@" -t f -e sql -x sql-formatter --fix '{}' -l postgresql
|
||||
|
||||
# Format Markdown with Deno
|
||||
fd "$@" -t f -e md -x deno fmt -q '{}'
|
||||
'';
|
||||
});
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
-- Add file_mtime column to media_items table for incremental scanning
|
||||
-- Stores Unix timestamp in seconds of the file's modification time
|
||||
|
||||
ALTER TABLE media_items ADD COLUMN file_mtime BIGINT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN file_mtime BIGINT;
|
||||
|
||||
-- Create index for quick mtime lookups
|
||||
CREATE INDEX IF NOT EXISTS idx_media_items_file_mtime ON media_items (file_mtime);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
-- Session persistence for database-backed sessions
|
||||
-- Replaces in-memory session storage
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sessions (
|
||||
session_token TEXT PRIMARY KEY NOT NULL,
|
||||
user_id TEXT,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
-- V12: Book Management Schema (PostgreSQL)
|
||||
-- Adds comprehensive book metadata tracking, authors, and identifiers
|
||||
|
||||
-- Book metadata (supplements media_items for EPUB/PDF/MOBI)
|
||||
CREATE TABLE book_metadata (
|
||||
media_id UUID PRIMARY KEY REFERENCES media_items (id) ON DELETE CASCADE,
|
||||
|
|
@ -18,8 +17,11 @@ CREATE TABLE book_metadata (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_book_isbn13 ON book_metadata (isbn13);
|
||||
|
||||
CREATE INDEX idx_book_series ON book_metadata (series_name, series_index);
|
||||
|
||||
CREATE INDEX idx_book_publisher ON book_metadata (publisher);
|
||||
|
||||
CREATE INDEX idx_book_language ON book_metadata (language);
|
||||
|
||||
-- Multiple authors per book (many-to-many)
|
||||
|
|
@ -33,6 +35,7 @@ CREATE TABLE book_authors (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_book_authors_name ON book_authors (author_name);
|
||||
|
||||
CREATE INDEX idx_book_authors_sort ON book_authors (author_sort);
|
||||
|
||||
-- Multiple identifiers (ISBN variants, ASIN, DOI, etc.)
|
||||
|
|
@ -46,15 +49,13 @@ CREATE TABLE book_identifiers (
|
|||
CREATE INDEX idx_book_identifiers ON book_identifiers (identifier_type, identifier_value);
|
||||
|
||||
-- Trigger to update updated_at on book_metadata changes
|
||||
CREATE OR REPLACE FUNCTION update_book_metadata_timestamp()
|
||||
RETURNS TRIGGER AS $$
|
||||
CREATE OR REPLACE FUNCTION update_book_metadata_timestamp () RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER update_book_metadata_timestamp
|
||||
BEFORE UPDATE ON book_metadata
|
||||
FOR EACH ROW
|
||||
CREATE TRIGGER update_book_metadata_timestamp BEFORE
|
||||
UPDATE ON book_metadata FOR EACH ROW
|
||||
EXECUTE FUNCTION update_book_metadata_timestamp ();
|
||||
|
|
|
|||
|
|
@ -1,15 +1,40 @@
|
|||
-- V13: Enhanced photo metadata support
|
||||
-- Add photo-specific fields to media_items table
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN date_taken TIMESTAMPTZ;
|
||||
|
||||
ALTER TABLE media_items ADD COLUMN date_taken TIMESTAMPTZ;
|
||||
ALTER TABLE media_items ADD COLUMN latitude DOUBLE PRECISION;
|
||||
ALTER TABLE media_items ADD COLUMN longitude DOUBLE PRECISION;
|
||||
ALTER TABLE media_items ADD COLUMN camera_make TEXT;
|
||||
ALTER TABLE media_items ADD COLUMN camera_model TEXT;
|
||||
ALTER TABLE media_items ADD COLUMN rating INTEGER CHECK (rating >= 0 AND rating <= 5);
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN latitude DOUBLE PRECISION;
|
||||
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN longitude DOUBLE PRECISION;
|
||||
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN camera_make TEXT;
|
||||
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN camera_model TEXT;
|
||||
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN rating INTEGER CHECK (
|
||||
rating >= 0
|
||||
AND rating <= 5
|
||||
);
|
||||
|
||||
-- Indexes for photo queries
|
||||
CREATE INDEX idx_media_date_taken ON media_items(date_taken) WHERE date_taken IS NOT NULL;
|
||||
CREATE INDEX idx_media_location ON media_items(latitude, longitude) WHERE latitude IS NOT NULL AND longitude IS NOT NULL;
|
||||
CREATE INDEX idx_media_camera ON media_items(camera_make) WHERE camera_make IS NOT NULL;
|
||||
CREATE INDEX idx_media_rating ON media_items(rating) WHERE rating IS NOT NULL;
|
||||
CREATE INDEX idx_media_date_taken ON media_items (date_taken)
|
||||
WHERE
|
||||
date_taken IS NOT NULL;
|
||||
|
||||
CREATE INDEX idx_media_location ON media_items (latitude, longitude)
|
||||
WHERE
|
||||
latitude IS NOT NULL
|
||||
AND longitude IS NOT NULL;
|
||||
|
||||
CREATE INDEX idx_media_camera ON media_items (camera_make)
|
||||
WHERE
|
||||
camera_make IS NOT NULL;
|
||||
|
||||
CREATE INDEX idx_media_rating ON media_items (rating)
|
||||
WHERE
|
||||
rating IS NOT NULL;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
-- V14: Perceptual hash for duplicate detection
|
||||
-- Add perceptual hash column for image similarity detection
|
||||
|
||||
ALTER TABLE media_items ADD COLUMN perceptual_hash TEXT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN perceptual_hash TEXT;
|
||||
|
||||
-- Index for perceptual hash lookups
|
||||
CREATE INDEX idx_media_phash ON media_items(perceptual_hash) WHERE perceptual_hash IS NOT NULL;
|
||||
CREATE INDEX idx_media_phash ON media_items (perceptual_hash)
|
||||
WHERE
|
||||
perceptual_hash IS NOT NULL;
|
||||
|
|
|
|||
|
|
@ -1,17 +1,20 @@
|
|||
-- V15: Managed File Storage
|
||||
-- Adds server-side content-addressable storage for uploaded files
|
||||
|
||||
-- Add storage mode to media_items (external = file on disk, managed = in content-addressable storage)
|
||||
ALTER TABLE media_items ADD COLUMN storage_mode TEXT NOT NULL DEFAULT 'external';
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN storage_mode TEXT NOT NULL DEFAULT 'external';
|
||||
|
||||
-- Original filename for managed uploads (preserved separately from file_name which may be normalized)
|
||||
ALTER TABLE media_items ADD COLUMN original_filename TEXT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN original_filename TEXT;
|
||||
|
||||
-- When the file was uploaded to managed storage
|
||||
ALTER TABLE media_items ADD COLUMN uploaded_at TIMESTAMPTZ;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN uploaded_at TIMESTAMPTZ;
|
||||
|
||||
-- Storage key for looking up the blob (usually same as content_hash for deduplication)
|
||||
ALTER TABLE media_items ADD COLUMN storage_key TEXT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN storage_key TEXT;
|
||||
|
||||
-- Managed blobs table - tracks deduplicated file storage
|
||||
CREATE TABLE managed_blobs (
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
-- V16: Cross-Device Sync System
|
||||
-- Adds device registration, change tracking, and chunked upload support
|
||||
|
||||
-- Sync devices table
|
||||
CREATE TABLE sync_devices (
|
||||
id TEXT PRIMARY KEY NOT NULL,
|
||||
|
|
@ -19,6 +18,7 @@ CREATE TABLE sync_devices (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_sync_devices_user ON sync_devices (user_id);
|
||||
|
||||
CREATE INDEX idx_sync_devices_token ON sync_devices (device_token_hash);
|
||||
|
||||
-- Sync log table - tracks all changes for sync
|
||||
|
|
@ -36,7 +36,9 @@ CREATE TABLE sync_log (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_sync_log_sequence ON sync_log (sequence);
|
||||
|
||||
CREATE INDEX idx_sync_log_path ON sync_log (path);
|
||||
|
||||
CREATE INDEX idx_sync_log_timestamp ON sync_log (timestamp);
|
||||
|
||||
-- Sequence counter for sync log
|
||||
|
|
@ -44,7 +46,11 @@ CREATE TABLE sync_sequence (
|
|||
id INTEGER PRIMARY KEY CHECK (id = 1),
|
||||
current_value BIGINT NOT NULL DEFAULT 0
|
||||
);
|
||||
INSERT INTO sync_sequence (id, current_value) VALUES (1, 0);
|
||||
|
||||
INSERT INTO
|
||||
sync_sequence (id, current_value)
|
||||
VALUES
|
||||
(1, 0);
|
||||
|
||||
-- Device sync state - tracks sync status per device per file
|
||||
CREATE TABLE device_sync_state (
|
||||
|
|
@ -78,14 +84,17 @@ CREATE TABLE upload_sessions (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_upload_sessions_device ON upload_sessions (device_id);
|
||||
|
||||
CREATE INDEX idx_upload_sessions_status ON upload_sessions (status);
|
||||
|
||||
CREATE INDEX idx_upload_sessions_expires ON upload_sessions (expires_at);
|
||||
|
||||
-- Upload chunks - tracks received chunks
|
||||
CREATE TABLE upload_chunks (
|
||||
upload_id TEXT NOT NULL REFERENCES upload_sessions (id) ON DELETE CASCADE,
|
||||
chunk_index BIGINT NOT NULL,
|
||||
offset BIGINT NOT NULL,
|
||||
offset
|
||||
BIGINT NOT NULL,
|
||||
size BIGINT NOT NULL,
|
||||
hash TEXT NOT NULL,
|
||||
received_at TIMESTAMPTZ NOT NULL,
|
||||
|
|
@ -107,4 +116,7 @@ CREATE TABLE sync_conflicts (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_sync_conflicts_device ON sync_conflicts (device_id);
|
||||
CREATE INDEX idx_sync_conflicts_unresolved ON sync_conflicts(device_id) WHERE resolved_at IS NULL;
|
||||
|
||||
CREATE INDEX idx_sync_conflicts_unresolved ON sync_conflicts (device_id)
|
||||
WHERE
|
||||
resolved_at IS NULL;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,16 @@
|
|||
-- V17: Enhanced Sharing System
|
||||
-- Replaces simple share_links with comprehensive sharing capabilities
|
||||
|
||||
-- Enhanced shares table
|
||||
CREATE TABLE shares (
|
||||
id TEXT PRIMARY KEY NOT NULL,
|
||||
target_type TEXT NOT NULL CHECK (target_type IN ('media', 'collection', 'tag', 'saved_search')),
|
||||
target_type TEXT NOT NULL CHECK (
|
||||
target_type IN ('media', 'collection', 'tag', 'saved_search')
|
||||
),
|
||||
target_id TEXT NOT NULL,
|
||||
owner_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
||||
recipient_type TEXT NOT NULL CHECK (recipient_type IN ('public_link', 'user', 'group', 'federated')),
|
||||
recipient_type TEXT NOT NULL CHECK (
|
||||
recipient_type IN ('public_link', 'user', 'group', 'federated')
|
||||
),
|
||||
recipient_user_id TEXT REFERENCES users (id) ON DELETE CASCADE,
|
||||
recipient_group_id TEXT,
|
||||
recipient_federated_handle TEXT,
|
||||
|
|
@ -28,13 +31,23 @@ CREATE TABLE shares (
|
|||
parent_share_id TEXT REFERENCES shares (id) ON DELETE CASCADE,
|
||||
created_at TIMESTAMPTZ NOT NULL,
|
||||
updated_at TIMESTAMPTZ NOT NULL,
|
||||
UNIQUE(owner_id, target_type, target_id, recipient_type, recipient_user_id)
|
||||
UNIQUE (
|
||||
owner_id,
|
||||
target_type,
|
||||
target_id,
|
||||
recipient_type,
|
||||
recipient_user_id
|
||||
)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_shares_owner ON shares (owner_id);
|
||||
|
||||
CREATE INDEX idx_shares_recipient_user ON shares (recipient_user_id);
|
||||
|
||||
CREATE INDEX idx_shares_target ON shares (target_type, target_id);
|
||||
|
||||
CREATE INDEX idx_shares_token ON shares (public_token);
|
||||
|
||||
CREATE INDEX idx_shares_expires ON shares (expires_at);
|
||||
|
||||
-- Share activity log
|
||||
|
|
@ -49,6 +62,7 @@ CREATE TABLE share_activity (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_share_activity_share ON share_activity (share_id);
|
||||
|
||||
CREATE INDEX idx_share_activity_timestamp ON share_activity (timestamp);
|
||||
|
||||
-- Share notifications
|
||||
|
|
@ -62,7 +76,10 @@ CREATE TABLE share_notifications (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_share_notifications_user ON share_notifications (user_id);
|
||||
CREATE INDEX idx_share_notifications_unread ON share_notifications(user_id) WHERE is_read = FALSE;
|
||||
|
||||
CREATE INDEX idx_share_notifications_unread ON share_notifications (user_id)
|
||||
WHERE
|
||||
is_read = FALSE;
|
||||
|
||||
-- Migrate existing share_links to new shares table
|
||||
DO $$
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
-- V18: File Management (Rename, Move, Trash)
|
||||
-- Adds soft delete support for trash/recycle bin functionality
|
||||
|
||||
-- Add deleted_at column for soft delete (trash)
|
||||
ALTER TABLE media_items ADD COLUMN deleted_at TIMESTAMPTZ;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN deleted_at TIMESTAMPTZ;
|
||||
|
||||
-- Index for efficient trash queries
|
||||
CREATE INDEX idx_media_deleted_at ON media_items (deleted_at);
|
||||
|
||||
-- Partial index for listing non-deleted items (most common query pattern)
|
||||
CREATE INDEX idx_media_not_deleted ON media_items(id) WHERE deleted_at IS NULL;
|
||||
CREATE INDEX idx_media_not_deleted ON media_items (id)
|
||||
WHERE
|
||||
deleted_at IS NULL;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
-- V19: Markdown Links (Obsidian-style bidirectional links)
|
||||
-- Adds support for wikilinks, markdown links, embeds, and backlink tracking
|
||||
|
||||
-- Table for storing extracted markdown links
|
||||
CREATE TABLE IF NOT EXISTS markdown_links (
|
||||
id TEXT PRIMARY KEY NOT NULL,
|
||||
|
|
@ -29,7 +28,8 @@ CREATE INDEX idx_links_target_path ON markdown_links(target_path);
|
|||
CREATE INDEX idx_links_type ON markdown_links (link_type);
|
||||
|
||||
-- Track when links were last extracted from a media item
|
||||
ALTER TABLE media_items ADD COLUMN links_extracted_at TIMESTAMPTZ;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN links_extracted_at TIMESTAMPTZ;
|
||||
|
||||
-- Index for finding media items that need link extraction
|
||||
CREATE INDEX idx_media_links_extracted ON media_items (links_extracted_at);
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||
|
||||
CREATE EXTENSION IF NOT EXISTS pg_trgm;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS root_dirs (
|
||||
path TEXT PRIMARY KEY NOT NULL
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS root_dirs (path TEXT PRIMARY KEY NOT NULL);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS media_items (
|
||||
id UUID PRIMARY KEY NOT NULL,
|
||||
|
|
@ -30,7 +29,10 @@ CREATE TABLE IF NOT EXISTS tags (
|
|||
created_at TIMESTAMPTZ NOT NULL
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_tags_name_parent ON tags(name, COALESCE(parent_id, '00000000-0000-0000-0000-000000000000'));
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_tags_name_parent ON tags (
|
||||
name,
|
||||
COALESCE(parent_id, '00000000-0000-0000-0000-000000000000')
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS media_tags (
|
||||
media_id UUID NOT NULL REFERENCES media_items (id) ON DELETE CASCADE,
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
ALTER TABLE media_items ADD COLUMN IF NOT EXISTS search_vector tsvector
|
||||
GENERATED ALWAYS AS (
|
||||
setweight(to_tsvector('english', COALESCE(title, '')), 'A') ||
|
||||
setweight(to_tsvector('english', COALESCE(artist, '')), 'B') ||
|
||||
setweight(to_tsvector('english', COALESCE(album, '')), 'B') ||
|
||||
setweight(to_tsvector('english', COALESCE(genre, '')), 'C') ||
|
||||
setweight(to_tsvector('english', COALESCE(description, '')), 'C') ||
|
||||
setweight(to_tsvector('english', COALESCE(file_name, '')), 'D')
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN IF NOT EXISTS search_vector tsvector GENERATED ALWAYS AS (
|
||||
setweight(to_tsvector('english', COALESCE(title, '')), 'A') || setweight(to_tsvector('english', COALESCE(artist, '')), 'B') || setweight(to_tsvector('english', COALESCE(album, '')), 'B') || setweight(to_tsvector('english', COALESCE(genre, '')), 'C') || setweight(
|
||||
to_tsvector('english', COALESCE(description, '')),
|
||||
'C'
|
||||
) || setweight(
|
||||
to_tsvector('english', COALESCE(file_name, '')),
|
||||
'D'
|
||||
)
|
||||
) STORED;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_media_search ON media_items USING GIN (search_vector);
|
||||
|
|
|
|||
|
|
@ -1,8 +1,15 @@
|
|||
CREATE INDEX IF NOT EXISTS idx_audit_media_id ON audit_log (media_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit_log (timestamp);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_audit_action ON audit_log (action);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_media_content_hash ON media_items (content_hash);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_media_media_type ON media_items (media_type);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_media_created_at ON media_items (created_at);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_media_title_trgm ON media_items USING GIN (title gin_trgm_ops);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_media_artist_trgm ON media_items USING GIN (artist gin_trgm_ops);
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
ALTER TABLE media_items ADD COLUMN thumbnail_path TEXT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN thumbnail_path TEXT;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
-- Integrity tracking columns
|
||||
ALTER TABLE media_items ADD COLUMN last_verified_at TIMESTAMPTZ;
|
||||
ALTER TABLE media_items ADD COLUMN integrity_status TEXT DEFAULT 'unverified';
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN last_verified_at TIMESTAMPTZ;
|
||||
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN integrity_status TEXT DEFAULT 'unverified';
|
||||
|
||||
-- Saved searches
|
||||
CREATE TABLE IF NOT EXISTS saved_searches (
|
||||
|
|
|
|||
|
|
@ -12,4 +12,5 @@ CREATE TABLE plugin_registry (
|
|||
|
||||
-- Index for quick lookups
|
||||
CREATE INDEX idx_plugin_registry_enabled ON plugin_registry (enabled);
|
||||
|
||||
CREATE INDEX idx_plugin_registry_name ON plugin_registry (name);
|
||||
|
|
|
|||
|
|
@ -31,5 +31,7 @@ CREATE TABLE user_libraries (
|
|||
|
||||
-- Indexes for efficient lookups
|
||||
CREATE INDEX idx_users_username ON users (username);
|
||||
|
||||
CREATE INDEX idx_user_libraries_user_id ON user_libraries (user_id);
|
||||
|
||||
CREATE INDEX idx_user_libraries_root_path ON user_libraries (root_path);
|
||||
|
|
|
|||
|
|
@ -3,7 +3,10 @@ CREATE TABLE IF NOT EXISTS ratings (
|
|||
id UUID PRIMARY KEY,
|
||||
user_id UUID NOT NULL,
|
||||
media_id UUID NOT NULL REFERENCES media_items (id) ON DELETE CASCADE,
|
||||
stars INTEGER NOT NULL CHECK (stars >= 1 AND stars <= 5),
|
||||
stars INTEGER NOT NULL CHECK (
|
||||
stars >= 1
|
||||
AND stars <= 5
|
||||
),
|
||||
review_text TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE (user_id, media_id)
|
||||
|
|
@ -73,7 +76,9 @@ CREATE TABLE IF NOT EXISTS usage_events (
|
|||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_usage_events_media ON usage_events (media_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_usage_events_user ON usage_events (user_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_usage_events_timestamp ON usage_events (timestamp);
|
||||
|
||||
-- Watch history / progress
|
||||
|
|
|
|||
|
|
@ -1,16 +1,23 @@
|
|||
-- Drop redundant indexes (already covered by UNIQUE constraints)
|
||||
DROP INDEX IF EXISTS idx_users_username;
|
||||
|
||||
DROP INDEX IF EXISTS idx_user_libraries_user_id;
|
||||
|
||||
-- Add missing indexes for comments table
|
||||
CREATE INDEX IF NOT EXISTS idx_comments_media ON comments (media_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_comments_parent ON comments (parent_comment_id);
|
||||
|
||||
-- Remove duplicates before adding unique constraint
|
||||
DELETE FROM external_metadata e1
|
||||
WHERE EXISTS (
|
||||
SELECT 1 FROM external_metadata e2
|
||||
WHERE e1.media_id = e2.media_id
|
||||
WHERE
|
||||
EXISTS (
|
||||
SELECT
|
||||
1
|
||||
FROM
|
||||
external_metadata e2
|
||||
WHERE
|
||||
e1.media_id = e2.media_id
|
||||
AND e1.source = e2.source
|
||||
AND e1.ctid < e2.ctid
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
-- Add file_mtime column to media_items table for incremental scanning
|
||||
-- Stores Unix timestamp in seconds of the file's modification time
|
||||
|
||||
ALTER TABLE media_items ADD COLUMN file_mtime INTEGER;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN file_mtime INTEGER;
|
||||
|
||||
-- Create index for quick mtime lookups
|
||||
CREATE INDEX IF NOT EXISTS idx_media_items_file_mtime ON media_items (file_mtime);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
-- Session persistence for database-backed sessions
|
||||
-- Replaces in-memory session storage
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sessions (
|
||||
session_token TEXT PRIMARY KEY NOT NULL,
|
||||
user_id TEXT,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
-- V12: Book Management Schema
|
||||
-- Adds comprehensive book metadata tracking, authors, and identifiers
|
||||
|
||||
-- Book metadata (supplements media_items for EPUB/PDF/MOBI)
|
||||
CREATE TABLE book_metadata (
|
||||
media_id TEXT PRIMARY KEY REFERENCES media_items (id) ON DELETE CASCADE,
|
||||
|
|
@ -18,8 +17,11 @@ CREATE TABLE book_metadata (
|
|||
) STRICT;
|
||||
|
||||
CREATE INDEX idx_book_isbn13 ON book_metadata (isbn13);
|
||||
|
||||
CREATE INDEX idx_book_series ON book_metadata (series_name, series_index);
|
||||
|
||||
CREATE INDEX idx_book_publisher ON book_metadata (publisher);
|
||||
|
||||
CREATE INDEX idx_book_language ON book_metadata (language);
|
||||
|
||||
-- Multiple authors per book (many-to-many)
|
||||
|
|
@ -33,6 +35,7 @@ CREATE TABLE book_authors (
|
|||
) STRICT;
|
||||
|
||||
CREATE INDEX idx_book_authors_name ON book_authors (author_name);
|
||||
|
||||
CREATE INDEX idx_book_authors_sort ON book_authors (author_sort);
|
||||
|
||||
-- Multiple identifiers (ISBN variants, ASIN, DOI, etc.)
|
||||
|
|
@ -47,8 +50,13 @@ CREATE INDEX idx_book_identifiers ON book_identifiers(identifier_type, identifie
|
|||
|
||||
-- Trigger to update updated_at on book_metadata changes
|
||||
CREATE TRIGGER update_book_metadata_timestamp
|
||||
AFTER UPDATE ON book_metadata
|
||||
FOR EACH ROW
|
||||
AFTER
|
||||
UPDATE ON book_metadata FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE book_metadata SET updated_at = datetime('now') WHERE media_id = NEW.media_id;
|
||||
UPDATE book_metadata
|
||||
SET
|
||||
updated_at = datetime ('now')
|
||||
WHERE
|
||||
media_id = NEW.media_id;
|
||||
|
||||
END;
|
||||
|
|
|
|||
|
|
@ -1,15 +1,40 @@
|
|||
-- V13: Enhanced photo metadata support
|
||||
-- Add photo-specific fields to media_items table
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN date_taken TIMESTAMP;
|
||||
|
||||
ALTER TABLE media_items ADD COLUMN date_taken TIMESTAMP;
|
||||
ALTER TABLE media_items ADD COLUMN latitude REAL;
|
||||
ALTER TABLE media_items ADD COLUMN longitude REAL;
|
||||
ALTER TABLE media_items ADD COLUMN camera_make TEXT;
|
||||
ALTER TABLE media_items ADD COLUMN camera_model TEXT;
|
||||
ALTER TABLE media_items ADD COLUMN rating INTEGER CHECK (rating >= 0 AND rating <= 5);
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN latitude REAL;
|
||||
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN longitude REAL;
|
||||
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN camera_make TEXT;
|
||||
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN camera_model TEXT;
|
||||
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN rating INTEGER CHECK (
|
||||
rating >= 0
|
||||
AND rating <= 5
|
||||
);
|
||||
|
||||
-- Indexes for photo queries
|
||||
CREATE INDEX idx_media_date_taken ON media_items(date_taken) WHERE date_taken IS NOT NULL;
|
||||
CREATE INDEX idx_media_location ON media_items(latitude, longitude) WHERE latitude IS NOT NULL AND longitude IS NOT NULL;
|
||||
CREATE INDEX idx_media_camera ON media_items(camera_make) WHERE camera_make IS NOT NULL;
|
||||
CREATE INDEX idx_media_rating ON media_items(rating) WHERE rating IS NOT NULL;
|
||||
CREATE INDEX idx_media_date_taken ON media_items (date_taken)
|
||||
WHERE
|
||||
date_taken IS NOT NULL;
|
||||
|
||||
CREATE INDEX idx_media_location ON media_items (latitude, longitude)
|
||||
WHERE
|
||||
latitude IS NOT NULL
|
||||
AND longitude IS NOT NULL;
|
||||
|
||||
CREATE INDEX idx_media_camera ON media_items (camera_make)
|
||||
WHERE
|
||||
camera_make IS NOT NULL;
|
||||
|
||||
CREATE INDEX idx_media_rating ON media_items (rating)
|
||||
WHERE
|
||||
rating IS NOT NULL;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
-- V14: Perceptual hash for duplicate detection
|
||||
-- Add perceptual hash column for image similarity detection
|
||||
|
||||
ALTER TABLE media_items ADD COLUMN perceptual_hash TEXT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN perceptual_hash TEXT;
|
||||
|
||||
-- Index for perceptual hash lookups
|
||||
CREATE INDEX idx_media_phash ON media_items(perceptual_hash) WHERE perceptual_hash IS NOT NULL;
|
||||
CREATE INDEX idx_media_phash ON media_items (perceptual_hash)
|
||||
WHERE
|
||||
perceptual_hash IS NOT NULL;
|
||||
|
|
|
|||
|
|
@ -1,17 +1,20 @@
|
|||
-- V15: Managed File Storage
|
||||
-- Adds server-side content-addressable storage for uploaded files
|
||||
|
||||
-- Add storage mode to media_items (external = file on disk, managed = in content-addressable storage)
|
||||
ALTER TABLE media_items ADD COLUMN storage_mode TEXT NOT NULL DEFAULT 'external';
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN storage_mode TEXT NOT NULL DEFAULT 'external';
|
||||
|
||||
-- Original filename for managed uploads (preserved separately from file_name which may be normalized)
|
||||
ALTER TABLE media_items ADD COLUMN original_filename TEXT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN original_filename TEXT;
|
||||
|
||||
-- When the file was uploaded to managed storage
|
||||
ALTER TABLE media_items ADD COLUMN uploaded_at TEXT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN uploaded_at TEXT;
|
||||
|
||||
-- Storage key for looking up the blob (usually same as content_hash for deduplication)
|
||||
ALTER TABLE media_items ADD COLUMN storage_key TEXT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN storage_key TEXT;
|
||||
|
||||
-- Managed blobs table - tracks deduplicated file storage
|
||||
CREATE TABLE managed_blobs (
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
-- V16: Cross-Device Sync System
|
||||
-- Adds device registration, change tracking, and chunked upload support
|
||||
|
||||
-- Sync devices table
|
||||
CREATE TABLE sync_devices (
|
||||
id TEXT PRIMARY KEY NOT NULL,
|
||||
|
|
@ -20,6 +19,7 @@ CREATE TABLE sync_devices (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_sync_devices_user ON sync_devices (user_id);
|
||||
|
||||
CREATE INDEX idx_sync_devices_token ON sync_devices (device_token_hash);
|
||||
|
||||
-- Sync log table - tracks all changes for sync
|
||||
|
|
@ -39,7 +39,9 @@ CREATE TABLE sync_log (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_sync_log_sequence ON sync_log (sequence);
|
||||
|
||||
CREATE INDEX idx_sync_log_path ON sync_log (path);
|
||||
|
||||
CREATE INDEX idx_sync_log_timestamp ON sync_log (timestamp);
|
||||
|
||||
-- Sequence counter for sync log
|
||||
|
|
@ -47,7 +49,11 @@ CREATE TABLE sync_sequence (
|
|||
id INTEGER PRIMARY KEY CHECK (id = 1),
|
||||
current_value INTEGER NOT NULL DEFAULT 0
|
||||
);
|
||||
INSERT INTO sync_sequence (id, current_value) VALUES (1, 0);
|
||||
|
||||
INSERT INTO
|
||||
sync_sequence (id, current_value)
|
||||
VALUES
|
||||
(1, 0);
|
||||
|
||||
-- Device sync state - tracks sync status per device per file
|
||||
CREATE TABLE device_sync_state (
|
||||
|
|
@ -83,14 +89,17 @@ CREATE TABLE upload_sessions (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_upload_sessions_device ON upload_sessions (device_id);
|
||||
|
||||
CREATE INDEX idx_upload_sessions_status ON upload_sessions (status);
|
||||
|
||||
CREATE INDEX idx_upload_sessions_expires ON upload_sessions (expires_at);
|
||||
|
||||
-- Upload chunks - tracks received chunks
|
||||
CREATE TABLE upload_chunks (
|
||||
upload_id TEXT NOT NULL,
|
||||
chunk_index INTEGER NOT NULL,
|
||||
offset INTEGER NOT NULL,
|
||||
offset
|
||||
INTEGER NOT NULL,
|
||||
size INTEGER NOT NULL,
|
||||
hash TEXT NOT NULL,
|
||||
received_at TEXT NOT NULL,
|
||||
|
|
@ -114,4 +123,7 @@ CREATE TABLE sync_conflicts (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_sync_conflicts_device ON sync_conflicts (device_id);
|
||||
CREATE INDEX idx_sync_conflicts_unresolved ON sync_conflicts(device_id, resolved_at) WHERE resolved_at IS NULL;
|
||||
|
||||
CREATE INDEX idx_sync_conflicts_unresolved ON sync_conflicts (device_id, resolved_at)
|
||||
WHERE
|
||||
resolved_at IS NULL;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,16 @@
|
|||
-- V17: Enhanced Sharing System
|
||||
-- Replaces simple share_links with comprehensive sharing capabilities
|
||||
|
||||
-- Enhanced shares table
|
||||
CREATE TABLE shares (
|
||||
id TEXT PRIMARY KEY NOT NULL,
|
||||
target_type TEXT NOT NULL CHECK (target_type IN ('media', 'collection', 'tag', 'saved_search')),
|
||||
target_type TEXT NOT NULL CHECK (
|
||||
target_type IN ('media', 'collection', 'tag', 'saved_search')
|
||||
),
|
||||
target_id TEXT NOT NULL,
|
||||
owner_id TEXT NOT NULL,
|
||||
recipient_type TEXT NOT NULL CHECK (recipient_type IN ('public_link', 'user', 'group', 'federated')),
|
||||
recipient_type TEXT NOT NULL CHECK (
|
||||
recipient_type IN ('public_link', 'user', 'group', 'federated')
|
||||
),
|
||||
recipient_user_id TEXT,
|
||||
recipient_group_id TEXT,
|
||||
recipient_federated_handle TEXT,
|
||||
|
|
@ -31,13 +34,23 @@ CREATE TABLE shares (
|
|||
FOREIGN KEY (owner_id) REFERENCES users (id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (recipient_user_id) REFERENCES users (id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (parent_share_id) REFERENCES shares (id) ON DELETE CASCADE,
|
||||
UNIQUE(owner_id, target_type, target_id, recipient_type, recipient_user_id)
|
||||
UNIQUE (
|
||||
owner_id,
|
||||
target_type,
|
||||
target_id,
|
||||
recipient_type,
|
||||
recipient_user_id
|
||||
)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_shares_owner ON shares (owner_id);
|
||||
|
||||
CREATE INDEX idx_shares_recipient_user ON shares (recipient_user_id);
|
||||
|
||||
CREATE INDEX idx_shares_target ON shares (target_type, target_id);
|
||||
|
||||
CREATE INDEX idx_shares_token ON shares (public_token);
|
||||
|
||||
CREATE INDEX idx_shares_expires ON shares (expires_at);
|
||||
|
||||
-- Share activity log
|
||||
|
|
@ -54,6 +67,7 @@ CREATE TABLE share_activity (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_share_activity_share ON share_activity (share_id);
|
||||
|
||||
CREATE INDEX idx_share_activity_timestamp ON share_activity (timestamp);
|
||||
|
||||
-- Share notifications
|
||||
|
|
@ -69,17 +83,51 @@ CREATE TABLE share_notifications (
|
|||
);
|
||||
|
||||
CREATE INDEX idx_share_notifications_user ON share_notifications (user_id);
|
||||
CREATE INDEX idx_share_notifications_unread ON share_notifications(user_id, is_read) WHERE is_read = 0;
|
||||
|
||||
CREATE INDEX idx_share_notifications_unread ON share_notifications (user_id, is_read)
|
||||
WHERE
|
||||
is_read = 0;
|
||||
|
||||
-- Migrate existing share_links to new shares table (if share_links exists)
|
||||
INSERT OR IGNORE INTO shares (
|
||||
id, target_type, target_id, owner_id, recipient_type,
|
||||
public_token, public_password_hash, perm_view, perm_download,
|
||||
access_count, expires_at, created_at, updated_at
|
||||
INSERT
|
||||
OR IGNORE INTO shares (
|
||||
id,
|
||||
target_type,
|
||||
target_id,
|
||||
owner_id,
|
||||
recipient_type,
|
||||
public_token,
|
||||
public_password_hash,
|
||||
perm_view,
|
||||
perm_download,
|
||||
access_count,
|
||||
expires_at,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
SELECT
|
||||
id, 'media', media_id, created_by, 'public_link',
|
||||
token, password_hash, 1, 1,
|
||||
view_count, expires_at, created_at, created_at
|
||||
FROM share_links
|
||||
WHERE EXISTS (SELECT 1 FROM sqlite_master WHERE type='table' AND name='share_links');
|
||||
id,
|
||||
'media',
|
||||
media_id,
|
||||
created_by,
|
||||
'public_link',
|
||||
token,
|
||||
password_hash,
|
||||
1,
|
||||
1,
|
||||
view_count,
|
||||
expires_at,
|
||||
created_at,
|
||||
created_at
|
||||
FROM
|
||||
share_links
|
||||
WHERE
|
||||
EXISTS (
|
||||
SELECT
|
||||
1
|
||||
FROM
|
||||
sqlite_master
|
||||
WHERE
|
||||
type = 'table'
|
||||
AND name = 'share_links'
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
-- V18: File Management (Rename, Move, Trash)
|
||||
-- Adds soft delete support for trash/recycle bin functionality
|
||||
|
||||
-- Add deleted_at column for soft delete (trash)
|
||||
ALTER TABLE media_items ADD COLUMN deleted_at TEXT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN deleted_at TEXT;
|
||||
|
||||
-- Index for efficient trash queries
|
||||
CREATE INDEX idx_media_deleted_at ON media_items (deleted_at);
|
||||
|
||||
-- Index for listing non-deleted items (most common query pattern)
|
||||
CREATE INDEX idx_media_not_deleted ON media_items(id) WHERE deleted_at IS NULL;
|
||||
CREATE INDEX idx_media_not_deleted ON media_items (id)
|
||||
WHERE
|
||||
deleted_at IS NULL;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
-- V19: Markdown Links (Obsidian-style bidirectional links)
|
||||
-- Adds support for wikilinks, markdown links, embeds, and backlink tracking
|
||||
|
||||
-- Table for storing extracted markdown links
|
||||
CREATE TABLE IF NOT EXISTS markdown_links (
|
||||
id TEXT PRIMARY KEY NOT NULL,
|
||||
|
|
@ -29,7 +28,8 @@ CREATE INDEX idx_links_target_path ON markdown_links(target_path);
|
|||
CREATE INDEX idx_links_type ON markdown_links (link_type);
|
||||
|
||||
-- Track when links were last extracted from a media item
|
||||
ALTER TABLE media_items ADD COLUMN links_extracted_at TEXT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN links_extracted_at TEXT;
|
||||
|
||||
-- Index for finding media items that need link extraction
|
||||
CREATE INDEX idx_media_links_extracted ON media_items (links_extracted_at);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,4 @@
|
|||
CREATE TABLE IF NOT EXISTS root_dirs (
|
||||
path TEXT PRIMARY KEY NOT NULL
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS root_dirs (path TEXT PRIMARY KEY NOT NULL);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS media_items (
|
||||
id TEXT PRIMARY KEY NOT NULL,
|
||||
|
|
|
|||
|
|
@ -9,19 +9,106 @@ CREATE VIRTUAL TABLE IF NOT EXISTS media_fts USING fts5(
|
|||
content_rowid = 'rowid'
|
||||
);
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS media_fts_insert AFTER INSERT ON media_items BEGIN
|
||||
INSERT INTO media_fts(rowid, title, artist, album, genre, description, file_name)
|
||||
VALUES (new.rowid, new.title, new.artist, new.album, new.genre, new.description, new.file_name);
|
||||
CREATE TRIGGER IF NOT EXISTS media_fts_insert
|
||||
AFTER INSERT ON media_items
|
||||
BEGIN
|
||||
INSERT INTO
|
||||
media_fts (
|
||||
rowid,
|
||||
title,
|
||||
artist,
|
||||
album,
|
||||
genre,
|
||||
description,
|
||||
file_name
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
new.rowid,
|
||||
new.title,
|
||||
new.artist,
|
||||
new.album,
|
||||
new.genre,
|
||||
new.description,
|
||||
new.file_name
|
||||
);
|
||||
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS media_fts_update AFTER UPDATE ON media_items BEGIN
|
||||
INSERT INTO media_fts(media_fts, rowid, title, artist, album, genre, description, file_name)
|
||||
VALUES ('delete', old.rowid, old.title, old.artist, old.album, old.genre, old.description, old.file_name);
|
||||
INSERT INTO media_fts(rowid, title, artist, album, genre, description, file_name)
|
||||
VALUES (new.rowid, new.title, new.artist, new.album, new.genre, new.description, new.file_name);
|
||||
CREATE TRIGGER IF NOT EXISTS media_fts_update
|
||||
AFTER
|
||||
UPDATE ON media_items
|
||||
BEGIN
|
||||
INSERT INTO
|
||||
media_fts (
|
||||
media_fts,
|
||||
rowid,
|
||||
title,
|
||||
artist,
|
||||
album,
|
||||
genre,
|
||||
description,
|
||||
file_name
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
'delete',
|
||||
old.rowid,
|
||||
old.title,
|
||||
old.artist,
|
||||
old.album,
|
||||
old.genre,
|
||||
old.description,
|
||||
old.file_name
|
||||
);
|
||||
|
||||
INSERT INTO
|
||||
media_fts (
|
||||
rowid,
|
||||
title,
|
||||
artist,
|
||||
album,
|
||||
genre,
|
||||
description,
|
||||
file_name
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
new.rowid,
|
||||
new.title,
|
||||
new.artist,
|
||||
new.album,
|
||||
new.genre,
|
||||
new.description,
|
||||
new.file_name
|
||||
);
|
||||
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS media_fts_delete AFTER DELETE ON media_items BEGIN
|
||||
INSERT INTO media_fts(media_fts, rowid, title, artist, album, genre, description, file_name)
|
||||
VALUES ('delete', old.rowid, old.title, old.artist, old.album, old.genre, old.description, old.file_name);
|
||||
CREATE TRIGGER IF NOT EXISTS media_fts_delete
|
||||
AFTER DELETE ON media_items
|
||||
BEGIN
|
||||
INSERT INTO
|
||||
media_fts (
|
||||
media_fts,
|
||||
rowid,
|
||||
title,
|
||||
artist,
|
||||
album,
|
||||
genre,
|
||||
description,
|
||||
file_name
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
'delete',
|
||||
old.rowid,
|
||||
old.title,
|
||||
old.artist,
|
||||
old.album,
|
||||
old.genre,
|
||||
old.description,
|
||||
old.file_name
|
||||
);
|
||||
|
||||
END;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,11 @@
|
|||
CREATE INDEX IF NOT EXISTS idx_audit_media_id ON audit_log (media_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit_log (timestamp);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_audit_action ON audit_log (action);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_media_content_hash ON media_items (content_hash);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_media_media_type ON media_items (media_type);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_media_created_at ON media_items (created_at);
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
ALTER TABLE media_items ADD COLUMN thumbnail_path TEXT;
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN thumbnail_path TEXT;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
-- Integrity tracking columns
|
||||
ALTER TABLE media_items ADD COLUMN last_verified_at TEXT;
|
||||
ALTER TABLE media_items ADD COLUMN integrity_status TEXT DEFAULT 'unverified';
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN last_verified_at TEXT;
|
||||
|
||||
ALTER TABLE media_items
|
||||
ADD COLUMN integrity_status TEXT DEFAULT 'unverified';
|
||||
|
||||
-- Saved searches
|
||||
CREATE TABLE IF NOT EXISTS saved_searches (
|
||||
|
|
|
|||
|
|
@ -12,4 +12,5 @@ CREATE TABLE plugin_registry (
|
|||
|
||||
-- Index for quick lookups
|
||||
CREATE INDEX idx_plugin_registry_enabled ON plugin_registry (enabled);
|
||||
|
||||
CREATE INDEX idx_plugin_registry_name ON plugin_registry (name);
|
||||
|
|
|
|||
|
|
@ -31,5 +31,7 @@ CREATE TABLE user_libraries (
|
|||
|
||||
-- Indexes for efficient lookups
|
||||
CREATE INDEX idx_users_username ON users (username);
|
||||
|
||||
CREATE INDEX idx_user_libraries_user_id ON user_libraries (user_id);
|
||||
|
||||
CREATE INDEX idx_user_libraries_root_path ON user_libraries (root_path);
|
||||
|
|
|
|||
|
|
@ -3,7 +3,10 @@ CREATE TABLE IF NOT EXISTS ratings (
|
|||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
media_id TEXT NOT NULL,
|
||||
stars INTEGER NOT NULL CHECK (stars >= 1 AND stars <= 5),
|
||||
stars INTEGER NOT NULL CHECK (
|
||||
stars >= 1
|
||||
AND stars <= 5
|
||||
),
|
||||
review_text TEXT,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime ('now')),
|
||||
UNIQUE (user_id, media_id),
|
||||
|
|
@ -81,7 +84,9 @@ CREATE TABLE IF NOT EXISTS usage_events (
|
|||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_usage_events_media ON usage_events (media_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_usage_events_user ON usage_events (user_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_usage_events_timestamp ON usage_events (timestamp);
|
||||
|
||||
-- Watch history / progress
|
||||
|
|
|
|||
|
|
@ -1,17 +1,24 @@
|
|||
-- Drop redundant indexes (already covered by UNIQUE constraints)
|
||||
DROP INDEX IF EXISTS idx_users_username;
|
||||
|
||||
DROP INDEX IF EXISTS idx_user_libraries_user_id;
|
||||
|
||||
-- Add missing indexes for comments table
|
||||
CREATE INDEX IF NOT EXISTS idx_comments_media ON comments (media_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_comments_parent ON comments (parent_comment_id);
|
||||
|
||||
-- Remove duplicates before adding unique index (keep the first row)
|
||||
DELETE FROM external_metadata
|
||||
WHERE rowid NOT IN (
|
||||
SELECT MIN(rowid)
|
||||
FROM external_metadata
|
||||
GROUP BY media_id, source
|
||||
WHERE
|
||||
rowid NOT IN (
|
||||
SELECT
|
||||
MIN(rowid)
|
||||
FROM
|
||||
external_metadata
|
||||
GROUP BY
|
||||
media_id,
|
||||
source
|
||||
);
|
||||
|
||||
-- Add unique index for external_metadata to prevent duplicates
|
||||
|
|
|
|||
|
|
@ -68,9 +68,6 @@ in
|
|||
|
||||
echo "sccache setup complete!"
|
||||
fi
|
||||
|
||||
# Start the daemon early for slightly faster startup.
|
||||
"$SCCACHE_BIN" --start-server >/dev/null 2>&1 || true
|
||||
'';
|
||||
|
||||
env = {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue