316 Commits

Author SHA1 Message Date
Tom Wheeler
67b813988e perf(letterboxd): reduce Playwright usage and parallelise TMDB resolution
searches TMDB API first, if no exact match found then grabs TMDB ID from individual page with
playwright
2026-03-17 21:00:33 +13:00
Tom Wheeler
199841f3ae fix(placeholders): placeholder filters blocking creation when grab missing items was not enabled
fix #509
2026-03-17 19:43:59 +13:00
Tom Wheeler
c2f11799cf fix(imdb-letterboxd): use Playwright clients in random list and title validation for IMDb/Letterboxd
fix #475
2026-03-17 19:35:50 +13:00
Tom Wheeler
cd14951bbc fix(security): validate filenames in icon and poster thumbnail routes to prevent path traversal 2026-03-17 16:19:54 +13:00
bitr8
ef873b7fe6
Sanitize SVG content on icon upload (#514)
SVG files uploaded as icons are saved without sanitisation. Embedded
script tags, event handlers, foreignObject elements, and javascript:
URIs in SVG content enable stored XSS.

Adds sanitizeSvg() that strips dangerous elements and attributes
before saving. Applied via uploadIcon() so template imports are
also covered.

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-03-17 10:06:38 +13:00
bitr8
404e7c865e
fix: TV placeholders leaking into filtered hubs (#503)
PlaceholderDiscovery re-verified TV items via isPlaceholderItem() which
returns false during library-level scans (no Children metadata in Plex
response). The marker file on disk already proves it's an Agregarr-created
placeholder, so trust that instead of re-checking a broken API path.

Also: find S00E00 by episode index not array position, and use async
placeholder detection in the orphan scan for definitive TV identification.

Ref #414

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-03-17 10:03:53 +13:00
Tom Wheeler
95f77d64a4 fix(seerr): enable Home/Recommended visibility options for Seerr Individual Requests collections
Longstanding Plex bug not respecting label restrictions for Collections on Home/Recommended has been
fixed in PMS Beta 1.43.1.10540, confirmed working with Agregarr. Also removes previous easter egg
which enabled the option (intended for use when the project was going to be a PR for Overseerr,
allowing use of the option without waiting for an update)

fix #112
2026-03-17 09:26:16 +13:00
Tom Wheeler
501d6b68d7 chore(overlays): revert order of imdb and rt overlays 2026-03-05 19:04:49 +13:00
Tom Wheeler
78842cd050 fix(tmdb-collections): respect language setting for TMDB franchise collections
fix #487
2026-03-03 23:51:32 +13:00
bitr8
8d850322b9
fix(overlays): support Maintainerr v3 API (mediaServerId rename) (#504)
Maintainerr v3 renamed `plexId` (number) to `mediaServerId` (string)
in their API response. The overlay context builder compared against the
old field, silently failing to match any media items so daysUntilAction
never populated.

Read `mediaServerId` with fallback to `plexId`, compare as strings.
Supports both Maintainerr v2 and v3.

Fixes #501

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-03-03 00:18:43 +13:00
Ruben
207a1ed905
fix(overlays): correct air date today logic for next episode and season (#496)
* fix(overlays): correct air date today logic for next episode

* fix(overlays): correct air date today logic for next season
2026-03-03 00:16:56 +13:00
bitr8
d8655cad41
fix(placeholders): handle Plex returning TV seasons as Children.Directory (#491)
Plex returns seasons as Children.Directory (not Children.Metadata)
when using ?includeChildren=1. All placeholder detection code only
checked Children.Metadata, so isPlaceholderItem() always returned
false for TV shows — skipping title fixes and triggering false
cleanup of valid placeholders.

Added Metadata || Directory fallback across all detection paths,
type casts, and getChildrenMetadata() API helper.

Fixes #414

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-03-03 00:15:31 +13:00
Rust84
4f11ad1260
fix(local-posters): fix pagination and library filtering for local poster folders (#477)
Add pagination loop to process all library items instead of only the first 50. Use
plexApi.getLibraries() instead of OverlayLibraryConfig so libraries without overlays are included.

#433
2026-03-03 00:13:43 +13:00
Douw Jacobs
898c300d2a
fix(overlays): fix days since season premiere logic (#473) 2026-03-03 00:10:36 +13:00
Sean Bingham
4a4e1d85c1
fix(cleanup): prevent auto-franchise collections from being deleted when custom sync is enabled (#470)
Updated 'CollectionCleanupService' so deletion checks look at all Agregarr labels on a collection, instead of only the first one.
2026-02-23 09:58:22 +13:00
Anthony Hoivik
cb12822872
fix(overlays): move IMDb rating position out of conflict with top banner tiles (#408)
* fix: move IMDb rating position out of conflict with top banner tiles

* fix: move dolby vision, hdr position down to prevent conflict with new imdb position
2026-02-21 19:42:07 +13:00
Sean Bingham
069e58c174
fix(coming-soon): makes hideIndividualItems work for Coming Soon collections (#469)
* - Updated `hideIndividualItems` description in settings to clarify support for both Coming Soon and TMDB auto_franchise collections.
- Improved `ComingSoonCollectionSync` to filter items based on media type and apply collection exclusions.
- Added logic to set collection mode when `hideIndividualItems` is enabled, ensuring individual items are hidden in the library tab.
- Adjusted UI components to reflect changes in collection mode options for TMDB and Coming Soon collections.

* fix(comingsoon): guard missingItems before quick-sync storage
2026-02-20 13:25:41 +13:00
bitr8
77c5a91139
fix(Placeholders): Scan all placeholder-enabled libraries, not just the first (#467)
.find() only returned the first TV/movie library with placeholders
enabled, silently skipping any additional libraries. Replace with
.filter() + Set to discover and process placeholders across all
libraries.

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-02-20 13:24:37 +13:00
bitr8
63b8851a1a
fix(Placeholders): Separate placeholder filters independent of auto-request filters (#456)
* feat: separate placeholder filters independent of auto-request filters

Add placeholderMinimumYear, placeholderMinimumImdbRating,
placeholderMinimumRottenTomatoesRating,
placeholderMinimumRottenTomatoesAudienceRating, and
placeholderFilterSettings to CollectionConfig and
MultiSourceCollectionConfig.

buildPlaceholderFilterConfig() helper swaps placeholder values into
standard filter fields so MissingItemFilterService works unchanged.
Updated BaseCollectionSync and MultiSourceOrchestrator call sites.

Collapsible "Placeholder Filters" section in collection edit form
reuses FilterWithMode/KeywordFilterWithMode. Auto-expands when
editing configs with existing values.

Fixed pre-existing gap: keywords missing from
MultiSourceCollectionConfig.filterSettings type.

---------

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
Co-authored-by: Tom Wheeler <thomas.wheeler.tcw@gmail.com>
2026-02-20 13:22:44 +13:00
Tom Wheeler
888dc43301 fix(overlays): fix native language strings being used for language/subtitle variables
now uses language code and converts to english

fix #460
2026-02-13 12:49:13 +13:00
Tom Wheeler
9b272e37b1 fix(overlays): add TVDB TV Status as additional TV Status option
add base TVDB client for future integration.

fix #342
2026-02-13 11:31:45 +13:00
bitr8
e0470bcb0a
fix: pass rating filters and seasonGrabOrder to multi-source collections (#459)
Multi-source config assembly was missing minimumImdbRating,
minimumRottenTomatoesRating, minimumRottenTomatoesAudienceRating,
and seasonGrabOrder. Items below the rating threshold were not
being filtered for multi-source collections.

re #440

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-02-13 08:50:21 +13:00
bitr8
87087cbb6c
fix: re-apply placeholder markers during global discovery (#453)
Movie placeholder labels were only re-applied by Coming Soon collections,
so movies in other collection types (Letterboxd, IMDB, Trakt, etc.) could
permanently leak into filtered hubs if the initial label application failed.

TV placeholder title fixes returned false on timeout but the result was
never checked, giving no visibility into failures.

- Re-apply trailer-placeholder label for all movie placeholders during
  global discovery pass
- Log warnings when episode title or movie label application fails
- Track failure counts in discovery summary logs

Relates to #414

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-02-13 08:40:35 +13:00
bitr8
a6e3e017bd
fix(collections): use correct Plex API endpoint for collection title updates (#444)
Collections require the /library/sections/{id}/all?type=18 endpoint for
metadata updates, not /library/metadata/{ratingKey}. This fixes dynamic
cycle titles (DYNAMIC_CYCLE_TITLE) not updating in Plex after first sync.

- Add libraryKey parameter to updateCollectionTitle()
- Use correct Plex API endpoint for collection metadata updates
- Lock title field to prevent Plex overwriting
- Propagate errors instead of swallowing them

Fixes #432

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-02-13 08:37:58 +13:00
bitr8
ecda35507c
fix(filtered-hub): use episode air date for TV recently released (#450)
originallyAvailableAt on type=2 (shows) returns the show's premiere
date, not the latest episode's air date. A show like The Rookie
(premiered 2018) wouldn't appear even with new episodes airing.

Changed to episode.originallyAvailableAt:desc which sorts shows by
their most recent episode's air date.

Fixes #442

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-02-08 21:30:05 +13:00
bitr8
bf569aea54
fix: use searchPerson API for person spotlight TMDB disambiguation (#452)
searchMulti returns all media types without known_for_department,
causing wrong person selection when names collide (e.g., actor
"Ingmar Bergman" chosen over the director). Switch to searchPerson
and rank results by department match, profile image, then popularity.

Relates to #443

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-02-08 21:29:44 +13:00
bitr8
968d4246f5
fix(letterboxd): resolve letterboxd items via film page TMDB links (#454)
Letterboxd film pages embed exact TMDB links (data-track-action="TMDb"),
but the current resolution relies entirely on fuzzy title+year search.
Short or common titles like "Columbus", "Flow", and "Moonlight" frequently
resolve to wrong results because the scoring gives near-identical scores
to partial title matches and off-by-one year differences.

This adds film page scraping as the primary resolution method, with the
existing TMDB search as fallback.

- Scrape individual film pages for TMDB ID before attempting title search
- Batch scraping with concurrency limit (5 concurrent, 200ms delay)
- Containment scoring now scales by title length ratio instead of flat 0.9
- Year scoring: exact match 0.3, +/-1 year 0.2 (was 0.3 for both)

Fixes #448

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-02-08 21:03:00 +13:00
bitr8
6b89f60983
fix: persist applyOverlaysDuringSync for pre-existing collections (#445)
The checkbox was in the UI but the field wasn't in the type definition
or save payload, so changes were never persisted.

Fixes #438

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-02-06 11:15:02 +13:00
Tom Wheeler
9787db3bda feat(overlays): add Plex Labels as condition
fix #243
2026-02-02 20:55:56 +13:00
Tom Wheeler
af965b66c6 feat(overlays): add Collection as condition
re #243
2026-02-02 20:36:09 +13:00
Ryan Brothers
3668ec2931
feat(collections): Add custom TMDB Collection Builder (#416)
Collections can now be created using the TMDB Discover Movie/TV endpoint, allowing for complex filters to create custom collections. Includes custom builder with dropdowns and search fields.
---------

Co-authored-by: Tom Wheeler <thomas.wheeler.tcw@gmail.com>
2026-02-02 16:18:20 +13:00
Tom Wheeler
4baa26302c feat(overlays): add ability to tag and sort overlays. add grid size option
fix #376, fix #435
2026-02-02 03:01:31 +13:00
Tom Wheeler
28245dbeb1 chore(prettier): formatting 2026-02-02 01:47:11 +13:00
Tom Wheeler
5745991f46 feat(missing-items): tMDB Keyword added to allow for more advanced filtering
such as christmas, seasonal movies

fix #256
2026-02-02 01:42:25 +13:00
Tom Wheeler
09f1dbbac6 feat(overlays): add 'mapped icons' element, allowing variables to be mapped to icons 2026-02-02 00:39:07 +13:00
Tom Wheeler
31427a8dcc fix(watchlist): fixes plex watchlist not respecting radarr/sonarr exclusions
fix #429
2026-01-30 21:38:08 +13:00
Tom Wheeler
596f5596d1 fix(placeholders): fixes placeholders not being added to multiple collections
when a placeholder was detected as already existing, it was not being added to CollectionItems,
therefore not being added to the new collection
2026-01-30 21:31:00 +13:00
Tom Wheeler
a02e5475f0 feat(coming-soon): coming soon collections can now be filtered by Radarr/Sonarr server and tags
fix #406, fix #411
2026-01-30 21:27:52 +13:00
Tom Wheeler
84db0e23c2 feat(collections): items that fall off collections now have a label 'agregarr-stale' added
includes check after each collection is processed to handle items existing in multiple collections

fix #384
2026-01-29 19:29:20 +13:00
Tom Wheeler
2acad0162c fix(watchlist): add username tags option for grabbing missing items from watchlist
fix #427
2026-01-29 19:09:23 +13:00
Tom Wheeler
627eb99fae fix(radarr-sonarr): show auto-generated tag in collection config 2026-01-29 18:54:40 +13:00
Tom Wheeler
9962d5e0ef feat(overlays): add RT Verified Hot support and preset
fix #394
2026-01-29 17:49:58 +13:00
Tom Wheeler
a87ab2557d feat(radarr-sonarr): add option to tag existing media
previously only missing items could have tags added, a new option in radarr/sonarr settings allows
the addition of tags to existing media, using the existing tags used in missing items. also extracts
and refactors tagging functions to remove duplication.

fix #248
2026-01-29 17:27:26 +13:00
Tom Wheeler
afd53297c0 chore(tvdb): add tvdb id extraction for future implementation. also extract some shared functions 2026-01-29 15:09:46 +13:00
Tom Wheeler
b510fdc9f2 fix(multi-source): fixes collection title not updating when changed
fix #425
2026-01-29 11:14:43 +13:00
Tom Wheeler
9b0d319102 feat(tautulli): add 'Most Watched' collection by Play Count or Watch Duration
fix #426
2026-01-29 10:52:34 +13:00
Tom Wheeler
eb22483553 fix(cleanup): prevent auto franchise collections from being deleted during full sync
when custom sync was enabled. repliactes same method used for overseerr individual requests, which
are also identified by label since it is a 'one config multiple collections' type
2026-01-29 10:16:31 +13:00
Tom Wheeler
e3e55148cd fix(randomise-home-order): process libraries separately and shuffle non-contiguous items
previously libraries were processed together resulting in unexpected ordering. also fixes issue
where items for randomisation were being selected by continuous groups with the option enabled,
resulting in interleaved items not being shuffled correctly.

fix #226
2026-01-29 09:49:33 +13:00
Tom Wheeler
def271603f perf(overlays): batch composite all template overlays in single render pass 2026-01-29 08:41:36 +13:00
Tom Wheeler
9016bd98f3 fix(letterboxd): improve TMDB matching with year-aware search and scoring
fix #236
2026-01-29 08:33:40 +13:00