* - 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
.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>
* 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>
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>
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>
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>
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>
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>
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>
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>
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
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
The previous regex extracted from `<img alt="...">` which contains
"Poster for [Title]" instead of the clean title.
- Use `data-item-name` attribute which has the actual title
- Strip year suffix since year is extracted separately from
`data-item-full-display-name`
Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
The date window filtering in enrichWithTMDBReleaseDates() was removing items
before includeAllReleasedItems could preserve them. Now passing skipDateFilter
param to bypass filtering when includeAllReleasedItems is true for non-Coming-Soon
collections.
- Added skipDateFilter param to enrichWithTMDBReleaseDates()
- Skip movie/TV date window filtering when skipDateFilter is true
- Fail-open on TMDB fetch errors when skipDateFilter is true
- PlaceholderCreation passes skipDateFilter based on config
Fixes#336
Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
Radarr sometimes sets releaseDate to an estimated digital release.
The code was adding another 90 days on top. Now checks if releaseDate
is already 30+ days after inCinemas before adding the estimate.
Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
add "Include all released items" toggle, fix orphaned cleanup to use fixed 7-day grace period, fix
placeholder quick sync deleting tv items, other minor changes
re #336, re #268, re #253, re #307
Adds support for IMDb's Top 250 English-language movies list as a new
collection source. The list is available at /chart/top-english-movies/.
- Added TOP_250_ENGLISH_MOVIES enum value and URL mapping
- Added 'top_250_english' subtype to collection sources
- Added UI options in CollectionTypeSection and MultiSourceConfigSection
- Added title presets for the new collection type
- Auto-sets mediaType to 'movie' when selecting this subtype
Closesagregarr/agregarr#330
Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
Hub items that no longer exist in Plex should not cause errors during
cleanup operations. This matches the behavior of other delete methods
that also ignore 404 responses.
Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
Bug 1: startNow doesn't trigger immediate sync
- When startNow=true, firstSyncAt was set to current time
- calculateNextRunFromFirstSync() returned firstSyncAt + interval (12h later)
- No immediate sync was triggered
- Fix: If firstSyncAt is within 60s of now, queue immediate sync
Bug 2: Deadlock when scheduled sync overlaps full sync
- Scheduled sync acquired API lock in queueCollectionSync()
- Queued sync to process "after main sync completes"
- But main sync was waiting for the same API lock
- Fix: Move API lock acquisition from queue time to execution time
in processLibraryQueue(), after fullSyncRunning check
Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
When placeholders are cleaned up because real content arrived, Plex
wasn't notified and ghost entries remained in the library. This adds:
- New emptyTrash() method to PlexAPI
- Fire-and-forget scan + empty trash after placeholder cleanup
- New autoEmptyTrash setting (default: true) with UI toggle
- Setting in Plex settings page with "advanced" badge
The scan runs in the background so it doesn't block the sync process.
Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
parseConfigIdFromLabel() regex didn't handle source names containing
hyphens or underscores (multi-source, filtered_hub). This caused
DYNAMIC_CYCLE_TITLE collections to create new Plex collections on each
cycle instead of updating the existing one.
Updated regex to allow hyphens/underscores in source names while
ensuring configId capture starts at the first digit.
Co-authored-by: bitr8 <bitr8@users.noreply.github.com>