Show HN: Recommendarr – AI Driven Recommendations Based on Sonarr/Radarr Media
github.comHello HN!
I've built a web app that helps you discover new shows and movies you'll actually enjoy by:
- Connecting to your Sonarr/Radarr/Plex instances to understand your media library
- Leveraging your Plex watch history for personalized recommendations
- Using the LLM of your choice to generate intelligent suggestions
- Simple setup: Easy integration with your existing media stack
- Flexible AI options: Works with OpenAI-compatible APIs like OpenRouter, or run locally via LM Studio, Ollama, etc.
- Personalized recommendations: Based on what you actually watch.
While it's still a work in progress, it's already quite functional and I'd love your feedback!
Probably what you want is not an LLM but just the embeddings for clustering. It's much lighter and would work well with new material as well.
I've tested it out for filtering RSS feeds and has worked pretty well [1].
[1] https://github.com/m0wer/rssfilter
I toyed with embedding, and still have an implementation laying around in a branch locally, but that would require a readily available dataset of embedded movies and shows to do comparisons against right?
I'm pretty new to embedding so my understanding may be a off.
The “cool” thing about embeddings is that you can use a generic one that can even support multiple languages. Just with the plot/description of the movie you could see “similar” ones in different aspects such as movies that also talk about dogs or more complex relations. Here is a short post about how it works: https://blog.sgn.space/posts/embeddings_based_recommendation...
Looks like connected services need to be reachable from the client, would be great if there was a server component and I could point recommendarr to plex/sonarr/radarr via docker networking
For my projects I typically lean towards avoiding server components at all costs just because I prefer the ease of setup and it is one less thing to break for users. Though it has some annoyances like you're encountering.
Maybe at some point I (or someone) can create a server version repo so people have the option to choose.
Trakt.tv is the integration you need.
What is the largest library of watched media that this has been tested at? I can see this choking on media fanatics watch histories.
Interesting, I've never used Trakt before but that looks pretty cool. I could see adding support for that. I'll definitely be looking into it.
As for the largest library, I only really know of my own which is around 250 series and 250 movies. Not small but not huge. Passing all of that info is fine enough, but I'm also curious how truly massive libraries or watch histories are handled.
I imagine you would hit the LLM token input limit first if you had thousands of series and movies. Definitely need some further testing in those cases.
Ahh ya. Big libraries can have over 30k movies. Emby, jellyfin, and plex can also integrate into Trakt. So it’s already being used in these apps for many users.
That's good to know, there are ways around the limit of course by breaking up the prompt into multiple messages and then you're at the mercy of the models context window which can be anywhere from 4k to millions.
At some point though like you say, it's going to become ineffective and you'd probably want to use the "Sampling" mode that is available to only send a random subset of your library to model as a general representation. Though how well this works on massive library remains to be seen.
Not sure how useful recommendations based on 30k movies would be, you could basically recommend anything...
Indeed. I would use watch history over library contents.
Can it differentiate between different household members?
This is really cool, and very well done! Would love to see it more on a per-user basis, as I share access with my family and do not have similar tastes at all. Perhaps tied in with Overseer API and Tautulli to see what users are requesting, then actually watching?
Tautulli proved troublesome in my first attempt at integrating it and got put on the back-burner unfortunately. I would really like to get it integrated properly so per user recommendations could become a thing.
I haven't looked at integrating Overseer yet but that is a good idea as well and worth a try at implementing. I'll be adding that to my list, thanks for suggestion!
Has there been any research on how LLMs perform as recommendation engines?
I'd assume there isn't any algorithms provided weighted comparisons based on my viewing habits, but rather a fairly random list that looks like its based on my viewing habits.
Perhaps, in practice, the difference between those two is academic, but I'm really not keen on leveraging such a heavy everything model for such a specific use case, when something much simpler, and private, would suffice.
I haven't looked into it too deep if I'm honest, I built this app solely because I find LLM TV and Movie recommendations to be leaps and bounds better than any other recommendation service I've ever used, I find most of them terrible unfortunately.
I just got tired of manually inputting the data and wanted a more automated approach. This recommendations system isn't extracting loads of data yet (like how often things are watched etc..) but instead a more birds eye view of your library and watch history to analyze.
Cool project but why use an LLM for this?
Recommendation systems exist well before LLMs and have been in use for a while, wouldn't it better and more efficient even?
All of them sucked, though. Turns out, running regression on some features picked as much to help the user as to satisfy business objectives, doesn't lead to a system that can capture one's preferences well.
LLMs have the benefit of understanding (or some values of understanding) how people feel about things in general, in a global sense. They may not have a database of people's choices, but they have a "database" of connotations for every word, how ideas and emotions relate, how interests connect, etc. Instead of relying on a relatively tiny historical record of choices in few, specific (and ill-defined) categories, they can just place user's history in their 10 000 dimensional latent space and use that as a direction to explore, effectively guessing whatever the user's actual preferences are likely to be, without being able to name them or fit into explicit categories.
The best recommendation system I encountered was the "similar artists" cloud on what.cd on an artists page. Has never failed me.
https://github.com/WhatCD/Gazelle/blob/master/classes/artist...
yeah I mentioned in another comment I've never found recommendation systems to work very well for me. I've gone through many of them and the reason I decided to start using LLMs was because I was out of options...and after I tried it I ended up much preferring the recommendations given.
You can also specify more granular in human words what you're looking for which is a big bonus for me personally.
I'm excited to try this! I'd love support for music recommendations via Plex music libraries. (Currently, I use a script to export my music library to a format suitable for LLM analysis.)
Interesting… any more details on how you do that?
With the caveat that it's imperfect and not packaged correctly, you can check out music2json.ts at https://github.com/CharlesWiltgen/music2json to get the idea. In short, I just dump a JSON of artists, albums (with genres), and tracks, feed that to an LLM, and then ask it to recommend other artists and albums I might like (e.g. "Please recommend additional compilations, artists, and albums I may like based on this music library"). The biggest problem at the moment is that it will often recommend things that are already in my library.
> it will often recommend things that are already in my library.
This is going to be a really dumb suggestion, not because I think you are dumb, but because LLMs are. This happened to me the other day:
Me: "I'm going to upload a list of [things]; please suggest similar [things]. Please do not repeat any [things] on the original list."
ChatGPT°: [Blah blah blah] <List with about 1/5 repeats>
Me: "Please do not repeat any [things] on my original list."
ChatGPT: "I'm sorry, here's a list of [things] without any [things] on the list you gave me: <list without any repeats>"
No idea why that worked, and maybe it doesn't always.
°Bog-standard web interface, not an API request with a system prompt. No idea which ChatGPT flavor; I can't be bothered to keep track. Maybe doing something fancy stops that from happening in the first place, but I was dumb enough to try something dumb and whaddaya know?
I appreciate the post and will definitely try that, thank you!
Oh, forgot to say: the new list only repeated about 2/3 of the (real) suggestions it gave me. (I naively expected it to reproduce the list, with all the repeated output pruned, which would have been fine with me.) It also gave me a further eight or ten new suggestions, most of which I thought were better than its originals.
I know we're not supposed to anthropomorsize these things, but it sure felt like giving a task to a teenager who half-asses it, and only does the real work after you call them out on it. It's a brave new world, that has such creatures in it.
Cool project! Can you explain a little more about how the recommendation algorithm works?
It's hard to really explain how the LLM decides what to recommend if I'm honest.
The general idea is I generate a prompt to feed into the LLM with specific instructions to use the Sonarr (for example) library info which is passed in as a list of series titles. I also provide some general guidelines on what it should take into account when choosing media to suggest.
After that it's in the hand of the LLM, it will internally analyze and recommend shows based on what it believe someone might enjoy based on their media library...Given that every LLM model is different, how they internally decide what shows to recommend will be unique to them. So if you have bad suggestions etc..It's best to try a different model.
it provides nice flexibility but in reality my control of the actual recommendations are limited to the initial prompt that is passed in.
Does this mean it is limited to the model's internal memory? Meaning newer shows won't be in the recommendations because they're past the training cut-off?
That is a likely true to an extent, though it's hard to say at what point it cuts off.
If a model was trained 6 months ago for example it will likely have some info on shows that came out this month due to various data points talking about that show as "upcoming" but not released. Due to that it may still recommend "new" shows that have just released.
All that being said, I have to imagine that suggesting shows that have just now been released is likely the weak point of the system for sure.
The entire product is a wrapper around a well written ChatGPT prompt.
An LLM Prompt, not ChatGPT specific. But yeah pretty much that is the core of everything.
Looks super neat! A great idea as well.
Any plans to support jellyfin?
Thanks!
Jellyfin is definitely on the list to be added, it's probably next in line actually. If it's as simple as Plex integration I'll be very happy.
Edit - Support Added
https://api.jellyfin.org/
Jellyfin support has already been added earlier today.
Just integrate Trakt
Don't LLMs usually have knowledge cutoffs from months or years ago? Does that mean it came recommend new shows?
This sounds amazing, giving it a try right now
Hopefully it works well for you! I just pushed up changes for adding Jellyfin integration as well, so that should be available through the docker hub here soon as well.
I'd love to see support for lidarr, I need way more help with music recommendations than TV/Movies
I wonder if there’s way to get access to the music genome data that Pandora uses. Would happily pay for an API and it could be available outside the US since licensing the music itself to stream it isn’t needed.
I'm definitely not opposed to adding Lidarr support, I've never personally used it so I may tinker around with it here soon and think on how to structure prompts for that etc...