Jump to content

Aperture - AI-Powered Recommendations for Emby


Recommended Posts

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
TheGru
Posted
4 hours ago, TheGru said:

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

I am almost done, wrote some google translate scripts and i18n have made this a bit less painful... without Cursor and composer 2 fast for help I would not have ever done this.

TheGru
Posted
10 minutes ago, TheGru said:

I am almost done, wrote some google translate scripts and i18n have made this a bit less painful... without Cursor and composer 2 fast for help I would not have ever done this.

3090 hardcoded english strings

TheGru
Posted (edited)

Aperture v0.7.5 Release Notes

This release expands Discovery with JustWatch streaming charts, configurable TMDb genre strips (including exclude genres and flexible year ranges), a clearer Movies / TV browse layout, and multilingual UI improvements.


At a glance

Theme What shipped
Discovery browse layout On Movies and TV Series, sub-tabs separate TMDb popular overall (AI pool, filters, refresh) from Popular by genre (admin-configured TMDb Discover strips). Choice is remembered in the browser.
Streaming discovery Discover → Streaming tab (when enabled): JustWatch-backed charts; admin can enable the feature and choose provider strips.
Genre strips (admin) Per-strip genres (AND), exclude genres, from / to year (including Today for a rolling end at the current calendar year), heading, origin country, max titles, drag reorder.
Multilingual UI Fourteen locales; RTL for Arabic and Hebrew. Deployment-wide language defaults under System settings.

Summary for users

Where to find things

What Where
AI discovery pool + filters + Refresh DiscoverMovies or TV Series → sub-tab TMDb popular overall
Horizontal genre strips DiscoverMovies or TV Series → sub-tab Popular by genre
Streaming charts DiscoverStreaming (only if your admin has enabled streaming discovery for the server)
Your UI language User settings (language / locale preferences in the app)

Grid/list view and Refresh apply to TMDb popular overall, not to the genre-strip sub-tab. Redundant info alerts about clicking titles were removed from Discovery tab content.


Summary for admins

Genre strips (TMDb Discover)

Path: Admin → Settings → Setup → Genre discovery (third sub-tab under Setup). TMDb must be configured; the tab is disabled until then.

Deep link (same page): /admin/settings?tab=setup&setupSub=genre-discovery

Configure Movies and TV sections separately. For each strip you can set:

  • Genres — multiple genres are combined with AND (TMDb with_genres).
  • Exclude genres — TMDb without_genres (e.g. Science Fiction but not Animation).
  • From year / To year — optional bounds on release date (movies) or first air date (TV). To year can be No end, Today (current year) (rolling end-of-year bound at fetch time), or a specific year.
  • Optional heading, origin country, and max titles per strip.
  • Drag strips to reorder; use the save control on a strip (or your workflow) to persist.

Streaming discovery (JustWatch)

Path: Admin → Settings → Setup → IntegrationsStreaming discovery block (enable flag, provider strip codes).

Deep link: /admin/settings?tab=setup&setupSub=integrations

The Discover → Streaming tab appears for users when streaming discovery is enabled for the deployment and their account has Discovery enabled.

Language defaults (deployment)

Path: Admin → Settings → SystemLanguage defaults (default UI language and default AI language for new users / server-side defaults where applicable).


Discovery – TMDb popular overall vs Popular by genre

  • TMDb popular overall — The personalized discovery pool: language/genre/year filters, Refresh, grid or list view, job progress when a discovery job runs.
  • Popular by genre — Read-only horizontal strips driven by admin Genre discovery configuration. Strips load as you scroll (lazy loading).

Discovery – Streaming (JustWatch)

Charts are backed by JustWatch GraphQL data with server-side caching. TMDb poster paths may be resolved and cached to reduce API load. Exact provider codes depend on region; the admin UI references the bundled provider list.


Multilingual UI and RTL

Aperture’s web UI is multilingual. Users can work in a supported language (including via browser language detection and stored preference). We do not guarantee completeness or accuracy of translations; no promises are made as to language quality.

Supported UI locales (14): English (en), Spanish (es), German (de), French (fr), Italian (it), Portuguese (pt), Dutch (nl), Russian (ru), Japanese (ja), Chinese (zh), Korean (ko), Hindi (hi), Arabic (ar), Hebrew (he).

Right-to-left (RTL): The layout uses RTL for Arabic and Hebrew so navigation and mirroring behave correctly for those locales.


Update instructions

For Docker users

docker compose pull
docker compose up -d

Apply database migrations per your process (pnpm db:migrate or automatic on startup, depending on deployment).

Operator checklist

  • Run migrations01100112 must apply before relying on streaming discovery or poster cache. Should happen automatically.
  • TMDb — Required for genre strips and for sensible Discover behavior.
  • Streaming discovery — Enable and configure provider strips under Setup → Integrations if you want the Streaming tab.
  • Genre strips — Configure under Setup → Genre discovery; use Discover → Popular by genre to verify.

Thank you for running Aperture and feeding back on Discovery and translations in real environments.

Edited by TheGru

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...