show-imdb-ratings

Show IMDb Ratings on Streaming Services

Chrome extension that overlays the IMDb user rating on every title card while browsing Netflix, Prime Video, Hulu, HBO Max, Apple TV, Disney+, Paramount+ and Tubi. Each card gets a small badge with the rating. On Netflix, Prime Video and Hulu, hovering a title opens the site’s own preview, which gets an IMDb line with the year and vote count; click that line to open the IMDb page. HBO Max has no preview, so there the badge on the card is the link. A show’s episode list gets a rating next to every episode, season by season (click one to open that season on IMDb). Each site is a small adapter file, so more services can be added.

Site Card badge Hover details / title pages Episode lists Notes
Netflix top-right of each tile, also on New & Popular, its “coming soon” rows included (a title not out yet that shares a name with an older film can show that film’s rating until its preview, which has the year, corrects it), and on episode cards (“Hooked from the First Episode”); top-left of the show window’s “More Like This” cards (the running time is top-right) line under the preview popup’s buttons; in the featured banner, a chip beside Play / More Info; in the full show window, a line under the buttons in the show window’s episode list, after each title episode cards and their preview name only the episode: the show is worked out once per episode from Netflix’s own page; the popup’s type and year lines pick the right same-named title and also correct the card
Prime Video top-right of each tile; hidden while the card is expanded chip in the expanded card’s metadata row; in the top banner, a chip beside the Watch now button; on a title’s own page, a chip in the metadata row after the year on a series page (one page per season), after each episode heading season suffixes stripped; movie/series type and, on title pages, the year passed along
Hulu top-right of each tile; top-left of the tall “Because you watched” cards line under the preview panel’s metadata; also in the top banner; on a series page, a chip after its metadata on a series page, after each “S2 E1 - …” tile title movie/series type from the link path; a series page’s year tells a revival from the original
HBO Max bottom-right of each poster none (HBO Max has no hover preview); the badge tooltip works; in the top banner, a chip beside the Watch button; on a title’s own page, a chip in the My List / Rate / Trailer row on a show page, after each episode title title parsed from the tile’s accessibility label; movie/series type from the link path
Apple TV top-right of each poster; Continue Watching tiles get their show’s rating top-left (Apple’s logo is top-right) none (no hover preview); in a room’s top banner and on a title’s own page, a chip in the metadata line (“TV Show · Drama”, age rating) on a show page, on each tile’s “EPISODE 3” line; all seasons share one scrolling row, and each tile’s season is worked out from its position and the season picker movie/series type from the link path, year from the title page
Disney+ top-right of each poster and Continue Watching tile none (no hover preview); in the home page banner, a chip in the rating / year / genre line; on a title’s own page, a chip under the “1998 – 2005 • 8 Seasons” line in the Episodes tab, after each episode title titles from the poster art’s alt text or the tile’s label (badges, “Hulu Original Series” and network names stripped); year from “Released 2006” where the row gives it; live sports, playlists and collections skipped
Paramount+ (includes Showtime) top-right of each tile none (no hover preview); in the home page banner, a chip under the title; on a show’s own page, a chip under the genre / year / seasons line on a show page, after each episode’s “41M · Nov 13, 2022” line movie/series type from the link path (/movies/video/, /shows/); a show page’s year is the first season’s; movies open straight into the player, so they are rated on tiles only; live-game rows, brand and collection tiles skipped
Tubi top-right of each poster, and of each thumbnail in a title page’s “You May Also Like” list Tubi’s own banner already shows an IMDb score; on a title’s own page, a chip in the “Crime · 2003 · 16 Seasons” line on a series page, in each episode’s “1 hr 40 min” line movie/series type from the link path; year passed only for movies (a series’ year is a recent season’s)
Letterboxd (optional since 1.3) top-right of each poster on browse grids, lists, watchlists, diaries and profiles; posters under 60 px wide are left alone none (Letterboxd’s own hover shows its rating); on a film’s own page, a chip under the credits none (films only) films only, so the year on every poster makes the match exact; off until ticked under Sites, which asks the browser to allow letterboxd.com

Setup

  1. Install it from the Chrome Web Store. (Or, without the store: download the latest ZIP from the Releases page, extract it somewhere permanent, open chrome://extensions, turn on Developer mode, click Load unpacked and pick the show-imdb-ratings folder.)
  2. The settings open in their own small window. Click Update now to build the ratings database (next section): about 280 MB downloaded from IMDb, a few minutes, with a progress bar. When it says done, open any of the streaming sites. That’s it. If you closed the window first: the extension’s icon (a poster with a gold star) sits in Chrome’s puzzle-piece menu (pin it to keep it in the toolbar, where it shows a yellow ! until the database is built), and the sites themselves show a small “Click to set up ratings” notice in the bottom-right corner. Either one opens the settings.
  3. Optional: a free OMDb API key fills in titles the database doesn’t have, such as brand-new releases. Get one at https://www.omdbapi.com/apikey.aspx (1,000 lookups a day), activate it from the email they send, paste it into the settings panel (click the extension’s toolbar icon) and click Test, which saves the key and checks it; nothing below the field applies until it passes. The key comes from OMDb, not IMDb: IMDb itself doesn’t issue keys, and OMDb is a separate service that mirrors IMDb’s ratings. Once the key works, the OMDb section also offers Also show: Rotten Tomatoes, Metacritic and an awards headline next to the IMDb rating in previews, banners and title pages (one request per title, remembered for 30 days), and with On cards too the scores on card badges as well, which uses more of the 1,000 lookups a day. Those four are on until you untick one. Mostly films: OMDb rarely has these scores for series. IMDb rating per OMDb (off until ticked) adds OMDb’s own copy of the IMDb rating when it isn’t the number on the badge; the database and OMDb each refresh their copy on their own day, so the two can differ by a tenth. Clicking the tomato score opens Rotten Tomatoes and the MC score Metacritic (the title’s page when OMDb knows it, else that site’s search); the rest of the badge opens IMDb. Until the key works those boxes are greyed out.
  4. Optional: the eight streaming services are on from the start, and the extension does nothing on a site you don’t visit. To stop seeing ratings on one, untick it under Sites on the same panel; the extension then stays idle there. A site marked new (Letterboxd) is off until you tick it, and the browser then asks you to allow it. The row under the list adds an address of your own, for a country’s store or a site that moved (www.amazon.co.uk/gp/video, say, with Prime Video picked as the site whose pages it serves): the browser asks to allow that address, and it gets a row and a tick of its own. Changes apply to open tabs at once; a site just allowed needs its tab reloaded.
  5. Optional: under Badges on title cards, show card badges always, only when the mouse is over a card, or not at all (previews, banners and title pages keep their rating either way); show the grey “n/a” badges, hidden by default; pick the size of the card and episode badges, Small, Medium (default) or Large; and pick the label before the score, a star (default) or the yellow IMDb tag. The samples beside the label choice are drawn at the chosen size. Hovering any badge says it is the IMDb rating and where it came from.

Local database

IMDb publishes its ratings as daily data dumps, licensed for each person’s own non-commercial use. The extension builds its database from them in your browser: it downloads about 280 MB from IMDb, keeps films and series with at least 25 votes (about 420,000 titles; films include TV films, TV specials, direct-to-video releases and shorts, shorts only from 100 votes) and the episodes of those series, and stores the result in the browser’s IndexedDB. Lookups then happen locally, with no requests to anyone.

Nothing downloads until you click Update now on the settings panel the first time. That first build lands in two stages: the titles go live as soon as the title list has been read, so badges start showing while the episode list is still downloading.

Titles in other languages (off by default). The streaming sites show titles in your profile’s language (“Zadzwoń do Saula” for Better Call Saul), and IMDb’s title list has only the English and original names, so with a profile in another language the translated titles get no rating. Tick Match titles in other languages on the panel, tick the languages you use in the list that appears (your browser’s language and any seen on a streaming page come pre-ticked), and click Get titles (ticked before the first build, they come with it, no extra click). The extension streams IMDb’s list of titles by country once (520 MB pass through, the biggest of the files; nothing is saved as a file) and keeps the useful part, the names of the database’s titles in every supported language, about 50 MB in the browser’s database. The languages you ticked are then keyed from that as extra names for the same ratings, and ticking another language later takes seconds, with no download. The full rebuild fetches a fresh list once the kept one is three months old. An English browser on English pages has no use for any of this, which is why it is off. Unticking the option stops the matching but keeps the list, so turning it back on costs no download; Delete database removes it. The languages written in the Latin alphabet (Polish, German, French, Spanish, Portuguese, Italian, Dutch, the Nordic and most Central European languages, Turkish, Indonesian, Vietnamese) are covered, and since 1.2.2 so are Korean, Japanese, Chinese, Russian, Ukrainian, Bulgarian, Greek, Hebrew, Arabic, Thai and Hindi: titles in those scripts are matched character for character after case and compatibility folding. How far each goes is set by IMDb’s data, which names nearly every title in Japanese and Hindi, about 150,000 in Cyrillic, 71,000 in Chinese, 43,000 in Greek and under 6,000 in Korean (Ozark, Stranger Things and Squid Game have a Korean name; Breaking Bad and Better Call Saul are listed for Korea in English). On Netflix that gap is closed another way: a card named in another script also gets its English name from Netflix’s public page of the title, read once, signed out, as episode cards already do to find their show, and that name is looked up first. Other sites have no such page, so there a Korean profile gets what IMDb names in Korean. Arabic (2,400 names), Hebrew and Thai (500 each) are listed for those other sites’ sake. Someone who set languages up before 1.2.2 and ticks one of these sees Get titles instead of Apply once, since the kept list from before has no rows for them. Netflix’s own labels (a show’s “5 Seasons”, the season dropdown, “Show” or “Movie”) are read in English, Polish, German, French, Spanish, Portuguese, Italian and Dutch; in other languages titles still match, but the hints that tell a 2026 series from a same-named 1955 film are lost.

After that the refresh is sized to what changes. Once a week only the ratings file (about 9 MB) is re-read and every stored rating updated in place; it also counts the titles that have been rated since the last full build. The full rebuild (all three files, about 280 MB) runs monthly, and sooner once that count of waiting titles is large. Both intervals can be changed under Advanced on the panel: the ratings weekly, every two weeks or monthly; the full rebuild monthly, every two or every three months, which costs little with a working OMDb key covering new titles meanwhile, or only when you click Update now, for a capped connection that can take the 9 MB but not the 280. The panel shows the title count, the dates of the last full build and ratings update, the next refresh with its size and due date, and progress; Update now is always a full rebuild, and Update ratings only under Advanced runs the 9 MB ratings pass by hand. Cancel, next to the progress bar, stops a build where it is: nothing changes until the new titles are switched live, which happens in one step; after that they stay, with the episodes left to the next full rebuild. The automatic refresh can be switched off there, which is the thing to do on a metered connection. A failed build (offline, say) is retried a day later, and so is one that was cancelled. An update that changes how the database is stored (FORMAT in db.js) also rebuilds it once, whatever its age; with the automatic refresh off, the panel asks for Update now instead.

OMDb only. With an OMDb key the database can be skipped: choose OMDb only under “Ratings from” at the top of the Ratings database section. Every lookup then goes to OMDb (1,000 a day, each answer remembered for 30 days), and no database is built, refreshed or consulted. Chosen before a key has passed Test, the cursor lands in the key field and the status line says no ratings show until one does. One that exists is kept, unused, so switching back costs no download (Delete database under Advanced frees its space); without one, choosing Local database again brings Update now back, and nothing downloads until it is clicked.

No ratings data ships with the extension and none is in this repository: the data is IMDb’s, and their licence covers your own copy, not redistribution.

Lookups go: stored answers, then the local database, then OMDb for titles the database doesn’t have (brand-new releases, titles under 25 votes), if a key is set. The Use OMDb box on the settings panel switches all OMDb traffic off, the extra scores included; under OMDb only it stays on. An OMDb answer that names an IMDb ID is kept for good: from then on the title’s rating comes from the local database by that ID (the weekly ratings file includes titles the database has no name for yet), falling back to OMDb’s copy, and the title is never sent to OMDb again. A name the full rebuild learns later still wins.

Layout

File Role
manifest.json Manifest V3. One content-script entry per required site, each loading that site’s adapter and then content.js; host permissions for datasets.imdbws.com (the dumps) and omdbapi.com; optional host permissions for the optional sites and a catch-all for addresses the user adds.
sites-list.js The table of sites: adapter name, label, addresses, required or optional. Shared by the background (registrations), the settings page (the Sites list) and the tests (which check the manifest against it); also the address checks for the add row.
sites/netflix.js, sites/primevideo.js, sites/hulu.js, sites/hbomax.js, sites/appletv.js, sites/disneyplus.js, sites/paramountplus.js, sites/tubi.js, sites/letterboxd.js Site adapters: which elements are title cards and hover previews, how to read the title (and movie/series type where available), and where the badge goes.
content.js Generic: watches the page, looks up titles as cards come near the viewport, draws badges, refreshes stale ones in the background.
background.js The background’s shell (a service worker; an event page in Firefox, see below): the event listeners, the message router for the content scripts and the settings page, the settings window, the status report, and the content-script registrations for optional sites and added addresses while the browser grants them.
lookup.js, omdb.js Answering the content scripts: remembered answers in chrome.storage.local first, then the local database, then OMDb (with a concurrency limit, a daily request count and a pause after a limit error).
refresh.js, languages.js, build.js The automatic refresh (what is due and when), the languages chosen for titles in other languages, and the database build as the background drives it (its state, the hidden page, cancel).
db.js The local ratings database in IndexedDB, shared by the service worker (lookups), the build (writes) and the settings (status). Ratings live in a table by IMDb ID that the weekly pass rewrites.
builder.js, build-worker.js Build the database from IMDb’s data dumps in a web worker: the full build in two stages (titles, then episodes) and the weekly ratings-only pass.
offscreen.html/js Hidden page that hosts the build worker, since the service worker can’t run minutes of work itself.
store/ Store listing text, screenshots and the scripts that build the store ZIPs and the icons. Not part of the extension.
badge.css Badge styling, including per-site placement tweaks.
options.html, options.js, options-text.js, options-languages.js The settings page: database build and status, per-site on/off, badge options, OMDb key entry and test, usage counter, clearing remembered ratings, deleting the database; its texts and its languages section in the two smaller files.

Firefox

The same code runs in Firefox 140 or later. manifest.json is Chrome’s; store/build-zip.ps1 builds both store ZIPs, and the Firefox one gets a manifest generated by store/firefox-manifest.mjs. What differs:

To try it without the store: build the ZIPs, open about:debugging, click This Firefox → Load Temporary Add-on… and pick dist/imdb-ratings-v<version>-firefox.zip. It stays until Firefox restarts.

Adding another site

Create sites/<name>.js defining window.IMDBEXT_SITE in the same shape as the existing adapters: a targets list where each entry has a kind (card or detail), a selector, titleOf(el) (a title, or a list of candidates tried in order), host(el), and optionally typeOf(el) (returns movie or series), yearOf(el) (a four-digit release year) and place(host, badge). Add the site to the table in sites-list.js as an optional one, with its addresses, and its match patterns under optional_host_permissions in the manifest (the tests check the two agree). No content-script entry: the eight required sites keep theirs, and every site since is optional, so that an update never makes Chrome switch the extension off for its users to accept a new site. Put any site-specific badge positioning in badge.css. The existing adapters’ header comments record what each site’s markup looks like.

Or point Claude Code at this folder, paste the site’s URL, and say “add this one.”

Known limits

Credits

Built with Claude Code (Anthropic’s AI coding assistant), which wrote the code; I designed it, tested it on the streaming sites and published it.

Information courtesy of IMDb (https://www.imdb.com). Used with permission. The ratings come from IMDb’s non-commercial datasets, which IMDb allows for personal and non-commercial use with this attribution.