514 Commits

Author SHA1 Message Date
semantic-release-bot
41c93226ab chore(release): 2.2.0 v2.2.0 2026-01-14 16:36:51 +00:00
Tom Wheeler
afe019ea2e Merge branch 'develop' into latest 2026-01-15 05:29:23 +13:00
Tom Wheeler
52b266b385 fix(github-actions): integrate semantic-release-action and add GitHub release step 2026-01-15 05:18:58 +13:00
Tom Wheeler
e621b7554f fix(overseerr): disable notifications for overseerr users
fix #240
2026-01-15 04:31:26 +13:00
Tom Wheeler
91f7484904 fix(letterboxd): fix mixed lists in letterboxd
re #236
2026-01-15 04:31:24 +13:00
Weblate (bot)
2cea59b52b Translations update from Hosted Weblate (#360)
* Translated using Weblate (French)

Currently translated at 99.3% (1423 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (Hungarian)

Currently translated at 99.8% (1430 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/hu/

* Translated using Weblate (French)

Currently translated at 99.4% (1424 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (French)

Currently translated at 99.4% (1424 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (Swedish)

Currently translated at 26.3% (377 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/sv/

* Translated using Weblate (French)

Currently translated at 99.6% (1427 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (French)

Currently translated at 99.8% (1430 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (Hungarian)

Currently translated at 99.9% (1431 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/hu/

* Translated using Weblate (French)

Currently translated at 84.5% (1340 of 1585 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

---------

Co-authored-by: Sulli <susu.leduc@gmail.com>
Co-authored-by: Koch Norbert <kochnorbert@icloud.com>
Co-authored-by: Hannes Brolin Lagerstedt <mainhannes@gmail.com>
2026-01-15 04:04:27 +13:00
Tom Wheeler
6888304b09 chore(github): test dependabot, add source request template, add typecheck to pre-commit
other minor changes
2026-01-15 03:58:46 +13:00
Tom Wheeler
9600cb245b fix(overseerr): fix plexClient and libraryCache not being passed to sync
fix #363
2026-01-15 02:17:09 +13:00
Tom Wheeler
76db41b2ac fix(random-lists): fixes letterboxd and imdb random lists
not matching due to requirement to meet maxItems, which is passed as 9999 when intially matching
random lists

fix #324
2026-01-15 01:02:01 +13:00
Tom Wheeler
4573668623 fix(collection-posters): fixes network logo mapping
fix #361
2026-01-15 00:36:17 +13:00
Tom Wheeler
56e046de12 fix(imdb): fix url validation
fix #362
2026-01-15 00:20:48 +13:00
Tom Wheeler
f124211bda fix(placeholders): improve date filtering UX/logic for general lists
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
2026-01-14 23:24:56 +13:00
Tom Wheeler
39c439bb80 feat(placeholders): add option to skip youtube trailer downloads
speeds up sync dramtically at cost of using generic coming soon video instead of trailer
2026-01-14 23:18:15 +13:00
Tom Wheeler
193833ce85 fix(trakt): add support for new app.trakt.tv urls 2026-01-14 23:09:47 +13:00
Weblate (bot)
460c8d2f1a Translations update from Hosted Weblate (#347)
* Translated using Weblate (French)

Currently translated at 99.3% (1423 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (Hungarian)

Currently translated at 99.8% (1430 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/hu/

* Translated using Weblate (French)

Currently translated at 99.4% (1424 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (French)

Currently translated at 99.4% (1424 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (Swedish)

Currently translated at 26.3% (377 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/sv/

* Translated using Weblate (French)

Currently translated at 99.6% (1427 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (French)

Currently translated at 99.8% (1430 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (Hungarian)

Currently translated at 99.9% (1431 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/hu/

---------

Co-authored-by: Sulli <susu.leduc@gmail.com>
Co-authored-by: Koch Norbert <kochnorbert@icloud.com>
Co-authored-by: Hannes Brolin Lagerstedt <mainhannes@gmail.com>
2026-01-14 11:41:32 +13:00
Tom Wheeler
030c928844 fix(mdblist): fix mdblist for multi-source collections
fix #299
2026-01-14 11:39:06 +13:00
bitr8
01f94d5c1f feat(imdb): add Top 250 English Movies collection type (#358)
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

Closes agregarr/agregarr#330

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-01-14 10:19:36 +13:00
bitr8
be53722678 fix(posters): validate SVG icon dimensions and file type (#350)
Validates SVG dimensions before scale calculation to prevent division
by zero. Warns when non-SVG files passed with hint about required format.

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-01-14 10:18:07 +13:00
bitr8
287befaa50 fix(plex): handle 404 gracefully when deleting hub items (#356)
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>
2026-01-14 10:16:50 +13:00
bitr8
bcda04dc64 fix(scheduler): startNow immediate sync and deadlock bugs (#348)
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>
2026-01-14 10:16:02 +13:00
Tom Wheeler
11cc3609e7 chore(user-settings): remove redundant {user} api call
fix #352
2026-01-14 10:12:46 +13:00
Tom Wheeler
cac92296ed chore(internationalisation): extract literal strings into message defintions for i18n 2026-01-14 09:55:35 +13:00
Tom Wheeler
e8b40272e1 fix(missing-item-filter): change from include to exclude when ratings return null/undefined 2026-01-12 11:33:06 +13:00
Tom Wheeler
3f49633027 fix(placeholders): add youtube-cookies.txt setup feedback
in both Settings -> Downloads, and in config form when placeholders is selected
2026-01-12 11:29:31 +13:00
Tom Wheeler
b3f0a1e561 feat(overlays): add certified fresh overlay support, with preset
fix #346
2026-01-12 10:57:05 +13:00
Tom Wheeler
30ab2fc472 fix(overlays): add runtime HHMM (eg 2h 16m)
fix #301
2026-01-12 10:52:39 +13:00
Tom Wheeler
b02e767e9a fix(item-ordering): fix original plex order overriding source order
re #225
2026-01-12 10:20:41 +13:00
Tom Wheeler
b381e419e6 fix(placeholders): update to new library specific path 2026-01-11 22:31:24 +13:00
bitr8
a4e6ebaecd fix(api): Sanitize error responses to prevent information disclosure (#282)
* fix(api): Sanitize error responses to prevent information disclosure

Add error response sanitization to prevent internal implementation details
from leaking to clients in production:

- New errorResponse.ts utility with whitelist-based message filtering
- Safe message patterns allow user-friendly errors through
- Sensitive patterns block stack traces, file paths, credentials, IPs
- Development mode bypasses sanitization for debugging
- Updated global error handler to use sanitization

This prevents information disclosure while maintaining helpful error
messages for common user-facing issues like "not found" or "invalid".

* style: Fix prettier formatting

* ci: trigger rebuild

* fix(types): Add missing type parameters for Record and Set

- Add <string, string> to Record type declarations for mimeTypeMap
- Add <string> to Set constructor for assetPaths

Fixes TypeScript errors in CI.

* style: format with prettier

---------

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-01-11 22:24:06 +13:00
bitr8
7c6ff6b030 fix(security): harden API clients and file operations (#300)
- overseerr.ts: Redact credentials in error logs (whitelist headers,
  sanitize URL query params, try/catch stringify with pre-truncation)
- externalapi.ts: Add catch handler to rolling cache background refresh
- animeIds.ts: Add 30s timeout and 50MB size limit with streaming
- MultiSourceOrchestrator.ts: Validate sources array before cycle_lists
- LocalPosterFolderService.ts: Validate poster downloads (size, status, type)
- placeholderManager.ts: Prevent path traversal with realpath validation

Reviewed by Codex - addresses credential leakage, unhandled rejections,
resource exhaustion, division by zero, and directory traversal vectors.

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-01-11 22:22:38 +13:00
bitr8
452a2be4a9 fix(placeholders): trigger Plex scan and empty trash after cleanup (#332)
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>
2026-01-11 22:20:25 +13:00
Weblate (bot)
82599a4add Translations update from Hosted Weblate (#335)
* Translated using Weblate (French)

Currently translated at 99.3% (1423 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (Hungarian)

Currently translated at 99.8% (1430 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/hu/

* Translated using Weblate (French)

Currently translated at 99.4% (1424 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (French)

Currently translated at 99.4% (1424 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

* Translated using Weblate (Swedish)

Currently translated at 26.3% (377 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/sv/

* Translated using Weblate (French)

Currently translated at 99.6% (1427 of 1432 strings)

Translation: agregarr/Agregarr Frontend
Translate-URL: https://hosted.weblate.org/projects/agregarr/agregarr-frontend/fr/

---------

Co-authored-by: Sulli <susu.leduc@gmail.com>
Co-authored-by: Koch Norbert <kochnorbert@icloud.com>
Co-authored-by: Hannes Brolin Lagerstedt <mainhannes@gmail.com>
2026-01-11 22:18:33 +13:00
bitr8
5806bbc549 fix(placeholders): handle Jellyfin trickplay directories during cleanup (#340)
* fix: skip directories when cleaning orphaned placeholder files

Jellyfin creates .trickplay directories with the same base name as video
files. The cleanup scan matched these directories because they contain
{edition-Trailer} in the path, then failed with EISDIR when attempting
fs.unlink() on them.

Added a stat check to skip non-file entries during orphaned file cleanup.

* fix: remove trickplay directories when deleting placeholders

When Jellyfin scans placeholder videos, it creates .trickplay directories
for video thumbnail scrubbing. These become orphaned when the placeholder
is deleted.

Now removePlaceholder() cleans up the associated .trickplay directory
using fs.rm() with recursive option.

---------

Co-authored-by: bitr8 <bitr8@users.noreply.github.com>
2026-01-11 22:18:11 +13:00
bitr8
5150bc790d fix: multi-source label regex for collection matching (#345)
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>
2026-01-11 22:16:57 +13:00
Tom Wheeler
d56d213d98 fix(custom-lists): refactor validation to include SSE messaging. fix fetch title for imdb
fix #344
2026-01-11 22:14:34 +13:00
Tom Wheeler
d9c6e2f7f8 fix(imdb): add watchlist support
fix #343
2026-01-11 22:13:34 +13:00
Tom Wheeler
459b9e339e fix(imdb): add AWS WAF challenge solver, fixing all IMDb lists
adds headless chromium to solve challenge. recent changes to IMDb require this, all lists return
zero items otherwise.
2026-01-11 18:01:01 +13:00
Tom Wheeler
dcfa611d70 chore(github-actions): cleanup old digests on oracle VM 2026-01-11 16:24:13 +13:00
Tom Wheeler
7cc440d9d5 chore(github-actions): add ghcr permissions 2026-01-11 15:59:47 +13:00
Tom Wheeler
14d220d869 chore(github-actions): update to use ghcr for builds
avoiding docker hub pull rate limits. remove concurrency check
2026-01-11 14:57:12 +13:00
Tom Wheeler
1d3e0ad35d chore(readme): update PlexAniBridge link 2026-01-11 14:53:59 +13:00
Tom Wheeler
aadcbf4a53 fix(collections): fixes incorrect ratingKey being saved when editing linked configs
re #120
2026-01-11 13:43:52 +13:00
Tom Wheeler
9cdad9f65d chore(github-actions): add concurrency control to develop build
prevent rate limiting for docker multi-arch builds when multiple commits pushed in quick succession
2026-01-11 10:46:51 +13:00
grokdesigns
7b2187108d fix(rt-ratings): add roman numeral search support (#334)
* Add Roman Numeral Support
2026-01-11 08:12:48 +13:00
Tom Wheeler
5e33c6167d fix(item-ordering): add A-Z and Z-A sort order options
fix #341
2026-01-11 08:08:17 +13:00
Tom Wheeler
44e6c163f9 fix(letterboxd): add support for /{user}/films/ URL's
fix #311
2026-01-11 08:06:27 +13:00
Tom Wheeler
1c21a0e7b2 feat(sort-order): add release date and date added to plex as sort order options
also refactors overseerrSync to use Plex Lookup

fix #187, fix #203
2026-01-11 07:42:34 +13:00
Tom Wheeler
da1095f947 fix(overlays): add networks context
fix #286
2026-01-10 12:12:35 +13:00
Tom Wheeler
8073c3418c fix(plex-libraries): fixes non-movie/show libraries being discovered inconsistently
fix #255
2026-01-10 00:47:24 +13:00
Tom Wheeler
3aadbf0b44 feat(overlays): add Plex User Rating condition/variable
fix #254
2026-01-09 23:36:12 +13:00