Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/API.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ There is no global error handler, so error bodies are framework defaults. A deni

### Secrets

`GET /api/settings` masks nine secret fields. The per-integration read routes under `/api/settings` **do not mask** and return the real stored values, because the settings forms need them in order to save them again. `GET /api/settings` also leaves `apikey` and `download_client_username` in the clear.
`GET /api/settings` masks ten secret fields. The per-integration read routes under `/api/settings` **do not mask** and return the real stored values, because the settings forms need them in order to save them again. `GET /api/settings` also leaves `apikey` and `download_client_username` in the clear.

Two further routes hand over secrets wholesale: `GET /api/notifications/configurations` returns every notification credential unmasked, and `GET /api/settings/database/download` streams the entire database with every secret in plaintext.

Expand Down
10 changes: 5 additions & 5 deletions docs/Configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -225,11 +225,11 @@ When media is removed through Radarr or Sonarr, Maintainerr can remove the match

Maintainerr supports qBittorrent and Transmission. Pick the client first, then enter the URL and credentials for that same instance.

| Setting | Description |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Client | Choose `qBittorrent` or `Transmission`. Nothing is selected until you choose. An install that already had a download client when it upgraded keeps `qBittorrent`, the only client that existed before. Changing the client clears the URL field because qBittorrent uses a WebUI base URL while Transmission uses the full RPC endpoint. |
| Delete downloaded data | When enabled, removing a download also deletes its files from disk. Turn this off if you cross-seed, so other torrents that share the data keep working. |
| Fallback seeding ratio | Whether a download has finished seeding is decided by the client's own ratio or time limits first. This fallback ratio only applies when the client enforces no limit, and then only after 23 hours. |
| Setting | Description |
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Client | Choose `qBittorrent` or `Transmission`. Nothing is selected until you choose. An install that already had a download client when it upgraded keeps `qBittorrent`, the only client that existed before. Once a client is saved, switching to the other one clears the URL field because qBittorrent uses a WebUI base URL while Transmission uses the full RPC endpoint. |
| Delete downloaded data | When enabled, removing a download also deletes its files from disk. Turn this off if you cross-seed, so other torrents that share the data keep working. |
| Fallback seeding ratio | Whether a download has finished seeding is decided by the client's own ratio or time limits first. This fallback ratio only applies when the client enforces no limit, and then only after 23 hours. |

### qBittorrent

Expand Down
1 change: 1 addition & 0 deletions docs/MediaServerSwitching.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ When migrating during a switch:

- Compatible rules are automatically converted (application ID and property IDs rewritten)
- Incompatible rules are **deleted** from the database (logged with details)
- If a deleted rule was the first in its section, the next rule takes over its section operator, so the section still joins the rest of the group with `AND` or `OR` as before
- Rule groups where all rules were incompatible are also deleted
- Some properties are **remapped** to their closest equivalent (see [Incompatible Properties](#incompatible-properties))
- Collections are preserved (metadata kept, recreated on new server)
Expand Down
6 changes: 4 additions & 2 deletions docs/Rules.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,13 @@ General info about the rule. Some of the information specified here will be show
| Custom collection name | The name of the existing manually managed collection to use <InlineTooltip label="+" tooltip="Only shown and needed when the Custom Collection checkbox is checked." /> |
| Keep in Maintainerr only | Keep this collection inside Maintainerr and create nothing on your media server. Rules, actions, overlays, and \*arr tags all keep working. Off by default, set per collection, and hidden while `Custom collection` is on. |

Maintainerr only shows `Force reset Seerr record` for movie, show, and season rules. Episode rules always rely on Seerr's normal availability sync because Seerr tracks requests at the season level, not per episode. If an older episode rule still has this option saved, re-saving the rule clears it.
Maintainerr only shows `Force reset Seerr record` for movie, show, and season rules. Episode rules always rely on Seerr's normal availability sync because Seerr tracks requests at the season level, not per episode. If an older episode rule still has this option saved, re-saving the rule clears it. Seerr cannot take one season out of a request either, so on a season rule a request that also covers a season you still have is kept, and the log says so. Maintainerr deletes it when the last of its seasons goes.

`Force delete Ombi request` is shown for the same three rule types, for a similar reason: Ombi can only delete a whole request, so deleting one for a single episode would drop the requests for the episodes you still have. Ombi has no availability sync of its own either, so a request left in place stays listed as available even after the media is gone. On a season rule, Maintainerr deletes only the requests that cover nothing but that season; one that also covers another season is kept, and the log says so. Ombi drops a show's own request once its last remaining request is gone.

When you choose `Change quality profile and search` for Radarr or Sonarr, Maintainerr shows a quality profile selector for the chosen server. This action does not use `Take action after days`; it changes the item's quality profile immediately when the collection action runs.

The `Tag this content` option keeps a Radarr/Sonarr tag named after the rule group on each matching item for as long as it stays in the collection, and removes it when the item leaves. Because Sonarr tags apply to the whole series, the option is offered for movie collections (Radarr) and whole-show collections (Sonarr) only - not season or episode collections. The tag is created on the \*arr instance if missing, the rule group's name is normalized to the tag character set Radarr/Sonarr accept (lowercase letters, numbers, and hyphens), and tagging is best-effort, so it never blocks a rule run. Renaming a rule group applies the new tag on the next membership change but leaves the previous tag in place until you remove it.
The `Tag this content` option keeps a Radarr/Sonarr tag named after the rule group on each matching item for as long as it stays in the collection, and removes it when the item leaves. Because Sonarr tags apply to the whole series, the option is offered for movie collections (Radarr) and whole-show collections (Sonarr) only - not season or episode collections. The tag is created on the \*arr instance if missing, the rule group's name is normalized to the tag character set Radarr/Sonarr accept (lowercase letters, numbers, and hyphens), and tagging is best-effort, so it never blocks a rule run. Only items the rules added carry the tag, not items you added by hand. Renaming the rule group or switching its \*arr server moves the tag when you save: the old tag comes off and the new one goes on. Rule groups whose names give the same tag on the same \*arr server share it, and an item keeps the tag while any of them still holds it.

`Keep in Maintainerr only` is for collections that exist to hold media for review, tag it in the \*arrs, or count down to an action, rather than to be browsed on the media server. Membership, the countdown, actions, overlays, and tags all read Maintainerr's own records, so they behave exactly as they would otherwise. Turning it on tears down a collection Maintainerr already created on the media server; turning it off lets the next rule run recreate it. It cannot be combined with `Custom collection`, which by definition points at a collection that already exists on the server.

Expand Down Expand Up @@ -171,6 +171,8 @@ Season delete actions unmonitor the season in Sonarr and delete its episode file

Episode delete actions share the season folder with other episodes, so the folder is never removed by this action. No leftover folder cleanup is offered for episode rules.

Maintainerr finds the episode in Sonarr by its TVDB episode id when exactly one Sonarr episode has it, so a library numbered differently from Sonarr, such as absolute or DVD order, still acts on the right episode. Otherwise it matches by season and episode number, or by air date. When one file holds several episodes, all of them are unmonitored before the file is deleted, so Sonarr does not download it again. If any of them cannot be unmonitored, the file is kept.

### Sportarr actions

Sportarr runs alongside Sonarr and Radarr; you can configure all three at once. Because Plex reports both TV and sports libraries as the same 'show' type, each collection over a show library names a single manager: pick either Sonarr or Sportarr for that collection (not both). Different collections can use different managers, so the same library can have some collections managed by Sonarr and others by Sportarr.
Expand Down
4 changes: 1 addition & 3 deletions docs/api/logs.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,7 @@ Response:

Only Maintainerr's own daily files are listed. Anything else in the directory is invisible here, including the rotation bookkeeping file.

:::note DATA_DIR is ignored here
In production this route reads `/opt/data/logs` directly and does not honour `DATA_DIR`. If you have moved your data directory, this list will not reflect it.
:::
The files live in the `logs` folder of the data directory, which is `/opt/data` unless `DATA_DIR` points somewhere else.

### `GET /api/logs/files/{file}`

Expand Down
10 changes: 4 additions & 6 deletions docs/api/notifications.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,10 @@ Response:
]
```

| Status | Cause |
| ------------------------ | ---------------------------- |
| `200` | JSON array of configurations |
| `200` with an empty body | The read failed |

An empty body is not the same as `[]`. `[]` means no agents are configured, an empty body means the read threw. Check the body type to tell them apart.
| Status | Cause |
| ------ | ----------------------------------------------------------------- |
| `200` | JSON array of configurations. `[]` means no agents are configured |
| `500` | `Notification configurations could not be read`: the read failed |

Rule group links are not included on this route.

Expand Down
2 changes: 1 addition & 1 deletion docs/api/ombi.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Response:
| `200` | Array of usernames, possibly empty |
| `400` | `tmdbId` is not an integer, `type` is missing or not `movie`/`tv`, or a number is not one |

Unlike the Seerr route, `type` is required and validated, because Ombi keeps movie and show requests in separate lists and cannot be asked for both at once.
`type` is required and validated, as on the Seerr route, because Ombi keeps movie and show requests in separate lists and cannot be asked for both at once.

A request made with Ombi's API key is recorded against Ombi's system user, so the name reported is the alias that request carries instead.

Expand Down
5 changes: 3 additions & 2 deletions docs/api/overlays.md
Original file line number Diff line number Diff line change
Expand Up @@ -602,14 +602,15 @@ Send `multipart/form-data` with a single file field named `font`. Accepted exten
| ------ | ------------------------------------------------------------------------------------------------- |
| `201` | Stored. The body is the sanitised name and path |
| `400` | No file uploaded, an unsupported extension, an invalid filename, or the field is not named `font` |
| `413` | The file exceeds 32 MB |
| `500` | The write failed |

:::warning Overwrites silently
A font with the same sanitised name is **overwritten with no warning and no backup**. Every template referencing that filename renders with the new file on the next run.
:::

:::caution No size limit on this route
Unlike the image route, there is no size cap here and the whole file is buffered in memory. The bytes are also never checked to be a real font. A bad file only shows up later as a warning during a run, after which text falls back to a default typeface.
:::caution The file is not checked to be a font
The whole file is held in memory during the upload, which is why it is capped at 32 MB. The bytes are never checked to be a real font. A bad file only shows up later as a warning during a run, after which text falls back to a default typeface.
:::

There is **no delete route for fonts**. An uploaded font can only be removed from disk by hand.
Expand Down
11 changes: 7 additions & 4 deletions docs/api/seerr.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ This is the route behind the "Requested by" line in the media modal. Names are r
| Parameter | Type | Required | Description |
| --------- | -------------- | -------- | ------------------------------------------------------------------------ |
| `tmdbId` | path, integer | Yes | TMDB id of the movie or show |
| `type` | query, string | Yes | `movie` or `tv`. Anything else is a `400` |
| `season` | query, integer | No | Season number. Only filters show requests, so it is harmless for a movie |

Response:
Expand All @@ -79,10 +80,12 @@ Response:

Order is oldest request first.

| Status | Cause |
| ------ | --------------------------------------------------------------------- |
| `200` | Array of usernames, possibly empty |
| `400` | `tmdbId` is not an integer, or `season` is present but not an integer |
| Status | Cause |
| ------ | ------------------------------------------------------------------------------------------------------------ |
| `200` | Array of usernames, possibly empty |
| `400` | `tmdbId` is not an integer, `type` is missing or not `movie`/`tv`, or `season` is present but not an integer |

`type` is required because TMDB numbers movies and shows separately, so one id can name both a movie and an unrelated show. Only requests of that type are counted.

Pass `season` for a season-level lookup. Seerr tracks show requests per season, so without it a season lookup credits whoever requested a _different_ season.

Expand Down
Loading
Loading