Tree / Self Hosting / Movies & TV Shows / Jellyfin / Library View
Ratings Enhanced
A fully configurable ratings section with toggles and source priorities.
- Status
- Green · Published
- Type
- script
- Hours
- about 5
- Tokens
- about 2.5 M
A configurable extension of Druidblack's ratings script, built on his Version 1 only.
In this article
Four variants, one configurable script
This script builds on the work of Druidblack. His jellyfin_ratings brings external ratings into the Jellyfin media info line, and he offered four separate variants: Version 1 and Version 2, each in a "basic" mode with window.fetch and a "user" mode with GM_xmlhttpRequest.
Measured against that base, the plan was one file. For stability, maintainability and structural consistency it is built only on Version 1. Both network modes live in the same script and are chosen by a setting. On top of that came independent switches for almost everything.
Everything you can decide
You need a free MDBList key and the JavaScript Injector or a userscript manager. Configure the top of the script first, because it decides the whole look. Global, movie and TV show settings are separate blocks.
The settings cover:
- Sources: IMDb, TMDB, Rotten Tomatoes critics and audience, Metacritic and Metacritic user score, Trakt, Letterboxd, Roger Ebert, Kinopoisk and MyAnimeList. Each one has its own switch.
- Order and limit: the order of an array is the display order, and a limit caps how many external ratings appear.
- Jellyfin's own ratings: show both, only the stars, only the critics, or hide them.
- Lines: internal and external ratings can each stay in the main line or move to a second line.
- Ends at: show or hide it, keep it where Jellyfin puts it, place it before or after the ratings, or give it a line of its own.
- Rotten Tomatoes: optional Fresh and Certified icons based on the score.
- Cache: answers are kept in memory and in the browser, with a time limit, which saves requests and speeds up repeated views.
Global settings
| Option | Ships as | Effect |
|---|---|---|
ALLOWED_PLATFORMS | ['windows'] | Where the script runs: windows, android, ios, macos, linux, chromeos |
MODE | 'basic' | basic uses window.fetch, user uses GM_xmlhttpRequest in a userscript manager that grants it, and otherwise falls back to fetch with a warning |
DEBUG | false | Detailed output in the browser console |
EXTRA_ROW_SPACE | 'reserve' | How room for the second line appears, see below |
TRIGGERS.pollMs | 1000 | How often the page is scanned for new TMDB links |
CACHE.enabled | true | Keeps answers for later views |
CACHE.ttlMinutes | 360 | How long an answer stays valid |
Your MDBList key goes into the same block.
Settings per type
Movies and TV shows each have their own copy of these values, and TV shows apply to the main level only, not to seasons or episodes.
| Option | Ships as | Effect |
|---|---|---|
UI_JELLYFIN_DB_RATINGS_MODE | 'rating_only' | both, rating_only, critics_only or hide |
UI_DEACTIVATE_JELLYFIN_EXTRA_RATINGS | false | true turns off all external ratings and keeps only Jellyfin's own |
UI_INTERNAL_RATINGS_NEW_LINE_MOVE | true | Moves Jellyfin's ratings to the second line |
UI_EXTERNAL_RATINGS_NEW_LINE | true | Puts external ratings on the second line |
UI_CRITICSRATING_ICON_FRESH | true | Fresh icon for Jellyfin's critic rating, from score 6.0 on a scale up to 10 |
UI_CRITICSRATING_ICON_CERTIFIED | true | Certified icon for the same rating, from score 9.0 |
UI_RT_ICON_CERTIFIED | true | Certified logic for the external Rotten Tomatoes rating, from score 9.0 |
SOURCES | all on | One entry per source, with an ID and an enabled flag |
SOURCE_ORDER | 1 to 11 | Display order by ID, and a missing ID counts as disabled |
LIMIT_MAX_RATINGS | 6 | Maximum external ratings, following the order, and 0 means no limit |
Movies have three more values for "Ends at":
| Option | Ships as | Effect |
|---|---|---|
ENDING_AT_MODE | true | Shows or hides it |
ENDING_AT_POSITION_MODE | 'vanilla' | vanilla keeps Jellyfin's position, begin puts it before the ratings of that line, end after them |
ENDING_AT_LINE_MODE | 'main' | main, after_main for its own line after the main line, after_external for its own line after the external ratings, or same_external to join them |
The script works with both Jellyfin's built-in ratings and the external MDBList data, so it is worth deciding first which of the two you want to see at all. TMDB is often not needed on TV shows, which is why the switches and the limit exist per type.
With 11 possible sources and a default limit of six, the order array does the real deciding: whatever stands first is what you see.
My own screenshot setup, as an example: Jellyfin's critic rating off, its star rating moved to the next line, external ratings on that line too, at most six of them, and "Ends at" left in the main line.

Four tries for one line
The most visible hurdle was one line of layout. If ratings arrive late and the page then grows, everything below moves. I wanted the room there from the start.
Claude sessions did this work together with the port to Jellyfin 12, and it took four rounds on my live server. These four attempts stay listed, because each one taught what I actually meant:
- Did not work: a band with a symmetric gap. The header grew after the ratings arrived.
- Did not work: reserving one line from the start. The growing stopped, but the row still did not sit where I meant.
- Did not work: placing the ratings below the header band with a transparent spacer. Measured correctly, but not what I meant.
- Worked: imitating a second Jellyfin info line. The row comes right after the media info line with that line's own margin, and the header band grows by exactly one line. The room below stays Jellyfin's, within a pixel.
The result is now a setting: reserve holds the room from the start and removes it only if no ratings come, and grow adds it when they arrive. Ratings stay hidden until their logos are loaded, so they appear complete.
Language, links and small screens
Three smaller problems came out of the same review. "Ends at" used to be found by its text, which only works in one interface language. It is now found by Jellyfin's own class. Version 12 also links seasons and episodes to TMDb, which would have put ratings there, so the script accepts movie and series links only, as before.
Mobile layouts were the third. The audit found the ratings covering the Play and More buttons there, so the row now stays in the page flow and the buttons move down. A platform switch at the top of the script decides where it runs, and only Windows is on by default.
Also part of Essentials
This script now also runs inside my Essentials plugin, with its settings on a normal dashboard page instead of values at the top of the code. On its own, through the JavaScript Injector, it works as before.
Connected
Next: Hover Preview Tiles