Skip to content

v2.8.0

Choose a tag to compare

@bitr8 bitr8 released this 25 Jul 08:02

v2.8.0

Separator collections, per-user collection targeting, and a presets dropdown that turns creating a collection into one click. Sonarr drives the next-episode countdown now, so it holds on the poster instead of dropping off and turning up again later. Eight fixes behind that, most of them from reports on the fork tracker. Everything here has been running live on a production server.

Docker tags

Tag What it tracks
bitr8/agregarr:latest Stable releases. This is what you want.
bitr8/agregarr:2.8.0 Pinned to this exact release.
bitr8/agregarr:develop Bleeding edge. Builds on every push, breaks sometimes.

Upgrading from 2.7.0 is a pull; config volumes are compatible. Release tags ship amd64 and arm64 (Apple Silicon, RPi 4+).

One manual step, only if you use the Plex webhook. The webhook URL has changed and now carries a token. Copy the new one from Settings > Downloads and paste it into Plex under Settings > Webhooks. The old URL gets a 401, so until you swap it over your placeholder trailers stay marked as watched. If you've never set the webhook up, skip this.

What's new

Separator collections

Kometa has had these for years and they're a good idea, so Agregarr has them now. A separator is an empty collection that exists purely to carry a title card, so a long collection row can be broken into labelled groups instead of running together.

Separators skip the template engine entirely, so the title renders exactly as you type it. The form is cut down to what actually applies: visibility and time restrictions, nothing else. Point one at your own poster template through the auto-poster toggle, or leave it and get the built-in Separator template. (fork #41, thanks Damienlee69)

Collection presets

Add Collection has a presets dropdown now, twelve of them, covering TMDB, IMDb, Trakt, Coming Soon and Netflix Top 10. Picking one fills in type, subtype, template, item limit and visibility in a single click, so a new collection is a name and a save rather than a form-filling exercise.

Trakt presets stay hidden until you've got Trakt credentials saved. Coming Soon presets switch placeholder creation on for you. (fork #31, thanks maskofsanity666; #34, thanks apinner)

Per-user collection targeting

Any collection config can now name a Target User. Agregarr labels the collection and excludes it from every other user's library filters, so browsing the library they don't see it. Targeted collections carry a "Target User" badge in the listing so you can tell at a glance which ones are restricted.

Cherry-picked from Elliott Carlson's upstream PR #555. Credit where it's due, this is his feature and it's a good one.

One limit worth knowing before you rely on it. Plex promotes a collection to the Home screen server-wide, and there's no per-user version of that switch, so a targeted collection that's also promoted to Home still shows up on everyone's Home. The targeting holds for library browsing. If you want it properly hidden, leave it recommended-only rather than home-promoted.

The user dropdown lists everyone with access to your server, owner included, resolved server-side from the admin record. The owner keeps visibility over every collection regardless of targeting.

Last Episode Added sort

Smart collections get a Last Episode Added sort option. (fork #43, thanks subwavetv)

Fixed

Next-episode countdowns hold on the poster

Sonarr is the authority for the next-episode date now, and that's the fix. Sonarr has the next episode lined up the second the current one airs, so there's no window for a countdown to fall through. TMDB still supplies identity and covers shows Sonarr doesn't track.

That closes the countdown that would drop off a poster and reappear later. TMDB's next_episode_to_air is served from a gateway cache and can lag reality by hours, so it kept reporting an episode that had already gone out. Two supporting changes make it stick: a failed fetch is now told apart from a genuine "no upcoming episode", so a transient blip leaves the overlay alone instead of clearing it, and a countdown whose date has passed is cleared at read time regardless of what any cache upstream believes.

Date handling underneath is properly guarded now too. Server-side Intl constructors are banned by a lint rule and covered by regression tests, because the app's SSR polyfill replaces Intl.DateTimeFormat with one that rejects named timezones. That's the sort of thing a unit suite on native Node will never catch, so it's enforced at lint time where it can't come back. (fork #35, thanks shonufgit)

Time restrictions were eating your visibility settings

Your active visibility config is the single source of truth now, and a time restriction can't overwrite it. Configs that were already scrambled repair themselves on upgrade, so there's nothing to reset by hand.

Four bugs, one shape between them: a restriction writes reduced visibility during an inactive window, then something reads those reduced values back and treats them as what you asked for. Discovery was reading Plex's current visibility on every sync and overwriting the stored config, which made that a loop. Multi-source collections weren't persisting their active state after evaluating a restriction. The full library sync applied active visibility unconditionally, over the top of what the per-collection pass had already worked out correctly. And ordering convergence recovery re-promotes collections, which Plex treats as a reset to all-visible, so visibility is re-applied afterwards.

Also: re-promoting a collection that Plex already has in hub management is skipped, because that POST was itself resetting visibility on every sync. (fork #42, #46, thanks shonufgit)

Base posters stay clean

Agregarr won't adopt one of its own overlays as a base poster any more, so repeated runs composite onto the original artwork every time.

The opening was narrow: an overlay upload succeeds, the write recording it doesn't, and the next run has no way to tell our own output from the item's real poster. Every poster Agregarr overlays is WebP, so a WebP poster on an already-overlaid item is refused as a base and falls back to the cached base, then to content-addressed recovery. A poster that isn't WebP can't be one of ours and is adopted normally.

That inference only runs in the safe direction. Upload your own WebP poster to an overlaid item and you keep the previous base until you reset it, which takes one click. Deliberate trade: a stale base is recoverable, a baked-in overlay isn't.

Manual reorder could reach into another library

Dragging collections into a new order is scoped strictly to the library you're reordering now. A payload item with no saved config of that id in that library is refused, and merges look up the original within the library rather than taking the first id match anywhere.

Previously the rebuilt array combined saved configs filtered by library with payload items that were never checked for belonging to it, so one config could be written twice under a single id, and an unscoped lookup could carry a rating key and sync schedule across from a same-id config elsewhere. Duplicate saved ids are now reported rather than deleted: two configs can legitimately share an id across libraries, and a drag is no place to guess. Backed by 24 unit tests.

Movie placeholders match faster

Movie placeholders relied on the {tmdb-ID} filename tag alone, which the metadata agent only processes after the scan. TV placeholders have written a .plexmatch file since 2.6.0, which Plex reads during the scan instead. Movies do the same now, so GUIDs get assigned sooner and fewer creations time out waiting. Cleanup removes .plexmatch alongside .comingsoon, so deleting a placeholder no longer leaves an orphan folder. (fork #45, thanks dvd123321)

Actors billed sixth or lower didn't count

Smart collections built on an actor use Plex's actor= filter, which searches all billing positions, but the actor list feeding the minimum-items threshold only counted the top five billed roles per item. So the threshold rejected actors Plex would have matched perfectly well. (fork #38, thanks c-strange)

Overlay sync card holds its result

The dashboard's overlay sync card keeps showing what finished, instead of dropping back to Idle ten seconds later when the completed entries expired. Its progress bar is library-weighted and only moves forward, so it no longer sawtooths across a multi-library job as the denominator shrinks, and a standalone run won't claim 100% while it's still going. Both cards tell you how long ago they last finished.

Plex webhook is authenticated

The webhook endpoint carries a token now and bounds the upload it accepts.

That changes the URL, so see the upgrade note at the top if you've got the webhook registered in Plex.

Known and unfixed

  • When a config loses track of its collection in Plex, it falls back to finding it by title, and that fallback will take over one of your own collections if the names match. It gets relabelled and its contents replaced, and a config set to remove its collection when inactive will delete it. Keep your own collection names distinct from your Agregarr config names. The fix is written and sitting on a branch, held back because it also removes the only recovery path for a collection that half-created itself.
  • A targeted collection that's promoted to the Home screen still shows on everyone's Home. Plex has no per-user version of that switch.
  • Person collections get deleted on the next cleanup pass if their title template renders anything other than the plain person name. Cleanup matches on the bare name.
  • Restoring a base poster larger than 1000x1500 downscales it. Movies and shows too, not just seasons.
  • Restored posters stay locked in Plex.