Jump to content

Aperture - AI-Powered Recommendations for Emby


Recommended Posts

TheGru
Posted

ok I have embeddings working on Ollama on my Mac Studio M4 Max, using the Nomic Embed

image.thumb.png.201556cb146b5689859d6f2b9fbaaa1d.png

TheGru
Posted

Chat with tool calling using Ollama Qwen 3.

Other models would not play nice either due to improper tool function calling or because my machine can't run the model.

image.thumb.png.4675ea93e7b6076429c1388e7a3bf1e3.png

TheGru
Posted (edited)

Well it's cooking through my episodes right now creating embeddings

image.thumb.png.d2c9235a082f51f144d8a3f6c6aa7ce1.png

Aperture will now save embedding sets for easy switching between providers/models.

image.thumb.png.4c3bfd99ba2daa5ec039d93bcde7c177.png

Edited by TheGru
  • Like 2
TheGru
Posted
55 minutes ago, FlameRed said:

Got it. 

It is amazing that you developed this in just a couple of week. Unbelievable! 

Just a humble suggestion for some distant future release. For me, it would be so useful to have AI recommendations of new content that might be out there that I don't know even exists that might be something I like. Even just as a separate category that list them so I could consider and pull myself. 

But now I understand the intent better. 

Built in 5 days! I am sure I could come up with a way to surface suggestions for things your don't have but I would want to provide a means to add it, so maybe a connection to Jellyseer/Seer as a bridge to the Arrs

TeamB
Posted

15ms for embedding sounds ok-ish.

I have all my systems set up locally with no remote access and have no password on my emby users. It looks like you block login with users with no passwords.

 

 

 

TheGru
Posted
1 minute ago, TeamB said:

15ms for embedding sounds ok-ish.

I have all my systems set up locally with no remote access and have no password on my emby users. It looks like you block login with users with no passwords.

 

 

 

I do currently, as I had not considered that use case... let me think about a solution.

TheGru
Posted

Aperture v0.4.6 Release Notes

Hey everyone! 👋

This release introduces the Discovery feature (thanks to @FlameRed for the idea!)— AI-powered suggestions for content not in your library — plus full Jellyseerr/Seer integration for requesting missing content. If you've ever wanted Aperture to help you find your next favorite movie or series that you don't already own, this update is for you!


🔭 Discovery Feature

What It Does

Discovery analyzes your watch history and ratings, then suggests movies and TV series you might love but don't have in your library yet. It pulls candidates from multiple sources and ranks them using AI scoring.

Candidate Sources

TMDb:

  • Recommendations — Based on content you've watched recently
  • Similar Titles — Based on content you've rated highly
  • Discover — Popular/trending content meeting quality thresholds

Trakt:

  • Trending — Currently hot content
  • Popular — All-time popular content
  • Recommendations — Personalized Trakt picks (if user has linked Trakt account)

AI Scoring

Each candidate is scored with weighted factors:

  • Similarity Score (50%) — How well it matches your taste profile
  • Popularity Score (30%) — General audience popularity
  • Recency Score (20%) — Bonus for newer releases

Final results are ranked and cached per user.

Discovery Page

Navigate to Discovery from the sidebar to see your personalized suggestions:

  • Movie/Series tabs — Switch between content types
  • Ranked cards — Mirrors the Emby Rank Style Now!
  • Source badges — See where each suggestion came from
  • Match percentage — AI confidence in the recommendation
  • Manual refresh — Regenerate suggestions on demand

Detail Popper

Click the info icon on any card to see:

  • Fanart backdrop — Beautiful full-width backdrop image
  • Full metadata — Year, runtime, rating, vote count
  • Cast & Crew — Top 8 cast members with photos, clickable links to person pages
  • Director/Creator — Clickable links to director pages
  • Score breakdown — AI match and similarity scores
  • Original title — For international content

image.thumb.png.5a9d97e8f992976aae987add3e4f18af.png

image.thumb.png.5750c8b990e45fc57b3e4b8894c4a950.png

Already Requested and ability to Request!!!

image.png.7f60b828290108d8432499e7ab16da85.png.               image.png.f620c6e3258d38519399bda1080f3960.png

 


🎬 Jellyseerr/Seerr Integration

Request Missing Content

Found something in Discovery you want? Request it directly from Aperture!

Configuration

Navigate to Admin → Settings → Integrations to configure:

  • Jellyseerr URL — Your Jellyseerr instance URL
  • API Key — Get from Jellyseerr → Settings → General
  • Enable toggle — Turn request capability on/off

User Permissions

Control who can request content in Admin → Users:

  • Discovery Enabled — User can see Discovery suggestions
  • Request Enabled — User can submit requests to Jellyseerr

If Discovery is disabled for a user, requests are automatically disabled too.

Request Status

  • Pending — Request submitted, awaiting approval
  • Approved — Admin approved the request
  • Declined — Admin declined the request
  • Available — Content has been downloaded and is ready

Request status is shown on Discovery cards with visual badges.

image.thumb.png.430421a41160743ae88b48f501cc1044.png


📅 Discovery Background Job

generate-discovery-suggestions

A new daily job generates discovery suggestions for all enabled users:

  • Default schedule: Daily at 6:00 AM
  • Per-user generation — Each user gets personalized results
  • Statistics tracking — Candidates fetched, filtered, scored, stored
  • Run history — Track when suggestions were last updated

Prerequisites Check

The job shows a warning if prerequisites aren't met:

  • Jellyseerr must be configured (for request functionality)
  • At least one user must have Discovery enabled

image.thumb.png.492fbc74ab888181e34fb2a994df0dd7.png

image.thumb.png.4f7fee2a2e8f31cb46bb58175e211a61.png

 

 


🔓 Passwordless Login

For Media Servers Without Passwords

Some Emby/Jellyfin servers don't require passwords. Aperture now supports this (Thanks @TeamB!):

Configuration

Enable in Admin → Settings → Media Server → Security Settings or during initial setup wizard:

  • Toggle "Allow passwordless login"
  • Users can then log in with just their username

Login Page Behavior

  • Password field shows "(optional)" when passwordless is enabled
  • Helper text explains the configuration
  • Submit button enabled with just username

image.png.6381136957f8b51402fb9adee353db84.png


👥 Enhanced User Management

New User Permissions

Two new toggles on the Users page:

  • Discovery (🔭) — Enable/disable Discovery suggestions
  • Requests (📤) — Enable/disable Jellyseerr requests

User Detail Page

The individual user settings page now includes:

  • Discovery toggle with description
  • Request toggle with description (only shown when Discovery is enabled)

image.thumb.png.09ee44e20645727676c3fbb726ab8eba.png

image.thumb.png.d4be62ba5be6c047df9bbfbede528887.png


🎨 UI Improvements

Discovery Cards

Beautiful card design with:

  • Poster image with fallback
  • Rank badge (top-left)
  • Source chip (top-right)
  • Match percentage (bottom-right)
  • Request status badge (bottom-left when applicable)
  • Hover overlay with request button

🔧 Technical Details

New Database Tables

discovery_runs — Track job executions per user

  • Run statistics (fetched, filtered, scored, stored)
  • Duration tracking
  • Status (running, completed, failed)

discovery_candidates — Cached recommendations

  • Full metadata (title, year, poster, backdrop, genres, etc.)
  • Cast & crew info for detail popper
  • Score breakdown
  • Source tracking

discovery_requests — Track Jellyseerr submissions

  • Request status
  • Jellyseerr request/media IDs
  • Link to discovery candidate

New Migrations

  • 0080_discovery_feature.sql — Main tables and user columns
  • 0081_discovery_imdb_id.sql — IMDb ID for direct linking
  • 0082_discovery_cast.sql — Cast/crew metadata columns

New API Endpoints

Discovery:

  • GET /api/discovery/movies — Get movie suggestions
  • GET /api/discovery/series — Get series suggestions
  • POST /api/discovery/refresh/movies — Regenerate movie suggestions
  • POST /api/discovery/refresh/series — Regenerate series suggestions
  • GET /api/discovery/status — Get user's discovery status
  • GET /api/discovery/prerequisites — Check if prerequisites are met

Jellyseerr:

  • GET /api/jellyseerr/config — Get configuration
  • PUT /api/jellyseerr/config — Update configuration
  • POST /api/jellyseerr/test — Test connection
  • GET /api/jellyseerr/status/:mediaType/:tmdbId — Get media status
  • POST /api/jellyseerr/status/batch — Batch status check
  • POST /api/jellyseerr/request — Create request
  • GET /api/jellyseerr/requests — Get user's requests

Auth:

  • GET /api/auth/login-options — Get passwordless setting

Settings:

  • GET /api/settings/media-server/security — Get security settings
  • PATCH /api/settings/media-server/security — Update security settings

New Core Modules

@aperture/core/discover:

  • pipeline.ts — Main discovery generation flow
  • sources.ts — Fetch candidates from TMDb/Trakt
  • filter.ts — Filter out library/watched content
  • scorer.ts — AI scoring algorithm
  • storage.ts — Database operations
  • types.ts — TypeScript interfaces

@aperture/core/jellyseerr:

  • provider.ts — Jellyseerr API client
  • types.ts — TypeScript interfaces

🚀 Upgrade Instructions

For All Users

  • Update Aperture — Pull the latest version
  • Run migrations — Automatic on startup (0080, 0081, 0082)
  • Configure Jellyseerr — Admin → Settings → Integrations (optional but recommended)
  • Enable Discovery — Admin → Users → Enable for desired users
  • Run Discovery job — Or wait for daily schedule

For Jellyseerr Users

  • Get your API key from Jellyseerr → Settings → General
  • Enter URL and API key in Aperture settings
  • Test connection
  • Enable request permissions for users

For Passwordless Servers

  • Go to Admin → Settings → Media Server
  • Enable "Allow passwordless login" in Security Settings
  • Users can now log in without passwords

Enjoy discovering new content! 🔭🍿

image.png

image.png

  • Like 1
TeamB
Posted

this is looking really good, I am testing with just movies atm.
one thing I noticed was the recently played was not really correct, it is correct that I have watched these movies but years ago, I think you might be sorting based on the date you added them to your system and not the date they were watched.
image.png.794952ccc53b3ed0b2c5471cf5a2c07e.png

TheGru
Posted
1 minute ago, TeamB said:

this is looking really good, I am testing with just movies atm.
one thing I noticed was the recently played was not really correct, it is correct that I have watched these movies but years ago, I think you might be sorting based on the date you added them to your system and not the date they were watched.
image.png.794952ccc53b3ed0b2c5471cf5a2c07e.png

I’ll take a look! Is it just in that component? Might be a mistake in the sql pulling that list

TeamB
Posted (edited)

yeah just int he home page component from what I can see (the watched history page looks correct)

also what size are the prompt recommendation requests to the LLM, I have my ollama set to 4096 context window limit (I think that is the default) is this going to be enough?

Edited by TeamB
TheGru
Posted (edited)
10 hours ago, ebr said:

Can't you exclude the library from continue watching in the "Home Screen" settings for the user?

@ebrThe API for 4.9.4.1 beta has a hidefromresume which can be set to true, but only a per-item basis, so I can't simply exclude an aperture created library, but I can do it in an end-around manner:
 

  1. Create STRM files
  1. Refresh/scan the library
  1. Query the library items to get their IDs
  1. Call HideFromResume for each item

That being said it should work!

Edited by TheGru
GoldSpacer
Posted

Would aperture be able to make multiple libraries based on mdblists? And if a movie were in 4 of those libraries, we would expect it to show up 4 times in the continue playing?

TheGru
Posted
1 minute ago, GoldSpacer said:

Would aperture be able to make multiple libraries based on mdblists? And if a movie were in 4 of those libraries, we would expect it to show up 4 times in the continue playing?

it could, but it doesn't currently. I think I have a solution to hide things from continue playing to prevent that, but it would require the latest beta emby server, and I am still testing if it works or not

  • Like 1
TheGru
Posted
14 minutes ago, TheGru said:

it could, but it doesn't currently. I think I have a solution to hide things from continue playing to prevent that, but it would require the latest beta emby server, and I am still testing if it works or not

the issue would be sanity checking the MDB list against what exists in your libraries in order to build outputs, not a big deal but my fear becomes people asking "Why doesn't Movie X show up in my Emby Library? I see it on the MDB List!!! I hate you, build better software.. You suck!!" lol

  • Haha 1
TheGru
Posted
2 hours ago, TheGru said:

@ebrThe API for 4.9.4.1 beta has a hidefromresume which can be set to true, but only a per-item basis, so I can't simply exclude an aperture created library, but I can do it in an end-around manner:
 

  1. Create STRM files
  1. Refresh/scan the library
  1. Query the library items to get their IDs
  1. Call HideFromResume for each item

That being said it should work!

this does not work, minute the media is played it gets added back, hidefromresume is just remove from continue watching in the UI

TeamB
Posted

the list of similar movies does not populate with the list, the graph works but when switching to list it is empty

image.png.a41b20ed8d426a8c05ad977e954eb326.png

might have something to do with this in the browser console log
image.png.7707fd45352be74de143935a52c510d9.png

I dont see anything useful (i.e. a stack trace) in the aperture container logs

TheGru
Posted
23 minutes ago, TeamB said:

the list of similar movies does not populate with the list, the graph works but when switching to list it is empty

image.png.a41b20ed8d426a8c05ad977e954eb326.png

might have something to do with this in the browser console log
image.png.7707fd45352be74de143935a52c510d9.png

I dont see anything useful (i.e. a stack trace) in the aperture container logs

bug from changing the pgsql table vector column to support all the other providers and models. I'll get it fixed

FlameRed
Posted
15 hours ago, TheGru said:

Aperture v0.4.6 Release Notes

Hey everyone! 👋

This release introduces the Discovery feature (thanks to @FlameRed for the idea!)— AI-powered suggestions for content not in your library — plus full Jellyseerr/Seer integration for requesting missing content. If you've ever wanted Aperture to help you find your next favorite movie or series that you don't already own, this update is for you!


🔭 Discovery Feature

 

Sir, you are unbelievable! This is wonderful! 

TheGru
Posted
4 minutes ago, FlameRed said:

Sir, you are unbelievable! This is wonderful! 

Just wait until you see what's next! Per user watch history analysis weighting controls accessible in the user's profile settings. Trying to let end users train the algo on what they like beyond what the AI just infers for them!

image.png.df143156bddfa47e677b44c3e022e714.png

  • Like 1
Posted
12 hours ago, TheGru said:

The API for 4.9.4.1 beta has a hidefromresume which can be set to true, but only a per-item basis,

Yeah, that's not gonna work.  It is a user option in the home screen settings:

image.png

GoldSpacer
Posted
6 minutes ago, ebr said:

Yeah, that's not gonna work.  It is a user option in the home screen settings:

image.png

Is it possible to split this into 'show under latest media' as one check box and 'show in continue watching' as another checkbox? 

  • Like 1
TheGru
Posted
6 minutes ago, ebr said:

Yeah, that's not gonna work.  It is a user option in the home screen settings:

image.png

I know. What would be cool would be to show available libraries a user has access to that are used to populate this section. Simple display with toggles could work, and also expose this as a user preference via the API
image.png.3d6d1f005036bfc549a0b9468de4100d.png

image.png.75c6df81ecd72e2844d8d1b16781fcd5.png

TheGru
Posted
4 minutes ago, GoldSpacer said:

Is it possible to split this into 'show under latest media' as one check box and 'show in continue watching' as another checkbox? 

Better solution than mine above!

classiccollect1
Posted

HI I JUST WONDERING IF YOU HAVE ANY PLANS  FOR A  WINDOWS VERSION OF APERTURE OR WALKTHOUGH FOR THOSE OF US LESS TECH SAVY WITH DOCKER ?. I KNOW I CAN RUN DOCKER ON WINDOWS AND DEPLOY IT  FROM THERE. IM JUST NOT GOOD WITH  DOCKER OR LINUX. REALLY WISH I WAS. MY TIME IS  LIMITED ALSO BECAUSE OF MY BUSINESS SO ITS  HARD FOR ME TO REALLY GET INTO DOCKER AND LEARN IT WELL.  I HAVE IT SET UP BUT I CANT SEEM TO GET DOCKER COMPOSE SET UP. i LOVE WHAT YOU  CREATED APERTURE LOOKS AMAZING!

  • Disagree 1
Neminem
Posted

@classiccollect1stop yelling "All caps" means you are yelling.

  • Like 1

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