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
67 changes: 67 additions & 0 deletions docs/Glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,19 @@ List of studio names associated with the Plex item.
- Availability: movies, shows, seasons, episodes
- Type: text[]

#### Last play date (including unfinished)

:::info
The date when the Plex item was last played, including a play that was stopped before the end.

Plex moves an item's own last-viewed date on any playback and only writes a history row once a view completes, so on Plex this reports the same date as `Plex.lastViewedAt`. It reads that field directly instead of the watch history, so it still answers when a history lookup fails. The property exists so the same rule keeps working on a media server where playing and viewing are two different dates.

:::

- Key: Plex.lastPlayedAt
- Availability: movies, shows, seasons, episodes
- Type: date

---

### Jellyfin
Expand Down Expand Up @@ -1092,6 +1105,21 @@ List of studio names associated with the Jellyfin item. Also available on Emby.
- Availability: movies, shows, seasons, episodes
- Type: text[]

#### Last play date (including unfinished)

:::info
The newest date any user played the item, including a play that was stopped before the end. Unlike `Jellyfin.lastViewedAt`, it is not limited to views that count as watched. Also available on Emby.

Shows and seasons hold no play date of their own, so for those Maintainerr takes the newest play date of their episodes.

If the play date cannot be read for every user, the value is treated as unknown instead of falling back to an older date. That keeps an item that was just started from being handled as if nobody had touched it in months.

:::

- Key: Jellyfin.lastPlayedAt
- Availability: movies, shows, seasons, episodes
- Type: date

---

### Radarr
Expand Down Expand Up @@ -2158,6 +2186,19 @@ The date when the newest episode of the Plex item was viewed (according to Tautu
- Availability: shows, seasons
- Type: date

#### Last play date (including unfinished)

:::info
The date of the last playback session Tautulli recorded for the Plex item, however much of it was played.

Unlike `Tautulli.lastViewedAt`, this ignores the percentage configured in the Tautulli settings and the collection's `Watched percent override`, so a session someone abandoned after a minute still counts.

:::

- Key: Tautulli.lastPlayedAt
- Availability: movies, shows, seasons, episodes
- Type: date

---

### Tracearr
Expand Down Expand Up @@ -2290,6 +2331,19 @@ List of usernames who have watched (according to Tracearr) at least one episode
- Availability: shows, seasons, episodes
- Type: text[]

#### Last play date (including unfinished)

:::info
The date of the last playback session Tracearr recorded for the item, however much of it was played.

Unlike `Tracearr.lastViewedAt`, this ignores the watched threshold and the collection's `Watched percent override`, so a session someone abandoned early still counts.

:::

- Key: Tracearr.lastPlayedAt
- Availability: movies, shows, seasons, episodes
- Type: date

---

### Streamystats
Expand Down Expand Up @@ -2385,3 +2439,16 @@ The date when the selected Jellyfin user last viewed the item (according to Stre
- Key: Streamystats.lastViewedAtByUser
- Availability: movies, shows, episodes
- Type: date

#### Last play date (including unfinished)

:::info
The date the item was last played by anyone, according to Streamystats. Streamystats records every session it sees, so a play someone stopped early counts too. This property covers all users, while `Last view date by user` answers for the one user you pick.

Streamystats builds a show's numbers from its episodes and records nothing against a season, so this property is unavailable for seasons. If Maintainerr cannot read the item's Streamystats details, the value is treated as unknown instead of "never played".

:::

- Key: Streamystats.lastPlayedAt
- Availability: movies, shows, episodes
- Type: date
6 changes: 6 additions & 0 deletions docs/Notifications.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ Maintainerr checks for a newer build twice a day, and sends `Update Available` o
When Seerr (Overseerr or Jellyseerr) is configured, the **Media About to be Handled** message includes who requested the item, for example: _'Some Title' (requested by alice) will be handled in 3 days_. The lookup is season-aware for TV content and best-effort by design: if Seerr is unreachable or the item was not requested through Seerr, the requester line is silently omitted and the warning is still sent.
:::

### How messages are grouped and delivered

During a collection handling run, `Media Removed from Collection` is collected per collection and sent as one message when the run ends, listing every item that left that collection during the run. This covers items removed after they were handled, items cleaned up because they were gone from the media server, and items pruned from other collections. A rule run reports its own removals in grouped messages while it runs, so those arrive during the run. Emptying a collection by hand is picked up by the next rule run and reported as one message as well.

If a notification service answers with a rate limit, Maintainerr waits the time that service asks for and sends again, up to a minute, instead of dropping the message. Discord messages are cut to Discord's embed limits, so a very long list of items can end in `...`.

## Supported Notification Agents

### Discord
Expand Down
2 changes: 2 additions & 0 deletions docs/Rules.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ This also means Maintainerr keeps these states separate on purpose:

The watch-history getters keep these cases separate: a confirmed empty history returns no watch date, while server or history lookup failures stay unknown instead of falling back to an empty history result. That prevents outages from being misread as "never watched" and keeps `NOT_EXISTS` from matching the wrong items.

`Last play date (including unfinished)` (`lastPlayedAt`) is the played counterpart of `Last view date`. It answers with the last time an item was played at all, including a play someone stopped early, while `lastViewedAt` only counts a play that got far enough to be a view. It is offered for Plex, Jellyfin, Emby, Tautulli, Tracearr, and Streamystats, and it treats a failed lookup as unknown in the same way. On Plex both properties report the same date, because Plex already moves an item's last-viewed date on any playback.

:::

:::warning Plex Watchlist Rules
Expand Down