Jump to content

Aperture - AI-Powered Recommendations for Emby


Recommended Posts

DaMoekster
Posted

Is it feasible to run aperture on a raspberry pi 5?
I tried installing but get the error:Error response from daemon: no matching manifest for linux/arm64/v8 in the manifest list entries: no match for platform in manifest: not found.
Not being an expert on docker I'm not sure if this means a complete no or something has to be changed/added to get it working.

  • 2 weeks later...
farfetchedchild
Posted

Hey, 

First off, thank you for making this! It's been amazing! 

Now, I'm running Aperture in Docker on Windows (well, in Docker in WSL2 on Windows). I've got it working mostly ok, but when I try to analyze watch history I get an error. Also, when I try to auto detect paths I get "Unable to find media server files in Aperture's /media/ mount. Make sure your media folder is mounted at /media in Aperture's container." I have media libraries across multiple drives. Could this be the problem? They're all mounted, but I don't know of a way to enter them all as a path prefix (though I use STRM). 

Also, would it be possible to create virtual libraries (or playlists/collections) from user personalized Discovery recommendations for movies not in your libraries? From there Jellyseerr could be used either in the Emby client if on the web, or at the least by adding library items you don't to a watchlist monitored by Radarr or Sonarr. It'd be great to be able to request from Emby. 

TheGru
Posted
On 2/3/2026 at 3:51 AM, DaMoekster said:

Is it feasible to run aperture on a raspberry pi 5?
I tried installing but get the error:Error response from daemon: no matching manifest for linux/arm64/v8 in the manifest list entries: no match for platform in manifest: not found.
Not being an expert on docker I'm not sure if this means a complete no or something has to be changed/added to get it working.

I didn't build it against ARM and have been tied up with work. I will work on this at some point.

  • Thanks 1
DaMoekster
Posted
10 hours ago, TheGru said:

I didn't build it against ARM and have been tied up with work. I will work on this at some point.

Thanks and good luck with work!

SultanOfTux
Posted

Hi,

I disabled the "Enable Watching Libraries" option in the admin panel (see screenshot), but it's still displayed for regular users—only hidden for the admin account.

How can I disable it globally for all users?

Thanks!

image.thumb.png.ec86c67fcaf8100ad3585779a7902cf7.png

image.png.cd375b355313271531bc64807ee47e5b.png

olli1806
Posted

Hello everyone,

I urgently need help with the installation on my Synology NAS.
Unfortunately, I am not very familiar with Docker, so I am unable to complete the installation on my own.

Could someone please explain step by step how to set this up correctly on a Synology system, or point out what I need to pay special attention to?

Thank you very much in advance for your support.

Best regards
Oliver

SultanOfTux
Posted (edited)

This is my YAML,
 

But if yout want to Bind the Library Folders you have to add the Path to the Library. You should check the YAML from the Github Repo https://github.com/dgruhin-hrizn/aperture.

First you add all the Folders you need in volume1, then add a new Project in Containermanager, and start the Docker.

version: "3.7"
services:
aperture-db:
image: pgvector/pgvector:pg16
container_name: aperture-db
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: app
POSTGRES_DB: aperture
volumes:
- /volume1/docker/aperture/db:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U app -d aperture']
interval: 5s
timeout: 5s
retries: 5
restart: unless-stopped
 
aperture:
image: ghcr.io/dgruhin-hrizn/aperture:latest
container_name: aperture
user: root
ports:
- 3456:3456
environment:
NODE_ENV: production
DATABASE_URL: postgres://app:app@aperture-db:5432/aperture
RUN_MIGRATIONS_ON_START: 'true'
APP_BASE_URL: https://aperture.yourdomain.ch or IP
SESSION_SECRET: 'X7kP9mW3qR8tY2uV5nL6jH4fD1sA0eZ9bC2xM7nK3pQ4wE6rT8yU1iO5aN9vB2cL'
OPENROUTER_API_KEY: "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"
DISABLE_STRM_GENERATION: 'true'
DISABLE_EMBY_COLLECTIONS: 'true'
depends_on:
- aperture-db
volumes:
- /volume1/docker/emby/config:/emby-config:ro
- /volume1/docker/aperture/backups:/backups
restart: unless-stopped
Edited by SultanOfTux
gihayes
Posted

Any chance this might ever work for Emby running in Docker on Windows 11?

SultanOfTux
Posted

I think so, theres an extra windows docker compose on GitHub

  • Thanks 1
DaMoekster
Posted
1 hour ago, SultanOfTux said:

This is my YAML,
 

But if yout want to Bind the Library Folders you have to add the Path to the Library. You should check the YAML from the Github Repo https://github.com/dgruhin-hrizn/aperture.

First you add all the Folders you need in volume1, then add a new Project in Containermanager, and start the Docker.

version: "3.7"
services:
aperture-db:
image: pgvector/pgvector:pg16
container_name: aperture-db
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: app
POSTGRES_DB: aperture
volumes:
- /volume1/docker/aperture/db:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U app -d aperture']
interval: 5s
timeout: 5s
retries: 5
restart: unless-stopped
 
aperture:
image: ghcr.io/dgruhin-hrizn/aperture:latest
container_name: aperture
user: root
ports:
- 3456:3456
environment:
NODE_ENV: production
DATABASE_URL: postgres://app:app@aperture-db:5432/aperture
RUN_MIGRATIONS_ON_START: 'true'
APP_BASE_URL: https://aperture.yourdomain.ch or IP
SESSION_SECRET: 'X7kP9mW3qR8tY2uV5nL6jH4fD1sA0eZ9bC2xM7nK3pQ4wE6rT8yU1iO5aN9vB2cL'
OPENROUTER_API_KEY: "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"
DISABLE_STRM_GENERATION: 'true'
DISABLE_EMBY_COLLECTIONS: 'true'
depends_on:
- aperture-db
volumes:
- /volume1/docker/emby/config:/emby-config:ro
- /volume1/docker/aperture/backups:/backups
restart: unless-stopped

Your session secret and api key are visible. Did you change them first? Otherwise I would change these as soon as possible. 

SultanOfTux
Posted

Thank you but i have changed it before:)

  • 2 weeks later...
TheGru
Posted

Ok I am just about in a place where I can jump back in on Aperture, stay tuned!

  • Like 1
  • Thanks 3
Jdiesel
Posted

I've had some time to play around with the new home screen sections a bit over the past few weeks and found that a mix of views using tags and playlists work best.

For things like Trakt and MdbList tags work best as they are universal and are the same across all users. Also list ordering is less critical as most people, I suspect, will want some variability in what they see on the list and not just the top 10 over and over. I've been using the AutoTag plugin for this.

For user specific recommendations and server specific popular/trending lists, playlists are the way to go. The ordering is more important in this case and there is no way to define the order when using tags other than the title, release date, added on, etc.

I don't know that there is a way to create home section via the API yet. You can copy setting manually between users though. This might be a barrier to making things completely seem less. I personally don't mind setting things up once as long as the tags and playlists continue to update.

 

TheGru
Posted
On 3/2/2026 at 12:44 PM, Jdiesel said:

I've had some time to play around with the new home screen sections a bit over the past few weeks and found that a mix of views using tags and playlists work best.

For things like Trakt and MdbList tags work best as they are universal and are the same across all users. Also list ordering is less critical as most people, I suspect, will want some variability in what they see on the list and not just the top 10 over and over. I've been using the AutoTag plugin for this.

For user specific recommendations and server specific popular/trending lists, playlists are the way to go. The ordering is more important in this case and there is no way to define the order when using tags other than the title, release date, added on, etc.

I don't know that there is a way to create home section via the API yet. You can copy setting manually between users though. This might be a barrier to making things completely seem less. I personally don't mind setting things up once as long as the tags and playlists continue to update.

 

I setup my homescreen and then quickly copied the setting to all other users, so far no complaints. One additional setting is apparently incoming on an upcoming beta, where individual dynamic rows can either hide or show played items. For me this completes things as you can build a pseudo DVR home row for shows or episodes now that are your shows you can about via aperture or just favorites, and hide watched, while still allowing watched to show for other rows where hiding things would potentially break Top Pick ordering and numbered display. I am looking forward to that. Then I will jump back in on aperture updates and upgrades based on user feedback

  • Like 2
graytinc
Posted

image.thumb.png.044d56214119e5791c168bb5cf2d0c19.png

How do I permanently fix that (Missing posters)

fabien_m2002
Posted

Hello

i have an Gemini AI sub but when i set my API ket and test, i have this error. What's wrong?

Connection failed: models/text-embedding-004 is not found for API version v1beta, or is not supported for embedContent. Call ListModels to see the list of available models and their supported methods

  • Agree 1
sayschia
Posted

Hi, thank you for developing this. It is working perfectly!
Is it possible to change  the AI explanation language to german?

akacharos
Posted

Well, in case you TheGru run out of ideas when you jump back into further development of  existing features in Aperture, here is just some feedback and ideas which are merely suggestions:

  • I mentioned this earlier:
  • Create Collections the same way we can create custom recommendation playlists with genres and example movies. Given the new revamped home logic in Emby, Collections are back in fashion! With that being a permission, admins can grant Collection creation to non-admins in Emby.If that's not technically possible, at least let admins create Collections.
  • Add "Favorites" functionality in Aperture while browsing items that syncs to Emby (when you add an item to Favorites in Aperture, is also added to Favorites in Emby".
  • Align Graph and List Similar Movies items: Currently Graph has more items than in the List (more of a bug maybe?). Also personal preference would be to have the List as the default instead of Graph or maybe make the default a configuration option. And maybe the List view can also benefit from the relation data (eg. Same Director, Shared Actor etc.).
  • More filters in Browse (eg. country, watched/unwatched, household reach)
  • Add Person (next to Movies and Series). Given /person endpoint exists already, it's a same not to easily browse/search for it.
     
akacharos
Posted

And a minor api endpoint modification request: pass user id on /api/assistant/chat
When calling /api/assistant/chat,  there is no way to specify which user the request is on behalf of. All calls made with a single service API key are attributed to the key owner, making it impossible to maintain per-user context (recommendations, history, preferences).
I believe is due to const user = request.user as SessionUser (API key owner) and const { messages } = request.body  (no userId accepted).

On a high level, it would be something like this on src/routes/assistant/handlers/chat.ts 
 

// NOW:
interface ChatBody {
  messages: UIMessage[]
  system?: string
}

// AFTER Add userId? to the body interface:
interface ChatBody {
  messages: UIMessage[]
  system?: string
  userId?: string  // optional override from external system
}

  
  
// NOW:
const user = request.user as SessionUser
const { messages } = request.body

// AFTER Resolve the effective user right after const user = ...:
const user = request.user as SessionUser
const { messages, userId: requestedUserId } = request.body
const effectiveUserId = requestedUserId ?? user.id
// ?? means: use requestedUserId if provided, otherwise fall back to user.id




// NOW:
const systemPrompt = await buildSystemPrompt(user.id, user.isAdmin)
const toolContext = {
    userId: user.id,
    ...
}

// AFTER  Replace the two occurrences of user.id downstream:
const systemPrompt = await buildSystemPrompt(effectiveUserId, user.isAdmin)
const toolContext = {
    userId: effectiveUserId,  // ← this is what scopes recommendations/history to the right user
    ...
}

 

  • Like 1
  • 3 weeks later...
Iceburnmarko
Posted

Read through all the comments , first what an excellent plug-in…. One thing I was thinking, could it be possible to add “JustWatch api” into it.  Thinking to capture what ppl watched / like / hate outside of emby.

TheGru
Posted

Aperture v0.7.0 Release Notes

Hey everyone I'm back!!!!

This one is almost entirely feedback from the comments while I have been busy working on the stuff that pays the bills.

This release is a big step for people and discovery: Browse → People, credits gap (GAP) on person pages, richer browse filters, and full Seerr integration improvements. Shows You Watch now syncs with Emby/Jellyfin series favorites instead of building STRM files or virtual libraries—see Breaking changes for what to change on your media server.

Baseline: follows v0.6.5 (commit f97f574). Commit range: f97f574..6893d05 (13 commits).


At a glance

Theme What shipped
People & credits gap (GAP) GAP = TMDb filmography titles not in your library, grouped by role and media type; person browse, discover APIs (getPersonCreditsGap), filters, TMDb detail modals, profile cache, actor personId linking
Browse Country, watch status, watcher reach filters; preset save/load; countries list endpoints; view mode persistence
Seerr User ↔ Seerr mapping, attributed requests, My Requests, rename Jellyseerr → Seerr, settings and migrations
Shows You Watch Bidirectional favorites sync; scheduled sync-watching-favorites job; removal of STRM/virtual-library pipeline and sync-watching-libraries
Quality SQL fix for movie resolution filter; carousel alignment fix

Summary for users

  • Browse has a People tab: open people like titles, with grid/list view modes remembered per area.
  • People GAP (credits gap): on each person page, Aperture compares TMDb combined credits to your library and shows what’s missinggrouped by movie vs TV and by role (e.g. director vs actor), with filters. Open a TMDb detail modal from gap rows (backdrop, metadata, request flow where applicable).
  • Movies and series lists support country, watch status (via your history), and watcher reach (how many users on this instance have watched an item), plus saved filter presets.
  • Seerr: requests can map to your Seerr user; My Requests and clearer Seerr naming (replacing “Jellyseerr” in the product).
  • Shows You Watch stays a list in Aperture but syncs with series favorites on the server. Remove old watching virtual libraries in Emby and use a Home row (see below).

🎭 People & credits gap (GAP)

What GAP is

For a given person (actor, director, writer, etc.), GAP is the set of TMDb-credited movies and TV shows that do not map to an item in your Aperture-managed library—“on TMDb but not in your server’s library.” It answers: what am I missing from this person’s filmography?

How it works

  • Core: getPersonCreditsGap loads combined TMDb credits (cached via person_tmdb_profile_cache), compares to catalog coverage, and returns role-grouped missing titles (f4cc40c).
  • API: Discover routes expose the credits gap payload (with person browse, portrait push, TMDb movie/TV detail) using Zod schemas (1211fe6).
  • Web: Person page: missing credits grouped by media type and role, filters, TMDb detail modals (cb83c66). MediaPosterCard compact meta for dense rows (d0904e3).

Technical summary

  • Migration: person_tmdb_profile_cache for TMDb profile images and combined credits.
  • Helpers: listPeopleForBrowse, getPersonCreditsGap (GAP engine), findPersonMediaServerItemId for portrait push; getTVCredits / getTVExternalIds exported.
  • Media server sync: personId on Emby/Jellyfin actor sync for TMDb linking.
  • Browse → People: TMDb-backed grid, fallbacks, browsePeople + useViewMode (044b636).
  • UI: Carousel align-items: flex-start for mixed-height poster rows (2bc5ba2).

🔎 Browse filters (movies & series)

API (59e5b01😞 Query params country, watchStatus, minWatchers, maxWatchers on movie and series lists; GET /api/movies/countries and GET /api/series/countries. Watch status uses watch_history; watcher reach uses distinct user counts on the instance.

Web (961cd33😞 FilterPopper — production countries, watch status toggles, min/max watchers; wired to Browse fetch, chips, and preset save/load.


📺 Seerr (formerly “Jellyseerr” in-product)

  • User mapping to Seerr user ids (email / username / Jellyfin match, admin override).
  • Settings: optional seerr_require_user_mapping; migrations for seerr_user_id and 0104_rename_jellyseerr_to_seerr.
  • API: /api/seerrPOST /api/seerr/request with userId; GET /api/seerr/requests; admin PUT for seerrUserId on users.
  • Web: My Requests, navigation and settings renamed for Seerr.
  • Core: seerr module, userMapping, listAllSeerrUsers; docs/OpenAPI updated.

⚠️ Breaking changes: Shows You Watch STRM / virtual libraries

Aperture no longer:

  • Writes STRM files, symlinks, or NFOs for Shows You Watch.
  • Creates or updates Emby/Jellyfin virtual libraries for per-user watching output.
  • Exposes sync-watching-libraries, STRM vs symlink settings, or the library cover image admin block for that virtual library.

Database: strm_libraries rows with library_type = 'watching' and watching_library_use_symlinks are removed by migration (see Database migrations).

Emby / Jellyfin: recommended Home screen row

  • Remove the old virtual folder / library that pointed at Aperture’s watching output, and clean up aperture-watching (or similar) on disk if present.
  • Add a Home row with Dynamic Content:

    Libraries: all TV Series libraries you use.

    Sort: Date last content added (wording may vary by server version).

    Sort order: Descending.

    Playstate: Unplayed.

    Favorite: Enabled.

That surfaces favorited, unplayed series aligned with server favorites instead of a synthetic library.

What stays in Aperture

  • user_watching_series and /api/watching CRUD.
  • Favorites reconcile (reconcileWatchingFavoritesForUser).
  • POST /api/watching/refresh — reconcile only (skipped, reason, pushedToServer, removedFromDb, pulledIntoDb, pushErrors).
  • Job sync-watching-favorites; web Shows You Watch with Sync favorites.

🐛 Bug fixes

  • Movies — resolution filter (b92cdf1😞 resolution counts use a subquery so GROUP BY stays valid when filtering by resolution.

🗄️ Database migrations

Run your usual migration command so these apply in order:

Migration Purpose
0101_person_tmdb_profile_cache.sql TMDb person profile / credits cache
0102_users_jellyseerr_user_id.sql Seerr user id on users
0103_jellyseerr_require_user_mapping.sql Optional require-mapping flag
0104_rename_jellyseerr_to_seerr.sql Rename identifiers and system_settings keys to Seerr
0105_remove_watching_strm_libraries.sql Remove watching strm_libraries rows and watching_library_use_symlinks

(If some migrations already ran before you tag 0.7.0, confirm db/migrations state for your environment.)


🚀 Update instructions

For Docker users

docker compose pull
docker compose up -d

Database migrations run on startup (or use your usual pnpm db:migrate / deployment process).

Operator checklist

  • Migrate the database before API/web versions that need new columns and caches.
  • Emby: remove old watching virtual libraries and configure the Home row above if you used STRM watching.
  • Seerr: confirm URL/API keys and user mapping; set admin seerrUserId overrides when auto-match fails.
  • Jobs: schedule sync-watching-favorites; remove any references to sync-watching-libraries.

📋 API quick reference

  • Browse filters: country, watchStatus, minWatchers, maxWatchers; GET /api/movies/countries, GET /api/series/countries.
  • Discover (people): browse; credits gap (GAP); portrait push; TMDb movie/TV detail (see OpenAPI under discover).
  • Watching: POST /api/watching/refresh — favorites reconcile (no written / libraryCreated).
  • Seerr: /api/seerr/* — request, requests list, user mapping admin.

📋 Full changelog (commits since v0.6.5)

f4cc40c feat(core): TMDb person cache, people browse, credits gap, portrait helpers
b92cdf1 fix(api): movie resolutions filter after GROUP BY
1211fe6 feat(api): discover person routes and TMDb movie/TV detail
2bc5ba2 fix(ui): align carousel items to flex-start
d0904e3 feat(web): MediaPosterCard compact meta layout
044b636 feat(web): browse people tab and view mode persistence
cb83c66 feat(web): person page credits gap, filters, TMDb detail modal
59e5b01 feat(api): browse filters — country, watch status, watcher reach
961cd33 feat(web): browse filter UI for country, audience, and presets
10c58ed feat(seerr): attribute requests to users, My Requests, rename Jellyseerr to Seerr
764f9ec feat(watching): sync Shows you watch with Emby/Jellyfin favorites
db84e48 feat(jobs): add sync-watching-favorites as separate scheduled job
6893d05 Remove Shows You Watch STRM libraries; keep favorites sync
  • Like 3
TheGru
Posted
On 4/2/2026 at 10:32 AM, Iceburnmarko said:

Read through all the comments , first what an excellent plug-in…. One thing I was thinking, could it be possible to add “JustWatch api” into it.  Thinking to capture what ppl watched / like / hate outside of emby.

Unfortunately that api is very expensive

TheGru
Posted

Aperture v0.7.1 Release Notes

This release introduces Movie Collection Gap Analysis — a new admin tool that compares TMDb movie collections against your library to surface missing titles — plus Seerr request options so you can pick your Radarr/Sonarr server, quality profile, and root folder before submitting a request.

Baseline: follows v0.7.0 (commit 6893d05). Commit range: 6893d05..94337ae (8 commits).


At a glance

Theme What shipped
Gap Analysis Admin page comparing TMDb collections to your library; background scan persists all parts with library + Seerr status; collection-level sort & filter; movie detail modal with in-app Seerr requests
TMDb Collection Cache Persistent tmdb_collection_cache table avoids repeated TMDb API calls for the same collection data
Seerr Request Options Choose Radarr/Sonarr server, root folder, quality profile, and language profile before submitting requests — wired into Discovery, Person Detail, Top Picks, My Requests, and Gap Analysis

Summary for users

  • Gap Analysis is available in left nav menu under Admin → Gap Analysis. Run a scan, and Aperture fetches every TMDb movie collection referenced by your library, then shows which titles you own, which are already in Seerr's pipeline, and which are still missing.
  • Sort collections by most missing, most complete, or name. Filter by minimum missing count with a slider to focus on the biggest gaps.
  • Click any poster to open a detail modal with backdrop, metadata, and a Request via Seerr button — no need to leave Aperture.
  • Request options dialog — when requesting through Seerr from anywhere in Aperture, you now pick the destination server, root folder, and quality profile. Bulk requests (select all missing in a collection, or multi-select across collections) go through the same flow.

🔍 Movie Collection Gap Analysis

What it is

For every movie in your library that belongs to a TMDb collection (e.g. The Dark Knight Collection, Alien Collection), Aperture fetches the full collection and checks which released parts you own, which are in Seerr (requested/processing/available), and which are missing. Collections where all missing parts are already covered by Seerr are hidden entirely.

How it works

  • Background scan (refresh-library-gaps job): fetches TMDb collection data (cached in tmdb_collection_cache), cross-references your library and Seerr, and persists every released part with in_library and seerr_status into gap_analysis_results.
  • Display path is pure SQL — zero Seerr or TMDb HTTP calls at page-load time. Fast even with hundreds of collections.
  • UI groups results into collapsible collection cards with a responsive MoviePoster grid. Status overlays show "In Library", "Requested", "Processing", etc.

Key features

  • Collection-level sort: Most missing, Most complete, Name A–Z.
  • Min-missing slider: hide collections with fewer than N missing titles.
  • Search: filter by title or collection name.
  • Bulk select + request: select individual posters or all missing in a collection, then request via Seerr with your chosen options.
  • Detail modal: click any poster to see the TMDb detail view with backdrop, cast, overview, and request button.

Technical summary

  • Core module: packages/core/src/gap-analysis/index.tsrunLibraryGapAnalysis, getGapCollectionSummaries, listGapResults, getGapCollectionParts (all pure SQL reads).
  • TMDb cache: packages/core/src/tmdb/collection-cache.tsupsertCollectionCache, getCachedCollectionDataBatch, fetchCollectionDataAndCache.
  • API routes: apps/api/src/routes/gap-analysis/index.tsGET /latest, GET /results, GET /collection-parts, POST /refresh, POST /request.
  • Job: refresh-library-gaps registered in jobConfig and wired in the executor.

🎛️ Seerr Request Options

When submitting a request through Seerr, a new RequestSeerrOptionsDialog lets you choose:

  • Server (Radarr or Sonarr instance)
  • Root folder
  • Quality profile
  • Language profile (Sonarr)

The dialog is wired into every request flow: Discovery cards/list items, Person Detail gap rows, Top Picks preview, My Requests, and Gap Analysis. The Seerr provider now exposes listRadarrServers, getRadarrServerDetails, listSonarrServers, getSonarrServerDetails, and batchGetMediaStatus.


🗄️ Database migrations

Run your usual migration command so these apply in order:

Migration Purpose
0106_gap_analysis.sql gap_analysis_runs and gap_analysis_results tables; source column on discovery_requests
0107_tmdb_collection_cache.sql tmdb_collection_cache table for persistent TMDb collection data
0108_gap_results_status.sql in_library and seerr_status columns on gap_analysis_results; wipes prior runs due to schema change

🚀 Update instructions

For Docker users

docker compose pull
docker compose up -d

Database migrations run on startup (or use your usual pnpm db:migrate / deployment process).

Operator checklist

  • Migrate the database — the three new migrations must apply before starting the updated API.
  • TMDb API key must be configured (Admin → Settings) for gap analysis to work.
  • Seerr must be configured and enabled for the request flow. Without Seerr, gap analysis still shows owned vs missing but the request buttons are disabled.
  • Run an analysis — go to Admin → Gap Analysis and click "Run analysis" to populate the initial snapshot. Re-run after syncing new movies.

📋 API quick reference

  • Gap Analysis: GET /api/admin/gap-analysis/latest, GET /api/admin/gap-analysis/results, GET /api/admin/gap-analysis/collection-parts, POST /api/admin/gap-analysis/refresh, POST /api/admin/gap-analysis/request.
  • Seerr services: GET /api/seerr/radarr, GET /api/seerr/radarr/:serverId, GET /api/seerr/sonarr, GET /api/seerr/sonarr/:serverId.
  • Batch status: POST /api/seerr/batch-status.

📋 Full changelog (commits since v0.7.0)

eef6397 feat(seerr): add Radarr/Sonarr request options and batch media status
abea84a feat(tmdb): add persistent collection cache and helper types
952acdb feat(core): add gap analysis engine with pre-computed Seerr status
2f55407 feat(api): add gap analysis REST routes and background job executor
03b275d feat(web): add Gap Analysis admin page with detail modal
12d4676 docs: add gap analysis section to admin guide and API reference
94337ae feat(web): replace row-level sort with collection sort and min-missing filter
TheGru
Posted

Good lord making this thing multi-language is a huge pain in the ass!

  • Haha 2

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...