- C# 85.6%
- JavaScript 9.6%
- CSS 2.5%
- HTML 2.2%
- Makefile 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
* feat: show recommended titles that aren't in the library
"More like this" on a movie or series page now leads with TMDB's
recommendations for the title (movie/{id}/recommendations,
tv/{id}/recommendations). A recommendation the library holds is shown as
that item, in TMDB's order; one it does not hold is a stand-in that opens
like a search result, at most half the limit (6 of Web's 12). Jellyfin's own
genre match fills the rest, without duplicates. Jellyfin's own answer
nearly always fills the limit, so a stand-in only filling the gaps would
almost never show.
The Movies Suggestions tab's rows get TMDB's titles too, at most half of
each row: "Because you watched/liked" rows as "More like this" for the
row's movie, "Starring" and "Directed by" with the library's titles first
and the person's other films from TMDB after them (the credits feature 4
already reads).
Every major client asks for similar items on every title page, so neither
request waits for TMDB: they answer with what TmdbTitleLists keeps and,
without it, as Jellyfin does, while the list is prepared in the background
(release dates for the unreleased filter, imdb ids for a meta addon without
tmdb: ids, ratings where a user's parental control needs them, and which of
the titles the library holds). Opening the title's item starts that already,
while the item's own stream lookup runs, so a first open mostly has them
(series on a prod copy: 10.8 titles per "More like this" on the first open,
11.0 on the next, 8.5 on main). TMDB's lists are kept 7 days in
GelatoCache.Tmdb, which a configuration save keeps (nothing Gelato is
configured with goes into TMDB's answers); the prepared lists depend on the
addon and are kept per addon URL in GelatoCache.Memo, which a save empties,
and are prepared again after 12 hours, the old ones answered meanwhile.
Which titles the library holds is worked out again in the background after
an item write, so a request asks the database nothing: the 90 titles of a
Suggestions tab cost 14 ms there, and 50 to 70 ms more before
FindLibraryItemsAsync learned to keep to titles and take them from
Jellyfin's item cache. A title in both lists keeps the DTO Jellyfin built.
What the Suggestions filter adds is 9 to 11 ms per request (logged).
Same catches as the person page: adult titles, the unreleased filter,
parental control (a rating not known yet leaves the title out instead of
waiting), no stand-in without a folder for its type. Behind
RecommendedRemoteTitles, global and per user, on by default, off while
"Internal database search only" is on. ToMeta, the release and imdb id
lookups, the server's metadata language and the stand-in DTO build moved
from PersonActionFilter into RemoteTitles, shared by all three.
Measured on a prod copy (prod-jf123-20261023-warm), main against this
branch, ms, p50 / p95:
main branch
Suggestions tab (3 runs of 40) 591 / 648 615 / 669
movie "More like this", warm 167-173 / 200-228 170-180 / 201-210
movie page, warm 228-241 / 260-345 233-252 / 266-289
series "More like this", warm 71-79 / 79-97 73-77 / 85-93
series page, warm 110-124 / 128-142 117-126 / 140-141
(the "More like this" rows: the two runs a host sleep left complete; 3
earlier runs before the background library matching gave the same within
5 ms). Warm is a title opened again, with TMDB's titles; Suggestions with
6 more titles per answer (48, main 42). A first open's page time is
AIOStreams' stream answer, cached for the instance asked second, so it is
not compared.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep unreleased titles out of movie suggestions
The Movies Suggestions tab listed titles the library's listings hide:
with the unreleased filter on, a catalog's unreleased movie ("Avengers:
Doomsday", "Black Panther 3" on a prod copy) came up under "Because you
watched", and so could a title opened from search and never played.
Jellyfin 12 scores the rows' candidates on the database directly, past
GelatoItemRepository's listing filter, and HiddenListingFilter cannot
reach into a RecommendationDto row.
SimilarItemsManagerDecorator already asks for four times the items per
row and drops the stream rows before the cut; it now drops the pending
and unreleased ids with them, so the rows stay full.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
||
| .config | ||
| .github | ||
| Config | ||
| Controllers | ||
| Decorators | ||
| Filters | ||
| Frontend/js | ||
| Providers | ||
| RemuxDb | ||
| ScheduledTasks | ||
| Services | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| aiostreams-config.json | ||
| banner.png | ||
| build.yaml | ||
| Common.cs | ||
| Gelato.csproj | ||
| Gelato.sln | ||
| GelatoManager.cs | ||
| GelatoStremioProvider.cs | ||
| global.json | ||
| ItemClassifiers.cs | ||
| LICENSE | ||
| logo.png | ||
| Makefile | ||
| Plugin.cs | ||
| README.md | ||
| ServiceRegistrator.cs | ||
Note
Looking for the next evolution of Gelato? Check out Remux, a media server written in Rust that replaces Jellyfin instead of plugging into it. It supports local libraries, remote sources, and Stremio addons, and it works with your Jellyfin clients.
Gelato
Jellyfin Stremio Integration Plugin
Gelato brings your AIOStreams addon into Jellyfin. Jellyfin's search also finds what the addon offers, and the catalogs you pick are imported into your library on a schedule. Their titles behave like your own media: you browse, search, and play them in any Jellyfin client.
Features
- Search: Jellyfin's search also finds titles from the addon, ready to play.
- Catalogs: import the addon's catalogs into your library, kept up to date by a scheduled task.
- Streams on demand: Gelato finds the streams when you press play. Nothing is downloaded.
- Like your own media: the titles are regular Jellyfin library items.
- Proxy: streams go through Jellyfin, so your debrid service sees a single IP.
- Per-user settings: a user can have their own addon, for example for a kids' account.
- Seerr requests: a request approved in Seerr (Jellyseerr, Overseerr) adds the title to your library.
Usage
-
Set up AIOStreams. Host it yourself or use a public instance, for example the ElfHosted public instance.
New to debrid? Sign up with one of my referrals.
You need at least the TMDB addon turned on for search, and one addon that finds streams (Comet, for example). Or import the starter config, then turn on your debrid providers under Services.
-
On Jellyfin 12, add
https://raw.githubusercontent.com/lostb1t/Gelato/refs/heads/gh-pages/repository.jsonto your plugin repositories.Upgrading from Jellyfin 10.11? First update Gelato to its final 10.11 release, and shut the server down normally at least once before you upgrade Jellyfin. That release empties the Gelato folders on shutdown; without it, the first Jellyfin 12 start deletes every Gelato title. Its settings page shows whether your server is ready. If you upgraded without it, Gelato runs the Repair watch state task once on the first start and brings back every title that still has watch state (see the FAQ).
-
Install the plugin and open its settings. The Setup assistant walks you through the addon, the libraries, and the catalogs. Gelato supports only AIOStreams.
To change the libraries later, use Default movies library and Default series library on the Libraries tab. Pick a library you have and save, and Gelato adds a folder of its own to it. Or pick New library: Gelato creates the folder, and Copy folder gives you its path for Jellyfin's library dialog.
-
In Jellyfin, check each library's settings: Gelato should be first under the metadata downloaders and image fetchers. Gelato doesn't change the settings of a library you had before, so turn it on there yourself.
-
Search for a movie and play it. Or run the Import Catalogs task to fill your library.
For a step-by-step guide, see the setup guide.
Seerr requests
Gelato adds titles requested in Seerr (Jellyseerr, Overseerr). The Gelato settings show the fields below on the Libraries tab, each with a Copy button. In Seerr, go to Settings > Notifications > Webhook:
- Webhook URL:
http://<your-jellyfin>:8096/gelato/seerr - Authorization Header:
MediaBrowser Token="<API key>", with a key from Jellyfin's Dashboard > API Keys - JSON Payload: leave the default
- Notification Types: Request Approved and Request Automatically Approved
An approved request adds the movie or series to your library, and Seerr marks it available at its next Jellyfin scan. If the requester has libraries of their own on Gelato's Users tab, the title goes there. A series request adds the whole series, also when it named only some seasons.
Notes
- Gelato supports only AIOStreams.
FAQ
- After you change your config in AIOStreams, save it there, then select Refresh on the Catalogs tab of the Gelato settings. Gelato reads the addon again; you don't need to restart, also not after changing Gelato's settings.
- Turn on at least 1 catalog that supports search in AIOStreams. I suggest the TMDB addon.
- To start over, run the WARNING: purge all gelato items task in Dashboard > Scheduled Tasks. It removes the watch state along with the titles, so it's a real fresh start.
- Removing a title doesn't lose its watch state. Jellyfin keeps it, and Gelato puts it back when the title returns, so a movie you delete and add again later still has your progress.
- If titles went missing and took your watch state with them (after a Jellyfin 12 upgrade, for example), run the Repair watch state task in Dashboard > Scheduled Tasks. It imports what's gone again and gives it back its watch state. It has no schedule: it can't tell what you deleted on purpose from what you lost by accident, so it runs only when you start it, and it also brings back titles you deleted yourself. Gelato also runs it once on the first start after you install this release, and after every later major Jellyfin upgrade. Don't run Jellyfin's own User data cleanup task first: that task deletes the kept watch state.
- I suggest a lower timeout for your Stremio addons in AIOStreams, for example 5 seconds.
- Debridio TMDB and Debridio TVDB cause problems. I suggest the regular TMDB addon.
- To clear the stream cache, save Gelato's settings: the next visit of a title asks the addon for its streams again.
- A catalog can import into a library of its own, for example an Anime or Documentaries library: use the Library column on the Catalogs tab. Pick a library you have and save, and Gelato adds a folder of its own to it. For a new one, pick New library: Gelato creates the folder, and you add a library with it in Jellyfin (Jellyfin needs a folder for a new library). At the next import, new titles go there, and the titles the catalog imported before move there with their watch state. A title that 2 catalogs list stays with the one that imported it first. A movies library takes only the catalog's movies, and a shows library only its series; the rest goes to the default library. Set the catalog back to Default to move its titles back. A search inside such a library also asks the addon, and a result you open from it goes into that library.
- Opening a search result adds it to your library. With Keep opened search results out of the library until played on (on the Search tab), it stays out of the library, the home screen rows, and the counts until someone plays it, marks it as a favorite, likes it (a watchlist), or adds it to a collection or playlist. Search still finds it. If nobody does within 5 days, Gelato removes it again.
❤️ Support the Project
- ⭐ Star the repository on GitHub.
- 🤝 Contribute: Report issues, suggest features, or submit pull requests.
- ☕ Donate: