Jump to content

Aperture - AI-Powered Recommendations for Emby


Recommended Posts

akacharos
Posted

same applies for /studio btw

akacharos
Posted
On 1/26/2026 at 9:51 PM, camaban said:

 

AI edit of what I’d written above (it was ~5am, just waking up).

Also, just to be clear (because the AI flagged it and it definitely wasn’t my intention):

That wasn’t meant as snark. It was genuinely funny. I love how LLMs will find a way to justify whatever they’re told.

I’m working on a code review tool at work, and the prompting side has been… an experience.

For context: last night I spent a few hours going through and spamming “like” on the things I actually want included in the signal, plus marking the stuff I’d watched on Plex as watched in Emby. That improved things a lot. The only downside now is waiting for that huge burst of “watched” events to age out so it can be weighted appropriately.

Then this morning I spent another hour or two setting ratings on various titles (including 1-star ratings for things I only have because it’s a shared library with a friend of dubious taste). Big improvement again.

Anyway, the more coherent redo of the above:

Explicit likes/favourites weighting: If favourites are used as a strong positive signal, it may overweight sparse explicit feedback. Consider scaling the “favourite/like” signal by how much a user actually uses it (e.g., favourite-rate), and/or treating rewatches as a stronger implicit preference signal.

Respect profile restrictions: Filter candidates to only items the user profile can actually see (parental controls / rating limits), so picks aren’t wasted and explanations don’t reference inaccessible titles.

Reduce repeat surfacing: Add exposure tracking + cooldowns. If a title has been recommended multiple runs without being played, apply a penalty or hide it for N runs/days to keep the list moving (large libraries have plenty of variety).

Add a recency factor: Consider an optional “freshness” weight (newly released and/or newly added to library) to bias toward newer content when desired.

Cold-start onboarding: Optional “taste seeding” flow for new users (bulk rate titles) to establish preferences quickly.

Since you already ingest Emby heart ratings, a lightweight onboarding could just be a bulk ‘Rate/Review signals’ page that shows all rated + unrated titles with fast inline heart controls and filters (unrated, watched-but-unrated, frequently recommended-but-ignored). No new data model needed, just less clicking.

Add a per-profile Blacklist / Never recommend action that hard-excludes titles from future runs (with a manage/undo list). This is different from 1-star/dislike, which should remain a soft negative

 

Regarding the points raised about the Recency Factor, I would hesitate to enforce this strictly.

In Emby, "Recently Added" items are already in the spotlight, as most users sort by date added or have "Recently Added/Released" sections on their home screens. To me, the primary value of an AI recommendation engine is discovery—finding content I wouldn't normally see without scrolling endlessly through the library.

While a bias toward recent releases might suit general audiences, it doesn't apply to everyone. I think it makes more sense to profile a user's watch history based on preferred decades and adjust suggestions accordingly. For example, it doesn't make sense to apply a heavy weight to a new John Wick movie just because it’s "new," especially if that user has a long history of watching exclusively 60s Film Noir or 80s Horror B-movies.

Regarding Reducing Repeat Surfacing: This could be problematic depending on the user's viewing habits. Not everyone binges content. Many family members might only watch a couple of movies a week at most; some might not log in for weeks, while others watch daily.
If the scheduler runs every few days and applies a "cooldown" penalty to items just because they were suggested in a previous run, who wins? The casual viewer might miss out on a great recommendation simply because they didn't log in fast enough to see it before the system cycled it out.

  • Agree 1
camaban
Posted (edited)

This is true. There's endless tweak potential in the entire lot. Most hard set things are going to be bad at some level.

Utility of that really depends on size. I get more stuff coming in than I do spam, mostly added by people who aren't me (I'm just the storage enthusiast/hoarder) so this would help highlight the roughly 1:20 things I might care about.

Also helps keep the list fresh. Preferences aren't really going to change much, and if everything is equal, you're eventually getting to having the same recommendations week after week. Same weightings, roughly the same collection, same basic interests, same/similar results.

On a side note, I found when I moved away from OpenAI to a locally hosted model, I saw a large uptick in variety in everyone's recommendations. Prior to that it was fairly similar for everyone.

And because it's a less moral model, it was able to give me useful advice on how to argue for a Tarantino day at a kindergarten.

OpenAI just tried to make me feel like I was a bad person for even suggesting the idea. As if I wanted a priest rather than an enabler.

Edited by camaban
  • Haha 1
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. 

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

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

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

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
Posted

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

Posted

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

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. 

Posted

Thank you but i have changed it before:)

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